1、WebWork手册 WebWork 使用指南引言WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork已经被拆分成了Xwork1和WebWork2两个项目。 Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。 Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL the Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。We
2、bWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类), session(会话)application(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用JSP, Velocity, FreeMarker, JasperReports,XML等。在WebWork2.2中添加了对AJAX的支持,这支持是构建在DWR与Dojo这两个框架的基础之上.用于WebWork辅助开发的一个Eclipse插件: EclipseWork文件目录web
3、work下载一般包含的目录有:webwork-2.x.jar:WebWrok最新发布的Jar包webwork-example.war :WebWrok自带的很有代表性的功能演示例webwork-migration.jar :提供快速将1.x版本移植到2.x版本所用的类文件docs:WebWrok的使用文档;包括api文档、clover文档、单元测试(Junit)文档等lib:WebWork在运行或编译时所用到的所有.jar包src: 源程序目录xwork运行当URL发生请求到动作action,将由ServletDispatcher调度,从配置文件xwork.xml里查找与提交动作匹配的Acti
4、on名字,通过这个名字XWork框架找到对应Action的类;然后 XWork框架会负责去创建这个Action类的对象并调用execute()方法进行用户注册操作。正确执行execute()方法返回String类型数据后,它会请求再派遣到用户所配置指定好的页面。 当然在action执行之前会先执行配置好的拦截器。webwork.xml中用来配置拦截器。其中params是在webwork-default.xml定义好的,可以是chain、model-driven等等。引用的是com.opensymphony.xwork.interceptor.ParametersInterceptor。拦截器将
5、作用是将request请求的参数值通过表达式语言设置到相应Action的模型里。例如:某jsp里的,它输入的值会由Action类的getUser()和User类的setUserName(“”)设置到这个User模型里。拦截器的使用,使得Action类和Web实现了完全的解耦开发步骤描述一个WEB项目使用xwork的开发过程创建WEB工程1、 新建一个WEB工程将webwork的jar包放到web应用的WEB-INFlib目录里2、 将xwork.xml、webwork.properties等webwork配置文件放到WEB-INFclasses目录配置文件Web框架都是通过web.xml配置一
6、个JavaServlet控制器提供统一的请求入口,解析请求的url,再去调用相应的Action进行业务处理。WebWork也是如此,它是在web.xml文件里配置一个派遣器ServletDispatcher,ServletDispatcher初始化WebWrok的一些配置信息,解析XWork的Action配置信息,根据请求去组装和调用执行相应的拦截器(Interceptor)、Action、Action Result(Action执行结果的输出)等。另外与Struts类似,Webwork也需要配置本身xml。这个文件是xwork.xml,也是设置action及其转向web.xml webwor
7、kcom.opensymphony.webwork.dispatcher.ServletDispatcher webwork*.action/如果使用WebWork自带的标签库则必须载入WebWorkVelocityServlet,并配置webwork.tldvelocitycom.opensymphony.webwork.views.velocity.WebWorkVelocityServletvelocity*.vm webwork /WEB-INF/webwork.tldxwork.xml /main.jsp /index.jsp /login.jsp /error.jsp 下面是job
8、.xml login.jsp system/register.jsp 说明:1、 设置全局跳转global-results允许定义全局的输出目地,只要继承它所在的package,这些全局定义都是可用的。比如某个package下有多个action配置,那么这些action都可以使用全局的跳转,调用方式与action局部跳转一致。2、 必须包括webwork-default.xml3、 定义一个package,这个包可以继承其它package。继承后则拥有此package中所有action配置4、 namespace命名空间:用于指定一个action调用路径 ,假如此应用项目名为SchdulerC
9、enter,那么要调用此例的注册action(job.xml),页面中提交的路径应为/job/ register.action。当成功时返回页面路径为/job/login.jsp因为:result目的地没有/出现,表示目标页面的路径与action请求的命名空间路径一致,故将跳转到/job/ login.jsp当失败时返回页面路径为/system/register.jsp因为:result目的地出现/,表示目标页面的路径是自定义,并非默认与命名空间一致,故将跳转到自定义的目的地/system/register.jsp5、 通过include节点可将其它配置文件导入至默认配置文件xwork.xml
10、中,此例将job.xml导入。为了业务逻辑更加清晰,建议xwork.xml不设置package,而全部用include导入每个业务块的配置文件。比如关于登陆与注册的action可以创建一个login.xml,login.xml设置好action;有关作业的业务可以创建一个job.xml并设置好action。最后xwork.xml只需要引入这两个xml即可。6、 通过result定义action返回的跳转的名字,跳转的处理模式有:dispatcher:类似struts的forward,本系统页面间转向,能传递request,session数据redirect:浏览器跳转,可转向其它系统页面,无法
11、将request,session数据传送velocity:将指定的velocity模板作为结果呈现页面xslt:将指定的xslt作为结果呈现页面、chain:将处理结果交给另一个Action处理,以实现Action的链式处理7、 通过param设定action跳转相应的资源名称8、 action拦截器设定,webwork拦截器有name=params与name=model-driven两种方式,在webwork-default包都有定义。拦截器是在action运行之前执行。model-driven是针对action的Modle驱动模式的拦截器实现9、 上面的配置文件在拦截器设定方面还可修改为如
12、下: /通过interceptors组合params与model-driven拦截器,以减少interceptor-ref声明 . /启用组合后的指定拦截器, 模型通常所指的JavaBean。主要是一些属性及其set/get方法Actionaction操作有两种驱动模式Property-Driven模式:implements Action或extends ActionSupportModel-Driven模式:implements Action注:建议采用Model-Driven模式使得业务逻辑更加清晰Property-Driven模式public class InfoAction imple
13、ments Action /*直接将页面要用的数据封到InfoAction,将InfoAction同时当成Bean*/ public String company; /*重写Action的execute方法,指定返回跳转*/ public String execute() throws Exception company = ultrapower; return SUCCESS; public String getCompany() return company; public void setCompany(String company) pany = company; 说明:采用此模式,在
14、页面中可以直接使用action属性命名表单控件,如上例中,对于页面有一个文本框,其中company是Action的属性.在提交页面时company的值自动映射到InfoAction的company属性。此模式建议不采用。Model-Driven模式/*此模式将页面要用的数据单独作成Bean类*/public class Message public String address; public String getAddress() return address; public void setAddress(String address) this.address = address; 然后
15、actionpublic class MessageAction implements Action /*将页面要用的数据Bean作为属性*/ public Message message; /*重写Action的execute方法,指定返回跳转*/ public String execute() throws Exception / TODO Auto-generated method stub return null; public Message getMessage() return message; public void setMessage(Message message) th
16、is.message = message; 说明:采用此模式,在页面中可以直接使用模式属性命名表单控件,如上例中,对于页面有一个文本框,其中message是Action的属性,即模型类对象Message。address又是模型对象Message的属性,在提交页面时message.address的值自动映射到InfoAction的message属性对象。采用Model-Driven模式使用webwork标签比较简洁。建议采用ModelDriven接口在webwork中提到com.opensymphony.xwork.ModelDriven接口是做什么的呢? 它是将Object getModel(
17、)取得的Model放到ValueStack中。这样在页面就可能使用webwork标签将值输出。 Property-Driven模式与Model-Driven模式都可以实现这个接口来将Model放入ValueStack注意: Model-Driven(模型驱动)的Action与com.opensymphony.xwork.ModelDriven接口是二回事。 Model-Driven只是action处理页面的一种方式Action动态请求通常情况下提交请求是转到Action的execute方法,webwork允许灵活的配置请求并转到相应的处理方法。如下:假如LoginAction有execute(
18、)方法和view()方法,请求名为login,那么请求名为login.action时,进入execute()方法。请求名为login!view.action时,进入view()方法。ActionContext由于Xwork与Web无关性,我们的Action不用去依赖于任何Web容器,不用和那些JavaServlet复杂的请求(Request)、响应(Response)关联在一起。对请求(Request)的参数(Param),可以使用拦截器框架自动调用一些get()和set()方法设置到对应的Action的字段中。但是,仅仅取得请求参数的值就能完全满足我们的功能要求吗?不,在Web应用程序开发中
19、,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest)、响应(HttpServletResponse)操作。ActionContext简介ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象,比如:在使用WebWork时,我们
20、的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。ActionContext获取通过ActionContext的静态方法:ActionContext.getContext()来取得当前的ActionContext对象,如下代码:public static ActionContext
21、 getContext() ActionContext context = (ActionContext) actionContext.get(); if (context = null) OgnlValueStack vs = new OgnlValueStack(); context = new ActionContext(vs.getContext(); setContext(context); return context;其中actionContext对象的创建为:static ThreadLocal actionContext = new ActionContextThreadLo
22、cal();ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。ActionContext运用接获取HttpServletRequest、HttpServletResponse、HttpSession信息,如下例例一:获取所有参数中某个参数的值/取得我们当前的ActionContext对象co
23、ntextActionContext context = ActionContext.getContext();/从context对象里获取我们所有的请求参数,取得的却是一个Map对象Map params = context.getParameters();/得到的Map对象有许多参数值,这举例取request请求的“username”参数值String username = (String) params.get(“username”);例二:获取HttpSessionMap session = ActionContext.getContext().getSession();此例取得的ses
24、sion却是Map类型的对象,这是为什么?原来, WebWork框架将与Web相关的很多对象重新进行了包装,比如这里就将HttpSession对象重新包装成了一个Map对象,供我们的Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。ServletActionContext如果Action需要直接与JavaServlet的HttpSession、HttpServletRequest等一些对象进行操作,则需要利用 ServletActionContext。ServletActionContext简介ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有:1、 javax.servlet.http.HttpServletRequest:HTTPservlet请求对象2、 javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象3、
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1