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组件的三种关联关系的更多相关文章

  1. 总结 React 组件的三种写法 及最佳实践 [涨经验]

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

  2. 转-Web Service中三种发送接受协议SOAP、http get、http post

    原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...

  3. 在Tomcat中部署web项目的三种方式

    搬瓦工搭建SS教程 SSR免费节点:http://www.xiaokeli.me 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Man ...

  4. #Eclipse web工程 部署 三种方式 3

    Eclipse web工程 部署 三种方式 3.热部署 在Eclipse中,实现 修改一个.java文件或者.jsp文件甚至是配置文件,不需要重启WEB服务器的前提下让修改生效,实现tomcat自动加 ...

  5. Eclipse web工程 部署 三种方式 2

    Eclipse web工程 部署 三种方式 2.插件 tomcat插件下载: http://www.eclipsetotale.com/tomcatPlugin.html 解压缩后, com.sysd ...

  6. Eclipse web工程 部署 三种方式 1

    Eclipse web工程 部署 三种方式 1.run on 前提: 安装 好 eclipse.jdk.tomcat 然后 新建一个 web工程 注意此处Default output folder 最 ...

  7. Tomcat中部署web应用的三种方式

    Tomcat中部署web应用的三种方式(静态部署)       第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...

  8. tomcat发布web项目的三种方式

    tomcat发布web项目的三种方式 方式一: 配置tomcat 安装目录下的conf/server.xml <Host name="loaclhost">标签里面添加 ...

  9. 总结 React 组件的三种写法 及最佳实践

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

随机推荐

  1. 绕过CDN查找真实IP方法

    0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有:http://ping.china ...

  2. Event-Driven Architecture思考

    什么是Event? An event represents a fact, something happened; and it is immutab. 事件代表着事实,代表着过去发生的某件事情,是不 ...

  3. 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版

    截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...

  4. Ethical Hacking - GAINING ACCESS(22)

    CLIENT SIDE ATTACKS - BeEf Framework Browser Exploitation Framework allowing us to launch a number o ...

  5. Ethical Hacking - NETWORK PENETRATION TESTING(18)

    Session Hijacking What if the user uses the "remember me" feature? If the user uses this f ...

  6. Java 线程与同步的性能优化

    本文探讨的主题是,如何挖掘出Java线程和同步设施的最大性能. 1.线程池与ThreadPoolExecutor 1)线程池与ThreadPoolExecutor 线程池的实现可能有所不同,但基本概念 ...

  7. fastjson将json字符串转化为java对象

    目录 一.导入一个fastjson的jar包 二.Json字符串格式 三.根据json的格式创建Java类 四.给java类的所有属性添加setter方法 五.转换为java对象 一.导入一个fast ...

  8. html命名规则

    CSS样式命名 外套 wrap ------------------用于最外层 头部 header ----------------用于头部 主要内容 main ------------用于主体内容( ...

  9. tk.mybatis selectByPrimaryKey无法正确识别主键

    selectByPrimaryKey无法正确识别主键,查看日志,发现报如下错误: ==> Preparing: SELECT username,password,name,age,sex,bir ...

  10. humlbe bundle如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 humlbe bundle如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的 ...