struts2的数据封装
使用servlet怎么读取前台的表单传来的数据呢?
我们一般的做法就是使用request.getParameter("");但是呢,这样虽然可以读取数据,当数据量打的时候,代码会发生灰常大的冗余也要做了非常多的工作。有什么办法解决这个麻烦呢?办法当然是有的,使用struts数据封装就是一个很好的方法。
struts2的数据封装有两种方法:模型封装以及属性封装。
属性封装:
jsp表单
<form action="firstAction" method="post">
<table>
<tr>
<th>
useName:<input type="text" name="name">
</th>
</tr>
<tr>
<th>
password:<input type="password" name="psw">
</th>
</tr>
<tr>
<th>
<input type="submit" /><input type="reset" />
</th>
</tr>
</table>
</form>
我们怎么写属性封装的action呢?
表单的提交过来的属性必须要在action的类当中,一个不能少,而且都要写出get/set方法。属性也是必须一致,否则会报错
private String name;
private String psw;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
@Override
public String execute() throws Exception {
System.out.println(name);
System.out.println(psw);
return SUCCESS;
}
这样,我们就可以轻松的获取到表单提交过来的name与psw的参数值了。这样我们不需要书写request.getParameter("");就能获取到数据参数。
上面看到了,struts属性封装数据还是有点麻烦,我们能不能更简单点呢?还是有的,下面我们介绍这种方法:模型封装。
模型封装:
模型封装通俗一点讲就是:在action的类当中,我们使用一个对象去接收数据的参数,而参数的字段名就是接守数据的属性名。属性还是一个不能少,且还是要一致。
先看看非标准的模型封装:
jsp的表单部分代码。请注意name的值,是action类当中的类对象的对象名引用改对象的属性。如:user.psw
<form action="firstAction" method="post">
<table>
<tr>
<th>
useName:<input type="text" name="user.name">
</th>
</tr>
<tr>
<th>
password:<input type="password" name="user.psw">
</th>
</tr>
<tr>
<th>
<input type="submit" /><input type="reset" />
</th>
</tr>
</table>
</form>
action的代码:
对象不必实例化,但是必须也要写出get/set的方法
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
当对象中有一个队列集合的属性,怎么进行封装?只要在表单中name的值指定为队列集合的第几个元素就可以了。如:user类中有List list属性,表单中的属性只要写成user.list[0]/user.list[1]/...
标准的模型封装方法:
jsp部分代码,name的值写成封装对象的属性就可,不需对象引出
<form action="firstAction" method="post">
<table>
<tr>
<th>
useName:<input type="text" name="name">
</th>
</tr>
<tr>
<th>
password:<input type="password" name="psw">
</th>
</tr>
<tr>
<th>
<input type="submit" /><input type="reset" />
</th>
</tr>
</table>
</form>
在action类中,必须要先实例化对象,而且还要在action类中实现接口ModelDriven<封装的对象> ,也要重写getModel方法。在struts.xml文件的对应的action中要实现模型拦截器与默认拦截器。
1.struts.xml的拦截器 ,写在对用的action内
<!-- 模型封装拦截器 -->
<interceptor-ref name="modelDriven"></interceptor-ref>
<!-- action的默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
2.action的类的代码
public class LoginAction extends ActionSupport implements ModelDriven<User> {
//必须实例化对象
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
//返回封装模型
@Override
public User getModel() {
return user;
}
}
看来上面的代码,是不是觉得属性封装要比模型封装麻烦一点呢?在模型封装中,还是推荐使用标准的方法,在非标准的方法当中,虽然写起来会比较简单,标准的方法中,性能等各方面均会有一定的优势的。
struts模型封装的原理:
1。当请求数据发送到action之前,调用action类的getModel()方法获取数据将要封装的对象当中去;
2。获取到对象之后,获取封装数据对象的类 类型
3。获取到数据封装类的类型之后,获取类的属性;
4。request.getParameters方法获取表单的所有数据;
5。若表单的name的值与对象的属性一致,提取数据值
6。将提取到的数据封装到数据对象当总去
自动封装数据实例demo:http://blog.csdn.net/c_c123/article/details/46672193
struts标签封装数据:
在使用struts标签封装数据时候,action类实现不需要像上面的封装数据时候再实现接口ModelDriven<封装的对象>接口,封装的数据对象也不需要实例化,但是要实现get/set方法。
jsp文件当中,struts标签实现的表单,使用struts标签得先引入struts标签
<%@ taglib prefix="s" uri="/struts-tags"%>
struts标签的表单实现(struts标签建议使用自结束标签,在一些情况下,使用非自结束标签会发生服务器错误)name的值还是需要使用action类的封装数据对象的变量名引用数据对象的属性。如:user.psw
<s:form namespace="" action="sectAction" method="post">
用户名:<s:textfield name="user.name">
</s:textfield>
密码: <s:password name="user.psw"></s:password>
<s:submit></s:submit>
<s:reset></s:reset>
</s:form>
action类的局部代码
private User user;
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
这样就可以实现struts标签封装数据了。但是细心的人还是会发现,使用struts标签实现表单时候,表单的顺序有点不对经。这是因为struts标签当中有着他自身的格式,需要重写一些属性就可以了。
在struts.xml文件中 写入一下属性
<!-- 表单样式 --> <constant name="struts.ui.theme" value="simple"></constant> <constant name="struts.ui.templateDir" value="template"></constant> <constant name="struts.ui.templateSuffix" value="ftl"></constant>
就可以了。