Spring控制器在提交表单时重新加载相同的页面

时间:2011-10-05 08:15:06

标签: spring jsp

我在创建一个Spring控制器时遇到问题,该控制器会在填写表单时重新加载相同的页面。 我想要实现的是一个更改密码的页面。它应该要求输入旧密码,新密码和重新输入的新密码。当用户填写所有内容并提交表单时,操作应该是同一页面,控制器应该能够显示“密码不匹配”或“密码成功更改”之类的内容。 我知道如何通过使用几个控制器来实现这一点,但我认为使用一个控制器会更好。

以下是我的控制器:

package controllers;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import models.Password;



@Controller
public class ChangePassword {
    @RequestMapping(value = "/changepassword", method = RequestMethod.GET)
    public ModelAndView changePassword(@ModelAttribute("changepassword")Password password, BindingResult result) {
        if(password.isEmpty())
        {
            return new ModelAndView("changepassword", "command", new Password());
        }
        else if(password.isValid())
        {
            return new ModelAndView("changepassword", "message", "The password was successfully changed!");
        }
        else{
            return new ModelAndView("changepassword", "message", "The passwords did not match and/or the password was not 8 at least 8 characters long.");
        }       
    }

第一次加载页面时,它会正确显示表单,但如果将密码保留为空并提交,则glassfish会显示:

“org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:BindingResult和bean名称'command'的普通目标对象都不可用作请求属性”

我不明白为什么会发生这种情况,我认为它应该像第一次访问一样显示表单。

实际上我需要的是将Password模型提供给查看器以及一些文本(错误消息或成功消息)。我看到人们将地图返回给观众,但我没有成功。

1 个答案:

答案 0 :(得分:3)

您应该将请求映射为GET和POST。 GET用于呈现页面及其消息以及POST用于提交本身。

您应该重定向以避免重复提交问题。

并且为了在模型和视图中显示消息,您应该使用FlashScope实现。

有关详细信息,请参阅此帖子: Spring MVC custom scope bean

你可以这样做:

@Controller
public class ChangePassword {
    @RequestMapping(value = "/changepassword", method = RequestMethod.GET)
 public ModelAndView renderCPassPage(@ModelAttribute("changepassword")Password password, BindingResult result) {
       ModelAndView mv = new ModelAndView("changePassword");
       mv.addObject("password" password);
       return mv;
    }

   @RequestMapping(value = "/changepassword", method = RequestMethod.POST)
 public ModelAndView renderCPassPage(@ModelAttribute("changepassword")Password password, BindingResult result) {
       ModelAndView mv = new ModelAndView("redirect:changepassword");
          if(password.isEmpty())
        {
            return new ModelAndView("message", "password Empty");
        }
        else if(password.isValid())
        {
            return new ModelAndView("message", "The password was successfully changed!");
        }
        else{
            return new ModelAndView("message", "The passwords did not match and/or the password was not 8 at least 8 characters long.");
        }       
    }