Struts2模型对象未填充到表单字段

Struts2模型对象未填充到表单字段,struts2,Struts2,对于以下场景,表单字段不会自动填充 public class EmployeeAction extends ActionSupport implements ModelDriven{ private Employee employee=new Employee(); public Object getModel() { return employee; } public String execute() throws Exception {

对于以下场景,表单字段不会自动填充

 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();
   }

 }
问题是新的employee对象,但表单需要旧的对象引用,因此手动映射工作正常

  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>

雇员
雇员
雇员
雇员

我对Struts2模型驱动接口没有太多的工作经验,也不能推荐在您的情况下可以做得最好的方法,但如果我是对的,这就是使用模型驱动接口的陷阱之一

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

employee=employeeService.findById(9l);
但框架仍然引用了旧的模型对象。由于S2使用getter方法获取引用,因此它没有关于execute方法内部的操作以及导致数据不一致的原因的信息

老实说,我不确定这个用例是否有任何解决方案,我会选择一种简单的对象支持的属性方法。
如果我的输入正确,希望有人能提供解决方法。

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

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

    可以通过将信息保存到
    会话
    (例如,员工id)并验证此数据以创建新员工来解决此问题

    另一个选择是将Struts 2的ObjectFactory更改为类似Spring的内容

    参考资料:我使用了Struts2(带弹簧和不带弹簧),并试图找到一些官方参考资料。Struts 2文档不清楚中的实例创建,但是Struts 2的

    Spring2的bean作用域特性可用于作用域动作实例 到会话、应用程序或自定义范围,提供高级 自定义高于默认的每个请求范围


    模型驱动的用例非常简单。假设您有多个具有相同属性的操作(向导中经常出现这种情况,但也有其他情况)。。。如果将这些属性放在单个对象中,并将其与模型驱动一起使用,那么这些操作确实共享相同的属性就更清楚了。模型驱动的主要问题是,如果您决定向操作中添加一些额外的属性,而不是向模型中添加一些属性,那么绕过模型会有点麻烦。然后视图中的OGNL变得更有趣。如果使用此操作的表单正确,则应该填充模型。请将JSP(或表单HTML)与Employee类一起显示。我不清楚为什么你要找一个特定的员工(id 91),用它写下你的模型,然后什么都不做。您的问题听起来可能是您在寻找ParamsPreparamsStack。。。但这对我来说是一个远大的希望,因为真正了解的还不够。@Arun发布您的JSP和Employee类,否则除了已经发布的内容之外,很难说什么suggested@Arun:看到您的代码后,我的原始答案仍然保持不变。在调用ModelDriven操作的execute()方法时,框架已获得对您的模型对象的引用,它将在整个请求过程中使用该引用。因此,无论您是否将新引用分配给您的
    员工
    ,S2仍然有对它的旧引用。问题更多的是S2模型驱动的接口如何工作。S2为完整的请求循环创建操作实例。