HttpServlet请求与响应
处理请求的流程
服务器每次收到请求时,都会为这个请求开辟一个新的线程。
服务器会把客户端的请求数据封装到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()
// 像前端输出字符
PrintWriter out = response.getWriter();
out.print("abcdefg");
字节响应流
ServletOutputStream out = response.getOutputStream()
//获取资源的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) | 设置状态码同时发送消息 |
重定向
setStatus(302);
setHeader("主机名","资源路径")
// 简化
sendRedirect("资源路径");
浏览器地址栏路径发生变化,可以重定向到任意位置的资源(服务器内部、外部均可)两次请求,不能在多个资源使用request共享数据
请求转发和重定向的区别
- 请求转发是一个请求一次响应,而重定向是两次请求两次响应
- 请求转发地址栏不变化,而重定向会显示后一个请求的地址
- 请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
- 请求转发和重定向效率是转发高!因为是一个请求!
- 需要地址栏发生变化,那么必须使用重定向!
- 需要在下一个Servlet中获取request域中的数据,必须要使用转发!
域对象
用途:在不同的Servlet中共享数据
域对象的分类
request
:代表一次请求,只能在一次请求中共享数据session
:代表一次会话,只能在一次会话中共享数据application
:代表整个web应用程序,只能在整个web应用程序中共享数据
范围大小:request < session < application