⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 day04.txt

📁 servlet上课内容4.
💻 TXT
字号:
Servlet_day04   langna  2007-9-26   星期三
   回顾:
   MVC
   包结构: 先根据功能的层分-->再根据模块-->子模块
               com.tarena.ums.web.user        C
               com.tarena.ums.web.course     V
               
               com.tarena.ums.services   UserService   M
               com.tarena.ums.entity      User              M
    系统分析员:将方法的参数和返回值还有结构已经定义好了;
    要写注释; 
    CMM: 项目从第一级到第五级;从低到高; 
    注释的量不少于代码的40% (20%左右);  html 不需要加注释; 
一,  MVC的应用: 
    
    M: JDBC/Hibernate/EJB
    V: servlet/jsp/html/xml
    C: servlet以及被sevlet调的类,遵守servlet的规范; 
        C控制的不是一个分支,可以控制一组请求;
        find  -->   C -->  M
        delete --> C -->  M
        
        V有多个, C有一个; find.do / delete.do 
        用  ServletPath  解析 ; 
        异常是面向对象区别于面向过程最好的特性;
        public  void  removeUser(int  id){//如果不抛异常就说明操作成功;      
            String sql="delete from sd0705_user where id=?";
        }
        
        配置文件中:  *.action ;   地址栏输入:  user/find.action 或 find.action都可以;
        UsserService 当作成员变量;减少了频繁创建;
        UserService 类, 没有成员变量, 网络连接是一个方法申请一个; 是线程是安全的;
        
        String  path=request.getServletPath();
        
        if(path.equals("/user/find.action")){
            Collection<User> users = userService.findUsers();
            request.setAttribute("users", users);
            
            ServletContext application = getServletContext();
            RequestDispatcher dispatcher = application.getRequestDispatcher("/res/user/list/view");
            dispatcher.forward(request, response);
        }else if(path.equals("/user/remove.action")){
            int id=Integer.parseInt(request.getParameter("id"));
            userService.removeUser(id);
            
            ServletContext application = getServletContext();
            RequestDispatcher dispatcher = application.getRequestDispatcher("/user/find.action");//自己调自己的不同分支;
            dispatcher.forward(request, response);
        }
        else{
            throw  ServletException("invalid path"+path);            
        }
