java Web第五章 Day5 2020080605018

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接口中,定义了两种方法。

  1. forward(ServletRequestt request,ServletResponse response)
  2. 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地址是不会发生变化的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值