上篇博客我们已经简单的介绍了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); } }