Servlet笔记(三) Request和Session

来源:互联网 发布:还珠格格五阿哥和知画 编辑:程序博客网 时间:2024/06/10 05:27
一、常用表单数据的获取(复习表单,取数据用BeanUtils获取)
     < form   action ="/day05_requestparameter/servlet/RegistServlet"   method ="get" >
        姓名: < input   type ="text"   name ="name" />< br />
        性别: < input   type ="radio"   name ="gender"   value ="male"   checked ="checked" /> 男
             < input   type ="radio"   name ="gender"   value ="female" /> 女 < br />
        已婚: < input   type ="checkbox"   name ="married"  value ="on" />< br />
        爱好: < input   type ="checkbox"   name ="hobby"   value ="fb" /> 足球
         < input   type ="checkbox"   name ="hobby"   value ="bb" /> 篮球
         < input   type ="checkbox"   name ="hobby"   value ="ppb" /> 乒乓球 < br />
        籍贯: < select   name ="city" >
                 < option   value ="BJ" > 北京 </option >
                 < option   value ="SD" > 山东 </option >
                 < option   value ="HB" > 湖北 </option >
             </ select >< br />
        描述: < textarea   rows ="3"   cols ="38"   name ="description" ></ textarea >< br />
         < input   type ="hidden"   name ="id"   value ="438" />< br />
         < input   type ="image"   src ="/day05_requestparameter/xps.png" />      </ form >
 
二、请求转发和重定向(ServletRequest也是一个域对象)
 
    ServletRequest也是一个域(范围)对象
        void setAttribute(String key,Object value);:设置消息头
        Object getAttribute(String key);获取消息头key的value
        void removeAttribute(String key);删除消息头key
 
 
    RequestDispatcher:
        区别在于参数path路径的写法。
        ServletContext.getRequestDispatcher(String path):只能以/开头。/就代表当前应用。(绝对路径)
        ServletRequest.getRequestDispatcher(String path):如果以/开头。/就代表当前应用。(绝对路径)。如果不以/开头,就表示相对路径。
 
请求重定向
     //源
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
        request.setAttribute( "p" ,  "ppp" );
//        response.setStatus(302);//请求重定向:是客户端的行为
//        response.setHeader("Location", "/day05_requestparameter/ servlet /ServletDemo2");
         //请求重定向,简化代码
        response. sendRedirect ( "/day05_requestparameter/servlet/ServletDemo2" );     }
     //目标
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
         //请求转发,目标肯定得不到消息头
        System. out .println(request.getAttribute( "p" ));
        response.setContentType( "text/html;charset=UTF-8" );
        response.getWriter().write( "我给你办" );     }
 
请求转发
     //源:转发。是服务器端行为
     //转发时,源组件任何输出都无效。头有效
     //用转发时:源组件请不要输出任何内容。输出也白输。
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
        response.setContentType( "text/html;charset=UTF-8" );
        response.getWriter().write( "我不给你办" );        
        request.setAttribute( "p" ,  "ppppp" );
//        ServletContext  sc  = getServletContext();//ServletContext进行转发
//        //得到转发的类RequestDispatcher 请求分发器
//        RequestDispatcher  rd  = sc.getRequestDispatcher("/ servlet /ServletDemo4");
//        rd.forward(request, response);//传递下去了
         //转发简化的方式
//        request.getRequestDispatcher("/ servlet /ServletDemo4").forward(request, response);//绝对路径
        request.getRequestDispatcher( "ServletDemo4" ).forward(request, response);//相对路径     }
     //目标:转发
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
        System. out .println(request.getAttribute( "p" ));
         response .setContentType( "text/html;charset=UTF-8" );
        response.getWriter().write( "我给你办" );     }
 
包含  下面的例子打印Demo5Demo6
//源:包含
//包含:目标输出结果会显示到源组件中(只包含正文)。目标设置的响应消息头无效。
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
         throws  ServletException, IOException {
    response.setContentType( "text/html;charset=UTF-8" );
    PrintWriter out = response.getWriter();
    out.write( "Demo5" );
    request.getRequestDispatcher( "/servlet/ServletDemo6" ).include(request, response); }
//目标:包含
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
         throws  ServletException, IOException {
    response.setContentType( "text/html;charset=UTF-8" );
    PrintWriter out = response.getWriter();
    out.write( "Demo6" ); }
 
    request对象重点把握:
        1、获取请求参数及如何解决中文乱码:注意设置编码。
        2、理解请求转发和请求重定向的不同
        3、request域范围是多大:每一次请求。
 
三、各种URL地址的写法
    相对路径:
    绝对路径:推荐使用。必须以"/"开头
 
    绝对路径在使用时:如果地址给服务器端用的,"/"就代表当前应用。否则就需要加上当前应用名称。
 
    form的action:要加应用名称
    <a href=""/>:要加应用名称
    <img src=""/>:要加应用名称
    <script src=""></script>:要加应用名称
    <link href=""/>:要加应用名称
    HttpServletResponse.sendRedirect(String path):要加应用名称
    ServletContext.getRealPath(String url):不要加
    ServletRequest.getRequestDispatcher(String path):不要加
 
