WebWork手册.docx
《WebWork手册.docx》由会员分享,可在线阅读,更多相关《WebWork手册.docx(31页珍藏版)》请在冰豆网上搜索。
![WebWork手册.docx](https://file1.bdocx.com/fileroot1/2023-5/28/71f5c147-0c10-4a05-bfd7-42080aa2f517/71f5c147-0c10-4a05-bfd7-42080aa2f5171.gif)
WebWork手册
WebWork使用指南
引言
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EEWeb框架。
WebWork已经被拆分成了Xwork1和WebWork2两个项目。
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等。
在WebWork2.2中添加了对AJAX的支持,这支持是构建在DWR与Dojo这两个框架的基础之上.
用于WebWork辅助开发的一个Eclipse插件:
EclipseWork
文件目录
webwork下载一般包含的目录有:
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里查找与提交动作匹配的Action名字,通过这个名字XWork框架找到对应Action的类;然后XWork框架会负责去创建这个Action类的对象并调用execute()方法进行用户注册操作。
正确执行execute()方法返回String类型数据后,它会请求再派遣到用户所配置指定好的页面。
当然在action执行之前会先执行配置好的拦截器。
webwork.xml中
用来配置拦截器。
其中params是在webwork-default.xml定义好的,可以是"chain"、"model-driven"等等。
引用的是
com.opensymphony.xwork.interceptor.ParametersInterceptor。
拦截器将作用是将request请求的参数值通过表达式语言设置到相应Action的模型里。
例如:
某jsp里的,它输入的值会由Action类的getUser()和User类的setUserName(“…”)设置到这个User模型里。
拦截器的使用,使得Action类和Web实现了完全的解耦
开发步骤
描述一个WEB项目使用xwork的开发过程
创建WEB工程
1、新建一个WEB工程将webwork的jar包放到web应用的WEB-INF\lib目录里
2、将xwork.xml、webwork.properties等webwork配置文件放到WEB-INF\classes目录
配置文件
Web框架都是通过web.xml配置一个JavaServlet控制器提供统一的请求入口,解析请求
的url,再去调用相应的Action进行业务处理。
WebWork也是如此,它是在web.xml文
件里配置一个派遣器ServletDispatcher,ServletDispatcher初始化WebWrok的一些配置
信息,解析XWork的Action配置信息,根据请求去组装和调用执行相应的拦截器
(Interceptor)、Action、ActionResult(Action执行结果的输出)等。
另外与Struts类似,Webwork也需要配置本身xml。
这个文件是xwork.xml,也是设置action及其转向
web.xml
webwork
com.opensymphony.webwork.dispatcher.ServletDispatcher
webwork
*.action
//如果使用WebWork自带的标签库则必须载入WebWorkVelocityServlet,
并配置webwork.tld
velocity
com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet
velocity
*.vm
webwork
/WEB-INF/webwork.tld
xwork.xml
/main.jsp
/index.jsp
/login.jsp
/error.jsp
下面是job.xml
login.jsp
system/register.jsp
说明:
1、设置全局跳转
global-results允许定义全局的输出目地,只要继承它所在的package,这些全局定义都是可用的。
比如某个package下有多个action配置,那么这些action都可以使用全局的跳转,调用方式与action局部跳转一致。
2、必须包括webwork-default.xml
3、定义一个package,这个包可以继承其它package。
继承后则拥有此package中所有action配置
4、namespace命名空间:
用于指定一个action调用路径,假如此应用项目名为SchdulerCenter,那么要调用此例的注册action(job.xml),页面中提交的路径应为<%=request.getContextPath()%>/job/register.action。
当成功时返回页面路径为<%=request.getContextPath()%>/job/login.jsp
因为:
result目的地没有‘/’出现,表示目标页面的路径与action请求的命名空间路径一致,故将跳转到<%=request.getContextPath()%>/job/login.jsp
当失败时返回页面路径为<%=request.getContextPath()%>/system/register.jsp
因为:
result目的地出现‘/’,表示目标页面的路径是自定义,并非默认与命名空间一致,故将跳转到自定义的目的地<%=request.getContextPath()%>/system/register.jsp
5、通过include节点可将其它配置文件导入至默认配置文件xwork.xml中,此例将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:
浏览器跳转,可转向其它系统页面,无法将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、上面的配置文件在拦截器设定方面还可修改为如下:
//通过interceptors组合params与model-driven拦截器,以减少interceptor-ref声明
...
//启用组合后的指定拦截器,
模型
通常所指的JavaBean。
主要是一些属性及其set/get方法
Action
action操作有两种驱动模式
Property-Driven模式:
implementsAction或extendsActionSupport
Model-Driven模式:
implementsAction
注:
建议采用Model-Driven模式使得业务逻辑更加清晰
Property-Driven模式
publicclassInfoActionimplementsAction{
/*直接将页面要用的数据封到InfoAction,将InfoAction同时当成Bean*/
publicStringcompany;
/*重写Action的execute方法,指定返回跳转*/
publicStringexecute()throwsException{
company="ultrapower";
returnSUCCESS;
}
publicStringgetCompany(){
returncompany;
}
publicvoidsetCompany(Stringcompany){
pany=company;
}
}
说明:
采用此模式,在页面中可以直接使用action属性命名表单控件,如上例中,对于页面有一个文本框,,其中company是Action的属性.在提交页面时company的值自动映射到InfoAction的company属性。
此模式建议不采用。
Model-Driven模式
/*此模式将页面要用的数据单独作成Bean类*/
publicclassMessage{
publicStringaddress;
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
然后action
publicclassMessageActionimplementsAction{
/*将页面要用的数据Bean作为属性*/
publicMessagemessage;
/*重写Action的execute方法,指定返回跳转*/
publicStringexecute()throwsException{
//TODOAuto-generatedmethodstub
returnnull;
}
publicMessagegetMessage(){
returnmessage;
}
publicvoidsetMessage(Messagemessage){
this.message=message;
}
}
说明:
采用此模式,在页面中可以直接使用模式属性命名表单控件,如上例中,对于页面有一个文本框,,其中message是Action的属性,即模型类对象Message。
address又是模型对象Message的属性,在提交页面时message.address的值自动映射到InfoAction的message属性对象。
采用Model-Driven模式使用webwork标签比较简洁。
建议采用
ModelDriven接口
在webwork中提到com.opensymphony.xwork.ModelDriven接口是做什么的呢?
它是将ObjectgetModel()取得的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()方法和view()方法,请求名为login,那么
请求名为login.action时,进入execute()方法。
请求名为login!
view.action时,进入view()方法。
ActionContext
由于Xwork与Web无关性,我们的Action不用去依赖于任何Web容器,不用和那些JavaServlet复杂的请求(Request)、响应(Response)关联在一起。
对请求(Request)的参数(Param),可以使用拦截器框架自动调用一些get()和set()方法设置到对应的Action的字段中。
但是,仅仅取得请求参数的值就能完全满足我们的功能要求吗?
不,在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServletHttp的请求(HttpServletRequest)、响应(HttpServletResponse)操作。
ActionContext简介
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象,比如:
在使用WebWork时,我们的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。
在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。
ActionContext获取
通过ActionContext的静态方法:
ActionContext.getContext()来取得当前的ActionContext对象,如下代码:
publicstaticActionContextgetContext(){
ActionContextcontext=(ActionContext)actionContext.get();
if(context==null){
OgnlValueStackvs=newOgnlValueStack();
context=newActionContext(vs.getContext());
setContext(context);
}
returncontext;
}
其中actionContext对象的创建为:
staticThreadLocalactionContext=newActionContextThreadLocal();
ActionContextThreadLocal是实现ThreadLocal的一个内部类。
ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。
ActionContext运用
接获取HttpServletRequest、HttpServletResponse、HttpSession信息,如下例
例一:
获取所有参数中某个参数的值
//取得我们当前的ActionContext对象context
ActionContextcontext=ActionContext.getContext();
//从context对象里获取我们所有的请求参数,取得的却是一个Map对象
Mapparams=context.getParameters();
//得到的Map对象有许多参数值,这举例取request请求的“username”参数值
Stringusername=(String)params.get(“username”);
例二:
获取HttpSession
Mapsession=ActionContext.getContext().getSession();
此例取得的session却是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、