【问题标题】:Passing parameters to action through ModelDriven in Struts 2通过 Struts 2 中的 ModelDriven 将参数传递给动作
【发布时间】:2014-02-12 11:30:48
【问题描述】:

该问题与 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
}

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 拦截器填充并初始化模型属性以在结果中显示它。但问题是未填充参数。如何获取参数name被params拦截器填充,以便动作显示值?

【问题讨论】:

    标签: java regex jsp struts2 ognl


    【解决方案1】:

    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 匹配器。

    【讨论】:

    • 我尝试在 struts-2.3.15.2 中执行与您的问题类似的操作,并且效果很好,无需更改 acceptParamNames。这只是 2.3.16 的新内容吗???
    • acceptParamNames 即使在旧版本中也需要更改以使参数通过拦截器,但在较新版本中,如果排除参数则不起作用。另见Struts 2 Acceptable Parametersstruts 2 action with no setter getter
    • @SiddharthTrikha 你不明白这不是 2.3.15.x 吗? Struts 2.3.16 有不同的实现和行为。
    猜你喜欢
    • 2023-03-18
    • 2014-12-14
    • 1970-01-01
    • 2021-11-18
    • 2012-07-30
    • 2015-02-04
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多