Struts2 Action类的四种实现方式

Struts2的Action类实现方式可分为两大类:属性驱动和模型驱动!其中属性驱动有三种实现方式(普通pojo类 实现Action接口 继承ActionSupport)。

案例说明: 

用户在登陆界面(login.jsp),输入账号和密码,点击登陆按钮!如果账号密码匹配,进入欢迎界面(welcome.jsp),如果账号密码出错,进入登陆失败界面(fail.jsp)!LoginAction负责处理用户请求!  


1.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置struts2核心Filter -->
  <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <!-- 所有的请求都会被struts2过滤器拦住,相当于引入struts2框架 -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


2.配置struts.xml

<?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="lee" extends="struts-default" namespace="/test">
    <action name="login" class="action.LoginAction" method="execute">
        <result name="success" type="dispatcher">/welcome.jsp</result>
        <result name="error" type="dispatcher">/fail.jsp</result>
    </action>
    <action name="login" class="action.LoginAction1" method="execute">
        <result name="success" type="dispatcher">/welcome.jsp</result>
        <result name="error" type="dispatcher">/fail.jsp</result>
    </action>
    <action name="login" class="action.LoginAction2" method="execute">
        <result name="success" type="dispatcher">/welcome.jsp</result>
        <result name="error" type="dispatcher">/fail.jsp</result>
    </action>
    </package>
</struts>


3.编写JSP页面

①登录页面(login.jsp)

<html>
  <head>
    <title>登陆页面</title>
  </head>
  <body>
    <form action="test/login" method="post">
        用户:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登陆"><br>
    </form>
  </body>
</html>

②登录成功页面(welcome.jsp)

<html>
  <head>
    <title>登陆成功界面</title>
 </head>
 <body>
    欢迎您,登陆成功!
  </body>
</html>
③登录失败页面(fail.jsp)
<html>
  <head>
    <title>登陆成功界面</title>
 </head>
 <body>
    登录失败!
  </body>
</html>


4.Action类的实现方式

①普通POJO类

没有实现任何接口,也没有继承任何类,优点是无耦合,适合功能逻辑简单的Action类(基本不使用)。                                    是否包含属性并不重要,重要的是包含 setter和getter方法,因为系统是通过setter和getter方法来处理请求参数的,不是通过属性名来处理请求参数!  

package action;
/**
 * 版本一  普通POJO类
 * 
 */
public class LoginAction  {
    //私有属性
    private String username;
    private String password;
    //struts2的拦截器机制  getter   setter 方法负责解析用户请求参数  并且将请求参数值赋给action对应的属性
    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;
    }
    //普通的execute方法
    public String execute() throws Exception {
        if("test".equals(getUsername())&&"123".equals(getPassword())){
            return "success";
        }else{
            return "error";
        }

    }
}


②实现Action接口

Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法 。                                                                                                                                                              5个逻辑视图的常量                                                                                                                                                              

            * SUCCESS       -- 成功.
            * INPUT         -- 用于数据表单校验.如果校验失败,跳转INPUT视图.
            * LOGIN         -- 登录.
            * ERROR         -- 错误.
            * NONE          -- 页面不转向.
/**
 * 版本二  实现Action接口
 * 
 */
public class LoginAction1 implements Action {
    //私有属性
    private String username;
    private String password;
    //struts2的拦截器机制  getter   setter 方法负责解析用户请求参数  并且将请求参数值赋给action对应的属性
    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;
    }
    //execute方法,和方式一比较“success”变为SUCCESS ERROR变为ERROR
    public String execute() throws Exception {
        if("test".equals(getUsername())&&"123".equals(getPassword())){
            return SUCCESS;
        }else{
            return ERROR;
        }

    }
}


继承ActionSupport类(开发中经常使用这种方式

ActionSupport类是默认的Action类,若某个action节点没有配置class属性,则ActionSupport类即为待执行的Action类,而类中的execute方法即为要默认执行的action方法。

在这个类中还默认封装了一些静态变量(同Action接口一样)

            * SUCCESS       -- 成功.
            * INPUT         -- 用于数据表单校验.如果校验失败,跳转INPUT视图.
            * LOGIN         -- 登录.
            * ERROR         -- 错误.
            * NONE          -- 页面不转向.
package action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 版本三 继承ActionSupport
 * 
 */
public class LoginAction2 extends ActionSupport {
    //私有属性
    private String username;
    private String password;
    //struts2的拦截器机制  getter   setter 方法负责解析用户请求参数  并且将请求参数值赋给action对应的属性
    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;
    }
    //execute方法和方式二比较没变
    public String execute() throws Exception {
        if("test".equals(getUsername())&&"123".equals(getPassword())){
            return SUCCESS;
        }else{
            return ERROR;
        }

    }
}


方式一,方式二,方式三都属于属性驱动。                                                                                                                                    属性驱动就是使用属性作为贯穿MVC流程的信息携带者,依附于Action实例,Action实例封装请求参数和处理结果!   

接下来演示方式四:模型驱动(新建User类,用来封装请求参数!LoginAction实现Action和ModelDriven接口) 
关于模型驱动,就是使用单独的JavaBean实例来贯穿整个MVC流程,JavaBean实例封装请求参数和处理结果! 

User类。


④模型驱动

封装User类

public class User  implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    //私有的请求参数
    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 User() {
        super();
    }
    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }

}

LoginAction类

/**
 * 版本四 模型驱动
 * 
 */
public class LoginAction implements Action,ModelDriven<User> {
    //定义用于封装请求参数和处理结果的Model
    private User user=new User();
    //execute方法和方式二比较没变
    public String execute() throws Exception {
        if("test".equals(user.getUsername())&&"123".equals(user.getPassword())){
            return SUCCESS;
        }else{
            return ERROR;
        }

    }
    //重写getModel方法
    @Override
    public User getModel() {
        return user;
    }
}





 
 

猜你喜欢

转载自blog.csdn.net/qq_33800083/article/details/80251112
今日推荐