Struts2 支持3种方式接收表单域传递过来的数据
1.通过action对应的属性接收用户输入
(params拦截器负责帮我们把参数注入到栈顶对象对应的属性中 并压入值栈 所以 ,
通俗点讲params拦截器的作用是: 接收表单参数 , 表单回显
此时 对应的action 必须提供 该属性的setter方法
)
代码如下所示:
表单:
<s:form action="Login" method="post" namespace="/">
<s:textfield name="username" label="用户名"></s:textfield>
<br></br>
<s:textfield name="password" label="密码"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
对应的action:
private String username;
private String password;
//setter表单属性注入 getter表单属性回显
/* public String getUsername() {
return username;
}*/
public void setUsername(String username) {
this.username = username;
}
/*public String getPassword() {
return password;
}*/
使用ognl访问值栈中对应的属性:
<!-- 使用ognl 访问值栈中的对应的属性 -->
<h4>欢迎<s:property value="username"/>来到xxxx系统</h4>
使用这种方式 如果表单中有 10...20 个需要提交的属性值
容易造成 action 中需要对应的属性值数量过于庞大
2.通过领域对象接收用户输入
表单代码如下:
<s:form action="Login" method="post" namespace="/">
<s:textfield name="user.username" label="用户名"></s:textfield>
<br></br>
<s:textfield name="user.password" label="密码"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
对应的action代码如下:
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
使用ognl进行访问:
<!-- 使用ognl 访问值栈中的对应的属性 -->
<h4>欢迎<s:property value="user.username"/>来到xxxx系统</h4>
使用这种方式 也容易造成表单中 属性名过于冗长
3.使用modeldriven拦截器
表单如下:
<s:form action="Login" method="post" namespace="/">
<s:textfield name="username" label="用户名"></s:textfield>
<br></br>
<s:textfield name="password" label="密码"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
对应action如下:
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private static final long serialVersionUID = 647270100576858812L;
private User user = new User();
public User getModel() {
// TODO Auto-generated method stub
return user;
}
使用ognl访问如下:
<!-- 使用ognl 访问值栈中的对应的属性 -->
<h4>欢迎<s:property value="username"/>来到xxxx系统</h4>
使用这个方式:
即避免action中对应的属性过于繁多 ,又避免了表单域中属性名过于沉长。
但是请注意:不是所有的情况下都是用modeldriven ,如果需要的参数特别少 就不需要
如:搜索,只需要传一个值就行
modeldriven 实现步骤:
1.在请求到达栈顶之前,经过了modeldriven拦截器
modeldriven拦截器 会帮我们将model对象压入值栈 (注意此时的model对象任然是一个model 出来的空对象)
也就是说此时表单域中的属性还没有注入到对应action对象的属性中,那谁帮我们完成的呢?
是params 拦截器
所以由defaultStack中的拦截器 向下执行可知:
2 .params 拦截器 将表单域中的属性值注入栈顶对象(即目标action)对应的属性中
3.一个action请求 拦截器共用一个值栈
注意 :model 必须要new 必须是一个实例化的对象