四、会话概述
    1、什么是会话及会话的界定范围
    2、会话过程中要结局的就是各个用户数据的保留问题。
 
五、Cookie详解
    1、属性:
        name:(必须)
        value:(必须)不能是中文
        maxage:(可选)最长存活时间.默认是会话。单位是秒
        path:(可选)路径
            一个cookie的默认路径是:写cookie的那个servlet的访问路径。
            写cookie的servlet的路径是:String path = /day05_01_cookie/servlet/
                            如果访问的路径.startWith(path),浏览器就会把刚才写的cookie带给服务器。
        domain :(可选)域名
        comment:(可选)注释
        version:(可选)版本号
 
    2、服务器如何向客户端写Cookie:
        HttpServletResponse.addCookie(javax.servlet.http.Cookie)(实际上就是写了一个Set-Cookie的响应消息头)
        浏览器对于一个网站最多存20个cookie  (Cookie的个数是有限的)
        cookie总数不能超过300个。
        每个Cookie大小不能超过4KB。
    3、服务器如何取出客户端带来的cookie:HttpServletRequest.getCookies() (实际上就是获取 名字为cookie的请求消息头)
 
    4、如何唯一确定一个Cookie
        domain+path+name
        localhost/day05_01_cookie/servlet/   + lastAccessTime
 
六、Cookie案例:
利用cookie技术记录用户最近一次访问的时间
     public   void  doGet(HttpServletRequest  request , HttpServletResponse response)
             throws  ServletException, IOException {
        response.setContentType( "text/html;charset=UTF-8" );
        PrintWriter out = response.getWriter();
        out.write( "上次访问的时间是:" );
         //得到指定的cookie,该cookie中记录了上次访问的时间
        Cookie[] cs = request.getCookies();
         for ( int  i=0;cs!= null&&i<cs. length ;i++){
            Cookie c = cs[i];
             if ( "lastTime" .equals(c.getName())){
                String value = c.getValue();
                 //把cookie里面字符串转成long,再由Date转成可读格式
                 long  time = Long. parseLong (value);
                String ti =  new  Date(time). toLocaleString() ;
                out.write(ti);
            }
        }
         //清除cookie
        out.write( "<a href='/my_exericse_day05/servlet/MyCookieDemo2'>清除cookie</a>" );
         //把当前时间写入到cookie里面
        Cookie cookie =  new  Cookie("lastTime" , System. currentTimeMillis ()+"" );
         //设置cookie的存货时间,单位是秒.如果是Long单位多半是毫秒
        cookie.setMaxAge(1*30*24*60*60);
         //设置路径为当前应用的名称,意味着当前应用的任何资源都可以得到该cookie.
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);     }
     //删除指定的cookie
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
        response.setContentType( "text/html;charset=UTF-8" );
        PrintWriter out = response.getWriter();
        Cookie c =  new  Cookie("lastAccesTime" ,  "" );//和上面的一样的
        c.setMaxAge(0);
        c.setPath(request.getContextPath());
        response.addCookie(c);
        
        out.write( "删除成功!" );     }
 
提供选项让用户设置是否记录登录名
     //提供登陆界面
     //显示记住的用户名
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
        response.setContentType( "text/html;charset=UTF-8" );
        PrintWriter out = response.getWriter();
         //显示记住的用户名
        String username =  "" ;
        String checked =  "" ;
         //找到指定的cookie
        Cookie cs[] = request.getCookies();
         for ( int  i=0;cs!= null&&i<cs. length ;i++){
             if (CookieStatics. LOGIN_USERNAME .equals(cs[i].getName())){
                 //找到了
                String value = cs[i].getValue();
                username = value;
                checked =  "checked='checked'" ;
                 break ; //不希望程序继续往下运行
            }
        }        
         //提供登陆界面
        out.write( "<form action='" +request.getContextPath()+ "/servlet/LoginServletDemo2' method='post'>" );
        out.write( "用户名:<input type='text' name='username' value='"+username+"'/><br/>" );
        out.write( "密码:<input type='password' name='password'/><br/>" );
        out.write( "记住用户名:<input type='checkbox' name='remember' "+checked+" /><br/>" );
        out.write( "<input type='submit' value='登陆'/>" );
        out.write( "</form>" );     }
     //验证用户名或密码
     //根据用户是否需要记住用户名来处理cookie
     //是:添加cookie
     //否:删除cookie
     public   void  doGet(HttpServletRequest request, HttpServletResponse response)
             throws  ServletException, IOException {
        response.setContentType( "text/html;charset=UTF-8" );
        PrintWriter out = response.getWriter();
         //验证用户名或密码
        String username = request.getParameter("username" );
        String remember = request.getParameter("remember" );
         //根据用户是否需要记住用户名来处理cookie
         //用一个借口,来定义一个常量。直接引用,不容易出错
        Cookie c =  new  Cookie(CookieStatics. LOGIN_USERNAME , username);
        c.setPath(request.getContextPath());
         if (remember== null ){
             //否:删除cookie
            c.setMaxAge(0);
        } else {
             //是:添加cookie的失效时间为最大
            c.setMaxAge(Integer. MAX_VALUE );
        }
        response.addCookie(c);
        out.write( "登陆成功!" );     }
 
