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

emanlee 阅读:43 2025-05-04 20:05:19 评论:0

以下情况不会自动填充表单字段

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

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

员工.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 模型驱动接口(interface),因此不能推荐在您的情况下可以做的最好的事情,但如果我是对的,这就是使用模型驱动接口(interface)的陷阱之一。

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

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

但框架仍然引用旧模型对象。由于 S2 使用 getter 方法获取引用,因此它不知道您在 execute 方法中正在做什么以及导致数据不一致的原因。

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


标签:Struts2
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号