一、搭建骨架
在WebWork的开发包中找到下面一些应用程序必须的文件,相信这个难不倒你:)
xwork.jar WebWork构建所依赖的XWork类库
common-logging.jar 通用的日志类库,WebWork用它为Log4J或者JDK提供透明的日志记录
oscore.jar OSCore,一个来自OpenSymphony公司的通用功能类库
velocity-dep.jar 依赖Velocity类库
ognl.jar 对象图导航语言(OGNL),WebWork中使用的表达式语言
xwork.xml WebWork配置文件,为你的Web应用程序定义action、result和interceptor
web.xml J2EE Web应用程序配置文件,为你的Web应用程序定义servlet、JSP标签库等内容
现在创建一个名为HelloWorld项目(用你喜欢和习惯的IDE),在项目下创建一个源代码文件夹如src,一个web文件夹如webApp,把web.xml放在WEB-INF目录下,而xwork.xml应该被放在WEB-INF\classes下,如果是在IDE环境下就放在源代码文件夹下编译后就会出现在WEB-INF\classes了。相关的*.jar自然是放在WEB-INF\lib下了。下面我们对几个配置文件进行基本的修改。
为了让WebWork正常工作,我们必须配置一个在 上一篇笔记中提到的前端控制器(Front Controller),使特定URL模式的请求都被提交给WebWork处理。这和Struts是相似的。来看代码吧(web.xml):
1
<
web-app
>
2![](/Images/dot.gif)
3 < servlet >
4 < servlet-name > webwork </ servlet-name >
5 < servlet-class >
6 com.opensymphony.webwork.dispatcher.ServletDispatcher
7 </ servlet-class >
8 </ servlet >
9
10 < servlet-mapping >
11 < servlet-name > webwork </ servlet-name >
12 < url-pattern > *.action </ url-pattern >
13 </ servlet-mapping >
14![](/Images/dot.gif)
15 </ web-app >
2
![](/Images/dot.gif)
3 < servlet >
4 < servlet-name > webwork </ servlet-name >
5 < servlet-class >
6 com.opensymphony.webwork.dispatcher.ServletDispatcher
7 </ servlet-class >
8 </ servlet >
9
10 < servlet-mapping >
11 < servlet-name > webwork </ servlet-name >
12 < url-pattern > *.action </ url-pattern >
13 </ servlet-mapping >
14
![](/Images/dot.gif)
15 </ web-app >
为了使用WebWork的标签库,还需要给出一个告诉程序在哪里可以找到标签苦的配置,还是看代码吧(web.xml):
1
<
web-app
>
2![](/Images/dot.gif)
3 < taglib >
4 < taglib-uri > webwork </ taglib-uri >
5 < taglib-location >
6 /WEB-INF/lib/webwork-2.1.7.jar
7 </ taglib-location >
8 </ taglib >
9![](/Images/dot.gif)
10 </ web-app >
2
![](/Images/dot.gif)
3 < taglib >
4 < taglib-uri > webwork </ taglib-uri >
5 < taglib-location >
6 /WEB-INF/lib/webwork-2.1.7.jar
7 </ taglib-location >
8 </ taglib >
9
![](/Images/dot.gif)
10 </ web-app >
你是不是有点奇怪为什么taglib配置的是一个.jar而不是一个TLD文件,其实根据规范程序会自动到.jar中去找指定位置的TLD,我们暂且不管这个问题吧,先去看看WebWork自己的核心配置文件-xwork.xml吧。
说明一下,因为WebWork是基于XWork这个这个子项目的,所以这个文件叫做xwork,不要被它弄迷糊了。我们先来对xwork.xml做一个最基本的配置,以后熟悉了再往里面加入自己的东西就很轻松了。(xwork.xml)
1
<
xwork
>
2 < include file ="webwork-default.xml" >
3
4 < package name ="default" extends ="webwork-default" >
5 < default-interceptor-ref name ="completeStack" />
6 </ package >
7 </ xwork >
2 < include file ="webwork-default.xml" >
3
4 < package name ="default" extends ="webwork-default" >
5 < default-interceptor-ref name ="completeStack" />
6 </ package >
7 </ xwork >
我们暂时只用关注一个问题:xwork.xml中包含了一个名教webwork-default.xml的文件,这个文件已经包含在了webwork的.jar中了,它提供了让WebWork正常运行的标准配置,也提供了一些默认的处理方式。了解到这里已经足够了,我们继续往下走。
下面在xwork.xml同一个目录下创建一个webwork.properties配置文件,它定义了一些告诉webwork如何工作的信息,暂时不用关注它,在里面加入一行内容:(webwork.properties)
1
webwork.tag.altSyntax
=
true
到此,基本的骨架就搭成了,其实并不复杂。下面我们就开始进入真正与业务相关的内容吧。
二、你的第一个action
我们现在假设HelloWorld的需求是这样的:当用户访问一个URL的时候(如http://localhost/helloworld.action webwork默认的后缀是action,后面的笔记中你会了解到这个是可以修改的,比如换成现在比较流行的jspa),都会有一条HelloWorld问候语显示。从上面提到的webwork前端控制器的知识可以知道,URL请求会被映射到webwork中,所以我们要实现这个需求要做下面3件事情:
(1) 创建一个action类(用来实现业务逻辑,并准备返回)
(2) 创建一个result,这里是用JSP的形式,熟练后你可以灵活运用velocity、FreeMarker等
(3) 配置action与result
第一部创建action类:HelloWorld.java ,还是先看代码吧:
1
package
example
2
3 import com.opensymphony.xwork.Action;
4
5 public class HelloWorld implements Action{
6 private String message;
7
8 public String execute(){
9 message = " Hello, World!\n " ;
10 message += " The time is:\n " ;
11 message += System.currentTimeMillis();
12 return SUCCESS;
13 }
14
15 public String getMessage(){
16 return message;
17 }
18 }
2
3 import com.opensymphony.xwork.Action;
4
5 public class HelloWorld implements Action{
6 private String message;
7
8 public String execute(){
9 message = " Hello, World!\n " ;
10 message += " The time is:\n " ;
11 message += System.currentTimeMillis();
12 return SUCCESS;
13 }
14
15 public String getMessage(){
16 return message;
17 }
18 }
注意你所编写的action类都必须实现定义了execute()方法的Action接口,而execute()就是在执行这个action的时候被WebWork调用的。
在action中定义了message的getter方法,以便JSP标签取得message的值显示给客户端。
最后execute()方法返回了SUCCESS(其实就是一个值为“success”的字符串常量),并且所有的WebWork的action都必须返回一个result code(一个说明执行结果的字符串)。它告诉WebWork现在的执行结果和下一步应该对应到哪个result,虽然result code不一定必须对应一个result但是通常都是。既然业务已经处理完了,下面就来创建一个JSP页面显示HelloWorld问候语。
1
<%
@ taglib prefix
=
"
ww
"
uri
=
"
webwork
"
%>
2 < html >
3 < head >
4 < title > Hello Page </ title >
5 </ head >
6 < body >
7 The message generated by my first action is:
8 < ww:property value ="message" />
9 </ body >
10 </ html >
11
2 < html >
3 < head >
4 < title > Hello Page </ title >
5 </ head >
6 < body >
7 The message generated by my first action is:
8 < ww:property value ="message" />
9 </ body >
10 </ html >
11
用过页面标签的朋友肯定对这种代码很熟悉了,即使你没用过也没关系,下面简单介绍一下。第一行标签库定义将前缀ww和URI webwork(这个webwork就是前面在web.xml中定义的URI)之间建立了映射关系。前缀ww指明了所有WebWork标签在使用的时候以“ww:”开头。property标签包含了一个value属性值,通过设置value值,标签可以从action中获得对应表达式的内容。因为在action中创建一个名为getMessage()的方法,value值为message的property标签就会得到getMessage()方法调用后的值。把上面的代码保存为hello.jsp,放在webApp目录下。
配置你的action与result,已经创建了action类和视图,最后还需要将它们联系起来。你可以通过为action配置一个特别的URL,以及将SUCCESS这个result code映射到你刚才创建的JSP来完成这一步。当你配置一个WebWork action的时候,必须清楚下面3个方面:
(1) action类的全名,包含完整的包名
(2) 你打算将action存放于Web应用程序什么位置,即应用什么URL
(3) action可能返回所有结果码
1
<
xwork
>
2 < include file ="webwork-default.xml" >
3
4 < package name ="default" extends ="webwork-default" >
5 < default-interceptor-ref name ="completeStack" />
6
7 < action name ="helloWorld" class ="example.HelloWorld" >
8 < result name ="success" > hello.jsp </ result >
9 </ action >
10 </ package >
11 </ xwork >
2 < include file ="webwork-default.xml" >
3
4 < package name ="default" extends ="webwork-default" >
5 < default-interceptor-ref name ="completeStack" />
6
7 < action name ="helloWorld" class ="example.HelloWorld" >
8 < result name ="success" > hello.jsp </ result >
9 </ action >
10 </ package >
11 </ xwork >
到这个时候就已经差不多了,编译程序并发布在你喜欢的web容器中。启动服务器你就可以在浏览器中输入URL看看效果了,如http://localhost/helloWorld.action(如果端口为8080,还需要加上端口),这个时候你就会看到浏览器中显示了HelloWorld的信息。这并不是一个令人兴奋的网页,但是你至少开始使用WebWork了,这难道不令人激动吗?