Struts2-convention-plugin全注解在开发中的应用

转载至:http://blog.knowsky.com/237630.htm

既然Hibernate和Spring可以实现全注解式开发(Hibernate的注解式开主要体现在Hibernate的JPA,直接通过注解配置天生表取代了利用脚本来完成),使我们从复杂的配置中解放出来,Strut2引进的一款强大插件(Struts-Convention-plugin,官方文档cwiki.apche/WW/convention-plugin)可以是你也完成这样的任务.


首先你要搞清楚,这个插件它会默认扫描所有包名为struts、struts2、action、actions下面的类。然后它会对实现了Action接口以及类名以Action结尾的这些类,作为Action来进行处理。

你可以重新定义按哪种包名进行扫描。比如本例设定,只扫描web包下面的所有类,由于我们将Action类都放在这个包下面。

那这个插件是怎么实现原来的配置信息的呢? Ruby Snake 它的映射规则是这样的,对于以Action结尾的的类,往掉Action,取剩下的部分,将所有的字母转换为小写,假如有驼峰式的写法,则用"-"连接符来连接不同的单词,这是此插件的默认方式。终极转换之后的就是请求地址,还是用例子说明。

com.bolo.examples.web.base.UserAction

按照上面的规则,请求地址就应该是UserAction往掉Action后缀,将其余部分转换为小写,所以user就是我们的请求地址。不过,这还没有完,由于这里面还有一个命名空间的路径,在通常的配置文件中,一般会将不同的功能进行划分,在package标签里加上namespace属性。使用这个插件,它会为你自动配上命名空间,默认的就是前面说到的以那四种名称为根目录的命名空间,它们之后的都将成为命名空间的名称。

com.bolo.examples.struts.UserAction 映射为 /user.action

com.bolo.examples.struts.base.UserAction 映射为 /base/user.action

要是我们不以struts或其它几种默认值为包名,又该怎么办呢?没关系,插件为我们提供了一种自定义根包的配置方式

<constant name="strutsnvention.package.locators" value="web" />

上面这段配置是写在struts.xml里面的,它指定web为根,作用就相当于那四种默认值。

com.bolo.examples.web.base.UserAction映射为 /base/user.action

com.bolo.examples.web.HelloAction 映射为 /hello.action

com.bolo.examples.web.HelloWorldAction 映射为 /hello-world.action

请一定留意驼峰写法的映射方式,假如这里不是HelloWorld,而是Helloworld,那就不会再是hello-world.action,而是helloworld.action了。

既然已经知道了它的映射方式,接下来再看看这个插件是如何定义结果页面的。

convention默认会到/WEB-INF/content文件夹下面查找对应的结果页面,这个文件夹的名字可以修改,需要在struts.xml中定义

<constant name="strutsnvention.result.path" value="/WEB-INF/jsp" />

文件夹的名字改成了jsp,这样定义后,convention就会在这个文件夹下面查找结果页面。 lightening bolt 它的查找路径与映射的命名空间有关。默认规则是,在请求的命名空间下面,根据请求名称再结合方法返回的字符串天生终极的结果页面名称,再配以后缀名。convention支持以jsp、ftl、vm、html、htm等五种后缀格式的文件。这里有个比较特殊的是假如方法返回success,那么可以不用将它与请求名称拼接起来,直接使用请求名称作为返回页面的名称。还是举例子说明。

package com.bolo.examples.web;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {

    public String execute() {

        return SUCCESS:

    }

    public String welcome() {

        return "welcome";

    }

}



比如上面这段代码,HelloAction处于我们定义的根包(web)下面,因此,它的action请求为hello.action。 Lava Vocano  这时, Match Scratch 会默认执行execute()方法,由于返回的是success字符串,所以页面的名称可以简写为hello.jsp,但是当执行welcome方法时,由于返回的字符串为welcome,这时的页面名称则为hello-welcome.jsp。convention就是遵循这样的规则来进行命名,当然这只是最基本的,我们再来看看稍微复杂点的东东。

package com.bolo.examples.web.base;

import org.apache.struts2nvention.annotation.Result;

import org.apche.struts2nvention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;

@Results({@Result(name = "success",location="role-list.jsp"),@Result(name = "redirectUser",location="user.action" type="redirectAction")})

public class RoleAction extends ActionSupport {

    public String execute() {

        return SUCCESS:

    }

    public String input() {

        return INPUT;

    }

    public String redirectUser() {

        return "redirectUser";

    }

}



这个RoleAction类的外部,加了两种注解,它们的作用相当于配置文件中的result标签。Results是一个Result类型的数组注解,里面可以包含多个Result配置。使用Result注解来设置返回类型与返回页面,是不预备采取默认的定义方式。比如HelloAction就是我们采取的默认方式。另外对于有些特殊的返回类型,也需要显式的进行定义。

由于我对RoleAction中的execute()方法返回结果进行了显式的定义,所以,它将不再返回默认的role.jsp,而是location指定的role-list.jsp,Result注解中的name值要与返回值对应。

当请求路径为role!input.action时,会执行input()方法,对于这个方法来说,由于没有进行显式的定义,所以它会按照默认的命名规则返回role-input.jsp。

而redirectUser方法的返回结果指定了一个type为redirectAction的值,这表示要对Action重定向,在location中也说明了是跳转到哪个Action。请留意这里指定的是user.action,当程序跳转到UserAction时,会默认执行execute方法。

假如说,你想执行其它方法该怎么办呢? All the Little things 可以在location里面这样定义,location="user!input.action"。请记住,重定向时,假如是跳转到其它Action或本Action中的其它方法,type要写成redirectAction。

更进一步,我还想带些参数过往,又该如何呢?请添加params属性,它是一个数组类型。可以这样定义,params={"role_id","${role_id}","role_name","超级治理员"}。convention文档中有说明,里面的参数是一个键值对,总是形如key,value,key,value。所以第一个role_id与第三个role_name都叫参数名,二和四则是参数值。另外留意下"${role_id}"的含义,这是使用的OGNL表达式取出存在于值栈中的名叫role_id的值。这是一种动态获取并赋值的方式,在采用配置文件的方式中,也可以这样运用,而role_name参数则是一个固定字符串值。需要特别留意的就是,作为参数名的role_id与role_name,一定要在指向的Action中有这两个同名的属性,并且还有set方法,这是用来给这两个属性赋值。而对于${role_id},则要在当前这个Action中,有它的get方法。用于取值。

补充说明一下,在Action类中定义的全局变量,不是非得给它都加上set、get方法,这是根据实际情况来设置的。简单的说get()是获得值,set()是设置值。比如,你现在要在页面上显示username,那么就对这个属性设置get方法,假如只是对username设置值,从页面传值到Action,那只需要对它设置set方法就可以了。除此之外,我们也可以不采用struts2提供的值栈方式得到参数值,而是使用非常熟悉的request. getParameter()方法来获取参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值