java - 在 Struts 2 中通过 ModelDriven 将参数传递给操作

标签 java regex jsp struts2 ognl

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

相关文章:

java - 从 Camel 路由发送响应

java - SimpleDateFormat 没有按预期工作

python - 在目录中查找名称中包含特定字符串的文件

javascript - 使用正则表达式检查 URL 哈希以查找部分和页面

css - 如何在浏览器滚动和调整大小时保持文本框

java - 有效地将许多短排序列表合并成一个长排序列表

java - 请求路径 JAX-RS

regex - 使用 grep 查找以 $ 开头的模式

html - JSP:在 c:otherwise 循环中生成唯一的 HTML 类名(100% 新手)

JSP EL 字符串连接