1. 编码问题:
请求编码:
GET请求:GET没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
只能得到数据后变成字节,再将字节重新用utf-8编码
String name = request.getParameter(“name”);
name = new String(name.getBytes(“iso-8859-1”), “utf-8”);
POST请求:在使用request.getParameter()获取请求参数之前先通过request.setCharacterEncoding()来指定编码
request.setCharacterEncoding(“utf-8”);
String name = request.getParameter(“name”);
响应编码:
在使用response.getWriter()发送数据之前,一定要设置response.getWriter()的编码,使用response.setCharacterEncoding()方法。
response.setContentType(“text/html;charset=utf-8”)包含两部分:
1.response.setCharactorEncoding(“utf-8”) 设置字符编码为utf-8编码,输出的数据为utf-8编码;
2.设置了响应头content-type编码为utf-8,告诉浏览器用utf-8编码,浏览器就会用utf-8解析。
2. Response:
1.设置响应头信息
response.setHeader(“content-type”, “text/html;charset=utf-8”);
2.发送状态码
response.setStatus(200):设置状态码;
3.设置响应正文
PrintWriter out = response.getwriter(); // 获取响应字节流对象
ServletOutputStream out = response.getOutputStream(); // 获取响应字符流对象
4.重定向,服务器通知浏览器去访问另一个地址,即再发出另一个请求。
response.sendRedirect("/hello/BServlet"); 重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据
3. Request:
1.封装了请求头数据
String getHeader(String name):获取指定名称的请求头;
String getParameter(String name):通过指定名称获取参数值;
2.封装了请求正文数据,如果是GET请求,那么就没有正文;
3.request是一个域对象,可以把它当成Map来添加获取数据
void setAttribute(String name, Object value)
Object getAttribute(String name)
4.request提供了请求转发和请求包含功能
请求转发,在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成。
RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
rd.forward(request, response);
请求包含
RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
rd.include(request, response);
4. Reques获取其他域对象:
获取HTTPSession域对象
HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回;
注:参考崔希凡老师的文档