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