该问题与 ModelDriven
和 Struts 2.3.16 有关。由于 params
拦截器的行为更改为访问传递给操作的参数,因此需要配置 acceptParamNames
列表以与 ModelDriven
操作一起使用。如果 acceptParamNames
列表为空,则默认情况下通过默认模式接受参数。假设我们有一个
模型驱动
操作:
@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/>
在操作execute
方法中,我们获取参数name
,该参数应由params
拦截器填充,并初始化模型属性以显示它在结果中。但问题是参数没有填充。如何获取由 params 拦截器填充的参数 name
,以便操作可以显示该值?
最佳答案
name
是模型的属性,也是操作类的属性。 modelDriven
interceptor将模型推到值堆栈的顶部,因此在 JSP 中使用它很容易。操作对象位于模型下方。因此,可以使用 [1]
前缀直接引用它。请参阅OGNL basics .
但是如果模型和操作对象中没有重复的属性名称,则没有必要。当 OGNL 评估诸如 name
之类的名称时,它会从 valueStack
的顶部向下搜索属性访问器。第一个找到的访问器将被执行。因此,模型属性具有优先级,因为模型位于值堆栈的顶部。
如果应在操作上设置名称为 name
的属性,那么您可以直接将该属性命名为 [1].name
。但是,默认模式 params
interceptor 不接受这样的参数名称。 。然而,它是一个有效的 OGNL 表达式。因此,要让它通过拦截器,您需要将其添加到可接受的参数名称模式中。就这样
@Action(value="modelDrivenResult", results=@Result(location = "/modelDriven/modelDrivenResult.jsp"),
interceptorRefs = @InterceptorRef(value="defaultStack", params={
"params.acceptParamNames", "(\\[\\d+\\]\\.)*\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*"
})
)
这是因为 OGNL 还会检查接受参数的模式,并且此正则表达式模式允许匹配 params
和 OGNL 匹配器。
关于java - 在 Struts 2 中通过 ModelDriven 将参数传递给操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282400/