Struts2零配置 Zero Config+CodeBehind

Zero Config能根据web.xml中配置的actionPackages自动扫描所有Action类,并猜测其NameSpace.
再利用CodeBehind猜测Result指向的jsp,实现了struts.xml的零配置(其实也不是完全没有struts.xml,而是指struts.xml的内容不会随action的增加而膨胀)
如果有特殊的结果指向(如redirect类型的结果),在Action处用@Result配置。
如有package级的配置(如使用非默认的Interceptor栈),仍在struts.xml中定义package,用@ParentPackage指定。

不过,目前ZeroConfig的Annotation较少,只有@Result、@ParentPackage,@NameSpace(java的package名不符合约定规则时使用),还有exception-Mapping之类的配置没有包含。

1. ZeroConfig

在Web.xml 中设置ActionPackages ,则 Struts2会自动扫描这些Package下的Class,Class名含Action或扩展子ActionSupport的类都将被载入。

其中actionPackages的设置很有学问,比如 org.springside.miniweb.web, 则org.springside.miniweb.web.user.RoleAction,访问路径就会被自动的猜测为 /user/role.action

如果package名不符合这个规则,就需要自行设定NameSpace了,可以用Namespace annotation。又或者用ParentPackage annotation指定package,再在struts.xml中定义package的namespace.

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>org.springside.examples.miniweb.web</param-value>
</init-param>
</filter>

在Action类中,用Annotation 对特殊的RELOAD返回值进行了注释,其余的results就交给code-behind去猜了。

@Results({
@Result(name=CRUDActionSupport.RELOAD, value="/role", type=ServletActionRedirectResult.class)
})
public class RoleAction ...

2. CodeBehind

指定JSP的默认目录在/WEB-INF/jsp 下,原因就是希望保护jsp不能被直接打开,安全模块只要保护Action的地址即可

<constant name="struts.codebehind.pathPrefix" value="/WEB-INF/jsp/" />

1). 可以用 /user/login.action的URL 打开 /WEB-INF/jsp/user/login.jsp ,而LoginAction无需实际编写。

2). 对于UserAction返回return SUCCESS,默认访问/WEB-INF/jsp/user/user.jsp 或 user-success.jsp. 返回 “input”, 默认访问/WEB-INF/jsp/user/user-input.jsp

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()函数留空。

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

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" />

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页。

6. 取得Request 和 Response

HttpServletRequest request = ServletActionContext.getRequest();     
HttpServletResponse response = ServletActionContext.getResponse();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值