既然输入的参数总要交给相关的类(域对象)进行处理(执行操作或保存到数据库等),
那为什么不干脆直接将得到的参数付给域对象的相关属性呢
定义一个域对象(Domain Model)
package com.demo.struts2.model;
public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在UserAction类中不再定义单独的属性值,而是定义这个User类
public class UserAction extends ActionSupport {
private User user;
public String add(){
System.out.println("name:" + user.getName() + ", age:" + user.getPassword());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
struts.xml与之前相同
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.demo.struts2.action.UserAction">
<result>
/user_add_success.jsp
</result>
</action>
</package>
</struts>
访问时,链接如下图所示
输出结果如下
注意:Action类中不要自己new User对象,struts会帮你new
但是这里有一个问题:有时候接收的参数与Domain Model需要的参数不相符
例如Domain Model只需要user和password,对应数据库中的值
但是用户的输入可能还包含确认密码(不考虑前台校验的情况,举例子)
这样Domain Model就无法接收这个值了
解决方法:
1、用属性接收,然后传给Domain Model
2、使用VO(Value Object)/DO(Data Object)/DTO(Data Transfer Object)
定义一个UserDTO类
package com.demo.struts2.dto;
public class UserDTO {
private String name;
private String password;
private String confirmPassword;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getConfirmPassword() {
return confirmPassword;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
}
在UserAction中不再使用User类接收参数,而用UserDTO接收参数
当把所有参数传入以后,再由UserDTO创建一个User对象,将需要的属性传入
这就是DTO(Data Transfer Object)数据传输对象
作用就是“接收+传递”,在接收参数和Domain Model不匹配时使用
示意图如下