struts2中action业务控制类的几种配置方式

来源:互联网 发布:阿里云服务器怎么设置 编辑:程序博客网 时间:2024/06/02 03:44

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代码,如果项目有变动还得重新编译。

原创粉丝点击