此问题与ModelDriven
和Struts 2.3.16有关。由于params
拦截器的行为更改为访问传递给action的参数,因此需要配置acceptParamNames
列表以与ModelDriven
action一起使用。如果acceptParamNames
list为空,则默认通过默认模式接受参数。假设我们有
ModelDriven
动作:
@Namespace("/modelDriven")
public class ModelDrivenAction extends ActionSupport implements ModelDriven {
private Gangster model = new Gangster();
private String name; //getter and setter
public Object getModel() {
return model;
}
@Actions({
@Action(value="modelDriven", results=@Result(location = "/modelDriven/modelDriven.jsp")),
@Action(value="modelDrivenResult", results=@Result(location = "/modelDriven/modelDrivenResult.jsp"))
})
public String execute() throws Exception {
model.setName(name);
return SUCCESS;
}
}
型号:
public class Gangster {
private String name; //getter and setter
}
modelDriven.jsp:
<s:form id="modelDrivenForm" action="modelDrivenResult" method="POST" namespace="/modelDriven">
<s:textfield
label="Gangster Name"
name="[1].name"/>
<sj:submit cssClass="btn btn-primary" executeScripts="true" targets="div1"/>
</s:form>
<div id="div1"/>
modelDrivenResult.jsp:
<s:label
label="Gangster Name"
name="name"/><br/>
在action execute
方法中,我们获取了应该由params
拦截器填充的参数name
,并初始化模型属性以在结果中显示它。但问题是该参数未填充。如何获取由params拦截器填充的参数name
,以便action可以显示该值?
1条答案
按热度按时间n6lpvg4x1#
name
是模型的属性,也是操作类的属性。modelDriven
interceptor将模型推到值堆栈的顶部,因此很容易在JSP中使用它。动作对象位于模型下方。因此,它可以直接使用[1]
前缀引用。参见OGNL basics。但如果模型和动作对象中没有重复的属性名,则不需要这样做。当OGNL计算诸如
name
之类的名称时,它会从valueStack
的顶部向下搜索堆栈,以找到属性访问器。将执行找到的第一个访问器。因此,模型属性具有优先级,因为模型位于值堆栈的顶部。如果应该在action上设置名为
name
的属性,则可以直接将该属性命名为[1].name
。但是,params
interceptor的默认模式不接受这样的参数名称。但是,它是一个有效的OGNL表达式。因此,要让它通过拦截器,您需要将其添加到接受参数名称的模式中。像这样这是因为OGNL也检查接受的参数的模式,并且该正则表达式模式允许匹配
params
和OGNL匹配器。