1.请求和响应
- HttpServletRequest request
-
- 代表
-
- request代表浏览器发送给服务器的请求报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在这两个方法中可以直接使用
- 作用
-
- 1)获取请求参数
String userName = request.getParameter("username");
String password = request.getParameter("password");
-
-
- 2)获取当前Web应用的虚拟路径
-
String contextPath = request.getContextPath();
-
-
- 3)转发
-
//获取转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("success.html");
//转发请求
dispatcher.forward(request, response);
-
-
- 4)是一个域对象(下回分解)
-
- HttpServletResponse response
-
- 代表
-
- response代表服务器发送给浏览器的响应报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在这两个方法中可以直接使用
- 作用
-
- 1)给浏览器响应一个页面或页面的一个片段
//响应一个页面的片段
writer.write("<h1>Response Success!</h1>");
//响应一个完整的页面
writer.write("<!DOCTYPE html>");
writer.write("<html>");
writer.write("<head>");
writer.write("<meta charset='UTF-8'>");
writer.write("<title>Insert title here</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("<h1>登录成功!</h1>");
writer.write("</body>");
writer.write("</html>");
-
-
- 2)重定向
-
response.sendRedirect("success.html");
- 转发与重定向的区别
-
- 1)转发发送一次请求;重定向发送两次请求
- 2)转发浏览器地址栏地址无变化;重定向浏览器地址栏地址有变化
- 3)转发可以访问WEB-INF下的资源;重定向不能访问WEB-INF下的资源
- 4)转发可以共享request域中的属性;重定向不能共享request域中的属性
2.Web应用中的路径问题
- 相对路径不靠谱
-
- 在转发的情况下,由于地址栏地址无变化,有时候就可以导致浏览器解析地址错误,所以不建议使用相对路径,建议使用绝对路径
- 绝对路径
-
- 什么绝对路径:以 / 开头的路径即为绝对路径
- 绝对路径中 / 代表什么?
-
- 如果路径由浏览器解析: / 就代表当前服务器,例如:http://localhost:8080
- 那些路径由浏览器解析
-
- 1)html标签中的路径
-
- 如img中的src,script标签中的src属性;a标签中的href属性,link标签中的href属性;form表单中的action属性
- 2)重定向中的路径
- 如果路径由服务器解析:/ 就代表当前Web应用,例如:http://localhost:8080/Web01_Servlet_Ex
- 那些路径由服务器解析
-
- 1)web.xml中url-pattern中的路径
- 2)转发中的路径
- base标签
-
- 可以让我们以相对路径的形式来表示绝对路径
<base href="http://localhost:8080/Web01_Servlet_Ex/">
-
- 注意:base标签href属性后面的 / 必须写
3.中文乱码问题
- 编码:将字符转换成二进制数
- 解码:将二进制数转换成字符
- 乱码:编码和解码使用的字符集不一致就会导致乱码
- 请求乱码
-
- 请求由浏览器发送给服务器
-
- 浏览器编码:浏览器编码的字符集有HTML页面决定,具体有HTML页面中的meta标签决定
- 服务器解码:服务器默认的字符集是ISO-8859-1
- 由于两者的字符集不一致所以导致乱码
- 解决方案
-
- 对于POST请求
//该操作一定要在第一次获取请求参数之前
request.setCharacterEncoding("utf-8");
-
-
-
- 对于GET请求
-
- 由于get请求的请求参数在地址栏中,在到达Servlet之前已经被服务器进行解码,所以在Servlet里使用POST请求的方式设置字符集就不管用了。
- 这个时候我们需要改变服务器URL解码的字符集,在server.xml文件中的Connector标签中添加URIEncoding="UTF-8"
-
-
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- 响应乱码
-
- 响应由服务发送给浏览器
-
- 服务器编码:服务器默认的字符集是ISO-8859-1
- 浏览器解码:浏览器解码默认的字符集是GBK
- 解决方案
-
- 通过以下两种方式设置
//通过以下两种方式告诉浏览器使用UTF-8字符集进行解码
//方式一:
// response.setHeader("Content-Type", "text/html;charset=utf-8");
//方式二:
response.setContentType("text/html;charset=UTF-8");
-
-
- 设置了响应头之后浏览器就会使用设置的字符集进行解码,同时在Servlet中也会使用该字符集进行编码
-