`

webwork学习笔记

阅读更多
最近学习了WebWork,感觉它相对Struts1的最大优势在于它便于测试和Interceptor,使得系统的架构更加的低藕和,提高代码的可重用性。以后是学习WebWork过程中的一些感想。

1、对Request, Response, Session对象的访问,最好采用Aware接口的方式进行访问,而不是采用ServletActionContext的方式访问。

2、文件上传(同名多文件上传只需把相应的字段改成数组)
使用MultiPartRequestWrapper上传文件
public class ReqUpload extends ActionSupport implements ServletRequestAware{

public String execute() throws Exception {
// TODO Auto-generated method stub

MultiPartRequestWrapper rap = (MultiPartRequestWrapper)(req);
File doc = null;
try
{
doc = rap.getFiles("doc")[0];
String fileName = rap.getFileNames("doc")[0];
String contentType = rap.getContentTypes("doc")[0];

File directory = new File("e:\\log\\"+fileName);

doc.renameTo(directory);

}catch(Exception e)
{
e.printStackTrace();
}
finally
{
doc.delete();
}

return SUCCESS;
}



使用FileUploadInterceptor
pblic String execute() throws Exception
{

for(int i = 0; i < this.getDoc().length; i++)
{
File path = new File("e:\\log\\"+this.getDocFileName()[i]);
this.getDoc()[i].renameTo(path);
}

return SUCCESS;

}
然后再Action配置中加入<interceptor-ref name="completeStack"/>

3、Field-Driven Action VS Model-Driven Action
Field-Driven Action
它一般用在页面表单比较简单的情况使用,而且可以直接用域对象作为Action的字段。

Model-Driven Action
它很像Struts的FormBean,但在WebWork中,只要普通Java对象就可以充当模型部分。Model-Driven(模型驱动的)Action要求我们的Action实现com.opensymphony.xwork.ModelDriven接口,它有一个方法:Object getModel(),我们用这个方法返回我们的模型对象就可以了。如:
public class RegisterAction implements Action,ModelDriven
{
private User user = new User();

public String execute() throws Exception
{

//在这里调用用户注册的业务逻辑,比如:将注册信息存储到数据库
return SUCCESS;
}

public Object getModel()
{
return user;
}
}
页面文件:
<form name="register" action="register.action" method="post">
Username:<input type="text" name="username"><br>
Password:<input type="text" name="password"><br>
Email:<input type="text" name="email"><br>
Age:<input type="text" name="age"><br>
<input type="submit" name="Submit"><br>
</form>
配置文件如下:
<action name="register" class="com.xxh.actions.RegisterAction">
<result name="success" type="dispatcher">
<param name="location">/register-result.jsp</param>
</result>
<interceptor-ref name="model-driven"/>
<interceptor-ref name="params"/>
</action>



4、ActionContext And ServletActionContext
ActionContext
执行Action的上下文,我们可以通过ActionContext的静态方法:ActionContext.getContext()来取得当前的ActionContext对象;通过ActionContext取得我们的HttpSession:Map session = ActionContext.getContext().getSession();WebWork框架将与Web相关的很多对象重新进行了包装,比如这里将HttpSession对象重新包装成了一个Map对象,供我们的Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。

ServletActionContext
这个类直接继承了ActionContext,提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有:javax.servlet.http.HttpServletRequest:HTTPservlet请求对象;javax.servlet.http.HttpServletResponse;:HTTPservlet响应对象;javax.servlet.ServletContext:Servlet 上下文信息;javax.servlet.ServletConfig:Servlet配置对象;javax.servlet.jsp.PageContext:Http页面上下文。使用 ServletActionContext. getRequest()、 ServletActionContext. getRequest().getSession()等方式获取相应的对象。
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去选择呢?我觉得:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。

5、单元测试
使用单元测试框架JUnit对register.User. RegisterAction做单元测试
public void testExecuteWithProxyFactory() throws Exception
{
Map params = new HashMap();
params.put("user.username","Moxie");
params.put("user.password","mypassword");
params.put("user.email","achqian@yahoo.com.cn");
params.put("user.age",new Integer(23));
Map extraContext = new HashMap();
extraContext.put(ActionContext.PARAMETERS,params);

ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy("example", "register", extraContext);
proxy.setExecuteResult(false);
assertEquals(proxy.execute(),"success");

RegisterAction action = (RegisterAction) proxy.getAction();
assertEquals(action.getUser().getUsername(),"Moxie");
assertEquals(action.getUser().getAge(),23);
}

6、Interceptor(拦截器)
Interceptor(拦截器)将Action共用的行为独立出来,在Action执行前后运行。这也就是我们所说的AOP(Aspect Oriented Programming,面向切面编程),它将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。
当你提交对Aciton(默认是.action结尾的Url)的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被 Interceptor截取,Interceptor在Action执行前后运行。
webwork-default.xml中拦截器的定义如下:
<interceptors>
<interceptor name="alias" class="com.opensymphony.xwork.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
<interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
<interceptor name="createSession" class="com.opensymphony.webwork.interceptor.CreateSessionInterceptor" />
<interceptor name="debugging" class="com.opensymphony.webwork.interceptor.debugging.DebuggingInterceptor" />
<interceptor name="external-ref" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
<interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
<interceptor name="fileUpload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>
<interceptor name="i18n" class="com.opensymphony.xwork.interceptor.I18nInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
<interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
<interceptor name="scope" class="com.opensymphony.webwork.interceptor.ScopeInterceptor"/>
<interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
<interceptor name="sessionAutowiring" class="com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringInterceptor"/>
<interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
<interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
<interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="paramFilter" class="com.opensymphony.xwork.interceptor.ParameterFilterInterceptor" />
<interceptor name="paramRemover" class="com.opensymphony.xwork.interceptor.ParameterRemoverInterceptor" />
<interceptor name="sessionInvalidation" class="com.opensymphony.webwork.interceptor.SessionInvalidationInterceptor" />
<interceptor name="flash" class="com.opensymphony.webwork.interceptor.FlashInterceptor" />
<interceptor name="cookie" class="com.opensymphony.webwork.interceptor.CookieInterceptor" />
<interceptor name="store" class="com.opensymphony.webwork.interceptor.MessageStoreInterceptor" />

<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="model-driven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="static-params"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
<default-interceptor-ref name="defaultStack"/>
</interceptors>
可以自定义一个自己的Interceptor, 得实现Interceptor接口,或扩展抽象类AroundInterceptor等实现一个自己的Interceptor.

分享到:
评论

相关推荐

    webwork学习笔记(全)

    **WebWork 学习笔记(全)** WebWork 是一个基于 Java 的开源MVC(Model-View-Controller)框架,它旨在简化企业级Web应用程序的开发。本教程将全面介绍WebWork的核心概念、架构和使用方法。 **WebWork 介绍** ...

    WebWork2学习笔记

    本学习笔记将深入探讨WebWork2的核心概念、主要特性以及如何在实际项目中应用。 首先,WebWork2的核心是Action,它是处理用户请求的中心组件。Action类负责接收HTTP请求,执行业务逻辑,并通过Result将处理结果返回...

    java经典学习笔记,个人总结

    Java 经典学习笔记,个人总结 本资源总结了 Java 学习笔记,涵盖了 J2EE 方面的三大框架,包括 Struts2.x、Hibernate 和 Spring。文章首先介绍了 Struts2 的概念和优点,然后详细讲解了如何搭建 Struts2 开发环境,...

    Struts2学习笔记

    Struts2学习笔记,从基础开始。结合Struct1 和WebWork。

    代码学习笔记

    【代码学习笔记】 DWR(Direct Web Remoting)是一个在Java EE环境中广泛应用的AJAX框架,它的核心功能是使得开发者能够像操作本地JavaScript函数一样,便捷地调用服务器端的Java方法。这一特性极大地简化了前后端...

    Struts1及14. Struts2学习笔记

    本学习笔记将对Struts1和Struts2进行详细解析。 **Struts1简介** Struts1是早期流行的MVC框架,它的核心是ActionServlet,负责处理HTTP请求,并通过ActionForm对象收集表单数据,然后调用Action类的方法进行业务...

    struts2学习笔记

    以下是对Struts2学习笔记的详细解析: 一、认识Struts2 Struts2是Apache软件基金会的开源项目,它是Struts1的后续版本,吸取了其他优秀框架如WebWork的优点。Struts2的核心是Action类,它负责处理HTTP请求,并与...

    webwork in action

    在学习WebWork的过程中,`笔记.pdf`可能是作者或读者整理的学习要点和心得,涵盖了书中关键概念的总结。`[www.whser.com]readme.txt`可能是一个网站的说明文档,提供了更多关于WebWork的在线资源或者示例代码。`JSP...

    Java常用框架学习笔记.7z

    这些"Java常用框架学习笔记.7z"的压缩包包含了五个关键的Java框架的学习资源,它们分别是Struts2、Hibernate、Spring、SpringMVC和MyBatis。这五个框架都是Java开发中的重要工具,对于理解Java后端开发的复杂性和...

    struts项目学习笔记

    由传统Struts1和WebWork两个经典框架发展而来 Struts2框架=Struts2+XWork Strust2 核心功能 允许POJO(Plain Old Java Objects,简单javabean对象,没有继承,没有实现,getter,setter方法)对象 作为Action,没有耦合 ...

    strut2学习笔记(自己整理适合新手入门)

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在2007年发布,结合了WebWork框架的优秀设计和Struts1的成熟特性,旨在为...通过实践和学习,可以更好地掌握这个强大的MVC框架。

    struts2的学习笔记+测试源代码

    这篇学习笔记结合了测试源代码,旨在帮助开发者深入理解Struts2的核心概念和实践应用。 一、Struts2框架概述 Struts2是Apache软件基金会下的一个开源项目,它是Struts1的升级版,吸收了其他框架如WebWork的优点,...

    spring学习笔记

    本学习笔记将深入探讨Spring 3.0 MVC框架,帮助读者理解并掌握其主要特性。 首先,Spring MVC设计的核心理念是高度可配置性。每个功能模块都可以根据需求进行定制,这意味着开发者可以根据项目需求调整框架的工作...

    Struts2学习笔记.zip

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于...Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架,这里是在学习一些关于Struts2框架的详细笔记资源。

    Struts2 - 学习笔记

    Struts2是在WebWork2基础上发展而来的.和Struts1一样,Struts2也属于MVC框架.需要注意:尽管Struts2与Struts1在名称上的差别不大,但两者在代码编写风格上几乎是不一样的.

    Struts 学习笔记

    本篇学习笔记将深入探讨Struts的核心概念、工作原理以及如何在实际项目中应用Struts来构建高效、可维护的Web应用程序。 一、Struts框架概述 Struts作为经典的MVC框架,它为Java开发者提供了一种组织应用程序逻辑的...

    struts2学习笔记一

    作为Apache软件基金会的开源项目,Struts2是在Struts1的基础上,结合WebWork的技术发展起来的新一代框架,其核心是Xwork,能够在非WEB环境下运行。 1. **框架的概念** 框架是为了减少重复工作并提供可重用性而设计...

Global site tag (gtag.js) - Google Analytics