现在的位置: 首页 > 综合 > 正文

WebWork深入浅出

2013年10月20日 ⁄ 综合 ⁄ 共 4671字 ⁄ 字号 评论关闭

WebWork深入浅出

本文发表于《开源大本营》          

                     作者:钱安川

前言

本篇文章并没有太多WebWork 的实战代码细节。本人非常希望能充当一名导游的角色,带领读者逐步游览WebWork的功能特性和原理。在第一章,我们将提出基于三层架构的Web层需要解决的10个问题,这是本文的纵轴。围绕着纵轴,我们按照横轴的顺序逐步描述讲解:WebWork简介、WebWork入门、WebWork原理、WebWork实战和技巧、展望WebWork未来、最后是本文的总结。

基于三层架构的 Web 层需要解决的问题

我们这里讨论的Web层,是基于典型的三层架构:Web层,业务层,数据层。故,我们将不讨论任何涉及业务(业务逻辑)层和数据层功能的实现。

Web层需要解决的问题:

1、  数据的输入。如何获得基于无状态HTTP的请求数据?如何将请求的字符数据转换为对应的模型对象?

2、  输入数据的验证。如何验证输入数据的合法性并给出明确的错误消息提示

3、  数据的输出。如何展现复杂的对象结构?如何处理复杂的展现逻辑?

4、  数据的传递和共享。如何在不同的请求或页面之间传递和共享数据?

5、  页面的流程管理。如何管理Web应用中的页面流程?

6、  模块化的管理。如何将复杂的Web应用以模块化的方式管理?

7、  灵活可扩展的架构。如何支持各种不同的展现层技术?如何与业务层或数据层的各种框架整合?

8、  安全和访问控制的管理。如何提供基于Web的安全机制和资源访问控制的管理?

9、  代码实现的简洁和高效。如何让开发步骤和代码维护变得简单?如何尽量减少开发的中间环节?如何将公共的功能剥离出来,并可以灵活的组装应用?

10、                      其它问题。异步调用、国际化支持、文件上传、防止重复提交等等。

下面,让我们来一起看看WebWork是如何解决上面的这些问题。

 

WebWork 简介

 

WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。WebWork目前最新版本是2.2.2,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1WebWork2两个项目,如下示意图所示:

 


archit.gif

 

work简洁、灵活功能强大,它是一个标准的Command模式框架实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Notation Language),IoCInversion of Control依赖倒转控制)容器等。

WebWork2建立在Xwork之上,处理HTTP的请求和响应。所有的请求都会被它的前端控制器(ServletDispatcher,最新版本是FilterDispatcher)截获。前端控制器对请求的数据进行包装,初始化上下文数据,根据配置文件查找请求URL对应的Action类,执行Action,将执行结果转发到相应的展现页面。WebWork2支持多视图表示,视图部分可以使用JSP, Velocity, FreeMarker, JasperReportsXML等。

下面我们提到的WebWork将为WebWork2,使用的版本是WebWork2.2.2

 

WebWork 入门

WebWork 安装

如果只是搭建一个WebWork开发环境,那将非常简单:

1、  去网站http://www.opensymphony.com/webwork下载最新的WebWork2.2.2项目。

2、  搭建一个Web应用(这个不难吧);并拷贝WebWork框架运行需要的所有Jar文件到Web应用的WEB-INF/lib中。这些Jar文件,可以在WebWork项目中lib/default目录找到,即那个目录里面的所有文件。当然,别忘记今天的“主角”,在WebWork跟目录下的webwork-2.2.2.jar文件。

