Web组件的三种关联关系

Web应用程序如此强大的原因之一是它们能彼此链接和聚合信息资源。Web组件之间存在三种关联关系:

    ●  请求转发

    ●  URL重定向

    ●  包含

    存在以上关联关系的Web组件可以是JSPServlet,对于Struts应用,则还包括Action。这些Web组件都可以访问HttpServletRequest,和HttpServletResponse对象,具有处理请求、生成响应结果的功能。

1.1  请求转发

请求转发允许把请求转发给同一应用程序中的其他Web组件。这种技术通常用于Web应用控制层的Servlet流程控制器,它检查HTTP请求数据,并将请求转发到合适的目标组件,目标组件执行具体的请求处理操作,并生成响应结果。图1-5显示了一个Servlet把请求转发给另一个JSP组件的过程。

1-5  请求转发

Servlet类使用javaxservletRequestDispatcherforward()方法来转发它所收到的HTTP请求。转发目标组件将处理该请求并生成响应结果,或者将请求继续转发到另一个组件。最初请求的ServletRequestServletResponse对象被传递给转发目标组件,这使得目标组件可以访问整个请求上下文。值得注意的是,只能把请求转发给同一Web应用中的组件,而不能转发给其他Web应用的组件。

    如果当前的Servlet组件要把请求转发给一个JSP组件,如hello.jsp,可以Servlet的 service()方法中执行以下代码:

    RequestDispatcher rd=requestgetRequestDispatcher(hellojsp")

    //Forward to requested URL

    rdforward(request,response)

    JSP页面中,可以使用<jspforward>标签来转发请求,例如:

    <jspforward page="hellojsp"/>

    对于请求转发,转发的源组件和目标组件共享request范围内的共享数据

1.2  请求重定向

    请求重定向类似于请求转发,但也有一些重要区别

    ●  Web组件可以将请求重定向到任一URL,而不仅仅是同一应用中的URL

    ●  重定向的源组件和目标组件之间不共用同一个HttpServletRequest对象,因此不能共享request范围内的共享数据。

1-6显示了一个Servlet把请求重定向给另一个JSP组件的过程。

1-6 请求重定向

 

    如果当前应用的Servlet组件要把请求转发给URLhttp//jakartaapacheorg/stmts”,可以Servletservice()方法中执行以下代码:

response,sendRedirect(“http//jakarta.apacheorg/stmts/)

                 ——若传参则在路径后加?action=list类似这样的queryString

    从图1-6中可以看出,HttpServletResponsesendRedirect()方法向浏览器返回包含重定向的信息,浏览器根据这一信息迅速发出一个新HTTP请求,请求访问重定向目标组件。

1.3  包含

包含关系允许一个Web组件聚集来自同一个应用中其他Web组件的输出数据,并使用被聚集的数据来创建响应结果。这种技术通常用于模板处理器,它可以控制网页的布局。模板中每个页面区域的内容来自不同的URL,从而组成单个页面。这种技术能够为应用程序提供一致的外观和感觉。包含关系的源组件和目标组件共用同一个HttpServletRequest对象,因此它们共享request范围内的共享数据。图1-7显示了一个Servlet包含另一个JSP组件的过程。

1-7  Web组件的包含关系

 

    Servlet类使用javax.servlet.RequestDispatcherinclude()方法包含其他的Web组件。例如,如果当前的Servlet组件包含了三个JSP文件:header.jsp\main.jspfooter.jsp,则可以在 Servletservice()方法中执行以下代码:

    RequestDispatcher rd

    rd=reqgetRequestDispatcherC/headerjsp"))

    rdinclude(req,res)

    rd=reqgetRequestDispatcher("/mainjsp"))

    rdinclude(req,res)

    rd=reqgetRequestDispatcher("/footer.jsp"))

rdinclude(reqres)

这样就不再用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>

 

posted @ 2016-01-07 10:10  何鸿涛  阅读(2029)  评论(0)    收藏  举报