请求与响应
一、请求
1. 理解
ServletRequest接口 ----> HttpServletRequest子接口 ---->HttpServletRequestWrapper 实现类
① 客户端请求将请求信息封装该对象中
② 该对象是由Servlet容器创建的,开发者只需要使用
③ 在核心方法中直接使用
定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法。
2. 作用
3. 使用
1. 获取请求行信息
String scheme = request.getScheme();
System.out.println("协议:"+scheme);
String serverName = request.getServerName();
System.out.println("主机名:"+serverName);
int serverPort = request.getServerPort();
System.out.println("端口号:"+serverPort);
String contextPath = request.getContextPath();
System.out.println("项目名:"+contextPath);
String method = request.getMethod();
System.out.println("请求方式:"+method);
StringBuffer requestURL = request.getRequestURL();
System.out.println("请求URL:"+requestURL);
2. 获取请求头信息
String accept = request.getHeader("Accept");
System.out.println("accept:"+accept);
System.out.println("------------------------------------------");
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+":"+value);
}
3. 获取请求正文(重点)
· 获取URL拼接参数
//① 根据一个name获取一个value
String value = request.getParameter("name");
· 获取表单数据
// ② 获取一个name对应多个value
String[] values = request.getParameterValues("name");
// ③ 获取表单中所有的name
Enumeration<String> names = request.getParameterNames();
// ④ 获取全部的name和 value
Map<String, String[]> map = request.getParameterMap();
4. BeanUtils实现map映射实体类对象
① 下载导包 commons-beanutils-1.8.3.jar commons-logging-1.1.1.jar
② 使用
BeanUtils.populate(要映射对象, map数据);
要求:表单的name值 和 实体类的属性名 一致
5. 请求中文乱码
request.setCharacterEncoding("utf-8");
6. 案例:注册案例
7. 转发
理解:
客户端请求资源ServletA时,ServletA资源不足或者没有,请求其他的资源(页面、Servlet),再响应给客户端。请求其他的资源的过程叫做转发
使用:
// 1. 获取转发器
RequestDispatcher rd = request.getRequestDispatcher("要转发资源的路径");
// 2. 请求转发
rd.forward(request, response); // 完全转发
rd.include(request, response); // 部分转发
使用场景:跳转页面 如:注册成功跳转登录页
二、响应
1. 理解
定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法。
① 是Servlet中处理响应的对象
② 是Servlet容器 创建的
③ 作为核心方法的参数 开发者只需要在核心方法中使用
ServletResponse接口 ----> HttpServletResponse子接口 ----> HttpServletResponseWrapper 实现了
2. 作用
Servlet中处理响应客户端的对象。可以响应文本,也可以响应字节
3. 使用
① 文本
响应文本:
PrintWriter writer = response.getWriter();
writer.print("I am server, 这是文本信息");
中文乱码问题解决:
response.setContentType("text/html; charset=utf-8");
② 字节
响应字节:
ServletOutputStream sos = response.getOutputStream();
文件下载案例:
文件从服务器 ----> 客户端 ----> 下载到本地磁盘
// 1. 获取请求信息
String filename = request.getParameter("filename");
// 2. 实现下载:读入到内存 然后写出到客户端 再由客户端下载到本地
// 3. 读入内存
// 3.1 获取web目录下资源的真实路径
String realPath = request.getServletContext().getRealPath("img/" + filename);
// System.out.println(realPath);
FileInputStream fis = new FileInputStream(realPath);
// 告诉浏览器 该文件需要下载
response.setHeader("Content-Disposition", "attchment;filename="+filename);
// 4. 写出到客户端
ServletOutputStream sos = response.getOutputStream();
// 5. 边读边写
byte[] buff = new byte[2*1024];
int len = 0;
while((len=fis.read(buff))!=-1){
sos.flush();
sos.write(buff, 0, len);
}
// 6. 关闭
sos.close();
fis.close();
4. 重定向
理解:
客户端请求ServletA资源,ServletA没有资源ServletA响应客户端携带302状态码和重定向的url地址。客户端立刻对重定向的地址发送请求。这个过程称为重定向
实现:
response.sendRedirect("重定向地址");
使用场景:跳转页面 如:登录成功跳转首页
三、转发和重定向区别
转发特点:
1. 转发是由请求发起的
2. 发生在服务器内部
3. 转发过程中请求地址不变
4. 转发只能转发内部资源
5. 转发可以转发WEB-INF中的资源
6. 表单提交完成之后转发不可以刷新当前页面
重定向特点:
1. 重定向是由响应发起的
2. 发生在客户端与服务器之间
3. 重定向过程请求地址发生变化
4. 重定向既可以重定向内部资源 也可以重定向外部资源
5. 重定向不可以重定向WEB-INF下的资源
6. 表单提交完成之后重定向可以刷新当前页面
四、作业
共享域
1. 理解
2. 分类
① ServletContext 范围最大 可以在项目的任何地方实现数据的共享
② session 范围 一次会话中 实现数据的共享
③ request 范围 一次请求中 实现数据的共享
3. 作用
实现Servlet与Servlet之间 或者 Servlet与页面之间 数据的共享
4. 使用
保存数据到共享域:
setAttribute(String name, Object value);
取共享域数据:
getAttribute(String name);
删除共享域数据
removeAttribute(String name)
Cookie 和 session
一、会话
1.理解
客户端发送请求到服务器,连接成功会话开始,只有连接不断开整个过程就属于一次会话。从连接成功开始 到 服务器或者客户端断开结束。在此期间的任何请求 任何资源都属于该次会话。
2. 作用
由于HTTP协议,无状态的特点。每次请求都是一次新的会话,有时候需要重复验证。所以用户体验太差,要解决这种问题 使用会话技术。
3. 会话技术
Cookie 客户端会话
session 服务器端会话
二、Cookie
1. 理解
创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
1. 需要在Servlet中创建
2. 保存到浏览器
3. 唯一标识客户端 保存少量数据
2. 使用
1. 创建cookie
Cookie cookie = new Cookie(String name, String value);
2. 响应客户端
response.addCookie(cookie);
3. 获取cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+"=="+value);
}
}else{
System.out.println("没有cookie.....");
}
4. 过期时间 和浏览器无关
cookie.setMaxAge(); // 单位:m +秒数 -默认浏览器会话结束 0立即销毁
5. 有效路径:只在当前的有效路径下 生效
默认当前创建cookie的Servlet访问路径的上一层
cookie.setPath(路径);
3. 场景
1. 记录上次访问时间
2. 登录时的记住账号功能(作业)
3. 浏览记录
4. 特点
1. Cookie保存到客户端 安全性低
2. Cookie保存数据只能是字符串 不能有特殊符号 空格 分号 逗号 不能以$开头等
3. Cookie保存数据大小最多4KB
4. 一个服务器可以创建多个Cookie
5. Cookie可以设置有效时间 从调用addCookie方法开始 到期之后销毁了
6. Cookie的名字、路径、有效时间 决定了是不是同一个cookie
三、session
1. 理解
HttpSession 提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。
Servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,比如使用 cookie 或重写 URL。
① session是由Servlet容器创建
② 维护客户端和服务器的会话
2. 使用
1. 创建cookie
Cookie cookie = new Cookie(String name, String value);
2. 响应客户端
response.addCookie(cookie);
3. 获取cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+"=="+value);
}
}else{
System.out.println("没有cookie.....");
}
4. 过期时间 和浏览器无关
cookie.setMaxAge(); // 单位:m +秒数 -默认浏览器会话结束 0立即销毁
5. 有效路径:只在当前的有效路径下 生效
默认当前创建cookie的Servlet访问路径的上一层
cookie.setPath(路径);
3. 场景
4. 特点
1. session将数据保存到服务器 相对安全
2. session可以保存任意数据
3. session保存数据的大小 没有限制
4. 一个服务器对应一个session对象 每个用户分别分配不同的id
5. session可以设置有效时间 这个时间是指两次相邻访问的时间间隔
6. session是通过JSESSIONID确定是否是同一次会话
隐藏特点:
session数据的钝化(序列化到本地磁盘)和活化(从本地磁盘序列化到内存)
5. 总结
1. 保存数据量比较小 安全性低 数据易变 使用cookie维护会话
2. 保存的数据量较大 安全性高 数据不易变 使用session维护会话
cookie数据保存到了客户端 减轻了服务器的压力,session默认需要借助cookie使用
即使没有cookie session也可以维护会话 比如:重写url地址