WEB开发网
开发学院WEB开发Jsp Java Web Framework综述 阅读

Java Web Framework综述

 2008-01-05 18:36:04 来源:WEB开发网   
核心提示:java Web Framework综述0.简介本文介绍Java Web Framework的基本工作原理,和一些常用的开源Web MVC Framework(Struts, Web Work, Tapestry, Echo, JSF, Maverick, SPRing MVC, Turbine, Cocoon, Ba

java Web Framework综述

0.简介

本文介绍Java Web Framework的基本工作原理,和一些常用的开源Web MVC Framework(Struts, Web Work, Tapestry, Echo, JSF, Maverick, SPRing MVC, Turbine, Cocoon, Barracuda)。

Web开发的最重要的基本功是HTTP;Java Web开发的最重要的基本功是Servlet Specification。HTTP和Servlet Specification对于Web Server和Web Framework的开发实现来说,是至关重要的协议规范。

应用和剖析开源Web Framework,既有助于深入把握HTTP & Servlet Specification, 也有助于了解一些现代的B/S Web框架设计思想,如MVC,事件处理机制,页面组件,IoC,AOP等。在这个现代化的大潮中,即使Servlet规范本身也不能免俗,不断引入Filter、Listener等现代框架设计模式。同是Sun公司出品的JSF更是如此。

关于MVC模型、项目简介、配置文件、入门示例等基础知识,网上已经有大量的重复资料信息,本文不再赘述。

文中会提到一些相关的开源项目,和一些编程思想,如有需要,可以用相关的要害字在网上搜索,获取基本的背景知识。

本文力图言简意赅,突出重点。着重描述其他资料没有提到、或很少提到的较重要内容,如运行原理、主流用法,相关知识,要害特性等。

1. Java Web程序工作原理

Tomcat的Server.xml文件中定义了网络请求路径到主机本地文件路径的映射。比如,<context path="/yourapp" docBase="yourapp_dir/webapp"/>

 

我们来看一下,一个HTTP Request-Response Cycle的处理过程。

HTTP Request URL一般分为三段:host, context, path。

如http://yourhost/yourapp/en/index.Html这个URL,分为host=yourhost, context=yourapp, path=en/index.html三段。其中,Context部分由request.getContext()获得,path部分由request.getServletPath()获得(返回结果是“/en/index.html”)。

yourhost主机上运行的Tomcat Web Server接收到这个URL,根据Context定义,把yourapp这个网络路径映射为yourapp_dir/webapp,并在此目录下定位en/index.html这个文件,返回到客户端。

 

假如我们这个URL更换为http://yourhost/yourapp/en/index.jsp,这个时候Tomcat会试图把yourapp_dir/webapp/en/index.jsp文件编译成Servlet,并调用运行这个Servlet。

我们再把这个URL更换为http://yourhost/yourapp/en/index.do。

注重,戏剧化的事情就发生在这个时候,Servlet规范中最重要的类RequestDispatcher登场了。RequestDispatcher根据WEB-INF/web.xml配置文件的定义,调用对应的Servlet来处理en/index.do这个路径。

假设web.xml里面有这样的定义。

  <servlet>

   <servlet-name>DispatchServlet</servlet-name>

   <servlet-class>yourapp.DispatchServlet</servlet-class>

  </servlet>

  <servlet-mapping>

   <servlet-name>DispatchServlet</servlet-name>

   <url-pattern>*.do</url-pattern>

  </servlet-mapping>

那么,RequestDispatcher会调用yourapp.DispatchServlet类处理这个路径。

假如web.xml没有定义对应en/index.do这个路径的Servlet,那么Tomcat返回“您请求的资源不存在”。

RequestDispatcher用于Web Server中,也可以用于应用程序中进行处理转向,资源定位。比如,我们在处理en/index.do的代码中调用,

request.getRequestDispatcher(“cn/index.jsp”).forward(request, response), 就可以转交另外的资源cn/index.jsp来处理。

 

几乎所有的Web Framework都需要定义自己的Dispatch作用的Servlet,并调用RequestDispatcher进行转向处理。

阅读Web Framework源代码,有两条主要线索,(1)根据web.xml找到对应的Servlet类;(2)搜索包含“RequestDispatcher”词的代码文件。

 

我们看到,request, response  这两个参数,被RequestDispatcher在各种Servlet之间传来传去(JSP也是Servlet)。所以,request的setAttribute()和getAttribute()方法是Servlet之间传送数据的主要方式。

在MVC结构中,一般的处理流程如下:

处理HTTP Request的基本单位一般称为Action,是一个比Servlet轻量得多的接口定义,通常只有一两个方法,如execute(perform), validate等。

我们知道,URL->Servlet映射,定义在Web.xml配置文件里,但MVC框架通常会有另外一个定义URL-> Action映射的配置文件。

入口Dispatcher Servlet根据URL -> Action的映射关系,把请求转发给Action。

Action获得输入参数,调用商业逻辑,并把结果数据和View标识给(Model & View)返回给Dispatcher Servlet。

Dispatcher Servlet根据这个View 标识,定位相应的View Template Path,把处理转交给View(JSP +TagLib, Velocity, Free Marker, XSL等)。

View一般通过request.getAttribute()获得结果数据,并显示到客户端。至于是谁把结果数据设置到request.attribute里面,有两种可能:Action或Dispatcher Servlet。

2. Struts

http://struts.apache.org/

Struts是目前用户群最大、开发厂商支持最多的开源Web Framework。

Struts劳苦功高,为普及MVC框架作出了不可磨灭的贡献。显赫的声望,趋于老化的厚重结构,令Struts成为很多现代Web Framework参照、挑战的目标。

 

Struts应用主要包括3件事情: 配置struts-config.xml文件,实现Action类,实现View;还有一些高级扩展用法。下面分别讲述。

 

1. 配置struts-config.xml文件:

Struts支持多级配置文件,具体用法和限制,详见Struts文档。这里只讨论struts-config.xml主流配置的内容。:-)

 

(1) URL Path到Action的映射。

如<action path="/LogonSubmit" type="app.LogonAction" ... />

 

Struts的入口Servlet是ActionServlet。

ActionServlet需要此信息把URL Path调用对应的Action类处理。

在Struts运行期间,一个URL Path,只存在一个对应的Struts Action实例。所有的该URL Path的请求,都经过这同一个Struts Action实例处理。所以Struts Action必须线程安全。

想想看,其实这个要求并不过分,Action只是一个处理程序,不应该保存跨HTTP请求的状态数据,按理来说,也应该做成线程安全的。

 

(2) Template Name到View Template Path的映射。

<forward name="sUCcess" path="/pages/Welcome.jsp"/>

 

Action类返回一个Template Name,ActionServlet根据这个Template Name获得对应的View Template Path,然后调用

request.getRequestDispatcher(“View Template Path”),把处理转向路径对应的Servlet。在这个例子中,是转向/pages/Welcome.jsp编译后的Servlet。

 

我们来看一个一个Velocity的例子。

<include name="success" path="/pages/Welcome.vm"/>

web.xml的定义如下

<servlet>

  <servlet-name>velocity</servlet-name>

<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name>velocity</servlet-name>

  <url-pattern>*.vm</url-pattern>

</servlet-mapping>

 

这时,request.getRequestDispatcher(“/pages/Welcome.vm”)会调用VelocityViewServlet,由VelocityViewServlet负责装并驱动运行/pages/Welcome.vm这个模板文件。

这里面有一个问题,假如调用的是DispatchRequester.include()

Tags:Java Web Framework

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接