Struts2 OGNL - 请求参数提交顺序

时间:2011-03-09 18:38:18

标签: jsp struts2 ognl

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

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

提交此表单时,在“save”方法之前执行OGNL表达式employee.name(相当于getEmployee(。。setName())。并且,方法getEmployee()中没有“empId”的值。 “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;
}

2 个答案:

答案 0 :(得分:0)

我不确定我明白为什么要清楚,你想调用getEmployee()并且你不知道如何在方法中获取员工ID?

假设您有一张员工表。让我们假设该表提供了以下细节:

  • 员工姓名
  • 员工ID

让我们假设每行中也有一个链接,点击后会转到该员工的员工详细信息屏幕。由于您刚刚打印了员工ID,因此您还可以使用所需的get参数构造一个html锚元素,因此当调用该操作时,您将拥有所需的内容。 <s:a>标记以及<s:param>标记使这一切变得简单。

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

有关详细信息,请参阅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>

答案 1 :(得分:0)

首先,我假设你有一个empId字段的setter(你没有显示一个),你的问题是参数的顺序set是任意的。

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>