Struts2提供了三种常用的参数传递方案
- 使用Action的属性接收参数
- 使用Domain Model接收参数
- 使用ModelDriven接收参数
一。使用Action的属性接收参数
这种方式比较简单,
(1)直接在相应Action中加入需要传递的参数
LoginAction.java
package com.zsl.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
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 String login() {
System.out.println("username:"+username+" password:"+password);
return SUCCESS;
}
}
struts.xml
<action name="LoginAction" method="login"
class="com.zsl.action.LoginAction">
<result>需要跳转的页面</result>
</action>
login.jsp
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="提交">
</form>
十分简单方便,但是有几个细节:
- 每个字段都需要有getter和setter否则会报错
- jsp文件中是通过input标签的变量名完成数据的传递的
- 由于直接卸载Action文件中,可能因为元素过多,造成不好维护的问题
二。使用Domain Model接收参数
将username和password封装在User类中需要修改:
login.jsp
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="user.username">
<!-- user.username指的是传入某个对象的属性。 -->
密码:<input type="text" name="user.password">
<input type="submit" value="提交">
</form>
Login.Action
package com.zsl.action;
import com.opensymphony.xwork2.ActionSupport;
import com.zsl.po.User;
public class LoginAction extends ActionSupport{
private User user;
//注意:直声明,不实例,留给Struts实例化。
//同时必须有getter和setter
/**
* 必须是public,要不Struts访问不到喽
* @return
*/
public String login() {
System.out.println("username:"+user.getUsername()+" password:"+user.getPassword());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
新增User类
package com.zsl.po;
public class User {
/*
* 用户类,用来对用户输入信息的封装
*/
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;
}
}
比较简单方便,但是有几个细节:
- user对象实例化,交给struts完成,
- 每个字段都需要有getter和setter否则会报错
- jsp文件中是通过input标签的变量名完成数据的传递的
三。使用ModelDriven接收参数
这中方式更适合传递多个同类参数,同时维护起来比较方便
在上文的基础上再修改
LoginAction.java
package com.zsl.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.zsl.po.User;
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
/**
* 必须是public,要不Struts访问不到喽
* @return
*/
public String login() {
System.out.println("username:"+user.getUsername()+" password:"+user.getPassword());
return SUCCESS;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
login.jsp
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="提交">
</form>
比起上面那个似乎有点麻烦,然而并不是,有几个细节:
- User的对象必须进行实例化传入集合中
- 这种方式降低了前端和后端的耦合,扩展性更强。
四。传递复杂对象实例
传入User将其加入UserListd
Struts.xml同上
LoginAction
package com.zsl.action;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.zsl.po.User;
public class LoginAction extends ActionSupport{
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
/**
* 必须是public,要不Struts访问不到喽
* @return
*/
public String login() {
System.out.println("username:"+userList.get(0).getUsername()+" password:"+userList.get(0).getPassword());
System.out.println("username:"+userList.get(1).getUsername()+" password:"+userList.get(1).getPassword());
System.out.println("username:"+userList.get(2).getUsername()+" password:"+userList.get(2).getPassword());
return SUCCESS;
}
}
login.jsp
<form action="LoginAction.action" method="post">
1用户名:<input type="text" name="userList[0].username">
1密码:<input type="text" name="userList[0].password"><br/>
2用户名:<input type="text" name="userList[1].username">
2密码:<input type="text" name="userList[1].password"><br/>
3用户名:<input type="text" name="userList[2].username">
3密码:<input type="text" name="userList[2].password">
<input type="submit" value="提交">
</form>
总结:
- List集合了不能实例化,
- getter和setter方法不能少
- 前端页面需要通过相应名称完成相应内容的传入