ssh学习:struts2的数据封装

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>
	

 就可以了。

猜你喜欢

转载自gaosililin.iteye.com/blog/2267775
今日推荐