struts2中配置Action的方法

发布时间 2023-03-27 16:06:11作者: YorkShare

1.Action是什么(原文链接:https://www.bbsmax.com/A/GBJrY6pKz0/)

在Struts2中,一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是,用户的每次请求,都会转到一个相应的Action类里面,由这个Action类来进行处理,因此一个Action类代表了用户的一次请求或调用。简单来说,Action就是用来处理一次用户请求的对象。

2.Action有什么作用

public class HelloWorldAction implements Action {  
 
        private String account;
        private String password;   
 
        public String execute() throws Exception {
            System.out.println("用户输入的参数为===" + "account=" + account + ",password=" + password);
            return "toWelcome";
        }  
 
        public String getAccount() {
            return account;
        }  
 
        public void setAccount(String account) {
            this.account = account;
        }  
 
        public String getPassword() {
            return password;
        }  
 
        public void setPassword(String password) {
            this.password = password;
        }  
 
    }  

根据上面的Action实现,在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业务数据,又要处理业务功能。在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,这就变成Action只是去调用逻辑层来进行业务逻辑的处理,并不是真的在Action里面去实现业务逻辑的处理。上面Action的属性和属性对应的getter/setter方法,就是用来接收用户请求的数据,并把这些数据封装在Action中,在后续处理中可以访问这些数据。上面Action的实现中的execute方法的实现,你会发现execute方法里面实现的功能,正是前面学习的MVC的控制器部分的功能。从另外一个角度说,Struts2的Action也充当着MVC中控制器的角色。

3.Action的三种开发方式(原文链接:https://www.bbsmax.com/A/n2d9MlNgdD/)

(1)继承ActionSupport类:在Action类中需要用到Struts为我们提供的数据校验等Struts已经帮我们实现的功能,我们就继承着ActionSupport类

package com;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
        private String message;
          
        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public String execute() {
            setMessage("我的第一个Struts2项目");
            return "success";
        }
}

struts.xml的配置

    <package name="hellworld" extends="struts-default">    
        <action name="HelloWorld" class="com.HelloWorldAction">
            <result name="success">/HelloWorld.jsp</result>
        </action>
    </package>

(2)实现Action接口:ActionSuppot也继承着Action接口,所以ActionSuppot拥有Action接口的全部功能

(3)不继承任何类、不实现任何接口:一个普通的Java类

package com;

public class UserAction {
   private String username;
   private String password;
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
   
public String addUser()
{
    if(this.getUsername()!=null&&this.getPassword()!=null)
    {
        return "ok";
    }
    else
    {
        return "no";
    }
}

public String updateUser()
{
    if(this.getUsername()!=null&&this.getPassword()!=null)
    {
        return "ok";
    }
    else
    {
        return "no";
    }
}

public String deleteUser()
{
    if(this.getUsername()!=null&&this.getPassword()!=null)
    {
        return "ok";
    }
    else
    {
        return "no";
    }
}
}

struts.xml的配置

    <package name="usermanage" extends="struts-default">    
        <action name="user" class="com.UserAction" method="addUser">
            <result name="ok">/success.jsp</result>
            <result name="no">/fail.jsp</result>
        </action>
    </package>

4.通配符(原文链接:https://www.bbsmax.com/A/n2d9MlNgdD/)

在讲解通配符之前,我们来看一下需求…..

现在我的Action中有两个方法,处理登陆和处理注册:

public class PrivilegeAction extends ActionSupport {
    public String login() {
        System.out.println("我是登陆");
        return "success";
    }
    public String register() {
        System.out.println("我是注册");
        return "success";
    }
}

因此,我们就需要在struts.xml文件中配置两个action节点

 <action name="login" class="privilegeaction.PrivilegeAction" method="login">
        <result name="success">/index.jsp</result>
    </action>
    <action name="register" class="privilegeaction.PrivilegeAction" method="register">
        <result name="success">/index.jsp</result>
    </action>

现在我们发现:它们仅仅只有访问路径和方法的名称是不一样的….但是这却要多配置一个action节点,会造成浪费!

使用通配符改造如下:

<package name="privilige" extends="struts-default">
    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>
</package>

“privilege_*”表示:只要请求的Action以privilege开头,都将匹配。

"{1}"表示:请求到达Action类后,将执行通配符