gpt4 book ai didi

Spring Controller 在提交表单时重新加载同一页面

转载 作者:行者123 更新时间:2023-12-02 03:10:12 25 4
gpt4 key购买 nike

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

下面是我的 Controller :

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”的普通目标对象都不能作为请求属性”

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

事实上,我需要的是向查看器获取密码模型以及一些文本(错误消息或成功消息)。我见过有人将 map 返回给查看者,但我没有成功做到这一点。

最佳答案

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

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

为了在模型和 View 中显示消息,您应该使用 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.");
}
}

关于Spring Controller 在提交表单时重新加载同一页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com