您的位置:首页 > 编程语言 > Java开发

Struts2 随笔

2011-01-19 11:27 225 查看

3.1 总体变化

MVC框架最主要的两个功能是页面参数与Action Model的转换页面流转控制,我们考察框架时也多从这两点入手。

Struts2模式上的变动:
一、Action 从singleton bean 改为了per request的prototype bean。之前Struts1为了线程安全,action里面没有任何成员变量,在一个处理函数里输入输出都靠request,response参数搞定。
二、将很多处理透明的分解到了Interceptor Chain中,

因此,Struts2中Action在MVC里的位置,从Controller转为了Model(有属性、有行为且不依赖Request/Response的POJO),而Controller的角色则由Struts2亲自担当。

Struts2实际上的简化:

FormBean与Action合一,直接读写成员变量,不再需要FormBean或LazyBean,不再需要从request读写数据,每个函数不再需要长长的Request/Response参数。

实用的Prepareable接口和ModelDriven接口,比在在update时先从数据库载入拥有10个属性的对象,然后从页面绑定其中5个属性,整个过程很完美。

Convention,基于约定与annotation实现零配置文件。

3.2 零配置文件

Convention Plugin是2.1.6最新坐正的零配置Plugin,取代了原来的CodeBehind等插件,详细见详见Struts2笔记。 及其官方文档

,Alfa.Shi翻译了中文版



1. 能自动扫描所有Action类(默认为struts,action package下的所有子package,Springside在struts.xml中重新定义扫描web package下所有的子Package)
2. 所有扫到的Action,Convention猜测其NameSpace,如org.xxxx.struts.hello.world的路径为 /hello/world.action,package名如不符合这个规则也可以在action中用@Namespace重新指定。
3. jsp名同样以默认规则定义,对于UserAction返回return SUCCESS,默认访问/WEB-INF/jsp/user/user.jsp 或 user-success.jsp. 返回 "input" ,默认访问/WEB-INF/jsp/user/user-input.jsp
4.如果有特殊的结果指向(如redirect类型的结果),在Action处用@Result配置。
5.如有package级的配置(如使用非默认的Interceptor栈),仍在struts.xml中定义package,用@ParentPackage指定。也可以使用Convention Plugin提供的其他annotation进行配置。
6.可以用 /user/login.action的URL 打开 /WEB-INF/content/user/login.jsp ,而LoginAction无需实际编写。

http://struts.apache.org/2.0.11.2/docs/codebehind-plugin.html



3.3 参数绑定-- ModelDriven, Prepareable

无论是将Action中的变量渲染页面中,或者从request中将内容回传到Action中变量的过程,统称参数绑定。

1. 最原始的Struts2会直接赋值Action中的变量。 如hello.action?id=1,会将action中的id属性赋值。
2. 如果参数较多,而且都属于同一个对象的,可以将所有属性都放入一个对象中,比如hello.action?user.id 会为action中的User对象的id属性赋值。
3. ModelDriven接口,如果不想写太多"user."前缀,如${user.id},可以实现ModelDriven接口的getModel函数,返回user对象。则Struts2碰到{id}时,就会尝试调用getModel() 获得user对象再获取其id属性。
4. Prepareable接口,还有一种情况Hibernate常用的情况,一个对象可能有很多属性(比如有10个属性),但页面上可能只显示5个属性的输入框。如果按上面的方法,先new一个User类,然后从页面上赋值。保存此对象时就会将不在页面上修改的5个属性清空了。这时就需要两次的binding,一开始user变量为空,只绑定了action的id属性,然后在prepare()函数中查出有完整10个属性的对象,然后二次绑定时再将页面的那5个属性复制到user对象中。
prepare()函数有两种作用,一种专门为了二次binding,一种是作为公共的数据准备函数。但是,一个action内有多个method,不是每一个method都需要执行prepare,比如list()方法,如果这种method较多,或者会造成冲突时,还有另外一种方式来定义二次binding函数。比如prepareSave() 函数,就会默认的在执行save()前执行,此时,专门实现prePareMethodName() 方法再调度一个内部的prepare函数,而将prepare()函数留空。

3.4 Theme设定

虽然没有用多少Struts2的taglib,但Struts2的Theme设计还是不错的,在<s:actionMessage>中,我们就需要更改输出的格式,不以列表形式显示。

1.在classpath的/template目录中新增自己的theme目录,如/template/mytheme,从struts2的默认simple theme中复制出actionmessage.ftl进行修改。

2.在jsp中使用新的theme <s:actionmessage theme="mytheme"/>

如果需要默认都使用新的theme:

1.在classpath:/template/mytheme 中放置theme.properties,里面放一句parent = xhtml,即所有未重新实现的ftl,都使用xhtml默认的模板。

2.修改struts.xml,增加<constant name= "struts.ui. theme " value= "mytheme" />

3.5 信息与异常显示

1.配置使用store interceptor,可以在redirect页面时,将信息存储在session中.

<interceptor-stack name="springSideStack">
<interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack" />
</interceptor-stack>


2. 尽量使用addActionMessage来添加信息, 如果用addActionError会自动跳到input页。

3.6 取得Request 和 Response

HttpServletRequest request = ServletActionContext.getRequest();     HttpServletResponse response = ServletActionContext.getResponse();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: