【1】取值前简要描述一下赋值
Struts2使用表单参数进行赋值,依靠的是Parameters拦截器,简称params。params拦截器将会把表单中的参数映射到ValueStack栈的栈顶对象的各个属性中(表单中标签的name属性值与栈顶对象的属性值对应相等),即对应Action的各个属性(Struts2会把Action相关的属性与实例对象放于对象栈)。
如果某个字段在模型里没有匹配的属性,params拦截器将尝试ValueStack栈中的下一个对象。
如果在Action中对属性,如productName进行了二次赋值,那么将会覆盖表单提交过来的productName属性值。
Struts2中每个Action的Scope默认为Prototype,表单参数会与Action属性进行对应赋值–这里称之为对象栈。对应的取值的时候需要注意这样几点:对象栈(值栈)、请求域
。
【2】JSP页面取值代码
① 页面示例如下
<br><br>
ProductId:${productId}---${requestScope.productId }****<s:property value="productId"/>****<s:property value="#request.productId"/>
<br><br>
ProductName:${productName}---${requestScope.productName }****<s:property value="productName"/>****<s:property value="#request.productName"/>
<br><br>
ProdectName:${requestScope.prodectName }***${prodectName }****<s:property value="#request.prodectName"/>****<s:property value="prodectName"/>
<br><br>
ProductDesc:${productDesc}---${requestScope.productDesc }****<s:property value="productDesc"/>****<s:property value="#request.productDesc"/>
<br><br>
ProductPrice:${productPrice}---<%=request.getAttribute("productPrice") %>
<br><br>
ProductPrice:^<s:property value="productPrice"/>****<s:property value="#request.productPrice"/>
<br><br>
② 输入表单参数:
productName:tank
productDesc:weabon
productPrice:123468
③ 成员变量:
private Integer productId = 123;
private String productName;
private String productDesc;
④ Action对应方法:
public String save(){
System.out.println("save:"+this);
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("productName", "CPU");
request.setAttribute("prodectName", "123456");
return "details";
}
⑤ JSP页面取值结果:
⑥ 页面打印Struts ValueStack Debug
productId:四种取值都是123,Action方法中并未对productId做处理。
productName:其中从对象栈里面取值为tank,也就是表单输入时的数据。该属性在Action方法里面重新赋值为CPU。其他三种方式取值为CPU。
prodectName:该属性是在方法中额外添加到请求域中,肯定不存在于对象栈。故使用<s:property value="prodectName"/>
取值为空(从对象栈中拿值)<s:property value="#request.prodectName"/>
则可以获取。EL表达式方式从请求域中都可以取到。
⑦取值总结
- 存在于请求域中的属性 ,可使用EL或OGNL取值;
- 若属性单独属于请求域,如上述的prodectName,则不能使用对象栈取值方式;
- 若属性为Action成员变量,Struts会将其放入对象栈。但是可以使用四种取值方式。
- 若属性在Action方法中重新赋值 ,则从请求域中取得的为新值[CPU],从对象栈里面取得为将Action放入值栈中时候的值[tank]。
故,最快、安全取值方式:${requestScope.attr}||${attr}
!
原因分析:
Struts2将request进行了包装,并不是原先的HttpServletRequest。故,使用request取值时 ,会先去request请求域中进行取值,若取不到,则去栈中取值。
另外,若使用的是对象栈的取值方式,不会走上述流程,直接从值栈里面拿了数据,此时如果方法中将属性改变,则会读取到脏数据。
【3】更多标签使用实例
① 标签输入HTML文本
<s:property value="#request.gongyi.content" escape="false"/>
② 字符串截取
<s:if test="#gongyi.content.length()>=40">
<s:property value="#gongyi.content.substring(0,40)"/>
</s:if>
<s:else><s:property value="#gongyi.content"/></s:else>