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. bzoj3526[Poi2014]Card*

    bzoj3526[Poi2014]Card 题意: 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].有m个操作,第i个操作会交换c[i]和d[i]两 ...

  2. js 自定义阻止事件冒泡函数

    // 以下改方法全兼容Chrome function stopBubble(event){ if(event.stopPropagation){   // 兼容火狐(firebox) event.st ...

  3. Java常用API(ArrayList类)

    Java常用API(ArrayList类) 我们为什么要使用ArrayList类? 为了更加方便的储存对象,因为使用普通的数组来存储对象太过麻烦了,因为数组的一个很大的弱点就是长度从一开始就固定了,所 ...

  4. Windows File Recovery - 微软官方文件恢复工具

    假如你不小心误删除了文件或因各种意外情况丢失数据后,你可以通过 微软这款工具 这个工具来尝试恢复它们.WinFR 工具支持读取本机硬盘.移动硬盘.U 盘,或者连接相机.手机.使用读卡器来恢复 SD.T ...

  5. 【日常摘要】- RabbitMq实现延时队列

    简介 什么是延时队列? 一种带有延迟功能的消息队列 过程: 使用场景 比如存在某个业务场景 发起一个订单,但是处于未支付的状态?如何及时的关闭订单并退还库存? 如何定期检查处于退款订单是否已经成功退款 ...

  6. Linux系统中(CentOS 7)的用户和权限管理

    目录 用户和组 用户信息文件 用户密码信息 相关命令 用户管理 组管理 密码管理 权限管理 文件的详细信息 文件权限 相关命令 用户和组 用户信息文件 /etc/passwd (1 2 3 4 5 6 ...

  7. Flutter日常笔记

    factory修饰的构造方法 表示不是每次返回的都是新创建出来的对象, 可以取内存中已有的, 比如单例模式的书写 每次返回的都是一个实例, 这时要使用factory修饰构造方法 flutter不要求显 ...

  8. 第一课:Centos下配置java环境变量的两种方式(jdk1.8)

    配置java环境(yum安装) 1.查出java1.8的全部版本 yum list java-1.8* 2.安装你需要的java1.8 版本(安装的名字根据查询出来的结果输入这里只是举例) yum i ...

  9. Python 简明教程 --- 26,Python 多进程编程

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 学编程最有效的方法是动手敲代码. 目录 1,什么是多进程 我们所写的Python 代码就是一个程序, ...

  10. Salt组件(一)

    一.管理对象属性(Grains) Grains里面记录着每台Minion的一些常用属性,比如CPU.内存.磁盘.网信息等,我们可以通过grains.items查看某台Minion的所有Grains信息 ...