3、  Web.xml文件中配置WebWork的前端控制器FilterDispatcher,也就是一个普通的Servlet Filter(过滤器)而已。代码如下:

    < filter >

        < filter-name > webwork </ filter-name >

        < filter-class > com.opensymphony.webwork.dispatcher.FilterDispatcher </ filter-class >

    </ filter >

 

    < filter-mapping >

        < filter-name > webwork </ filter-name >

        < url-pattern > /* </ url-pattern >

  </ filter-mapping >

 

不过如果是在实际项目中使用,安装过程中还是有一些问题需要注意的:

1、  关于前端控制器。在以前WebWork2版本里面,前端控制器是ServeltDispatcher,它是一个JavaServlet。而现在是一个Filter(过滤器),会导致无法在页面中使用Jspinclude来包含一个WebWorkAction请求的URL。如果真的需要这样做,可以使用WebWorkaction标签库。

2、  关于Action请求URL的后缀。我们知道,在一般的Web框架中,前端控制器会将特定后缀的请求URL映射到对应的Action请求中。而我们这里的前端控制器会接受任意的请求,但它默认是将.action结尾的URL映射为WebWorkAction请求。我们可以在webwork.properties文件中,设置我们自己的后缀名,多个后缀名可以用逗号隔开。例如:webwork.action.extension=action,do

3、  Jsp 页面中, WebWork 的标签库不需要在 web.xml 中定义,在页面中通过如下的代码直接引用: <%@ taglib prefix = "ww" uri = "/webwork" %>

4、  Jsp页面中,默认“altSyntax”是开启的。它是用来解决标签库中的字符串和表达式语言混淆的问题。所以,作为变量的表达式语言应该放在%{}中,否则WebWork会把它当作字符串处理。

5、  如果展现层技术使用FreemarkerWebWork官方的推荐,也是我个人的推荐),如果在页面中需要使用标签库,必须在web.xml中配置JspSupportServlet,代码如下:

      < servlet >

      < servlet-name > JspSupportServlet </ servlet-name >

      < servlet-class > com.opensymphony.webwork.views.JspSupportServlet </ servlet-class >

      < load-on-startup > 1 </ load-on-startup >

   </ servlet >

6、  还有一些其它的定制,比如:编码,标签的模板文件等等,都可以在webwork.properties文件中配置。如果在ClassPath中没有这个文件,WebWork会自动读取WebWorkJar包里面的default.properties文件。

WebWork 核心概念

WebWork的三个关键部分

1、  Actions。一般一个Action代表一次请求或调用。在WebWork中,一般Action类需要实现Action接口,或者直接继承基础类ActionSupport。这是,它要实现默认的execute方法,并返回一个在配置文件中定义的Result(也就是一个自定义的字符串而已)。当然,Action也可以只是一个POJO(普通Java对象),不用继承任何类也不用实现任何接口。Action是一次请求的控制器,同时也充当数据模型的角色,我们强烈建议不要将业务逻辑放在Action中。

2、  Results。它是一个结果页面的定义。它用来指示Action执行之后,如何显示执行的结果。Result Type表示如何以及用哪种视图技术展现结果。通过Result TypeWebWork可以方便的支持多种视图技术;而且这些视图技术可以互相切换,Action部分不需做任何改动。

3、  InterceptorsWebWork的拦截器,WebWork截获Action请求,在Action执行之前或之后调用拦截器方法。这样,可以用插拔的方式将功能注入到Action中。WebWork框架的很多功能都是以拦截器的形式提供出来。例如:参数组装,验证,国际化,文件上传等等。

第一个例子: Welcome

入门,我们从简单的Welcome开始吧!需求如下:一个页面,有一个用户名输入框;输入自己的名字,例如Moxie,提交按钮返回一个欢迎的页面,并显示前面输入的用户名和一句欢迎信息,例如:Moxie, Welcome!页面操作流程图如下:


login.gif

WelcomeAcion.java



welcomeResult.jsp



welcome.jsp

开发步骤如下:

1、  输入页面。Welcome.jsp是一个非常简单输入页面,代码如下:

 

< form name = "register" action = "welcome.action" method = "POST" >

      Name: < input name = "username" > Please input your name.

</ form >

2、  WebWorkAction类。它实现了Action接口,获得welcome.jsp页面传入的数据即输入的用户名,根据这个用户名生成了一条欢迎信息,并在结果页面中打印出来。WelcomeAction.java代码如下:

 

public class WelcomeAction implements Action{

      private String username;

      private String welcomeMessage;

 

      public String execute() throws Exception {

            welcomeMessage = username +",Welcome!";

            return SUCCESS;

      }

     

      public void setUsername(String username) {

            this.username = username;

      }

     

      public String getWelcomeMessage() {

            return welcomeMessage;

      }

}

看了上面的代码,也许你都不敢相信这就是 Web 编程。没有调用任何一个 JavaServlet API ,它是如何获得请求的数据并将执行结果暴露给输入页面的呢?它是通过值堆栈和表达式语言来实现(后面会有详细介绍)。我们先看看 Action 是如何获得请求的数据。输入框的名字“ username ”,即请求的参数的名字,它就是一个表达式语言。 WebWork 遇到这个表达式语言,就会执行相应的 setUsername 方法,而 username 参数的值就是执行这个方法的参数。这些是在

抱歉!评论已关闭.