【问题标题】:redirect doesn't work in the Spring controller重定向在 Spring 控制器中不起作用
【发布时间】:2021-01-17 13:08:45
【问题描述】:

这里是一个注册字段,注册后应该是进入菜单页面,但是进入主页面

@Controller
@RequestMapping("/main")
public class SignInPageController {

    private UserDao userDao;
@Autowired
    public SignInPageController(UserDao userDao){this.userDao = userDao;}

@GetMapping("/menu")
    public String mainMenuPage(){
        return "main/menu";
    }
@GetMapping("/signup")
    public String signUpPage(Model model){
        model.addAttribute("newuser", new User());
        return "main/signup";
    }
@PostMapping("/signup")
    public String signUp(@RequestParam("name") String name,
                             @RequestParam("password") String password,
                             @RequestParam("email") String email,
                             @RequestParam("nativeLanguage") String nativeLanguage){
        User user = new User(name, password, email, nativeLanguage);
        userDao.signUpUser(user);
        return "redirect:/main/menu";
    }

你能告诉我问题是什么吗?

【问题讨论】:

  • 我真的不明白预期的行为是什么:你所说的“注册”是什么?您希望用户完成注册,然后将他重定向到主菜单?顺便说一句,你为什么返回 String 类型而不是 ModelAndView 类型?而且在我看来,你应该避免在你的代码中使用这样写的常量,如果它们被重复,它会更难维护!
  • 是的,预期的行为是将用户添加到数据库并转到主菜单页面。你是说我应该将模型传递给我的 mainMenuPage 方法吗?
  • 那么你有没有试过在每个方法中设置断点来查看它在哪里着陆?是的,尝试将“signUp”的返回类型从 String 更改为 ModelAndView 并返回,例如 return new ModelAndView("redirect:/main/menu", model);
  • 但是模型是另一回事,首先你应该确保你的路径是正确的,然后我们会检查你的redirectAttributes和你需要的数据是否存在于你的RequestMapping的每个方法中
  • 我通过向控制器方法添加模型解决了重定向问题(以及更正了 html 视图上的错误 - 表单中动作参数的路径指定不正确)。非常感谢,您可以将您的评论标记为答案吗?)

标签: java spring redirect model-view-controller controller


【解决方案1】:

您的SignInPageController 类上似乎缺少@Controller Spring 注释。

所以你应该得到这样的东西:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// And your other imports...

@Controller
@RequestMapping("/main")
public class SignInPageController {

    private UserDao userDao;

    @Autowired
    public SignInPageController(UserDao userDao){this.userDao = userDao;}

    @GetMapping("/menu")
    public String mainMenuPage(){
        return "main/menu";
    }

    @GetMapping("/signup")
    public String signUpPage(Model model){
        model.addAttribute("newuser", new User());
        return "main/signup";
    }

    @PostMapping("/signup")
    public String signUp(@RequestParam("name") String name,
                             @RequestParam("password") String password,
                             @RequestParam("email") String email,
                             @RequestParam("nativeLanguage") String nativeLanguage){
        User user = new User(name, password, email, nativeLanguage);
        userDao.signUpUser(user);
        return "redirect:/main/menu";
    }
}

【讨论】:

  • 很抱歉,这只是一个错字。我的代码包含此注释。修复了问题
  • 啊,很好读 ;) 更好的是你设法自己修复它!
【解决方案2】:

正如我在 cmets 中所说:

您应该从控制器的方法返回 ModelAndView 类型,返回如下:

return new ModelAndView("redirect:/main/menu", model);

正如您所提到的,您还遇到了重定向不正确的问题,请尝试使用已定义的 CONSTANTS 以避免拼写错误:)

如果您是 Spring 新手,请务必查看 RedirectAttributes,添加 flashAttributes,并查看 Baeldung 上的文档,它真的很完整。

祝你好运!

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 2020-06-26
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多