Skip to content

处理请求的流程

服务器每次收到请求时,都会为这个请求开辟一个新的线程。

服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!

服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应数据

HttpServletRequest(请求类)

编码

Tomcat 8.0以下(8.0后使用UTF-8,以前用ISO-8859-1)

  • get请求解决乱码 先把参数进行ISO-8859-1解码为字节数组,再重新使用UFT-8编码

  • post请求解决乱码 request.setCharacterEncoding("UFT-8");

请求转发

request.getRequestDispatcher("转发路径").forward(req,resp);

浏览器地址栏路径不发生变化 只能转发到当前服务器的内部资源 一次请求,可以在转发的资源间使用request共享数据

方法

方法信息
getMethod()获取请求方式
getLocalAddr()获取服务器ip地址
getLocalPort()获取服务器端口号
getRemoteAddr() 获取客户端ip地址
getRemotePort()获取客户端端口号
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符
getProtocol()(绝对路径)
getServletContext()获取协议及版本
getQueryString()获取ServletContext对象
getQueryString()获取请求信息!限get请求方式
BufferedReader reader=request.getReader()获取信息读取流(get,post通用)
reader.readLine()通过流获取请求信息
request.getParameterMap()获取参数的map集合(get,post通用)
request.getParameter(“参数名”)获取对应的参数值(get,post通用)
request.getParameterValues(“参数名”)获取对应的参数值数组(get,post通用)

HttpServletResponse(响应类)

响应正文

有两种响应,字符响应流、字节响应流

解决中文乱码:response.setContentType("text/html;charset=utf-8") || response.setCharacterEncoding("UTF-8")

字符响应流

PrintWriter out = response.getWriter()

java
// 像前端输出字符
PrintWriter out = response.getWriter();
out.print("abcdefg");

字节响应流

ServletOutputStream out = response.getOutputStream()

java
//获取资源的IO流
InputStream inputStream = getServletContext().getClassLoader().getResourceAsStream("/xxx.jpg");
ServletOutputStream outputStream = response.getOutputStream();
//文件IO操作
byte[] buffer=new byte[10];
int len;
while(true){
int len=inputStream.read(buffer);//当文件读完,返回-1,否则返回读取文件长度
if(len==-1)break;
outputStream.write(buffer);
}

在一个response里面,字节字符两者二选其一即可,否则会产生java.lang.illegalStateException异常

响应头

方法信息
setHeader(String name, String value)适用于单值的响应头
addHeader(String name, String value)适用于多值的响应头
setIntHeader(String name, int value)适用于单值的int类型的响应头
addIntHeader(String name, int value)适用于多值的int类型的响应头
setDateHeader(String name, long value)适用于单值的毫秒类型的响应头
addDateHeader(String name, long value)适用于多值的毫秒类型的响应头

状态码

方法信息
setStatus(int sc)设置状态码
sendError(int sc)设置错误状态码
sendError(int sc,String msg) 设置状态码同时发送消息

重定向

java
setStatus(302);
setHeader("主机名","资源路径")

// 简化
sendRedirect("资源路径");

浏览器地址栏路径发生变化,可以重定向到任意位置的资源(服务器内部、外部均可)两次请求,不能在多个资源使用request共享数据

请求转发和重定向的区别

  1. 请求转发是一个请求一次响应,而重定向是两次请求两次响应
  2. 请求转发地址栏不变化,而重定向会显示后一个请求的地址
  3. 请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
  4. 请求转发和重定向效率是转发高!因为是一个请求!
  5. 需要地址栏发生变化,那么必须使用重定向!
  6. 需要在下一个Servlet中获取request域中的数据,必须要使用转发!

域对象

用途:在不同的Servlet中共享数据

域对象的分类

request:代表一次请求,只能在一次请求中共享数据 session:代表一次会话,只能在一次会话中共享数据 application:代表整个web应用程序,只能在整个web应用程序中共享数据

范围大小:request < session < application