drp——Web组件交互的转发、包含

本文介绍了Web组件协作的两种方式:请求转发和包含。请求转发时,源组件预处理后将请求转发给目标组件完成响应;包含则是源组件将目标组件的响应结果整合到自身响应中。两者都依赖于`javax.servlet.RequestDispatcher`接口,共享同一请求和响应对象。通过ServletContext或ServletRequest获取RequestDispatcher对象,实现目标组件的指定。文中还提供实例展示了请求转发和包含的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Web组件协作的两种方式

         Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用。一个Servlet对象可否直接调用另一个Servlet对象的service()方法呢?答案是否定的,因为一个Servlet对象无法获得另一个Servlet对象的引用。

    Web应用在响应客户端的一个 请求时,有可能响应过程很复杂,需要多个Web组件共同协作,才能响应结果。尽管一个Servlet对象无法直接调用另一个Servlet对象的service()方法,但是Servlet规范为Web组件之间的协作提供了两种途径。

1、请求转发

Servlet(源组件)先对客户请求做一些预处理操作,然后把请求转发给其它Web组件(目标组件)来完成包括生成响应结果在内的后续操作。

2、包含

Servlet(源组件)把其它Web组件(目标组件)生成的响应结果包含到自身的响应结果中。

3.请求转发与包含的共同点

(1)源组件和目标组件处理的都是同一个客户请求,源组件和目标组件共享同一个ServletRequest对象和ServletResponse对象

(2)目标组件都可以为ServletjspHTML文档

(3)都依赖javax.servlet.RequestDispatcher接口


二、javax.servlet.RequestDispatcher接口

    它表示请求分发器。存在两个方法

1.forward()方法:把请求转发给目标组件,声明如下:   

Public void forward(ServletRequest request,ServletResponse response)
	throws ServletException,java.io.IOException

2.include()方法:包含目标组件的响应结果,声明如下:

Public void include(ServletRequet request,ServletResponse response)
	throws ServletException,java.io.IOException

说明:

1.Servlet源组件调用RequestDispatcher时,都要把当前的ServletRequest对象和ServletResponse对象作为参数传给它的forward()Include()方法。这时的源组件和目标组件共享同一个ServletRequest对象和ServletResponse对象。

2.Servlet可通过两种方式得到ResquestDispatcher对象

(1)调用ServletContext的getRequestDispatcher(String path)方法,path参数指定目标组件的绝对路径。

(2)调用ServletRequest的getRequestDispather(String path)方法,path参数指定目标组件的路径。


三、实例

1.请求转发

