1、实战G-Roller-WW 41G-Roller-WW介绍 41JSTL与WebWork的整合 41中文解决方案 41WebWork与其它开源项目的集成 41Spring 41Hibernate 41Xml-RPC 41总结 42附录 42我钟爱的Opensympnony 42从技术的角度Struts1.1与WebWork2的比较 44WebWork的项目资源 46参考资料 46WebWork介绍WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1,现在的WebWork2.x前身是Rickard
2、Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目,如下示意图所示:WebNon-webXwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL the Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用Servlet
3、Dispatcher将HTTP请求的变成Action(业务层Action类), session(会话)application(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用JSP, Velocity, FreeMarker, JasperReports,XML等。下面我们提到的WebWork将为WebWork2,使用的版本是2.1。WebWork安装HelloWorldWebWork安装当然,在具体开发使用介绍之前,搭建好运行环境是必备的。首先从webwork-2.x.jar 当然就是WebWrok最新发布的Jar包webwork-examp
4、le.war 是WebWrok自带的很有代表性的功能演示例子,掌握它是提高你的WebWork技术水平的捷径webwork-migration.jar 提供快速将1.x版本移植到2.x版本所用的类文件docs目录 WebWrok的使用文档,包括api文档、clover文档、单元测试(Junit)文档等lib目录 WebWork在运行或编译时所用到的所有.jar包src目录 源程序目录2、WebWork是J2EE Web框架,当然要运行在Web容器中,我用的是稳定的Tomcat 4.1,关于tomcat的安装和部署请自己搞定。3、用WebWork当然要将它的运行时用到的Jar包放到Web容器可以找
5、到的ClassPath中,将步骤1介绍的webwork-2.x.jar放到你部署目录下WEB-INFlib目录里,同时将WebWrok解压目录libcore下的所有.jar文件也拷贝到WEB-INFlib目录,这些是运行WebWork必需要用到的jar包。4、了解Web框架的朋友都知道,一般Web框架都是通过一个JavaServlet控制器提供统一的请求入口,解析请求的url,再去调用相应的Action进行业务处理。WebWork也不例外,它要求你在web.xml文件里配置一个派遣器ServletDispatcher,它初始化WebWrok的一些配置信息,解析XWork的Action配置信息,
6、根据请求去组装和调用执行相应的拦截器(Interceptor)、Action、Action Result(Action执行结果的输出)等,具体配置如下:servlet-namewebworkservlet-classcom.opensymphony.webwork.dispatcher.ServletDispatcher/servletservlet-mappingurl-pattern*.action/servlet-mapping这样,.action结尾的所有url请求将直接有ServletDispatcher去调度。下面我们写一个经典的HelloWorld,跑一个简单实例来验证你运行环境
7、是否可用,并感受一下简单、功能强大的WebWork的开发。注意:如果使用WebWork自带的标签库,除了配置相应的标签库以外,还须将com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet配置到web.xml,具体可以参考webwork-example里面的配置。HelloWorld首先看下面这个程序HelloWorldAction.java:package helloWorldimport com.opensymphony.xwork.Action;public class HelloWorldAction implemen
8、ts Action String greeting; public String getGreeting() return greeting; public String execute() throws Exception greeting = Hello World!; return SUCCESS;HelloWorldAction是一个普通的Java类,它实现了Action这个接口。Action是一个非常简单的接口,只有一个方法:public String execute() throws Exception; ,Action类介绍见下一节。HelloWorldAction有一个Stri
9、ng类型字段greeting,在execute()方法中,greeting被赋值“Hello World!”,并返回String型常量SUCCESS,SUCCESS的定义详见Action接口,这个常量代表了execute()方法执行成功,将返回成功页面。返回的页面greetings.jsp代码如下:% taglib prefix=ww uri=webwork %htmlhead First WebWork Example/headbodypww:property value=greeting/p/body/html greetings.jsp很简单的jsp页面,它使用了WebWork自带的标签
10、库。它的作用是输出变量“greeting”的值。这个result name=success type=dispatcher param name=location/greetings.jsp/result/action我们先看action标签:name=”hello”,表示我们调用这个Action的标识是hello,这样我们可以通过下面的url访问这个Action:/hello.action,例如:http:/localhost:8080/webwork/hello.action;class=很好理解,这是真正调用执行的类。我们在看看result标签:name=,记得前面HelloWorldA
11、ction返回的字符常量SUCCESS吗?它的值其实就是“success”,它表示Action执行成功返回success就转向这个结果;type=表示执行完Action,转向结果页面的方式;param参数指定了结果页面的位置:/greetings.jsp。代码写完,剩下的当然是编译、部署。启动tomcat服务器之后我们就可以执行了:在浏览器里输入你的地址:8080/webwork/hello.action你将会看到如下结果:Action(动作)Action介绍Action在MVC模式中担任控制部分的角色,在WebWork中使用的最多。每个请求的动作都对应于一个相应的Action,一个Actio
12、n是一个独立的工作单元和控制命令,它必需要实现XWork里的Action接口,实现Action接口的execute()方法。Action接口的代码如下:package com.opensymphony.xwork;import java.io.Serializable;public interface Action extends Serializable public static final String SUCCESS = public static final String NONE = none public static final String ERROR = error pub
13、lic static final String INPUT = input public static final String LOGIN = login public String execute() throws Exception;excute()方法是Action类里最重要的部分,它执行返回String类型的值,在Action中返回的值一般使用它上面定义的标准静态字符常量。前面的HelloWorldAction返回的就是SUCCESS字符常量,真正的值当然就是“success”,它与xwork配置文件里result标签name的值是相对应的。它用来决定execute()方法执行完成之
14、后,调用哪一种返回结果。字符常量的含义如下:SUCCESS:Action正确的执行完成,返回相应的视图;NONE:表示Action正确的执行完成,但并不返回任何视图;ERROR:表示Action执行失败,返回到错误处理视图;INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图;LOGIN:Action因为用户没有登陆的原因没有正确执行,将返回该登陆视图,要求用户进行登陆验证。用户注册例子下面我们将以一个用户注册的例子详细介绍Action的原理:功能描述:一个用户注册页面regist
15、er.jsp,用户可以在这个页面里输入用户注册的基本信息(例如:姓名、密码、Email等),输入完成提交表单,执行用户注册的Action,执行成功返回成功提示的页面(register-result.jsp)并将注册的信息输出。模型:User.java 控制:RegisterAction.java视图:register.jsp、register-result.jsp配置:xwork.xmlUser.java:package register;public class User private String username; private String password; private St
16、ring email; private int age; public String getUsername() return username; public void setUsername(String username) this.username = username; public int getAge() return age; public int setAge(int age) this.age = age; public String toString() return username= + username + password= + passwordemail= +
17、emailage= + age;模型User是一个普通的JavaBean,它包含了用户注册的字段信息,并对每个字段提供相应的set和get方法。下面我们来看看进行用户注册动作的RegisterAction.java:package example.register;/* * author moxie-qac * achqian */public class RegisterAction implements Action private User user= new User(); public User getUser() return this.user; public String ex
18、ecute() System.out.println(Start execute 。);User=+user); /在这里调用用户注册的业务逻辑,比如:将注册信息存储到数据库 return SUCCESS;这个Action是不是特清爽?用户注册就这么几行代码搞定,当然,我们提倡在Action里最好不要实现业务代码,Action的主要功能是提供从请求中取得参数的值,转化成相应的模型,再将模型传递给执行业务操作的对象,比如:将注册的用户信息存储到数据库中,由业务对象执行业务操作,再返回执行的结果。为了简化我们省去了注册的业务逻辑执行步骤。再看看我们注册信息输入的页面:register.jspReg
19、ister Exampletrtd align=leftform name=register action=register.action method=post Username:input type=text name=user.usernamebr Password:user.password Email:user.email Age:user.agesubmitSubmit/form/td/tr/tableregister.jsp页面其实只是一个普通的HTML页面,它提供了一个表单,用来接受用户输入的注册信息,它唯一特殊的部分就是input输入框定义的name部分,例如:用户姓名用的是
20、“user. username”。这种命名方式代表什么含义?它是必需的吗?下面我们将会给出答案。RegisterAction正确执行完成之后,会将执行的结果返回到register-result.jsp页面,由它来显示用户在前面页面输入的注册信息。register-result.jsp代码如下:Register result Congratulation,your register success! Username: Password: Email: Age:这个Jsp页面使用了WebWork的标签库 ,记得HelloWorld里的greetings.jsp吗?它也使用了这个标签库。我们看这个
21、:它是一个普通的使用标签库语句,查看这个标签库的源程序,见包com.opensymphony.webwork.views.jsp里的PropertyTag.java文件,你会发现这个类会根据value后面赋予的表达式值,去OgnlValueStack里查找这个表达式值所对应的操作。执行这个语句OgnlValueStack会根据value的值(一个表达式)“user.username”去分别调用RegisterAction类的getUser()和User类的getUsername()方法,即:getUser().getUsername(),取得的数据就是前面注册页面输入的用户名。我们把“user
22、.username”这样的语句叫做表达式语言(Expression Language,简称为EL)。它由XWork框架提供,XWork表达式语言的核心是OGNL(Object Graph Notation Language),OGNL是一种功能强大,技术成熟,应用广泛的表达式语言,将在下面的章节有详细介绍。我们在回到前面介绍的register.jsp,Input输入框里用的“user.username”,现在我们可以明白,它不是随意设置的,它是一个表达式语言,有着特殊的功能。看到这里,不知道你心中是否有一个疑问:我们的RegisterAction是如何取得用户注册页面输入的数据呢?如果你做过W
23、eb开发,你一定会想到RegisterAction里必需有一些从客户端请求中获取参数的语句,例如: 类似:String username = request.getParameter(“user. username”)的语句(request是HttpServletRequest的对象),去从request请求里面获取用户输入的参数值。可是我们这个Action里面只有User对象简单的get方法,并没有其它的代码。Xwork框架的Action是如何去实现了与Web无关?request请求的参数是怎么传递到我们Action的模型User中呢?在回答答案之前,我们先看一看Xwork的配置文件xwor
24、k.xml:example.register.RegisterAction /register-result.jspinterceptor-ref name=params看了前面的介绍,这段配置文件应该不难理解。用户通过注册页面register.jsp输入自己的注册信息,提交表单到动作register.action,它将有ServletDispatcher调度,从配置文件xwork.xml里查找与“register”匹配的Action名字,即上面配置的Action。通过这个名字XWork框架找到这个Action的类:example.register.RegisterAction,XWork框架会负责去创建这个Action类的对象并调用execute()方法进行用户注册操作。正确执行execute()方法返回String类型数据“success”之后,它会请求再派遣
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1