0
点赞
收藏
分享

微信扫一扫

Sturts2中标签取值-EL-OGNL-params赋值

【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页面取值结果:
Sturts2中标签取值-EL-OGNL-params赋值_取值
⑥ 页面打印Struts ValueStack Debug
Sturts2中标签取值-EL-OGNL-params赋值_赋值_02

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>


举报

相关推荐

0 条评论