Web组件的三种关联关系
Web应用程序如此强大的原因之一是它们能彼此链接和聚合信息资源。Web组件之间存在三种关联关系:
● 请求转发
● URL重定向
● 包含
存在以上关联关系的Web组件可以是JSP或Servlet,对于Struts应用,则还包括Action。这些Web组件都可以访问HttpServletRequest,和HttpServletResponse对象,具有处理请求、生成响应结果的功能。
1.1 请求转发
请求转发允许把请求转发给同一应用程序中的其他Web组件。这种技术通常用于Web应用控制层的Servlet流程控制器,它检查HTTP请求数据,并将请求转发到合适的目标组件,目标组件执行具体的请求处理操作,并生成响应结果。图1-5显示了一个Servlet把请求转发给另一个JSP组件的过程。

图1-5 请求转发
Servlet类使用javax.servlet.RequestDispatcher.forward()方法来转发它所收到的HTTP请求。转发目标组件将处理该请求并生成响应结果,或者将请求继续转发到另一个组件。最初请求的ServletRequest和ServletResponse对象被传递给转发目标组件,这使得目标组件可以访问整个请求上下文。值得注意的是,只能把请求转发给同一Web应用中的组件,而不能转发给其他Web应用的组件。
如果当前的Servlet组件要把请求转发给一个JSP组件,如hello.jsp,可以在Servlet的 service()方法中执行以下代码:
RequestDispatcher rd=request.getRequestDispatcher("hello.jsp");
//Forward to requested URL
rd.forward(request,response);
在JSP页面中,可以使用<jsp:forward>标签来转发请求,例如:
<jsp:forward page="hello.jsp"/>
对于请求转发,转发的源组件和目标组件共享request范围内的共享数据。
1.2 请求重定向
请求重定向类似于请求转发,但也有一些重要区别:
● Web组件可以将请求重定向到任一URL,而不仅仅是同一应用中的URL。
● 重定向的源组件和目标组件之间不共用同一个HttpServletRequest对象,因此不能共享request范围内的共享数据。
图1-6显示了一个Servlet把请求重定向给另一个JSP组件的过程。

