最近在看Struts2的showcase,本打算先找个简单的看看,就选择了person,要么说没有中彩票的运气,第一个例子我就看不明白了,person的index.jsp里是这样调用action的
<html>
<head>
<title>Acme Corp</title>
</head>
<body>
<ul>
<li><a href="newPerson!input.action">Create</a> a new person</li>
<li><a href="listPeople.action">List</a> all people</li>
</ul>
</body>
</html>
但是在struts-person.xml里却没有这个action的声明,只是声明了一个包,也没有默认的action类,后来”百度“了一下才知道,这个是Struts2的新特性,使用注解配置Action。
使用注解配置Action第一个要做的就是在web.xml中配置FilterDispatcher,为FilterDispatcher设置 actionPackages参数,指定包含了Action类的包的列表,多个包之间用(,)分割,这些包和他们的子包都会被扫描。扫描的对象是包中所有实现了Action接口,或者以"Action"结尾的类。顺便说一下类名的匹配方法,把类名的第一个字母小写,如果以Action结尾的,去掉 Action。比如说一个类叫 DeletePersonAction 那么他的请求应该是deletePersion.action。
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>org.apache.struts2.showcase.person</param-value>
</init-param>
</filter>
这个配置的意思就是会扫描org.apache.struts2.showcase.person包里所有实现了Action接口,或者以"Action"结尾的类,所以"newPerson!input.action"这个请求对应的类应该是NewPersonAction的input 方法。
我们再看看NewPersonAction.java这个文件
@ParentPackage("person")
public class NewPersonAction extends ActionSupport {
private static final long serialVersionUID = 200410824352645515L;
PersonManager personManager;
Person person;
public void setPersonManager(PersonManager personManager) {
this.personManager = personManager;
}
public String execute() {
personManager.createPerson(person);
return SUCCESS;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
所谓的零配置就是把相关的注解写到Action类里,比如ParentPackage,Namespace,Result,Results
例如:
@Namespace("/person") //指定名称空间
@ParentPackage("person") //指定继承的包,struts-default无需指定
@Result("/success.jsp") //指定success,因为success是默认的,所以不用指定name
@Results({
@Result("name="input", value="/input.jsp"),
@Result("name="error", value="/error.jsp", type=ServletDispatcherResult.class)
})
public class NewPersonAction extends ActionSupport {
。。。。
}
但是NewPersonAction.java里并没有指定result,那它是怎么转移的呢?这个是codebehind插件的作用。在struts.xml里有这样的设定,也就是说person这个包应用了codebehind的功能
<constant name="struts.codebehind.defaultPackage" value="person" />
参考网址是
http://struts.apache.org/2.0.6/docs/codebehind-plugin.html
我想因为这个,所以NewPersonAction会跳转到newPerson.ftl上。
<!-- -->