WebWork入门使用教程.docx
《WebWork入门使用教程.docx》由会员分享,可在线阅读,更多相关《WebWork入门使用教程.docx(72页珍藏版)》请在冰点文库上搜索。
WebWork入门使用教程
WebWork使用教程
2012-11-5
1.WebWork简介
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EEWeb框架。
WebWork目前最新版本是2.1,现在的WebWork2.x前身是RickardOberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目,如下示意图所示:
Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。
Xwork提供了很多核心功能:
运行时表单属性验证,类型转换,强大的表达式语言(OGNL–theObjectGraphNotationLanguage),IoC(InversionofControl倒置控制)容器等。
核心概念——WebWork的三个关键部分
1.Actions。
一般一个Action代表一次请求或调用。
在WebWork中,一般Action类需要实现Action接口,或者直接继承基础类ActionSupport。
这是,它要实现默认的execute方法,并返回一个在配置文件中定义的Result(也就是一个自定义的字符串而已)。
当然,Action也可以只是一个POJO(普通Java对象),不用继承任何类也不用实现任何接口。
Action是一次请求的控制器,同时也充当数据模型的角色,我们强烈建议不要将业务逻辑放在Action中。
2.Results。
它是一个结果页面的定义。
它用来指示Action执行之后,如何显示执行的结果。
ResultType表示如何以及用哪种视图技术展现结果。
通过ResultType,WebWork可以方便的支持多种视图技术;而且这些视图技术可以互相切换,Action部分不需做任何改动。
3.Interceptors。
WebWork的拦截器,WebWork截获Action请求,在Action执行之前或之后调用拦截器方法。
这样,可以用插拔的方式将功能注入到Action中。
WebWork框架的很多功能都是以拦截器的形式提供出来。
例如:
特点
ValueStack和EL
关于ValueStack的描述:
1.ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。
2.EL,全称ExpressLanguage,即表达式语言。
不要被语言吓倒,它是简单的对象导航语言。
有字符串(例如:
3.WebWork的ValueStack底层有第三方开源项目OGNL实现。
所以EL也都遵循OGNL的规范。
我们在开发中,几乎不需要知道OGNL的细节。
4.WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象(例如:
/*
下面我们用一个雇员类为例,使用Junit框架(单元测试框架)来展示ValueStack的功能。
我们有一个Employee类,它有两个属性:
Interceptor(拦截器)
关于拦截器的描述:
1.一个拦截器就是在xwork.xml文件中定义的一个无状态Java类,它至少要实现XWork的com.opensymphony.xwork.interceptor.Interceptor接口。
2.实现Interceptor接口的拦截器,代码部分在intercept方法中实现。
在intercept方法中,可以直接返回一个Result字符串,这样整个执行直接“短路”,这时Action的execute方法也不会执行(一般很少会这么用)。
所以,一般都会在这个方法里调用参数对象invocation的invoke方法,并返回这个方法执行的结果。
这样会持续执行后面的拦截器方法以及Action的execute方法等。
3.大部分的时候,拦截器直接继承WebWork的抽象类com.opensymphony.xwork.interceptor.AroundInterceptor就可以了。
这时,需要实现它的before和after方法。
Before方法会在Action执行之前调用,after方法在Action执行之后调用。
4.拦截器的执行顺序。
我们可将多个拦截器放一起组装成一个拦截器栈。
这样拦截器会按照栈的顺序由上而下执行before方法,所有before方法执行结束,再执行Action的方法,执行Result的方法,再返回执行结果,最后再从下而上执行拦截器的after方法。
5.拦截器的过滤功能。
我们通常会在应用中使用一个通用的定义多个拦截器的拦截器栈。
但有些Action方法在调用的时候,不需要要其中的部分拦截器。
这时,我们就可以使用拦截器过滤功能。
如果拦截器要拥有过滤功能,必须实现抽象类com.opensymphony.xwork.interceptor.MethodFilterInterceptor。
这样,拦截器在定义的时候或者在Action引用拦截器栈的时候,我们就可以指定哪些Action方法是需要过滤的,哪些Action是不需要过滤的。
提供的拦截器介绍
1.自动为Action设置Http请求数据的拦截器(ParametersInterceptor)。
这个拦截器非常方便实用,但完全自动组装对象数据,很可能会带来安全问题。
如果Action不需要设置数据,那么这个Action只要实现com.opensymphony.xwork.interceptor.NoParameters接口即可。
如果是Action中部分数据需要自动设置,部分数据不允许设置,这样可以实现接口com.opensymphony.xwork.interceptor.ParameterNameAware,可以在这个接口的acceptableParameterName(StringparameterName)方法中,定义我们可以接受哪些方法,如果允许只要让这个方法返回True就可以了。
2.过滤参数功能的拦截器(ParameterFilterInterceptor)。
它可以全局阻止非法或不允许Action访问的参数。
可以很好的和上面的组装参数的拦截器一起使用。
3.为Action设置静态数据的拦截器(StaticParametersInterceptor)。
它可以将Action定义的静态参数,设置到Action中。
4.数据验证拦截器(ValidationInterceptor)。
定义之后,会调用验证文件或实现验证接口com.opensymphony.xwork.Validateable的所有验证。
5.验证流程处理拦截器(WorkflowInterceptor)。
它和上面的拦截器一起使用,处理验证的流程。
如果验证通过则继续前进,如果发现有验证错误消息,直接转到Action中定义的输入结果(input)页面。
6.类型转换错误处理拦截器()。
它首先去取得类型转换的错误消息(主要是由设置Http请求参数的拦截器产生),如果取到错误消息,它会将错误消息传递给实现接口com.opensymphony.xwork.ValidationAware的Action,这样我们可以将这些错误消息暴露到页面中。
7.Action链拦截器(ChainingInterceptor)。
它是用来拷贝前一个Action的属性数据到当前Action中。
它要求前一个Action必须是chainResult(),这样才能进行Action的数据拷贝。
8.防止页面重复提交(或页面重复刷新)拦截器。
TokenInterceptor和TokenSessionInterceptor都是防止重复提交的拦截器。
不同点是后者在Session存贮了最近一次请求的结果数据。
9.文件上传的拦截器(FileUploadInterceptor)。
实现文件上传的功能。
如果有人曾经手工写过文件上传程序,那一定会惊叹于这个拦截器。
我们可以在这个拦截器中设定上传文件的大小和类型限制。
记得需要第三方的文件上传库的支持,只要在webwork.properties中配置过,并拷贝相应的jar包就可以了。
10.进度条等待拦截器(ExecuteandWaitInterceptor)。
当Action的执行需要很长实际的时候,我们可以使用这个进度条等待的拦截器。
它会将Action放到后台执行,而在前端显示进度条或等待消息提示的页面。
11.还有一些其它不常用的拦截器,我们可以在WebWork文档中找到,这里就不再做介绍。
WebWork2建立在Xwork之上,处理HTTP的响应和请求。
WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类),session(会话)application(应用程序)范围的映射,request请求参数映射。
WebWork2支持多视图表示,视图部分可以使用JSP、Velocity、FreeMarker、JasperReports、XML等。
下面我们提到的WebWork都特指WebWork2,本文档使用的版本是2.1。
2.WebWork安装-HelloWorld实例介绍
2.1WebWork安装
在具体开发使用介绍之前,搭建好运行环境是必备的。
1、我们可以从并将其解压开来。
打开解压目录,你将看到以下的文件和目录:
webwork-2.x.jar:
/*
webwork-example.war:
/*掌握它是提高你的WebWork技术水平的捷径;
webwork-migration.jar:
docs目录:
/*包括api文档、clover文档、单元测试(Junit)文档等;
lib目录:
/*
src目录:
2、WebWork是J2EEWeb框架,当然要运行在Web容器中,本文档用的是稳定的Tomcat4.1,关于tomcat的安装和部署请参考相关文档。
3、用WebWork必须要将它的运行时用到的Jar包放到Web容器可以找到的ClassPath中,将步骤1介绍的webwork-2.x.jar放到部署目录下WEB-INF\lib目录里,同时将WebWrok解压目录lib\core下的所有.jar文件也拷贝到WEB-INF\lib目录,这些是运行WebWork必需要用到的jar包。
4、了解Web框架的朋友都知道,一般Web框架都是通过一个JavaServlet控制器提供统一的请求入口,解析请求的url,再去调用相应的Action进行业务处理。
WebWork也不例外,它要求你在web.xml文件里配置一个派遣器ServletDispatcher,它初始化WebWrok的一些配置信息,解析XWork的Action配置信息,根据请求去组装和调用执行相应的拦截器(Interceptor)、Action、ActionResult(Action执行结果的输出)等,具体配置如下:
……
webwork
com.opensymphony.webwork.dispatcher.ServletDispatcher
……
webwork
*.action
……
如此,.action结尾的所有url请求将直接有ServletDispatcher去调度。
下面我们写一个经典的HelloWorld实例,来验证你的运行环境是否可用,并感受一下简单、功能强大的WebWork的开发。
注意:
除了配置相应的标签库以外,还须将com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet配置到web.xml,具体可以参考webwork-example里面的配置。
HelloWorld
首先看下面这个程序HelloWorldAction.java:
packagehelloWorld
importcom.opensymphony.xwork.Action;
publicclassHelloWorldActionimplementsAction{
Stringgreeting;
publicStringgetGreeting(){
returngreeting;
}
publicStringexecute()throwsException{
greeting="HelloWorld!
";
returnSUCCESS;
}
}
HelloWorldAction是一个普通的Java类,它实现了Action这个接口。
Action是一个非常简单的接口,只有一个方法:
/*Stringexecute()throwsException;,Action类介绍见下一节。
HelloWorldAction有一个String类型字段greeting,在execute()方法中,greeting被赋值“HelloWorld!
”,并返回String型常量SUCCESS,SUCCESS的定义详见Action接口,这个常量代表了execute()方法执行成功,将返回成功页面。
返回的页面greetings.jsp代码如下:
<%@taglibprefix="ww"uri="webwork"%>
FirstWebWorkExamplepropertyvalue="greeting"/>
greetings.jsp很简单的jsp页面,它使用了WebWork自带的标签库。
它的作用是输出变量“greeting”的值。
这个propertyvalue="greeting"/>语句,相当于调用相应Action(HelloWorldAction)的getGreeting()方法,取得变量“greeting”的值。
这里的HelloWorld代码就这么多。
可是,HelloWorldAction怎么去调用、执行?
执行成功它又怎么知道返回到greetings.jsp?
XWork的配置文件xwork.xml会负责将要执行的Action和展现的视图连接起来,见xwork.xml的如下片断:
/greetings.jsp
我们先看action标签:
/*表示我们调用这个Action的标识是hello,这样我们可以通过下面的url访问这个Action:
/*
例如:
helloWorld.HelloWorldAction"很好理解,这是真正调用执行的类。
我们在看看result标签:
/*记得前面HelloWorldAction返回的字符常量SUCCESS吗?
它的值其实就是“success”,它表示Action执行成功返回success就转向这个结果;type="dispatcher"表示执行完Action,转向结果页面的方式;param参数指定了结果页面的位置:
代码写完,剩下的当然是编译、部署。
启动tomcat服务器之后我们就可以执行了:
在浏览器里输入你的地址:
你将会看到经典的:
World!
3.Action
Action简介
Action在MVC模式中担任控制部分的角色,在WebWork中使用的最多。
每个请求的动作都对应于一个相应的Action,一个Action是一个独立的工作单元和控制命令,它必需要实现XWork里的Action接口,实现Action接口的execute()方法。
Action接口的代码如下:
packagecom.opensymphony.xwork;
importjava.io.Serializable;
publicinterfaceActionextendsSerializable{
publicstaticfinalStringSUCCESS="success";
publicstaticfinalStringNONE="none";
publicstaticfinalStringERROR="error";
publicstaticfinalStringINPUT="input";
publicstaticfinalStringLOGIN="login";
publicStringexecute()throwsException;
}
excute()方法是Action类里最重要的部分,它执行返回String类型的值,在Action中返回的值一般使用它上面定义的标准静态字符常量。
例如:
真正的值当然就是“success”,它与xwork配置文件里result标签name的值是相对应的。
它用来决定execute()方法执行完成之后,调用哪一种返回结果。
字符常量的含义如下:
SUCCESS:
/*返回相应的视图;
NONE:
但并不返回任何视图;
ERROR:
返回到错误处理视图;
INPUT:
/*需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图;
LOGIN:
/*将返回该登陆视图,要求用户进行登陆验证。
用户注册例子
下面我们将以一个用户注册的例子详细介绍Action的原理:
http:
//tieba.bai