您的位置:首页 > 编程语言 > Java开发

ssh学习:struts2的数据封装

2016-02-16 11:43 239 查看
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:/article/8433091.html

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>

 就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: