WebWork学习笔记Word下载.docx
《WebWork学习笔记Word下载.docx》由会员分享,可在线阅读,更多相关《WebWork学习笔记Word下载.docx(53页珍藏版)》请在冰豆网上搜索。
实战G-Roller-WW41
G-Roller-WW介绍41
JSTL与WebWork的整合41
中文解决方案41
WebWork与其它开源项目的集成41
Spring41
Hibernate41
Xml-RPC41
总结42
附录42
我钟爱的Opensympnony42
从技术的角度Struts1.1与WebWork2的比较44
WebWork的项目资源46
参考资料46
WebWork介绍
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EEWeb框架。
WebWork目前最新版本是2.1,现在的WebWork2.x前身是RickardOberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目,如下示意图所示:
Web
Non-web
Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。
Xwork提供了很多核心功能:
前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL–theObjectGraphNotationLanguage),IoC(InversionofControl倒置控制)容器等。
WebWork2建立在Xwork之上,处理HTTP的响应和请求。
WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类),session(会话)application(应用程序)范围的映射,request请求参数映射。
WebWork2支持多视图表示,视图部分可以使用JSP,Velocity,FreeMarker,JasperReports,XML等。
下面我们提到的WebWork将为WebWork2,使用的版本是2.1。
WebWork安装-HelloWorld
WebWork安装
当然,在具体开发使用介绍之前,搭建好运行环境是必备的。
首先从
webwork-2.x.jar当然就是WebWrok最新发布的Jar包
webwork-example.war是WebWrok自带的很有代表性的功能演示例子,掌握它是提高你的WebWork技术水平的捷径
webwork-migration.jar提供快速将1.x版本移植到2.x版本所用的类文件
docs目录WebWrok的使用文档,包括api文档、clover文档、单元测试(Junit)文档等
lib目录WebWork在运行或编译时所用到的所有.jar包
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执行结果的输出)等,具体配置如下:
……
<
servlet>
servlet-name>
webwork<
/servlet-name>
servlet-class>
com.opensymphony.webwork.dispatcher.ServletDispatcher<
/servlet-class>
/servlet>
servlet-mapping>
url-pattern>
*.action<
/url-pattern>
/servlet-mapping>
这样,.action结尾的所有url请求将直接有ServletDispatcher去调度。
下面我们写一个经典的HelloWorld,跑一个简单实例来验证你运行环境是否可用,并感受一下简单、功能强大的WebWork的开发。
注意:
如果使用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是一个非常简单的接口,只有一个方法:
publicStringexecute()throwsException;
,Action类介绍见下一节。
HelloWorldAction有一个String类型字段greeting,在execute()方法中,greeting被赋值“HelloWorld!
”,并返回String型常量SUCCESS,SUCCESS的定义详见Action接口,这个常量代表了execute()方法执行成功,将返回成功页面。
返回的页面greetings.jsp代码如下:
%@taglibprefix="
ww"
uri="
webwork"
%>
html>
head>
<
title>
FirstWebWorkExample<
/title>
/head>
body>
p>
ww:
propertyvalue="
greeting"
/>
/p>
/body>
/html>
greetings.jsp很简单的jsp页面,它使用了WebWork自带的标签库。
它的作用是输出变量“greeting”的值。
这个<
语句,相当于调用相应Action(HelloWorldAction)的getGreeting()方法,取得变量“greeting”的值。
我们的HelloWorld代码就这么多,完了。
可是,HelloWorldAction怎么去调用、执行?
执行成功它又怎么知道返回到greetings.jsp?
XWork的配置文件xwork.xml会负责将要执行的Action和展现的视图连接起来,见xwork.xml的如下片断:
actionname="
hello"
class="
helloWorld.HelloWorldAction"
>
resultname="
success"
type="
dispatcher"
<
paramname="
location"
/greetings.jsp<
/param>
/result>
/action>
我们先看action标签:
name=”hello”,表示我们调用这个Action的标识是hello,这样我们可以通过下面的url访问这个Action:
…/hello.action,
例如:
http:
//localhost:
8080/webwork/hello.action;
class="
很好理解,这是真正调用执行的类。
我们在看看result标签:
name="
,记得前面HelloWorldAction返回的字符常量SUCCESS吗?
它的值其实就是“success”,它表示Action执行成功返回success就转向这个结果;
type="
表示执行完Action,转向结果页面的方式;
param参数指定了结果页面的位置:
/greetings.jsp。
代码写完,剩下的当然是编译、部署。
启动tomcat服务器之后我们就可以执行了:
在浏览器里输入你的地址:
8080/webwork/hello.action
你将会看到如下结果:
Action(动作)
Action介绍
Action在MVC模式中担任控制部分的角色,在WebWork中使用的最多。
每个请求的动作都对应于一个相应的Action,一个Action是一个独立的工作单元和控制命令,它必需要实现XWork里的Action接口,实现Action接口的execute()方法。
Action接口的代码如下:
packagecom.opensymphony.xwork;
importjava.io.Serializable;
publicinterfaceActionextendsSerializable{
publicstaticfinalStringSUCCESS="
publicstaticfinalStringNONE="
none"
publicstaticfinalStringERROR="
error"
publicstaticfinalStringINPUT="
input"
publicstaticfinalStringLOGIN="
login"
publicStringexecute()throwsException;
excute()方法是Action类里最重要的部分,它执行返回String类型的值,在Action中返回的值一般使用它上面定义的标准静态字符常量。
前面的HelloWorldAction返回的就是SUCCESS字符常量,真正的值当然就是“success”,它与xwork配置文件里result标签name的值是相对应的。
它用来决定execute()方法执行完成之后,调用哪一种返回结果。
字符常量的含义如下:
SUCCESS:
Action正确的执行完成,返回相应的视图;
NONE:
表示Action正确的执行完成,但并不返回任何视图;
ERROR:
表示Action执行失败,返回到错误处理视图;
INPUT:
Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图;
LOGIN:
Action因为用户没有登陆的原因没有正确执行,将返回该登陆视图,要求用户进行登陆验证。
用户注册例子
下面我们将以一个用户注册的例子详细介绍Action的原理:
功能描述:
一个用户注册页面register.jsp,用户可以在这个页面里输入用户注册的基本信息(例如:
姓名、密码、Email等),输入完成提交表单,执行用户注册的Action,执行成功返回成功提示的页面(register-result.jsp)并将注册的信息输出。
模型:
User.java
控制:
RegisterAction.java
视图:
register.jsp、register-result.jsp
配置:
xwork.xml
User.java:
packageregister;
publicclassUser{
privateStringusername;
privateStringpassword;
privateStringemail;
privateintage;
publicStringgetUsername(){
returnusername;
publicvoidsetUsername(Stringusername){
this.username=username;
publicintgetAge(){
returnage;
publicintsetAge(intage){
this.age=age;
publicStringtoString(){
return"
username="
+username
+"
password="
+password
email="
+email
age="
+age;
模型User是一个普通的JavaBean,它包含了用户注册的字段信息,并对每个字段提供相应的set和get方法。
下面我们来看看进行用户注册动作的RegisterAction.java:
packageexample.register;
/**
*@authormoxie-qac
*achqian@
*/
publicclassRegisterActionimplementsAction{
privateUseruser=newUser();
publicUsergetUser(){
returnthis.user;
publicStringexecute(){
System.out.println("
Startexecute。
。
);
User="
+user);
//在这里调用用户注册的业务逻辑,比如:
将注册信息存储到数据库
returnSUCCESS;
这个Action是不是特清爽?
用户注册就这么几行代码搞定,当然,我们提倡在Action里最好不要实现业务代码,Action的主要功能是提供从请求中取得参数的值,转化成相应的模型,再将模型传递给执行业务操作的对象,比如:
将注册的用户信息存储到数据库中,由业务对象执行业务操作,再返回执行的结果。
为了简化我们省去了注册的业务逻辑执行步骤。
再看看我们注册信息输入的页面:
register.jsp
RegisterExample<
tableborder=0width=97%>
tr>
tdalign="
left"
formname="
register"
action="
register.action"
method="
post"
Username:
inputtype="
text"
name="
user.username"
br>
Password:
user.password"
Email:
user.email"
Age:
user.age"
submit"
Submit"
/form>
/td>
/tr>
/table>
register.jsp页面其实只是一个普通的HTML页面,它提供了一个表单,用来接受用户输入的注册信息,它唯一特殊的部分就是input输入框定义的name部分,例如:
用户姓名用的是“user.username”。
这种命名方式代表什么含义?
它是必需的吗?
下面我们将会给出答案。
RegisterAction正确执行完成之后,会将执行的结果返回到register-result.jsp页面,由它来显示用户在前面页面输入的注册信息。
register-result.jsp代码如下:
Registerresult<
<
Congratulation,yourregistersuccess!
Username:
Password:
Email:
Age:
这个Jsp页面使用了WebWork的标签库<
property/>
,记得HelloWorld里的greetings.jsp吗?
它也使用了这个标签库。
我们看这个:
它是一个普通的使用标签库语句,查看这个标签库的源程序,见包
com.opensymphony.webwork.views.jsp里的PropertyTag.java文件,你会发现这个类会根据value后面赋予的表达式值,去OgnlValueStack里查找这个表达式值所对应的操作。
执行这个语句OgnlValueStack会根据value的值(一个表达式)“user.username”去分别调用RegisterAction类的getUser()和User类的getUsername()方法,即:
getUser().getUsername(),取得的数据就是前面注册页面输入的用户名。
我们把“user.username”这样的语句叫做表达式语言(ExpressionLanguage,简称为EL)。
它由XWork框架提供,XWork表达式语言的核心是OGNL(ObjectGraphNotationLanguage),OGNL是一种功能强大,技术成熟,应用广泛的表达式语言,将在下面的章节有详细介绍。
我们在回到前面介绍的register.jsp,Input输入框
里用的“user.username”,现在我们可以明白,它不是随意设置的,它是一个表达式语言,有着特殊的功能。
看到这里,不知道你心中是否有一个疑问:
我们的RegisterAction是如何取得用户注册页面输入的数据呢?
如果你做过Web开发,你一定会想到RegisterAction里必需有一些从客户端请求中获取参数的语句,例如:
类似:
Stringusername=request.getParameter(“user.username”)的语句(request是HttpServletRequest的对象),去从request请求里面获取用户输入的参数值。
可是我们这个Action里面只有User对象简单的get方法,并没有其它的代码。
Xwork框架的Action是如何去实现了与Web无关?
request请求的参数是怎么传递到我们Action的模型User中呢?
在回答答案之前,我们先看一看Xwork的配置文件xwork.xml:
example.register.RegisterAction"
>
/register-result.jsp<
interceptor-refname="
params"
看了前面的介绍,这段配置文件应该不难理解。
用户通过注册页面register.jsp输入自己的注册信息,提交表单到动作register.action,它将有ServletDispatcher调度,从配置文件xwork.xml里查找与“register”匹配的Action名字,即上面配置的Action。
通过这个名字XWork框架找到这个Action的类:
example.register.RegisterAction,XWork框架会负责去创建这个Action类的对象并调用execute()方法进行用户注册操作。
正确执行execute()方法返回String类型数据“success”之后,它会请求再派遣