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)是一个域对象
- 1)获取求情参数
- 代表
-
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)重定向中的路径
- 1)html标签中的路径
- 如果路径由服务器解析:/ 就代表当前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中也会使用该字符集进行编码
- 响应由服务器发送给浏览器
网友评论