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);
        }
    }
  • 相关阅读:
    Java简单获取当前时间
    基EmguCv/OpenCv的零件的缺陷检测
    cURL实现模拟登陆+抓取数据
    Learnjava--色子点数概率(转)
    java读写txt文件
    java jdk1.8连接sql server数据库
    简单随机选人网站设计
    封装cURL工具类
    在Linux下安装PHP的curl扩展
    Jsp四种变量作用范围
  • 原文地址:https://www.cnblogs.com/FlySheep/p/3632282.html
Copyright © 2011-2022 走看看