记录用户的浏览记录
//显示所有的书籍,并提供查看详细的链接
//显示用户最近的浏览记录:保留3
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
         throws  ServletException, IOException {
    response.setContentType( "text/html;charset=UTF-8" );
    PrintWriter out = response.getWriter();
     //显示所有的书籍,并提供查看详细的链接
    out.write( "本站有以下好书,欢迎选购:<br/>" );
    Map<String, Book> books= BookDB. findAllBooks ();
     for (Map.Entry<String, Book> me:books.entrySet()){
        out.write(me.getValue().getName()+ "  <a href='" +request.getContextPath()+"/servlet/ShowBookDetailServlet?id="+me.getValue().getId()+"'>详情</a><br/>" );
    }
     //显示用户最近的浏览记录:保留3   bookHistory=3-2-1
    out.write( "<hr/>您最近的浏览记录:<br/>" );
    Cookie cs[] = request.getCookies();
     for ( int  i=0;cs!= null&&i<cs. length ;i++){
        Cookie c = cs[i];
         if ( "bookHistory" .equals(c.getName())){
            String bookIds = c.getValue(); //3-2-1
            String ids[] = bookIds.split( "\\-" );
             for (String id:ids){
                Book book = BookDB. findBookById (id);
                out.write(book.getName()+ "<br/>" );
            }
             break ;
        }
    }      }
//显示书籍的详细内容
//向客户端写cookie记录浏览历史
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
         throws  ServletException, IOException {
    response.setContentType( "text/html;charset=UTF-8" );
    PrintWriter out = response.getWriter();
     //显示书籍的详细内容
    String bookId = request.getParameter( "id" );
    out.write( "详情:" +BookDB. findBookById (bookId).toString());
    out.write( "<br/><a href='" +request.getContextPath()+ "/servlet/ShowAllBooksServlet'>继续购物</a>" );
     //向客户端写cookie记录浏览历史
    String ids = makeIds(request,bookId); //用-分隔
    Cookie c =  new  Cookie("bookHistory" , ids);
    c.setPath(request.getContextPath());
    c.setMaxAge(Integer. MAX_VALUE );
    response.addCookie(c);
}
//组织要写回的书的id
//    当前情况                                    新看的书            应写回的id
//    cookie一个都没有                                1                1
//    cookie不为null,但没有bookHistory                1                1
//    bookHistory=1                                2                2-1
//    bookHistory=2-1                                1                1-2
//    bookHistory=2-1                                3                3-2-1
//    bookHistory=2-1-3                            3                3-2-1
//    bookHistory=2-1-3                            4                4-2-1
private  String makeIds(HttpServletRequest request, String bookId) {
//        cookie一个都没有                                1                1
    Cookie cs[] = request.getCookies();
     if (cs== null||cs. length==0)
         return  bookId;     
//        cookie不为null,但没有bookHistory                1                1
    Cookie bookHistoryCookie =  null ;
     for (Cookie c:cs){
         if ( "bookHistory" .equals(c.getName())){
            bookHistoryCookie = c;
             break ;
        }
    }
     if (bookHistoryCookie== null ){
         return  bookId;
    }     
//        bookHistory=1                                2                2-1
//        bookHistory=2-1                                1                1-2
//        bookHistory=2-1                                3                3-2-1     
    String id = bookHistoryCookie.getValue(); // 2-1     
    LinkedList<String> list=  new  LinkedList<String>(Arrays. asList (id.split("\\-" ))); // 2 1     
     if (list.size()<3){
         if (list.contains(bookId)){
            list.remove(bookId);
        }
        list.addFirst(bookId);
    } else {     
//        bookHistory=2-1-3                            3                3-2-1
//        bookHistory=2-1-3                            4                4-2-1
         if (list.contains(bookId)){
            list.remove(bookId);
        } else {
            list.removeLast();
        }
        list.addFirst(bookId);
    }
     //把list中的id组织成字符串
     //3 2 1---->3-2-1
    StringBuffer sb =  new  StringBuffer();
     for ( int  i=0;i<list.size();i++){
         if (i>0)
            sb.append( "-" );
        sb.append(list.get(i));
    }
     return  sb.toString(); }
 
七、HttpSession原理详解
    HttpSession借助Cookie技术的。
 
    HttpSession getSession():服务器会根据用户带来的JSESSIONIDcookie的值,先查找。找到继续为你服务,没有找到,创建新的HttpSession对象。
    HttpSession getSession(boolean b):
                    b为true:效果同getSession()
                    b为false:只是查询。
 
1 0