我正在使用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;
}
答案 0 :(得分:0)
我不确定我明白为什么要清楚,你想调用getEmployee()并且你不知道如何在方法中获取员工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>