java web-----请求与响应(2)
学习目标
1.掌握HttpServletRequest对象的使用
2.掌握RequestDispatcher对象的应用
Servlet最主要的作用就是处理客户端请求,并向客户做出响应。为此,针对Servlet的每次请求,Web服务器在调用servlet ()方法之前都会创建两个对象分别是HttpServletRequest和HttpServletResponse。其中,HttpServletRequest用于封装HTTP请求消息,简称request对象。HttpServletResponse用于封装HTTP响应消息,简称reponse对象。这两个对象在Servlet过程至关重要。如图
这个图是借鉴的上一章节的,需要注意的是,在Web服务器运行阶段,每个Servlet都只会创建一个实例。然而,每次HTTP请求,Web服务器都会调用所请求的Servlet实例的servlet(HttpServletRequest request,HttpServletResponse response)方法,重新创建一个request对象和一个response对象。
一、HttpServletRequest对象
2.1获取请求行信息的方法
HttpServletRequest对象封装了http的消息,也提供了获取请求行、获取请求消息头、获取请求参数的方法。使用这个方法可以解决请求参数中文乱码问题。
二、RequestDispatcher对象的应用
1.RequestDispatcher接口概述:
当一个web资源收到客户端的请求后,如果希望服务器通知另外一个资源去处理请求,这时,除了使用sendRedirect()方法实现请求重定向外,还可以通过RequestDispatcher接口的实例对象来将实现。
方法声明 | 功能描述 |
---|---|
RequestDispatcher getRequestDispatcher(String path) | 返回封装某个路径所指定的资源的RequestDispatcher对象。需要注意:WEB-INF目录中的内容对RequestDispatcher对象也是可见的,因此,传递给RequestDispatcher(String path)方法的资源可以是WEB-INF目录中文件。 |
获取到RequestDispatcher对象后,最重要的工作是通知其他web资源处理当前的Servlet请求,为此,在RequestDispatcher接口中,定义了两种方法。
- forward(ServletRequestt request,ServletResponse response)
- include(ServletRequestt request,ServletResponse response)
2.请求转发
1.请求转发步骤:
1.浏览器——>访问Servlet1——>Web服务器(servlet容器)
2.Servlet1——>forward()——>Servlet2
3.Servlet2——>返回响应结果——>浏览器
从图中可以看出,当客户端访问Servlet1时,可以通过forward()方法来将请求转发给其他web资源,其他web资源处理完请求后,直接将响应结果返回到客户端。
3.请求转发实列
(1)创建RequestForwardServlet类。
public class RequestForwardServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 将数据存储到request对象中
request.setAttribute("company", "北京传智播客教育有限公司");
RequestDispatcher dispatcher = request
.getRequestDispatcher("/ResultServlet");
dispatcher.forward(request, response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
(
4.创建用于ResultServlet类,forward将servlet请求转发到ResultServlet。
ResultServlet:
public class ResultServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 获取PrintWriter对象用于输出信息
PrintWriter out = response.getWriter();
// 获取request请求对象中保存的数据
String company = (String) request.getAttribute("company");
if (company != null) {
out.println("公司名称:" + company + "<br>");
}
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
运行结果为:
访问RequestForwardServlet:
三.请求包含
##1.请求包含步骤*
请求包含指的是使用include()方法将Servlet请求转发给其他Web资源进行处理,与请求转发不同的时,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息
图示:
从图中可以看出,**当客户端访问完Servlet1后,Servlet1通过调用include()方法将其他Web资源包含了进来,**这样,当处理完完毕后,回送给客户端的响应结果既包含了当前Servlet的响应结果,也包含了其他web资源的响应结果。
## 2.测试运行includeServlet:
在测试实列时运行IncludingServlet类,如果不设置如下带代码:
//设置字符编码,不设置可能使本资源和包含资源乱码
response.setContentType("text/html;charset=utf-8");
可能使输出的中文字符乱码的现象
总结
而IncludedServlet中设置响应时使用的字符编码没起到作用。这是因为浏览器在请求IncludingServlet资源时,用于封装响应消息的HttpServletResponse对象已经创建该对象在编码时采用的时默认的ISO-8859-1,所以当客户端对接收到的数据进行解码时,Web服务器会继续保持调用HttpServletResponse对象中的信息,从而使IncludeServlet中的输出内容发生乱码。
注:使用include() 方法实现请求包含后,浏览器显示的URL地址是不会发生变化的。