本文内容:
一.使用注解方式的好处
二.Java注解方式写法
三. Java注解具体实现
四.Java注解的其他写法
一.使用注解方式的好处
Struts2中声明架构有2种方式,一种是xml的方式,一种Java注解的方式。对于Java注解的方式,它没有xml文件,所有的元数据都集中放在Java注解中,这些注解直接驻留在实现动作的类对应的Java源代码中。
很多人觉得Java注解是一种比较优雅的解决方案。有些XMl元素中必须显示指定的信息,可以从注解的类所隶属的Java包结构自动推断出来,也减少了多年以来在Web应用程序类路径下积累的XML文件的混乱状况。
(PS:个人觉得XML的也还好,大不了我把XML分割成几个独立的XML,必要时多写几行注释不就OK了)
二.Java注解方式写法
总结常用注解:
Namespace:指定命名空间。
ParentPackage:指定父包。
Result:提供Action结果的映射。
Results:Result注解列表。
Action:指定Action的访问URL。
Actions:Action注解列表。
@Namespace("/XXX") //不需要指定也可以。
@ParentPackage("struts-default") //不需要指定也可以。
@Result(name = "success",location = "/MyJsp.jsp")
@Results({
@Result(name = "success",location = "/MyJsp.jsp"),
@Result(name = "error",location = "/index.jsp")
})
@Action(value = "abc")
@Actions( { @Action("/one/url"), @Action("/another/url") })
一般来说,Action会配合Results属性一起使用。如:
@Action(value = "/H5/url", results = {
@Result(name = SUCCESS, location = "/H5/success.jsp"),
@Result(name = "failure", location = "/H5/fail.jsp")
})
三. Java注解具体实现
1.需要告诉框架动作类在哪里。
所以需要在web.xml中的FilterDispatcher中配置actionPackages属性,如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>action</param-value>
</init-param>
</filter>
2.告诉框架动作类在哪里还是不够的,需要以某种方式标记哪些类是动作类。方法有2.
一.实现Action接口。
二.使用命名约定,即让类名以Action结尾。
当然,你即实现Action接口,也以Action结尾也是可以的。
3.具体实例:我建的Web工程如下:
Web.xml文件如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>action</param-value>
</init-param>
</filter>
Index.jsp页面如下:
<body>
<a href = "/test/test.action">test1.action</a>
</body>
TestAction代码如下:
package com.my.action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Namespace("/test") //不需要指定也可以。不指定时jsp页面的/test/的这个命名空间也要去掉
@ParentPackage("struts-default") //不需要也可以
/*
* 相当于指定全局结果
*/
@Results({
@Result(name = "success",location = "/Success.jsp"),
@Result(name = "error",location = "/Error.jsp")
})
/*
* @Result(name = "error",location = "/index.jsp")
* 这个也是相当于指定全局结果,只不过这个是指定一个返回,上面是指定多个。
*/
public class TestAction extends ActionSupport{
public String execute() throws Exception
{
return SUCCESS;
}
}
四.Java注解的其他写法
1.假如多个action响应同一个函数怎么办?
2.一个TestAction类中有多个方法,分别响应不同的action。
3.正常点的类(一个TestAction类中有多个方法,分别响应不同的action。各自action有各 自的返回值)
对于1:
public class TestAction extends ActionSupport{
@Actions({
@Action("test"),
@Action("test1")
})
public String execute() throws Exception
{
return SUCCESS;
}
}
对于
2
:
public class TestAction extends ActionSupport{
/*
* 这个execute()方法默认就是test.action对应响应的方法
*/
public String execute() throws Exception
{
return SUCCESS;
}
@Action("test1")
public String test2()
{
return ERROR;
}
}
对于
3
:
public class TestAction extends ActionSupport{
/*
* 这个execute()方法默认就是test.action对应响应的方法
*/
public String execute() throws Exception
{
return SUCCESS;
}
/*
* 不同action响应同一个方法,但是对返回的结果处理不同
*/
@Actions({
@Action(value = "test1",results = {
@Result(name = "yes",location = "/Success.jsp"),
@Result(name = "no",location = "/Error.jsp")
}),
@Action(value = "test2",results = {
@Result(name = "yes",location = "/Error.jsp"),
@Result(name = "no",location = "/Success.jsp")
}),
})
public String test1_2()
{
return "yes";
}
/*
* 普通的一个action对应的方法,不同返回值跳转页面不一样
*/
@Action(value = "test3",results = {
@Result(name = "yes",location = "/Success.jsp"),
@Result(name = "no",location = "/Error.jsp")
})
public String test3()
{
return "no";
}
}