2017-04-03 62 views
0

我正在使用这样的表单支持bean。表单支持bean不保留已设置的属性值

public class BeanData implements Serializable{ 

    private String param1; 
    private String param2; 
    private String param3; 
    private String param4="india"; 

    getters setters 
} 

然后再送bean对象的模型如下─

@RequestMapping(value=/formPage, method={RequestMethod.GET,RequestMethod.POST}) 
    public ModelAndView getPage(HttpSession session, ModelAndView modelAndView) { 

     BeanData formBean = new BeanData(); 
     formBean.setParam2("123456"); // this param2 doens't have any field in JSP 
     modelAndView.addObject("formBean", formBean); 
     modelAndView.setViewName(PAGE); 

     return modelAndView; 
    } 
@RequestMapping(value=submitData, headers="Accept=*/*", method={RequestMethod.POST}) 
    public void submitData(@Valid @ModelAttribute("formBean") BeanData formBean, BindingResult result, HttpServletRequest request,HttpServletResponse response,ModelAndView modelAndView, HttpSession session) { 


     LOGGER.info("param1:"+formBean.getParam1()); // Param1 has a path map in jsp field. So whatever user is puuting into form field, that is getting populated here 
     LOGGER.info(" param2:"+formBean.getParam2()); // It has not been used in JSP. Though from controller it was populated before sending the bean to the jsp. but here the value is null . This is the concern 
     LOGGER.info("param3:"+formBean.getParam3());// Param1 has a path map in jsp field. So whatever user is puuting into form field, that is getting populated here 
     LOGGER.info("param4:"+formBean.getParam4());//thsi field also has not been used in JSP. But this property was set in bean instantiation. It is also getting retrieved successfully. 


     modelAndView.setViewName(SUCCESS PAGE); 

    } 

我担心的是,我想用setter方法来设置一个bean属性,并希望豆后盾对象传递给JSP。然后,所有的属性值应该绑定(我明确地绑定使用表单提交路径属性和我已经创建了bean对象时已经设置)到后台对象,它应该在控制器中接收。请指导我在哪里做错了。

<form:hidden path="formBean.param2"/> 

它不会显示在:

+0

您是否要在提交表单后检索设置为'param2'的值? – VPK

回答

0

如果你想牵住param2场的JSP的价值和它找回来的表单提交,您可以使用隐藏域,就像下面将它绑定你的JSP,它会保持你的价值。

另一种方法是将您的BeanData存储到会话中。

0

模型属性是请求范围的bean。您可以使用的解决方案:

  • 将您的属性映射到您的html表单的隐藏字段。我不建议这样做,因为他们可以在客户端轻松更新。
  • 使用会话属性,而不是模型属性,我认为这是最后一个选项。
  • 您真正应该做的是将您的表单bean的创建委托给使用@ModelAttribute注释的方法,而不是在getPage方法中进行。

Spring在处理请求之前执行注解为@ModelAttribute的方法,然后使用来自表单的属性更新对象。

@ModelAttribute("formBean") 
public BeanData setFormBeanModel() 
{ 
    BeanData formBean = new BeanData(); 
    formBean.setParam2("123456"); 
    return formBean; 
} 

@RequestMapping(value=/formPage, method={RequestMethod.GET,RequestMethod.POST}) 
public ModelAndView getPage(HttpSession session, ModelAndView modelAndView) 
{ 
    modelAndView.setViewName(PAGE); 

    return modelAndView; 
} 
+0

如果来自JSP的值为'null',则调用POST方法时它将相同。问题在这里没有解决。虽然这确实是一个更好的方法,但我很好奇这是否能解决问题。对于通过控制器的每个请求映射,还会调用用@ @ ModelAttribute注解的方法。 – VPK

+0

@VPK,它不发送到null,它只是根本不发送。春天如何更新一个属性,如果它没有被发送?第一个Spring使用'@ ModelAttribute'方法创建该对象,然后使用表单参数更新来自表单的属性,以用于相同的模型属性。如果某个属性未发送,则不会更新。正如我所说的,不建议使用表单隐藏字段或会话属性。 – alfcope

+0

对,如果未发送的属性没有更新,那么它将保持为空,它将如何解决问题? – VPK