【Java】Struts2中Action接受表单的三种方式

在Struts2中,假如有一个登陆页面,输入用户名密码。如何在action中接受呢?

有三种方式:1.使用Action的属性接收参数,2.使用DomainModel接收参数,3.使用ModelDriven接收参数

1.使用action的属性接受参数

只需要在处理的action中定义该私有变量(Bean),即可获取到,例如:

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

    private String name;
    private String pwd;
    
    public String login(){
        if ("admin".equals(name)){
            if ("admin".equals(pwd)){
                return SUCCESS;
            }
        }
        return INPUT;
    }
    
    // 提供get,set方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    
}

2.使用DomainModel接收参数

使用DomainModel时,需要把之前Action中定义的属性,提取到一个JavaBean中。

如下面的UserBean:

package com.pojo;

public class User {
    private String name;
    private String pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    
    
}

在Action中添加一个private User user;在form中的名字要与这里的user对象相同。并提供user的get,set方法。

package com.action;

import com.opensymphony.xwork2.ActionSupport;
import com.pojo.User;

public class LoginAction extends ActionSupport {
    private User user; //和登录的form填写的对象相同
    
    public String login(){
        if ("han".equals(user.getName())){
            if ("jun".equals(user.getPwd())){
                return SUCCESS;
            }
        }
        return INPUT;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
}

form中对name需要限定传参数给哪个对象。

    <form action="index_login.action" method="post">
    <!-- 指定传入哪个对象的user 和pwd -->
        <input type="text" name="user.name"><br>
        <input type="text" name="user.pwd"><br>
        <input type="submit"><br>
    </form>

3.使用ModelDriven接收参数(验证输入的时候比较方便,可以重写验证的方法)

Action:

package com.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.pojo.User;

public class LoginAction extends ActionSupport implements ModelDriven<User> {
    
    private User user = new User(); //和DomaiModel不同,需要实例化
    
    public String login(){
        if ("han".equals(user.getName())){
            if ("jun".equals(user.getPwd())){
                return SUCCESS;
            }
        }
        return INPUT;
    }
    
//    去除了user的get,set方法
//  实现了接口的方法
//    form中不需要指定哪个对象
    @Override
    public User getModel() {
        return user;  //返回对象
    }
    
}

UserBean与前一种相同,不变。

表单中input的name变了:

    <form action="index_login.action" method="post">
    <!-- 不需要 指定传入哪个对象的user 和pwd -->
        <input type="text" name="name"><br>
        <input type="text" name="pwd"><br>
        <input type="submit"><br>
    </form>

给List赋值,List<String> book;

<input type="text" name="book[0]"><input type="text" name="book[1]">,来输入数组