Public class CheckServlet extends GenericServlet{
	/**响应客户请求
	Public void service(ServletRequest request,ServletResponse response)
	throws ServletException,IOException{

		//读取用户名
		String username = request.getParameter("username");
		String message = null;
		If(username == null){
			Message="Please input username.";
		}else{
			Message="Hello," + username;
		}

		//在request对象中添加msg属性
		request.setAttribute("msg",message);
	
		//把请求转发给OutputServlet
		//使用ServletContext,path路径为绝对路径
		ServletContext context = getServletContext();
		RequestDispatcher dispatcher = context.getRequestDispatcher("/output");
		//使用ServletRequest,path路径可以为绝对路径,也可以为相对路径
		//RequestDispatcher dispatcher = request.getRequestDispatcher("output");

		PrintWrite out = response.getWriter();
	
		out.println("Output from CheckServlet before fowrwarding request.");
		System.out.println("Output from CheckServlet before forwarding request.");
	
		Dispatcher.forward(request,response);
	
		out.println("Output from CheckServlet after forwarding request.");
		System.out.println("Output from CheckServlet after forwarding request.");	
	}
}

Public class OutputServlet extends GenericServlet{
	Public void service(ServletRequest request,ServletResponse response)
	Throws ServletException,IOException{
	
		//读取CheckServlet存放在请求范围内的消息
		String message = (String)requet.getAttribute("msg");
		PrintWriter out = response.getWriter();
	
		out.println(message);
		out.close();
	}
}

2.包含

Public class MainServlet extends HttpServlet{
	Public void doGet(HttpServletRequest request,HttpServletResponse response)
	throws ServletException,IOException{
		//设置HTTP响应的正文的数据类型
		Response.setContentType("text/html");
		
		//输出HTML文档
		PrintWriter out = response.getWriter();
		out.println("<html></head><title>MainServlet</title></head>");
		out.println("<body>");
		
		ServletContext context = getServletContext();
		RequestDispatcher headDispatcher = context.getRequestDispatcher("/header.htm");
		RequestDispatcher greetDispatcher = context.getRequestDispatcher("/greet");
		RequestDispatcher footerDispacher = context.getRequestDispatcher("footer.htm");
		
		//包含header.htm
		headerDispatcher.include(request,response);
		
		//包含GreetServlet输出的HTML文档
		greetDispatcher.include(request,response);
		
		//包含footer.htm
		footerDispatcher.include(request,response);
		
		out.println("</body></html>");
		
		//关闭输出流
		out.close();
	}
}

说明:MainServlet类把header.htm的内容、GreetServlet生成的响应正文,以及foot.htm的内容都包含到自己的响应结果中,也就是说,MainServlet返回给客户的HTML文档是有MainServlet本身、header.htm、GreetServlet,以及foot.htm共同产生的。


总结:

Web组件的协作中不论转发、包含都是借助分发器ResquestDispatcher来实现,涉及到的目标组件,可以是HTML、JSP或者Servlet。Servlet容器每次接收到一个客户的请求,都会创建一个针对于ServletRequest、ServletResponse对象,然后把这两个对象作为参数传给响应的Servlet的服务方法。当容器把本次响应结果返回给客户,ServletRequest对象和ServeltResponse对象就结束生命周期。

基于HTML,CSS,JAVASCRIPT的简洁灵活的流行前端框架及交互组件集。 适用于任何场景,适用于每一个人 需要理由来爱上Bootstrap么?那就请接着向下看。 由匠人建,为匠人用 和您一样,我们乐于创造出色的web应用,于是想帮助更多象我们一样的匠人更为高效快捷地构建产品。Bootstrap因此而生。 适应各种技术水平 Bootstrap适应不同技术水平的从业者,无论是设计师还是程序员,大牛还是菜鸟。既能用来开发简单的小东西,也能构造更为复杂的应用。 跨设备,跨浏览器 最初设想中的Bootstrap只支持现代浏览器,不过新版本已经能支持所有主流浏览器(甚至包括IE7)。从Bootstrap 2开始,提供对平板和智能手机的支持。 12列栅格布局 栅格系统不是万能的,不过在应用的核心层有一个稳定和灵活的栅格系统确实可以让开发变得更简单。可以选用内置的栅格或是自己手写。 响应式设计 从Bootstrap 2开始,提供完整的响应式特性。所有的组件都能根据分辨率和设备灵活缩放,从而提供一致性的用户体验。 样式化的文档 与其他前端工具箱不同,Bootstrap优先设计了一个样式化的使用指南,不仅用来介绍特性,更用以展示最佳实践,应用以及代码实例。 不断完善的库 尽管只有10kb(gzip压缩后),Bootstrap却仍是最完备的前端工具箱之一,提供了几十个全功能的随时可用的组件。 定制的jQuery插件 一个出色的组件设计岂能没有易用易扩展的人机界面?Bootstrap为此提供了定制的jQuery内置插件。 用LESS构建 当传统的枯燥CSS写法止步不前时,LESS横空出世了。LESS中使用变量,嵌套,操作,混合编码,花费很小成本却让书写CSS更快更灵活。 HTML5 支持HTML5标签和语法 CSS3 逐步改进组件达到最终效果 开源 全部托管于 GitHub. Twitter制造 由经验丰富的工程师和设计师奉献
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值