我们知道每个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>
运行结果还是和上面一样
总结:虽然第二种方式看起来也挺方便的,但我们推荐第三种。