request对象和response对象【重要】
无论在doGet方法还是doPost方法都有HttpServletRequest和HttpServletResponse对象形参。
1 request请求对象
类型:HttpServletRequest。
概念:request对象封装浏览器向服务器发送请求时的请求报文【请求行,请求头,请求体】,该对象由服务器创建,以参数形式传入service(),最终传入doPost()或doPost()方法。
作用:
1 获取请求行
- 获取请求方式:request.getMethod()
- 获取URI:request.getRequestURI()【当前上下文资源路径】
- 获取URL:request.getRequestURL()【绝对路径(从服务器开始的路径)】
- 获取协议:request.getScheme()
- 获取服务器名称:request.getServerName()
- 获取服务器端口号:request.getServerPort()
2 获取请求头:request.getHeader(String 参数名)
3 获取请求参数:
- request.getParameter(String 参数名) 【获取请求参数,单个参数单个值】
- request.getParameterValues()【获取请求参数,单个参数多个值(如复选框)】
- request.getParameterMap()【获取请求参数,多个参数多个值,能够获取所有参数,返回的是Map】
4 请求转发:
①获取转发器
RequestDispather requestdispatcher = request.getRequestDispather;
②执行转发
requestdispatcher.forward(String url);
请求转发地址栏地址不会改变,一次请求两次响应。
5 request是域对象,具有以下方法,
- request.setAttribute()
- request.getAttribute()
- request.getServletContext()
- request.removeAttribute()
2 response响应报文
类型:HttpServletResponse
概念:response对象封装服务器向浏览器做出响应时的响应报文【响应头,相应行,响应体】,该对象由服务器创建,以参数形式传入service(),最终传入doPost()或doPost()方法。
作用:
-
设置响应行
- 设置状态码【比如强行抛出404,但是基本不会这样用】
-
设置响应头
- 设置文本类型以及字符集 response.setHeader("Content-Type","text/html;charset=utf-8")【解决乱码】
-
设置响应体
-
获取响应流,响应数据response.getWriter(); 测试写入数据: response.getWriter().write("success");
-
重定向【路径跳转】 response.sendRedirct(String url);
重定向地址栏路径改变,两次请求两次响应。
-
3 转发与重定向的区别
- 转发地址栏不变,重定向地址栏改变
- 转发携带request对象,重定向不带
- 转发只进行了一次请求,重定向进行了两次请求。
- 转发可以访问WEB-INF目录下的资源。重定向不能直接访问WEB-INF目录下的资源。
WEB-INF下目录属于服务器私有的,服务器内部可以访问,浏览器不能直接访问。
Web应用中的乱码问题
乱码情况:
1 请求乱码:
POST方式发送请求时,出现乱码;
GET方式发送请求时,未出现乱码。
2 响应乱码
响应过程中,默认出现乱码
1 基本概念
字符集:指的是所有字符集合,包括【中文,英文字符,各个国家字符以及标点符号等】
常用字符集有:UTF-8【支持比较大量的中文字符】、GBK【GB2312支持少量中文字符】、ISO-8859-1【不支持中文字符】等。
编码与解码:
编码:将字符转换为二进制的过程。
解码:将二进制转换为字符的过程。
乱码:编码与解码使用的字符集不一致时,出现的乱码现象。
2 浏览器与服务器默认编码与解码情况
服务器默认编码与解码一致为:ISO-8859-1【不支持中文】
浏览器:
默认编码:<mete charset="UTF-8">
默认解码:GBK
3 默认请求与响应乱码情况
乱码种类
1 浏览器向服务器发送请求时,出现乱码:请求乱码。
- 浏览器编码与服务器解码不一致
2 服务器向浏览器做出响应时,出现乱码:响应乱码
- 服务器编码与浏览器解码不一致
4 解决乱码
(1)解决请求乱码
①解决GET请求乱码
Tomcat8.5以及以后的版本,不用解决【服务器默认解决GET请求乱码问题】。
Tomcat7 解决方案:
思路:找到修改端口号8080的位置,设置字符集问题。
代码位置:tomcat——>conf——>server.xml
<connector URIEncoding="UTF-8" port="8080" protocol = "HTTP/1.1"
connectionTimeout="20000"
redirectPort = "8443" />
②解决POST请求乱码
思路:浏览器编码【UTF-8】与服务器解码【ISO-8859-1】不一致。将服务器解码设置为:UTF-8
代码:
request.setCharacterEncoding("UTF-8");
(2)解决响应乱码
思路:服务器编码【ISO-8859-1】与浏览器编码【GBK】不一致。
代码:
方法1 将服务器编码设置为:GBK
response.setCharacterEncoding("GBK");
方法2 将服务器编码与解码均设置为:UTF-8【推荐使用】
response.setContentType("text/html;charset=UTF-8");
总结:三行代码解决请求与响应乱码问题
web应用中的绝对路径
web应用中路径问题:由于使用转发跳转路径时,转发地址栏不变,此时使用相对路径不可靠【../】,可能出现404。所以建议使用绝对路径
1 什么是绝对路径
以【/】开头路径,称之为绝对路径。
2 【/】代表的意义
- 服务器解析【/】,代表当前上下文路径,即为:http://localhost:8080/项目名。以下两种情况由服务器解析【/】
- 注册中的【/】,web.xml中【/】或者注解。
- 转发中的【/】
- 浏览器解析【/】,代表当前服务器路径,即为:http://localhost:8080。以下两种情况由浏览器解析【/】
- html代码中使用【/】,如:<a><form><script>等
- 重定向中【/】
3 Servlet注册路径问题
Servlet默认路径注册在当前上下文路径下,比如在web.xml中声明servlet路径时所写的。
<url-pattern>/RegistServlet</url-pattern>
运行期间的【上下文】路径,相当于编写代码期间的【web】路径。
运行时servlet是在web目录下的。
路径问题示例代码
html代码
<head>
<meta charset="UTF-8">
<title>登录成功</title>
<base href="/day06_Servlet/">
</head>
<body>
<h2>登录成功!</h2>
<br>
<a href="index.html" target="_self">回首页</a>
</body>
Servlet代码
//登录成功:使用转发跳转login_success.html
request.getRequestDispatcher("/page/login_success.html").forward(request,response);
//登录失败:使用重定向跳转回login.html
response.sendRedirect(request.getContextPath()+"/page/login.html");
基于注解【JavaEE6(web3.0)】注册Servlet
示例代码
//@WebServlet(name = "Servlet30",value={"/Servlet30","/Servlet3"})
@WebServlet(name = "Servlet30",value="/Servlet30")
public class Servlet30 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet30");
}
}