二,  配置连接池: 
      提高性能:  DBA 优化 ; 
      JNDI: 访问命名服务器的API; 绑定服务,查找服务;
      命名服务器: 由厂商提供;
      服务器根据配置文件帮你绑定服务;
      我们只需查找即可;
      
      1)登陆服务器, 得到初始化上下文即可;
      2)lookup("jndi-name"); 数据源, 消息队列,等等;
      
      在tomcat中的配置:自带一个命名服务器;
      在应用的根文件夹建立一个子文件夹: META-INF/context.xml
      <Resource  name="jndi-name"  auth=" Container"   type="javax.sql.DataSource" >
      
    <Context>
    <Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource"
           maxActive="2" maxIdle="1" maxWait="-1"
           username="xjh0704" password="xjh0704" 
           driverClassName="oracle.jdbc.driver.OracleDriver"
           url="jdbc:oracle:thin:@192.168.0.201:1521:tarena"/>
    </Context>
    
    name: 配置JDNI的名字
    type:  绑定资源的类型
    maxActive:最大连接数; 2就行
    maxIdle:最大空闲连接数; 
    maxWait:等待时间,配置为-1就是无限等待,只到有空闲连接为止
    
    java:comp/env : 指定的上下文;默认的前缀; 再加上自己指定的名字即可:jdbc/oracle
    
    在配置文件中再加一个:jndiName=jdbc/oracle
                                      可以读配置文件得到数据源; 
                                      
     import javax.naming.*; 
     public static Connection getJndiConnection()
        {
                try
                {      //1, 登陆命名服务器;
                       Context context = new InitialContext();
                       //2,找到数据源, 这个是在tomcat下默认绑定Context的JNDIname
                       DataSource dataSource = (DataSource)context.lookup("java:comp/env/" + config.getProperty("jndiName"));
                       return dataSource.getConnection();
                }catch(Exception e)
                {
                        e.printStackTrace();
                        throw new RuntimeException(e.getMessage());
                }
        }
    开发的时候测试用直连即可, 应用时改配置文件即可;根据不同的服务器配置不同的连接;
    第一次访问创建连接池;以后就变快了;
    连接池依赖数据源,数据源依赖命名服务器;

 三 , 状态:会话:
    HTTP是无状态的连接; 
    
    ServletRequest对象的生命周期就是在service()方法中,
    除了forward(...,...)方法将这个请求对象转发给其他的Servlet。
    
    <a href  onclick="javascript: document.form[0].submit()" ; />
    //一个页面上一个时间只能有一个表单提交;但可以有多个表单;
            或改成提交按钮;
    
    将id和数量封装成一个item  map(id, amount);
    将item再封装成一个List集合;
    
    先判断请求中是否有一个items集合,没有的话再创建新的;
    把一个条目放到集合中; 
    转发请求,再得到请求中的内容;
  
     *.act
    /shopping/*.act 是不对的
    扩展名匹配和确切路径匹配不能放在一起使用
 1,Session   服务器端技术
    Session: 从创建开始到销毁结束;
    HttpSession  session= request.getSession(true); //先查找,如果不存在的话,创建一个session
    HttpSession  session= request.getSession(false);//如果存在就用已经存在的,否则返回一个空;
    
    会话是以用户为单位的;一个用户跟服务器端进行的一组交互产生的空间的内容;
    Session.invalidate();销毁;
    session 采用的是超时策略;setMaxInactionInterval(秒);
    在tomcat的conf的web.xml 中<session-config><session-timeout>30</session-timeout></session-config> 
    
    session.setAttribute(name,Object);
    session.getAttribute(name);
    session.remove(name);
   如果使用getSession()方法,就等同于getSession(true)。

    注意:ServletRequest对象适用于传输大量的数据,因为其生命周期比较短,
    可以有效的节省内存资源。
    大数据量的传输或保存不适合使用Session空间。
 2,Cookie  客户端技术
    Cookie,是记录用户的Session信息,也可以记录用户的请求信息,也就是SessionID,
    来分辨哪一个用户是否登陆过。在每次登陆时,还会将Cookie发送回服务器端,
    Cookie是用来跟踪Session的。
    
    Cookie是由服务器发送的;
    写Cookie:
      doPost{
    	    String user = request.getParameter("user");
            String pass = request.getParameter("pass");
    	    Cookie userCookie = new Cookie("user", user);
            userCookie.setMaxAge(60 * 60 * 24 * 365);//设置Cookie的最大有效期,秒为单位
            Cookie passCookie = new Cookie("pass", pass);
            passCookie.setMaxAge(60 * 60 * 24 * 365);
            response.addCookie(userCookie);
            response.addCookie(passCookie);
     }
    读Cookie ;
      doGet{
         Cookie[]  cookies=request.getCookie();//如果一个cookie都没有,会报空指针异常
         if(cookie!=null){
             for(int i=0;i<cookie.length;i++){
                 cookies[i].getName();
                 cookies[i].getValue();
             }
          }
      }
      
     不设有效期的话,默认的是当前浏览器有效;关闭就无效了; 
     设置cookie必须经过用户同意;
  3, 区别与联系:   
     
     session 在服务器端保存的,可以存任何数据;
     cookie 在客户端保存的,只能存字符串;  
     
     cookie:JSESSIONID=值;利用cookie技术跟踪会话;
     服务器端创建一个session后,会自动向客户端发送一个cookie(如果cookie);
     
     浏览器屏蔽cookie:隐私--设置--站点(127.0.0.1);不支持cookie
     那么session也不能起作用了;在开发过程中一般不考虑cookie被屏蔽的情况;
     
     2)URL_rewriting: 第二种
        回写url来跟踪会话;
          url ;jsessionid=值
       forward(response.encodeURL("/time"));//用forward时出现的是原来的请求的地址;
      
       重定向必须从应用的根开始写:
       response.sendRedirect(response.encodeRedirectURL("/serv-app/time"));
       ;jsessionid=值;
       url回写不能是静态页面;必须是动态的;把html变成servlet即可;
       
       有必要时, javascript可以判断是否支持cookie; 几乎所有的浏览器默认支持cookie;
       如果全都是动态页面的话,将回写url加上即可;
       
       cookie对应一个站点的容量是有上限的;到上限时会覆盖原来的记录;
                      一般是30~50个; cookie数量要少,不要过分依赖于它;
                      有可能存在浏览器的内存或客户端的文件中(要经过客户的同意);
                      用来跟踪会话的cookie是写在内存中的,关了浏览器也就失效了;             
       相邻页面用隐藏域传; 用session; 
     3)  
       session是我们创建的;request.getSession(true);
                                         request.getSession();
                                         request.getSession(false);
       立即销毁session.invalidate();
       <time-out>指30分钟不用会超时;
       
       一个用户:
       windows:IE下,一个窗口中和另一个窗口cookie是不可见的;开多个窗口就是多个用户;
       unix:不管开多少个窗口只要是一个人就是一个用户;
       单点登陆,一个用户在一个地方登陆,别的地方也是登陆状态;
       用全局的区域去记录;msn;
                       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -