Struts2 Model对象没有填充到表单字段

时间:2012-02-13 15:49:07

标签: struts2

表单字段不会自动填充以下方案

 public class EmployeeAction extends ActionSupport implements ModelDriven{

   private Employee employee=new Employee();

   public Object getModel() {       
    return employee;
}
   public String execute() throws Exception {    
        employee=employeeService.findById(employee.getId());
        return super.execute();
   }

 }

问题是新员工对象,但表单期望旧对象引用,因此手动映射工作正常,

  public String execute() throws Exception {     
       BeanUtils.copyProperties(employee,employeeService.findById(employee.getId()));   
        return super.execute();
    }

如何避免此对象(新/旧)引用问题

Employee.jsp

<s:form  action="saveemployee" method="post">
    <s:hidden name="id"></s:hidden>
    <s:textfield name="name" label="Name" />
    <s:textfield name="age" label="Age"></s:textfield>  
    <s:radio name="gender" label="Gender" list="%{staticMasterMap.gender}" listKey="key" listValue="value" ></s:radio>
    <s:label value="DOB"></s:label><fw:datepicker name="dob" id="dob" changeMonth="true" changeYear="true" format="dd/mm/yy"  yearRange="1900:2010"></fw:datepicker>
    <s:textarea name="address" label="Address"></s:textarea>    
    <s:submit label="Save"></s:submit>
    <s:reset label="Reset"></s:reset>
</s:form>

struts.xml中

<package name="fw" extends="struts-default"     namespace="/">

    <action name="saveemployee" class="com.example.employee.action.EmployeeAction"
            method="save">
            <result name="input" type="tiles">employee</result>
            <result name="success" type="tiles">employee</result>
        </action>           
        <action name="findemployee" class="com.example.employee.action.EmployeeAction" method="findById">
            <result name="success" type="tiles">employee</result>
            <result name="input" type="tiles">employee</result>         
        </action>       
   </package>

2 个答案:

答案 0 :(得分:3)

我没有太多使用Struts2模型驱动接口,也不能推荐在你的情况下可以做的最好的事情,但如果我是对的,这是使用模型驱动接口的一个陷阱。

在您的情况下,在调用execute()方法时,S2已经获得了对您将用于此特定请求周期的Model对象的引用。这意味着您正在使用

更改execute方法中的引用
employee=employeeService.findById(9l);

但框架仍然引用了旧的模型对象。由于S2使用getter方法获取引用,因此它没有信息在execute方法中你正在做什么,这是导致数据不一致的原因。

老实说,我不确定这个用例的任何解决方案,并将采用简单的Object支持属性方法。 希望如果我的输入正确,有人可以提供解决方法。

答案 1 :(得分:1)

我认为问题更简单。默认情况下,Struts 2操作在每个请求中实例化(也写为具有请求范围)。

  1. 当您找到某个Employee时,会创建EmployeeAction的实例并用于填充表单。
  2. 当您按“保存”按钮时,会使用新的(空)EmployeeAction实例创建Employee的新实例。
  3. 您可以通过让构造函数记录某些内容或使用调试器来验证是否是这种情况。

    解决此问题可以通过将信息保存到Session(例如,员工ID)并验证此数据来创建新的员工来完成。

    其他选择是将Struts 2的ObjectFactory更改为类似Spring的内容。

    参考文献:我使用过Struts2有没有Spring,并试图找到一些官方参考。 Struts 2文档不清楚request cycle中的实例创建,但Struts 2的Spring plugin文档说

      

    Spring 2的bean作用域功能可用于范围Action实例   到会话,应用程序或自定义范围,提供高级   自定义默认的每请求范围