图1-6 请求重定向
如果当前应用的Servlet组件要把请求转发给URL“http://jakarta.apache.org/stmts”,可以在Servlet的service()方法中执行以下代码:
response,sendRedirect(“http://jakarta.apache.org/stmts/”);
——若传参则在路径后加”?action=list”类似这样的queryString串
从图1-6中可以看出,HttpServletResponse的sendRedirect()方法向浏览器返回包含重定向的信息,浏览器根据这一信息迅速发出一个新HTTP请求,请求访问重定向目标组件。
1.3 包含
包含关系允许一个Web组件聚集来自同一个应用中其他Web组件的输出数据,并使用被聚集的数据来创建响应结果。这种技术通常用于模板处理器,它可以控制网页的布局。模板中每个页面区域的内容来自不同的URL,从而组成单个页面。这种技术能够为应用程序提供一致的外观和感觉。包含关系的源组件和目标组件共用同一个HttpServletRequest对象,因此它们共享request范围内的共享数据。图1-7显示了一个Servlet包含另一个JSP组件的过程。

图1-7 Web组件的包含关系
Servlet类使用javax.servlet.RequestDispatcher.include()方法包含其他的Web组件。例如,如果当前的Servlet组件包含了三个JSP文件:header.jsp\main.jsp和footer.jsp,则可以在 Servlet的service()方法中执行以下代码:
RequestDispatcher rd;
rd=req.getRequestDispatcherC/header.jsp"))
rd.include(req,res);
rd=req.getRequestDispatcher("/main.jsp"))
rd.include(req,res);
rd=req.getRequestDispatcher("/footer.jsp"))
rd.include(req,res);
这样就不再用rd.forward(req,res);来转发请求了!
在JSP文件中,可以通过<include>指令来包含其他的Web资源,例如:
静态包含:
<%@include file="header.jsp?action=list"%> ——这里可以以这种方式传参
<%@include file="main.jsp"%>
<%@include file="footer.jsp"%>
Or
动态包含:
<jsp:include page="Header.jsp">
<jsp:param name=”” value=””> ——这里可以以这种方式传参
</jsp:include>
Web组件的三种关联关系的更多相关文章
- 总结 React 组件的三种写法 及最佳实践 [涨经验]
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- 转-Web Service中三种发送接受协议SOAP、http get、http post
原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...
- 在Tomcat中部署web项目的三种方式
搬瓦工搭建SS教程 SSR免费节点:http://www.xiaokeli.me 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Man ...
- #Eclipse web工程 部署 三种方式 3
Eclipse web工程 部署 三种方式 3.热部署 在Eclipse中,实现 修改一个.java文件或者.jsp文件甚至是配置文件,不需要重启WEB服务器的前提下让修改生效,实现tomcat自动加 ...
- Eclipse web工程 部署 三种方式 2
Eclipse web工程 部署 三种方式 2.插件 tomcat插件下载: http://www.eclipsetotale.com/tomcatPlugin.html 解压缩后, com.sysd ...
- Eclipse web工程 部署 三种方式 1
Eclipse web工程 部署 三种方式 1.run on 前提: 安装 好 eclipse.jdk.tomcat 然后 新建一个 web工程 注意此处Default output folder 最 ...
- Tomcat中部署web应用的三种方式
Tomcat中部署web应用的三种方式(静态部署) 第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...
- tomcat发布web项目的三种方式
tomcat发布web项目的三种方式 方式一: 配置tomcat 安装目录下的conf/server.xml <Host name="loaclhost">标签里面添加 ...
- 总结 React 组件的三种写法 及最佳实践
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
随机推荐
- 什么是A站、B站、C站、D站、E站、F站、G站、HIJKLM站N站?
A站AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站.A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量 ...
- void operator()()的功能
在学习多线程的时候看到这样的一段代码,为什么要重载()呢?真有这个必要吗? #include <iostream> #include <thread> class Counte ...
- 通过代理模块拦截网页应用程序流量 - Intercept Web Application Traffic Using Proxy Modules
测试网站: http://testphp.vulnweb.com/login.php 浏览器代理设置为:127.0.0.1:8080 查看拦截流量: 方式1:通Proxy - Intercept 方式 ...
- C++语法小记---一个有趣的现象
下面的代码会飞吗? #include <iostream> #include <string> using namespace std; class Test { public ...
- 橘子origin游戏平台如何绑定登陆验证/二次验证码?
任天堂游戏公司4月份16万用户数据被黑客盗取,官方呼吁用户绑定二次验证码.疫情期间游戏用户暴涨,黑客活动频率也在增长,想起R星俱乐部用户绑定两步验证给十金的长期活动实在是明智之举,下面说下橘子游戏平台 ...
- android 6.0三星5.1.1Root
现在google是越来越不给我们留活路了… 从android 6.0开始, 三星的5.1.1开始. 默认都开启了data分区的forceencryption, 也就是强制加密. 也开启了/system ...
- Android集成Zxing
1.在build文件中添加依赖 dependencies { //ZXing implementation 'com.google.zxing:core:3.3.3' implementation(' ...
- Arch Linux, 无法启动进入sddm登录
启动Arch Linux 的时候全屏就一个错误"Failed to start Load/Save Screen Backlight Brightness of backlight:acpi ...
- 对‘sqrt’未定义的引用
首先, 引用数学库 #include<math.h> 引用数学库时,要在编译后加上-lm 是每一个都要加!! 如下: gcc su.c -o su.o -lm gcc -g su.c - ...
- Python os.chflags() 方法
概述 os.chflags() 方法用于设置路径的标记为数字标记.多个标记可以使用 OR 来组合起来.高佣联盟 www.cgewang.com 只支持在 Unix 下使用. 语法 chflags()方 ...