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);
}
}