【问题标题】:Struts2 OGNL - Request parameters submission orderStruts2 OGNL - 请求参数提交顺序
【发布时间】:2011-03-09 18:38:18
【问题描述】:

我正在使用jsp和struts2,我有以下场景:

<s:form>
<s:hidden name="empId" value="123"/>
<s:textfield name="employee.name"/>
<s:submit action="save"/>
</s:form>

当这个表单被提交时,OGNL 表达式employee.name(相当于getEmployee().setName())在“save”方法之前被执行。而且,“empId”的值在 getEmployee() 方法中不可用。 “empId”的值仅在“save”方法中可用。是否可以在 getEmployee() 中获取“empId”的值?

以下是我的 Action 类中的代码:

public String save() {
  //empId is available here
  return SUCCESS;
}

public Employee getEmployee(){
  if (employee == null){
    //empId is not available here
    employee = employeeService.get(empId);
  }
  return employee;
}

【问题讨论】:

  • 请提供相关的struts2 xml/annotations,一般来说我们更容易阅读,然后是阅读英文版。
  • 四元数,谢谢回复。我已将问题编辑为更清楚。请检查您是否能够理解场景。

标签: jsp struts2 ognl


【解决方案1】:

首先,我假设您确实有一个用于 empId 字段的设置器(您没有显示一个),并且您的问题是设置参数的顺序是随意。

ParametersInterceptor 有一个选项可以强制它首先设置顶级属性。您可以通过自定义拦截器堆栈来启用它,以使用 ordered 属性集定义参数拦截器。

<interceptor-ref name="params">
    <param name="ordered">true</param>
</interceptor-ref>

然后,在您的操作类中,将 setEmpId 方法更改为:

public void setEmpId(Integer empId) { // or whatever type it is
    this.empId = empId;
    employee = employeeService.get(empId);
}

作为 setter 方法的替代方法,您还可以为 Employee 类创建一个类型转换器,然后将您的表单更改为:

<s:form>
    <s:hidden name="employee" value="123"/>
    <s:textfield name="employee.name"/>
    <s:submit action="save"/>
</s:form>

【讨论】:

  • 感谢史蒂夫,我为“params”拦截器添加了“ordered”属性,它就像一个魅力!再次感谢您的建议。
  • 我的荣幸!当我遇到它时,我发现它真的很有用。
【解决方案2】:

我不确定我是否理解清楚,您想调用 getEmployee() 并且您不知道如何在方法中获取员工 ID?

假设您有一张员工表。我们还假设该表提供了以下详细信息:

  • 员工姓名
  • 员工编号

假设每一行中也有一个链接,单击该链接将带您进入该员工的员工详细信息屏幕。由于您刚刚打印了员工 ID,您还可以使用所需的 get 参数构造一个 html 锚元素,因此当调用该操作时,您将拥有所需的内容。 &lt;s:a&gt; 标签和 &lt;s:param&gt; 标签让这一切变得简单。

请参阅我的答案Tiles2 Struts Switch Locale,了解如何使用 struts2 锚标记和属性标记的示例。尽管该示例使用静态属性,但只需将参数标记中的 value 属性替换为 id 变量。

更多详情请见http://struts.apache.org/2.2.1.1/docs/a.html

编辑:我知道在你编辑之前我已经走了很远。

我认为最简单的方法是创建一个 getEmployee(int id) 方法。然后你也可以摆脱隐藏的字段值。 在那之后它应该是直截了当的......

您的 jsp 大致如下(未经测试):

<s:form>
   <s:textfield name="%{employee[123].name}"/>
   <s:submit action="save"/>
</s:form>

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多