簡體   English   中英

通過 Struts 2 中的 ModelDriven 將參數傳遞給操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM