我们知道每个Action都会对应一个类,具体在前面实现Action这篇文章讲了。那么这肯定就会涉及到参数传递的问题,因为我们要传递信息啊。除了使用session这一类方法,还有其他三种,总结如下。

我们使用一个登陆的小例子来说明


1.使用Action的属性接收参数

这是最常见的方法,使用代码说明如下。

@SuppressWarnings("serial")
public class LoginAction extends ActionSupport {
    private String username;
    private String password;
    public String login() {
        System.out.println(username);
        // ....
        return "success";
    }
    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;
    }
}

Login.jsp代码如下

<body>
    <form action="login.action" method="post">
        <!-- name的值注意一下 -->
        username:<input type="text" name="username">
        password:<input type="password" name="password">
        <input type="submit" value="submit">
    </form>
</body>

在struts.xml中配置Action

<struts>
        <action name="login" class="com.codeliu.action.LoginAction" method="login">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

success.jsp代码如下

<body>
    username:${username}
</body>

启动项目后,输入信息,会在控制台打印信息,同时success.jsp页面会输出用户名。


2.使用Domain Model接收参数

如果用第一个方法的话,如果我们要传递的信息好多,那么势必会造成Action中有很多字段,显得很臃肿,这时我们可以用下面的方法

新建一个User.java,有一个集合类

public class User {
    private String username;
    private String password;

    private List<String> books;
    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 List<String> getBooks() {
        return books;
    }
    public void setBooks(List<String> books) {
        this.books = books;
    }
}

然后把LoginAction.java改成如下

@SuppressWarnings("serial")
public class LoginAction extends ActionSupport {
    // 封装属性在User类中
    private User user;
    public String login() {
        System.out.println(user.getUsername());
        System.out.println(user.getBooks().get(0));
        // ....
        return "success";
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

注意要有set和get方法连接User类。

Login.jsp也得改,注意输入框的name值,List集合的方式

<body>
    <form action="login.action" method="post">
        <!-- name的值注意一下 -->
        username:<input type="text" name="user.username">
        password:<input type="password" name="user.password">
        book1:<input type="text" name="user.books[0]">
        book1:<input type="text" name="user.books[1]">
        <input type="submit" value="submit">
    </form>
</body>

success.jsp的代码改成如下,才能获取参数值

<body>
    username:${user.username}
</body>

启动项目,同样能获得用户输入的参数。


3.使用ModelDriven接口

第二种方式,我们可以看到,在Login.jsp中,输入框的name值是和对象的实例名联系在一起的,如果我们对象的实例名变了,那么都得重新改一遍,这肯定是不行的。

现在我们看看使用ModelDriven接口。

LoginAction.java修改如下

@SuppressWarnings("serial")
public class LoginAction extends ActionSupport implements ModelDriven<User>{
    // 封装属性在User类中,记得实例化
    private User user = new User();
    public String login() {
        System.out.println(user.getUsername());
        System.out.println(user.getBooks().get(0));
        // ....
        return "success";
    }
    @Override
    public User getModel() {
        return user;
    }
}

注意这里的User必须实例化,并且没有set和get方法,只是重写了getModel方法,返回值为User的实例对象。

修改Login.jsp

<body>
    <form action="login.action" method="post">
        <!-- name的值注意一下 -->
        username:<input type="text" name="username">
        password:<input type="password" name="password">
        book1:<input type="text" name="books[0]">
        book1:<input type="text" name="books[1]">
        <input type="submit" value="submit">
    </form>
</body>

注意看此时的name属性的值和实例对象的名称没有联系了。

同样success.jsp的代码也可以改成如下

<body>
    username:${username}
</body>

运行结果还是和上面一样


总结:虽然第二种方式看起来也挺方便的,但我们推荐第三种。