struts2通过配置请求与业务控制类之间的对应关系来处理请求,主要有以下四种方式:
- 一个请求对应一个业务控制类的一个方法
- 通过动态调用的方式
- 通过统配符的方式
- 通过注解的方式
1.一个请求对应一个业务控制类的一个方法
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 第一种写法 -->
<package name="sysmanage" namespace="/sysmanage" extends="struts-default">
<!-- "/sysmanage/add.action"请求匹配UserAction类中的add方法 -->
<action name="add" class="com.lyu.struts.sysmanage.action.UserAction" method="add">
<result name="addUser_suc">/views/sysmanage/addUser_suc.jsp</result>
</action>
<!-- "/sysmanage/del.action"请求匹配UserAction类中的del方法 -->
<action name="del" class="com.lyu.struts.sysmanage.action.UserAction" method="del">
<result name="delUser_suc">/views/sysmanage/delUser_suc.jsp</result>
</action>
<!-- "/sysmanage/update.action"请求匹配UserAction类中的update方法 -->
<action name="update" class="com.lyu.struts.sysmanage.action.UserAction" method="update">
<result name="updateUser_suc">/views/sysmanage/updateUser_suc.jsp</result>
</action>
<!-- "/sysmanage/query.action"请求匹配UserAction类中的query方法 -->
<action name="query" class="com.lyu.struts.sysmanage.action.UserAction" method="query">
<result name="queryUser_suc">/views/sysmanage/queryUser_suc.jsp</result>
</action>
</package>
</struts>
前台的请求方式:
2.动态调用方法
一个请求匹配某一个具体的类,并不指明具体哪个方法,而是通过!动态调用某个方法。
请求格式:Action的名称!方法名[.action]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 第二种写法,动态调用有漏洞,默认禁用 -->
<package name="sysmanage" namespace="/sysmanage" extends="struts-default">
<action name="userMgr" class="com.lyu.struts.sysmanage.action.UserAction">
<result name="addUser_suc">/views/sysmanage/addUser_suc.jsp</result>
<result name="delUser_suc">/views/sysmanage/delUser_suc.jsp</result>
<result name="updateUser_suc">/views/sysmanage/updateUser_suc.jsp</result>
<result name="queryUser_suc">/views/sysmanage/queryUser_suc.jsp</result>
</action>
</package>
</struts>
前台发送请求的格式:
注:请求的后缀.action可加可不加。
注意:struts2在开启动态方法调用(DMI)的情况下,,可以被远程执行任意命令,安全威胁程度高,如果想开启需将系统常量struts.enable.DynamicMethodInvocation的值设为true,默认为false
3.统配符的方式
利用通配符来简化配置,规范命名。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 第三种写法, 通配符-->
<package name="sysmanage" namespace="/sysmanage" extends="struts-default">
<!-- *是通配符,代表任意字符串,和正则表达式的*没有关系,{1}代表第一颗星,依次类推 -->
<action name="*User" class="com.lyu.struts.sysmanage.action.UserAction" method="{1}">
<result name="{1}User_suc">/views/sysmanage/{1}User_suc.jsp</result>
</action>
<action name="*_*" class="com.lyu.struts.sysmanage.action.UserAction" method="{1}">
<result name="{1}{2}_suc">/views/sysmanage/{1}{2}_suc.jsp</result>
</action>
</package>
</struts>
前台发送的请求方式:
注:
1. 统配符的方式虽然可以减少配置量,但是不利于维护,而且在2.5的新版本当中默认是不支持此种配置方式。
2. 符合最长前缀匹配:即同时使用通配符和明确指明哪个类的方法时,会由具体的那个方法来处理请求 。
4.注解的方式
导入三个jar包:
- asm-3.3.jar
- asm-commons-3.3.jar
- struts2-convention-plugin-2.3.16.3.jar
在Action类上加注解:
package com.lyu.struts.sysmanage.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
// 相当于package的extends
@ParentPackage("struts-default")
// 相当于package的namespace
@Namespace("/")
public class LoginAction {
private String loginName;
private String password;
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// login请求所对应的业务处理类,name为视图名称,location为返回的页面
@Action(value="login",results={
@Result(name="success",location="/main.jsp"),
@Result(name="fail",location="/error.jsp")
})
public String execute() {
System.out.println(loginName);
System.out.println(password);
if (loginName.equals("admin")) {
return "success";
} else {
return "fail";
}
}
}
注:不推荐,因为注解还是java代码,如果项目有变动还得重新编译。