action接受来自表单的数据的方式有三种:
- 属性驱动(直接通过getter/setter来获取)
- 域驱动(封装一个实体类来获取)
- 模型驱动
一、属性驱动
直接通过action封装jsp发送过来的数据。
login.jsp
<span>${errors }</span>
<form action="login.action" method="post">
用户名:<input type="text" name="username" value="${username }"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
LoginAction.java
package com.action;
public class LoginAction {
private String username;//属性名必须与表单的一致。
private String password;
private String errors;
public String getErrors() {
return errors;
}
public void setErrors(String errors) {
this.errors = errors;
}
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 execute(){
System.out.println("com.action.LoginAction");
if(username.equals("admin")&&password.equals("123")){
return "success";
}
this.errors = "用户名或密码错误!";
System.out.println(username+":"+password+":"+errors);
return "failure";
}
@Override
public String toString() {
return "LoginAction [username=" + username + ", password=" + password
+ ", errors=" + errors + "]";
}
}
二、域驱动
通过一个user类来封装jsp页面发送到来的数据。
login.jsp
<span style="color: red">${user.errors }</span>
<form action="login.action" method="post">
用户名:<input type="text" name="user.username" value="${user.username }"><br>
密 码:<input type="password" name="user.password"><br>
<input type="submit" value="提交">
</form>
注意:必须通过user.属性名来访问资源。
LoginAction.java
package com.action;
import com.domain.User;
public class LoginAction {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute(){
System.out.println("com.action.LoginAction");
if(user.getUsername().equals("admin")&&user.getPassword().equals("123")){
return "success";
}
this.user.setErrors("用户名或密码错误!");
System.out.println(user);
return "failure";
}
}
三、模型驱动
通过实现拦截器ModelDriven来封装数据。即通过getModel方法获取对象来封装数据。
login.jsp
<span style="color: red">${errors }</span>
<form action="login.action" method="post">
用户名:<input type="text" name="username" value="${username }"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
LoginAction.java
package com.action;
import com.domain.User;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction implements ModelDriven<User> {
private User user;
public String execute(){
System.out.println("com.action.LoginAction");
if(user.getUsername().equals("admin")&&user.getPassword().equals("123")){
return "success";
}
this.user.setErrors("用户名或密码错误!");
System.out.println(user);
return "failure";
}
@Override
public User getModel() {
if(this.user == null){
user = new User();
}
return user;
}
}
三、集合类参数
可以使用泛型集合来接受多个相同的对象参数。
login.jsp
<form action="login.action" method="post">
用户名:<input type="text" name="user[0].username" ><br>
密 码:<input type="password" name="user[0].password"><br>
用户名:<input type="text" name="user[1].username" ><br>
密 码:<input type="password" name="user[1].password"><br>
<input type="submit" value="提交">
</form>
LoginAction.java
package com.action;
import java.util.List;
import com.domain.User;
public class LoginAction {
private List<User> user;
public void setUser(List<User> user) {
this.user = user;
}
public List<User> getUser() {
return user;
}
public String execute(){
System.out.println(user.size());
return "success";
}
}