struts2_Action的基本使用

Actions是Struts2框架的核心,因为它们适用于任何MVC(Model View Controller)框架。 每个URL映射到特定的action,其提供处理来自用户的请求所需的处理逻辑。

Struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用get和set方法把request中的数据注入。

创建Action类

实现Action接口

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.opensymphony.xwork2;

public interface Action {
    String SUCCESS = "success";
    String NONE = "none";
    String ERROR = "error";
    String INPUT = "input";
    String LOGIN = "login";

    String execute() throws Exception;
}

只需要实现该接口,并在struts.xml中进行配置。

继承Actionsupport类

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable

ActionSupport类本身实现了Action接口,所以继承ActionSupport类就相当于实现了Action接口。除此之外,ActionSupport类还实现了其它几个接口,来为程序员提供更多使用的功能,这些接口和Struts2的一些其他特性相结合,可以实现基本的数据验证功能和国际化。接口如下所示:

com.opensymphony.xwork2.Validateable;  //提供validate()方法来为Action增加验证的功能
com.opensymphony.xwork2.Validateaware; //提供方法来保存和恢复action或field级的错误信息
com.opensymphony.xwork2.TextProvider;  //提供获取本地信息文本的功能
com.opensymphony.xwork2.LocaleProvider;//提供getLocale()方法来获取本地消息

(1) 基本的数据验证功能

只需要重写validate()方法

public void validate() {}
package com.org.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.org.bean.User;


public class LoginAction extends ActionSupport{
    //通过领域对象获取,客户端对应user.username
    private User user;
    private String securityCode;

    public String getSecurityCode() {
        return securityCode;
    }

    public void setSecurityCode(String securityCode) {
        this.securityCode = securityCode;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        try{
            Thread.sleep(6000);
            if (user.getUsername().equals("admin") && user.getPassword().equals("123")) {
                System.out.println(user.getBirthday());
                return SUCCESS;
            } else {
                return LOGIN;
            }
        }catch (InterruptedException e){
            e.printStackTrace();
            return INPUT;
        }
    }
    //普通校验,在execute之间会调用validate()或validateXXX()
    public void validate(){
        if(user.getUsername() == null || user.getUsername().trim().length() == 0){
            addActionError("用户名不能为空");
        }
        else if(user.getPassword() == null || user.getPassword().trim().length() == 0){
            addActionError("密码不能为空");
        }
    }
}

以上的validate()中实现了登录过程中判断用户名和密码否为空,调用了ActionSupport中的

public void addActionError(String anErrorMessage) {
    this.validationAware.addActionError(anErrorMessage);
}

可在前端使用

获得错误信息。

此外在ActionSupport中还有两个方法

public void addActionMessage(String aMessage) {
    this.validationAware.addActionMessage(aMessage);
}

public void addFieldError(String fieldName, String errorMessage) {
    this.validationAware.addFieldError(fieldName, errorMessage);
}

对应在前端可以用以下两个方法获得相应的信息。


注意引入标签库
<%@taglib prefix="s" uri="/struts-tags" %>

我们发现validate方法是没有返回值的,那么当验证后,如果有数据没有通过验证会自动跳转回到该action中名称为input的result所配置的页面。示例如下:

        
            /success.jsp
            /index.jsp
            /error.jsp
            /wait.jsp
            /error.jsp
            
            
            
                1500
            
            
        

 

(2)访问本地信息

在上面的示例中,你会发现在validate方法中,添加验证错误消息的时候,是采用的硬编码方式,也就是直接写死的字符串,这是很不好的:

  ① 不容易修改,比如要改变消息的内容,还得重新修改和编译类;

  ② 不利于国际化,如果要把中文的信息变换成英文的呢,同样要重新修改和编译类。

  可以通过访问本地信息的方式,把这些错误消息放置到Action类外部的配置文件中,在Action类内部只需要按照这些消息的key值去获取消息即可。这样一来,当消息发生变化的时候,只需要修改这个消息的配置文件即可。  

先来建立消息的配置文件,在Action类的路径下建立一个同名的properties文件,也就是文件名为HelloWorldAction.properties,然后在里面按照key=value的格式,添加要使用的错误消息。

userNameIsNull = \u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a
passwordIsNull = \u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a

 

    //普通校验,在execute之间会调用validate()或validateXXX()
    public void validate(){
        if(user.getUsername() == null || user.getUsername().trim().length() == 0){
            addActionError(this.getText("userNameIsNull"));
        }
        else if(user.getPassword() == null || user.getPassword().trim().length() == 0){
            addActionError(this.getText("passwordIsNull"));
        }
    }

配置struts.xml文件,注册action

配置举例:






    
    
    

    
        
            
            
        

        
            /success.jsp
            /index.jsp
            /error.jsp
            /wait.jsp
            /error.jsp
            
            
            
                1500
            
            
        
        
            /index.jsp
        
        
            
                image/jpeg
                imageStream
                2048
            
        
    

GitHub链接:https://github.com/CzcOnion/struts_test

你可能感兴趣的:(struts2)