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 必须是一个实例化的对象