[英]Passing parameters to action through ModelDriven in Struts 2
該問題與ModelDriven
和 Struts 2.3.16 相關。 由於params
攔截器的行為更改為訪問傳遞給操作的參數,因此需要配置acceptParamNames
列表以與ModelDriven
操作一起使用。 如果acceptParamNames
列表為空,則默認情況下它會通過默認模式接受參數。 假設我們有一個
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
}
模型驅動.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"/>
模型驅動結果.jsp:
<s:label
label="Gangster Name"
name="name"/><br/>
在 action execute
方法中,我們正在獲取參數name
,該name
應由params
攔截器填充並初始化模型屬性以將其顯示在結果中。 但問題是沒有填充參數。 如何獲取由 params 攔截器填充的參數name
,以便操作可以顯示值?
name
是模型的屬性,也是動作類的屬性。 modelDriven
攔截器將模型推到值堆棧的頂部,因此在 JSP 中很容易使用它。 動作對象位於模型下方。 因此,可以使用[1]
前綴直接引用它。 請參閱OGNL 基礎知識。
但是如果模型和操作對象中沒有重復的屬性名稱,則沒有必要。 當 OGNL 評估諸如 name 之類的name
,它會從valueStack
的頂部向下搜索屬性訪問器的堆棧。 將執行第一個找到的訪問器。 因此,模型屬性具有優先級,因為模型位於值堆棧的頂部。
如果應該在操作上設置名稱為name
的屬性,那么您可以直接將該屬性命名為[1].name
。 但是,這樣的參數名稱不被params
攔截器的默認模式接受。 但是,它是一個有效的 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 匹配器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.