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

取值前简要描述一下赋值

Struts2使用表单参数进行赋值,依靠的是Parameters拦截器,简称params。params拦截器将会把表单中的参数映射到ValueStack栈的栈顶对象的各个属性中【表单中标签的name属性值与栈顶对象的属性值对应相等】,即对应Action的各个属性【Struts2会把Action相关的属性与实例对象放于对象栈】。

如果某个字段在模型里没有匹配的属性,params拦截器将尝试ValueStack栈中的下一个对象。

如果在Action中对属性,如productName进行了二次赋值,那么将会覆盖表单提交过来的productName属性值。

Struts2中每个Action的Scope默认为Prototype,表单参数会与Action属性进行对应赋值–这里称之为对象栈。对应的取值的时候需要注意这样几点:对象栈(值栈)、请求域。


JSP页面取值代码



ProductId:${productId}---${requestScope.productId }********

ProductName:${productName}---${requestScope.productName }********

ProdectName:${requestScope.prodectName }***${prodectName }********

ProductDesc:${productDesc}---${requestScope.productDesc }********

ProductPrice:${productPrice}---<%=request.getAttribute("productPrice") %>

ProductPrice:^****

输入表单参数:

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赋值_第1张图片

Sturts2中标签取值-EL-OGNL-params赋值_第2张图片

productId:四种取值都是123,Action方法中并未对productId做处理。

productName:其中从对象栈里面取值为tank,也就是表单输入时的数据。该属性在Action方法里面重新赋值为CPU。其他三种方式取值为CPU。

prodectName:该属性是在方法中额外添加到请求域中,肯定不存在于对象栈。故使用取值为空(从对象栈中拿值)则可以获取。EL表达式方式从请求域中都可以取到。

综上:

  • 存在于请求域中的属性 ,可使用EL或OGNL取值;

  • 若属性单独属于请求域,如上述的prodectName,则不能使用对象栈取值方式;

  • 若属性为Action成员变量,Struts会将其放入对象栈。但是可以使用四种取值方式。

  • 若属性在Action方法中重新赋值 ,则从请求域中取得的为新值[CPU],从对象栈里面取得为将Action放入值栈中时候的值[tank]。

故,最快、安全取值方式:${requestScope.attr}||${attr} !

原因分析:

Struts2将request进行了包装,并不是原先的HttpServletRequest。故,使用request取值时 ,会先去request请求域中进行取值,若取不到,则去栈中取值。

另外,若使用的是对象栈的取值方式,不会走上述流程,直接从值栈里面拿了数据,此时如果方法中将属性改变,则会读取到脏数据。

你可能感兴趣的:(Struts2)