action的优化配置
1. Struts2中action的配置文件会随着业务的增加而增加。导致配置文件膨胀。Struts2中提供了三种方案来解决这个问题:
a) 动态方法调用来实现
b) 通配符配置来解决
c) 使用注解的方式来解决。
传统的action配置方式:
Action处理类中有4个处理方法:
public class UserAction { public String add(){ System.out.println("添加"); return Action.SUCCESS; } public String delete(){ System.out.println("删除"); return Action.SUCCESS; } public String find(){ System.out.println("查询"); return Action.SUCCESS; } public String update(){ System.out.println("修改"); return Action.SUCCESS; } } |
Action的配置文件:
<package name="default" namespace="/" extends="struts-default"> <!-- 传统的配置方式 --> <action name="add" class="cn.sxt.action.UserAction" method="add"> <result>/index.jsp</result> </action> <action name="find" class="cn.sxt.action.UserAction" method="find"> <result>/index.jsp</result> </action> <action name="delete" class="cn.sxt.action.UserAction" method="delete"> <result>/index.jsp</result> </action> <action name="update" class="cn.sxt.action.UserAction" method="update"> <result>/index.jsp</result> </action> </package> |
2. 动态方法调用简化action的配置:
a) 动态方法调用首先需要将下面常量配置为true
<!-- 配置动态方法调用为true,不同版本默认配置不一致 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> |
b) 在struts.xml配置文件中,只需配置一个action即可
<!-- 动态方法调用方式 --> <action name="userAction" class="cn.sxt.action.UserAction"> <result>/index.jsp</result> </action> |
c) 在调用action时,需要按照以下规则进行调用:
ActionName!methodName.action
调用方式:http://localhost:8080/action_cfg/userAction!delete.action
注意:使用动态方法调用,需要注意不同的处理方法返回值的问题。不同处理方法的返回值应该是不一致的,除非处理后跳转到同一个页面。动态方法调用不安全,不推荐使用。
3. 使用通配符配置来解决action配置优化的问题。
<!-- 使用通配符进行action的配置 * 表示匹配多个字符 {1} 表示占位符 1表示的第一个*的内容 如果请求的是add.action,那么* 表示add {1}表示add --> <action name="*" class="cn.sxt.action.UserAction" method="{1}"> <result>/index.jsp</result> </action> |
注意:如果使用通配符进行配置action,需要注意不同的处理方法返回值的问题。不同处理方法的返回值应该是不一致的,除非处理后跳转到同一个页面。如果有指定名称的action,那么首先匹配指定名称的action,没有再匹配通配符。
4. 使用注解来进行action的配置
a) 导入struts2-convention-plugin-2.3.4.jar
b) 在action类上配置注解
@ParentPackage("struts-default") @Namespace("/") public class UserAction { @Action(value="/add", results={@Result(name="success", location="/index.jsp", type="redirect"), @Result(name="error", location="/error.jsp", type="redirect")}) public String add(){ System.out.println("添加"); return "success"; } @Action("/delete") public String delete(){ System.out.println("删除"); return "success"; } @Action("/find") public String find(){ System.out.println("查询"); return "success"; } @Action("/update") public String update(){ System.out.println("修改"); return "success"; } } |