JAVAEE request请求与Cookie 详解

HttpServletRequest

上篇博客我们已经简单的介绍了request请求 本篇我们将举几个简单的示例帮助加深对request的理解和认识

// 上篇博客我们使用的是getParameter()方法处理表单传过来的数据 这样一个一个获取不免有些麻烦 
// 因此使用getParameterValues()方法 可以极大节省代码
public class Demo01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应的编码格式
        response.setContentType("text/html;charset=UTF-8"); 
        // 告诉服务器请求的内容是什么编码格式的
        request.setCharacterEncoding("UTF-8");
        // 利用getParameterNames() 打印表单数据
        Enumeration<String> names = request.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();  
            String[] values = request.getParameterValues(name);
            System.out.println(Arrays.toString(values));
    }

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

}

request也是一个域对象 内部是维护一个map集合(拥有添加 删除 获取的方法)
作用范围:一次请求中 可以获取到域中保存的数据

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", "james");
//      fun1(request, response);
//      fun2(response); 
        // 请求包含
        // 相当于把两个页面的响应合成为一个响应返回给浏览器
        // 请求转发
        // 浏览器只会响应一次数据
        request.getRequestDispatcher("/demo03").forward(request, response);
        out.write("你好");

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

    public void fun2(HttpServletResponse response) throws IOException {
        // 请求重定向 查看是否能获取域中的值
        // 重定向是两次请求 不能获取到request域中的值
        // 重定向 即可访问本地服务器 也可以访问非本地服务器
        response.sendRedirect("/sh-web-servlet03/demo03");
    }

    public void fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 请求转发 获取转发器
        // 请求转发 只是服务器内部的访问 不管怎么写路径 始终都在项目路径下
        // 这里写外链会报404
        RequestDispatcher dispatcher = request.getRequestDispatcher("http://www.baidu.com");
        dispatcher.forward(request, response);
    }

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

}

// Demo03.java
public class Demo03 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取 request中保存的值
        PrintWriter out = response.getWriter();
        out.write("大家好");
        String name = (String)request.getAttribute("name");
        System.out.println(name);
        System.out.println("我是demo03");     
    }
}

会话

客户端和服务端进行交互 当浏览器关闭的时候这次会话(交互)才算结束
会话中两个技术
1. coookie 客户端技术 保存在浏览器中的缓冲数据
当我发起一个请求servlet 然后servlet进行逻辑处理 添加一个商品进购物车
处理完成后给客户端(浏览器)一个响应
响应中携带着记录的信息 cookie
让浏览器保存起来 可以是保存在内存中(结束会话 cookie 被删除) 也可以保存在硬盘中(会话结束依然存在)
当用户再次访问 会携带者之前保存的cookie 去访问
每个网站可以保存20个cookie 整个浏览器 可以保存300个
2. HttpSession 服务端技术 保存在服务器中
将在明天的博客中做出演示

练习: 记录上次刷新的时间


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还没产生 只要当第一次请求之后的响应 中 
        // 可以把cookie写回到浏览器中
        // 显示上次登录的时间
        // 思路:
        // 第一次访问的时候利用cookie 响应到浏览器中 下次再访问的时候从cookie中把时间取出来展示

        // 读取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(5*60);

        // 把cookie添加进响应当中
        response.addCookie(cookie);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值