zoukankan      html  css  js  c++  java
  • Java Web总结七Requst、Cookie

    一、request对象常用API

      1、取得请求头相关的信息:

        1)request.getHeader(String):String

        2)request.getHeaders(String):Enumeration 

        3)getHeaderNames():Enumeration

      2、获取请求参数的值:

        1)request.getParameter(String):String

        2)request.getParameterValues(String):String[]。可以用于像获取多选框的值

          注意:在GET请求方式下,如果参数不一致,返回null,可能出现空指针异常

        3)BeanUtils框架能够自动将String参数设置到JavaBean对象中

          a)无需理会参数的类型,个数,但是参数名一定要和JavaBean中的字段一致。

          b)String->8种基本类型自动转换,非8种基本类型可以注册转换器。

          c)String或String[]类型的参数自动感知装配 。

          BeanUtils框架使用代码如下:

    package com.gnnuit.request;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.beanutils.BeanUtils;
    
    import com.gnnuit.domain.User;
    
    public class Demo1 extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Enumeration<String> parameterNames = request.getParameterNames();
            User user = new User();
    
            while (parameterNames.hasMoreElements()) {
                String parameterName = parameterNames.nextElement();
                String parameterValue = request.getParameter(parameterName);
                System.out.println(parameterValue);
                try {
                    BeanUtils.setProperty(user, parameterName, parameterValue);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write("姓名:" + user.getUsername() + "<br/>");
            writer.write("年龄:" + user.getAge() + "<br/>");
            writer.write("薪水:" + user.getSalary() + "<br/>");
            writer.write("爱好:" + user.getLikes().length);
        }
    
    }

    二、Request应用

      1、防盗链。判段某个页面来自于何方,即referer请求头。代码如下:

    package com.gnnuit.request;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //防盗链
    public class Demo2 extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String referer = request.getHeader("Referer").trim();
            if (referer != null
                    && referer.equals("http://localhost:8080/day07/index.html")) {
                this.getServletContext().getRequestDispatcher("/download.html")
                        .forward(request, response);
            } else {
                this.getServletContext().getRequestDispatcher("/ad.html")
                        .forward(request, response);
            }
        }
    
    }

      2、收集表单数据。项目中,用户请求的参数,最好做null或空串的二次判段。

      3、中文乱码的解决:

        1)POST方式下乱码产生的原因:浏览器发送的编码方式与Request对象的编码方式不一致。

          解决方案:request.setCharacterEncoding("UTF-8),该方法只能解析请求体中的乱码方式,除此之外,无力解决。

        2)GET方式解决方案如下:

    package com.gnnuit.request;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //解决get提交方式乱码
    public class Demo4 extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String username = request.getParameter("username");
            byte[] buffer = username.getBytes("ISO-8859-1");
            String user = new String(buffer, "utf-8");
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("用户名:" + user);
        }
    
    }

        3)如果用户是post方式提交,在转发情况下,依然是post请求,但重定向情况下,是get请求。

        4)如果用户是get方式提交,在转发和重定向情况下,都是get请求。

        5)405:本身请求是get请求,但未在servlet内提供对应的doGet()方法, post也是类似。

    三、再谈MVC设计模式

      1、如果严格按照MVC思想的话,浏览器首页访问的是控制器,然后再由控制器转发到视图。

      2、位于WEB-INF/目录下的资源,客户端无法直接访问,只能通过服务端转发进入。

      3、request对象也可用于资源的转发:request.getRequestDispatcher("/WEB-INF/success.html").forward(request,response);

      4、通过正则表达式验证中文:[u4E00-uFA29]+。

      5、对于重定向而言,前后的二个Request域对象不同,如果取值不到,返回"null",不会报错。

    四、request的细节

      1、转发是通过RequestDispatcher对象的forward(request,response)方法完成的。

      2、forward()方法之前的输出,如果是输出到缓冲区,再转发到其他Servlet,那么原缓冲区的数据忽略不计。

      3、forward()方法之前的输出,如果真正输出到浏览器,再转发到其他Servlet,再转发到其他Servlet代码忽略不计。

      4、forward()方法之前的输出,如果是对响应头的设置,会保留到转发的其他Servlet中。

    五、重定向和转发区别

      1、转发只能相对于当前web应用而言,不能转发到其它web应用。重定向可以在当前web应用之外的其它web应用重定向资源。

      2、转发/表示当前web应用。重定向/表示web服务器的根目录,即webapps目录。

      3、转发时,浏览器地址栏不变。重定向时,浏览器地址栏改变。

      4、转发是服务端的内部行为,浏览器不知。重定向是浏览器和服务端的共同行为,浏览器必知。

      5、转发时二个Servlet共享request域对象。重定向时二个Servlet独享request域对象。

      6、request具有二义性:请求对象、域对象。

    六、include包含

      需要使用Servlet包含相同的页面输出时,类似于函数调用。

    七、会话

      1、用户输出URL地址,有效访问某个网站,在该网站上的一系列有效操作,随后关闭浏览器的整个过程,叫一次会话。

      2、会话主要解决服务端如何保存每个客户端对应的私有信息。

      3、会话主要有二种:

        1)Cookie技术[客户端技术]。

        2)Session技术。

    八、Cookie

      1)Cookie是客户端的技术。

      2)每次发送请求时,客户端都会带上各自已的不同Cookie到服务端,服务端一解析Cookie,就知道是哪个客户端发送过来的信息。

      3)一个Cookie只能存储一种类型的信息。

      4)更新某个名的Cookie,即向浏览器写一个相同名的Cookie。

      5)Cookie一定要设置一个有效时间,如果不设置的话,默认该请求访问结束后,该Cookie自动销毁,用专业名词来讲,Cookie的默认有效期时一个有效会话结束。

      6)Cookie路径的设置:

        a)默认是产生Cookie的应用的访问路径。

        b)如果设置了路径,只能被包含此路径的资源访问。

        c)假如设置路径为“/day07”,也就是说,该Cookie只能被day07这个应用访问。

        d)假如设置路径为“/day08”(day07的应用增加的Cookie),该Cookie只能被day08访问,而day07是访问不到的。

        e)假如设置路径为“/”,该Cookie可以被同一个服务器的所有应用访问。

      Cookie代码如下:

    package com.gnnuit.cookie;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CookieDemo1 extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 创建Cookie
            Cookie c = new Cookie("name", "jack");
            // 设置Cookie的存活时间
            c.setMaxAge(1 * 24 * 60 * 60);
            // 把Cookie写到客户端
            response.addCookie(c);
        }
    }
  • 相关阅读:
    51 Nod 1086 多重背包问题(单调队列优化)
    51 Nod 1086 多重背包问题(二进制优化)
    51 Nod 1085 01背包问题
    poj 2559 Largest Rectangle(单调栈)
    51 Nod 1089 最长回文子串(Manacher算法)
    51 Nod N的阶乘的长度 (斯特林近似)
    51 Nod 1134 最长递增子序列(经典问题回顾)
    51 Nod 1020 逆序排列
    PCA-主成分分析(Principal components analysis)
    Python中cPickle
  • 原文地址:https://www.cnblogs.com/FlySheep/p/3632282.html
Copyright © 2011-2022 走看看