Java之Request域对象及cookie详解

获取表单中提交的数据

使用getParameter()获取打印表单数据

    private void fun1(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String sex = request.getParameter("sex");
        // 获得复选框的传递的值
        String[] hobby = request.getParameterValues("hobby");
        if (hobby!= null) {
            for (String h : hobby) {
                System.out.println(h);
            }
        }
        String city = request.getParameter("city");
        System.out.println(username + " " + password + " " + sex + " " + city);
    }

使用getParameterNames()获取打印表单数据

    private void fun2(HttpServletRequest request) {
        // 利用getParameterNames()打印表单数据
        Enumeration<String> enumeration = request.getParameterNames();
        while (enumeration.hasMoreElements()) {
            String nextElement = enumeration.nextElement();
            // 根据nextElement取出对应的值
            String[] strings = request.getParameterValues(nextElement);
            for (String string : strings) {
                System.out.println(string);
            }
        }
    }

把表单数据封装到对象中(getParameterMap())

把表单数据封装到对象中(使用BeanUtils工具类)
jar包:commons-beanutils-1.9.3.jar
      commons-logging-1.2.jar
注意:该对象要符合JavaBean规范

    private void fun3(HttpServletRequest request) {
        User user = new User();
        Map<String, String[]> map = request.getParameterMap();
        try {
            // 参数1 要封装的对象 参数2 map集合
            BeanUtils.populate(user, map);
            System.out.println(user);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

请求转发、请求重定向、请求包含(Request)

Request也是一个域对象
域对象的内部就是维护一个map集合(添加/删除/获取的方法)

request域的作用范围:一次请求当中可以获取到域中保存的数据

请求转发

请求转发只是服务器内部的访问,不管你怎么写路径始终都在项目路径下

    private void fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 请求转发 获取转发器
        RequestDispatcher dispatcher = request.getRequestDispatcher("/demo03");
        dispatcher.forward(request, response);
    }

请求重定向

1.重定向是两次请求,不能获取到request域中的值
2.重定向既可以访问本地服务器也可以访问非本地服务器

    private void fun2(HttpServletResponse response) throws IOException {
        // 写法1
        // response.setHeader("location", "/sh-web-servlet03/demo03");
        // response.setStatus(302);
        // 写法2
        response.sendRedirect("/sh-web-servlet03/demo03");
    }

请求包含

    public class Demo02 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");

            // 获取字符流
            PrintWriter out = response.getWriter();

            // 给request域中添加值
            request.setAttribute("name", "wl");
            // 请求包含
            request.getRequestDispatcher("/demo03").include(request, response);;

            // 请求转发 浏览器只能响应一次数据
            // request.getRequestDispatcher("/demo03").forward(request, response);;

            // 响应
            out.write("123");

            System.out.println("我是demo02的结尾");
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    public class Demo03 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            response.getWriter().write("456");

            // 获取request域中保存的值
            Object name = (String)request.getAttribute("name");
            System.out.println("我是demo03" + name);
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }

输出:我是demo03wl
     我是demo02的结尾
响应回网页:456123
请求包含相当于把两个页面的响应合成一个响应 返回给浏览器

会话技术

客户端(浏览器)和服务端进行交互(会话)
当浏览器关闭的时候这次交互结束 例如:打电话

会话中的两个技术:
    1.cookie(客户端技术) cookie是保存在浏览器的缓存数据
    2.HttpSession(服务端技术) HttpSession保存在服务端

什么是cookie?
当浏览器发起一个请求,请求一个servlet进行逻辑处理(例如添加一个商品进购物车)
处理完成后,给客户端(浏览器)一个响应
响应携带着记录了购买了什么商品的cookie
让浏览器保存起来
    1.可以保存在内存当中(结束会话 cookie被清除)
    2.也可以保存在硬盘中(结束会话 依然存在 就是个文件)
当用浏览器再一次请求购物车的时候会携带着之前保存的cookie去访问

第一次访问服务器时,由于cookie还没有产生,是不会携带cookie去访问的
只有当第一次请求后的响应中可以把cookie写回到浏览器中

显示上次登录的时间

思路:第一次访问的时候利用cookie响应到浏览器中,下次在访问的时候从cookie中把时间取出来

    public class Demo04 extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");

            // 读取cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                // 遍历数组
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals("lastTime")) {
                        // 取出cookie的值
                        String value = cookie.getValue();
                        // 字符串转long
                        long time = Long.parseLong(value);
                        // 转成日期
                        Date date = new Date(time);
                        // 创建一个显示的日期格式
                        // 参数就是你想要显示的日期格式
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        // 格式化时间
                        String lastTime = sdf.format(date);
                        // 响应回浏览器
                        response.getWriter().write("上次的访问时间:" + lastTime);
                    }
                }
            }

            // 创建cookie 记录当前的时间
            Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
            /*
             * 设置一下cookie的保存路径 工程名+配置网址路径
             * 读取cookie是按 请求的地址寻找cookie
             * 如果配置请求路径没有一级目录 这样全网站所有的网址请求都能找到这个cookie
             * cookie.setPath("/");
             */
            cookie.setPath("/sh-web-servlet03/servlet");
            /*
             * 设置cookie存活时间 
             * 负值表示浏览器关闭cookie消失
             * 正值表示存活时间
             * 0表示删除cookie
             */
            cookie.setMaxAge(60 * 5);
            // 把cookie添加进响应当中
            response.addCookie(cookie);
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }

web.xml配置

  <servlet>
    <servlet-name>demo04</servlet-name>
    <servlet-class>com.lanou3g.Demo04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo04</servlet-name>
    <url-pattern>/servlet/demo04</url-pattern>
  </servlet-mapping>

记录用户名

    public class Demo06 extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");

            String username = "";
            String check = "";
            // 读取cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals("username")) {
                        username = cookie.getValue();
                        check = "checked";
                    }
                }
            }
            System.out.println(username);

            response.getWriter().write("<form action='/sh-web-servlet03/servlet/demo07' method='post'>");
            response.getWriter().write("用户名:<input type='text' name='username' value="+username+"><br>");
            response.getWriter().write("密&nbsp&nbsp&nbsp码:<input type='password' name='password'><br>");
            response.getWriter().write("记住:<input type='checkbox' name='remember' checked="+check+"><br>");
            response.getWriter().write("<input type='submit' value='登录'>");     
            response.getWriter().write("</form>");  
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }

    public class Demo07 extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");
            // 获取请求的参数
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String remember = request.getParameter("remember");

            // 创建cookie
            Cookie cookie = new Cookie("username", username);
            //设置cookie路径
            cookie.setPath("/sh-web-servlet03/servlet");

            // 处理业务逻辑
            if (username.equals("sc") && password.equals("123")) {
                // 判断一下是否 记住
                if (remember != null) {
                    // 需要记住(设置存活时间)
                    cookie.setMaxAge(Integer.MAX_VALUE);
                } else {
                    // 删除原来的cookie
                    cookie.setMaxAge(0);
                }
                // 添加到响应中
                response.addCookie(cookie);
                response.getWriter().write("登录成功");
            } else {
                response.getWriter().write("登录失败");
                // 3秒后 回登录页面
                response.setHeader("refresh", "3;url=/sh-web-servlet03/servlet/demo06");
            }
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值