struts2中请求参数封装再解析

struts2中有三种封装方式,第一种无model属性驱动,如下:
 

<form action="${pageContext.request.contextPath}/testform/getform2" method="post">
	姓名:<input type="text" name="username"/><br>
	年龄:<input type="text" name="age"/><br>
        省略若干。。。
	生日:<input type="text" name="birthday"/><br>
	<input type="submit" value="提交"/>
</form>

这里顺便提到一点,html标签里是无法使用ognl表达式的,name的值也好,还是value的值也好,其实都是字符串,只不过struts2框架在参数封装这块,就是会把html标签的name当成ognl表达式去看,这点是框架决定的,不用纠结。ognl表达式运用在struts标签中,在<s:property/>标签中默认是ognl表达式,而在<s:textfield/>标签中默认会是字符串。但如果就是想在html标签里像ognl表达式一样去取值,可以用下面这两种方式:

struts标签实现:<input type="text" name="username" value="<s:property value='name'/>"/>
el表达式实现:<input type="text" name="username" value="${name}"/>

解析:这种参数封装的模式,struts2会读取name的值,然后调用动作类中其相关的set方法,将这些属性设置进去,也可以说是把这些值都设置到值栈中,因为我们都动作类默认会在值栈的栈顶,结果如下:

第二种,有model的属性驱动:

页面写法:

<form action="${pageContext.request.contextPath}/testform/getform2" method="post">
	姓名:<input type="text" name="cat.name"/><br>
	年龄:<input type="text" name="cat.age"/><br>
	生日:<input type="text" name="cat.birthday"/><br>
	<input type="submit" value="提交"/>
</form>

值栈情况:

解析:可以看到,值栈中栈顶还是我们的动作类对象,并且这个对象里有包装参数的的user对象。

第三种:有model的模型驱动方式

页面写法:

<form action="${pageContext.request.contextPath}/testform/getform3" method="post">
	姓名:<input type="text" name="name"/><br>
	年龄:<input type="text" name="age"/><br>
	生日:<input type="text" name="birthday"/><br>
	<input type="submit" value="提交"/>
</form>

值栈情况截图:

解析:可以看到这种实现方式,值栈的栈顶是我们的user对象而不再是action对象了。

总结:其实就是想说,三种参数封装方式,是由两个拦截器搭配实现的,一个params,一个ModelDrivenInterceptor,前两种都会将参数封装以后存在action对象中,action对象在栈顶。而最后一种方式,将一个包装参数的那个model压栈了。

猜你喜欢

转载自blog.csdn.net/dimples_qian/article/details/81193985