【问题标题】:Java, Spring Framework MVC - redirectionJava,Spring Framework MVC - 重定向
【发布时间】:2011-07-21 18:19:23
【问题描述】:

我正在使用 Spring 框架 3。 我有一个表格,用于将 cmets 发布到文章中。提交表单时,会检查是否有任何错误。 如果没有错误,控制器返回字符串

"redirect:entryView/"+comment.getEntryId();

一切都很好。

但是当出现一些错误时,如果控制器返回

"redirect:entryView/"+comment.getEntryId();

错误应该显示在带有 spring-form.tld 标签的表单附近:

<form:errors path="author"/>

但是没有显示错误! 当我试图返回时

"entryView/"+comment.getEntryId();

如果没有redirect:前缀,那么它会去/rus/WEB-INF/jsp/entryView/8.jsp并且有HTTP状态404。但它必须去http://example.com/rus/entryView/8,即文章和表单所在的页面因为 cmets 是!

这是视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
</bean>

我该怎么办?

控制器的其余部分:

@Controller
public class CommentController {
private RusService rusService;
private CommentValidator commentValidator;
@Autowired
public CommentController(RusService rusService,CommentValidator commentValidator){
    this.rusService = rusService;
    this.commentValidator = commentValidator;
}
@RequestMapping(value="/addComment",method=RequestMethod.POST)
public String addComment(Comment comment,BindingResult result){
    commentValidator.validate(comment, result);
    if(result.hasErrors()){
        return "redirect:entryView/"+comment.getEntryId();
    }else{
        rusService.postComment(comment);
        return "redirect:entryView/"+comment.getEntryId();
    }
}
}

【问题讨论】:

  • 控制器方法的其余部分是如何定义的?

标签: java forms spring frameworks


【解决方案1】:

&lt;form:errors path="author"/&gt; 中的错误显示如下:

  • 在验证/绑定期间,Errors 将作为属性保存在 HttpServletResponse 对象中
  • 这个JSP标签的实现调用response.getAttribute(name)来找到Errors实例来显示

当您使用redirect:url 时,您是在指示Spring 向客户端的浏览器发送302 Found,以强制浏览器向新URL 发出 请求。

由于重定向到的页面使用不同的请求/响应对象集进行操作,原始的Errors 丢失了。

将“错误”传递到您要重定向到的页面以使新页面显示它的最简单方法是自己处理它,方法是向第二页控制器的Session 对象添加一条消息可以查看(或通过在 URL 中传递参数)。

【讨论】:

  • 嗯,但如果我改变我的控制器,让它返回 ModelAndView 并输入:ModelAndView mav = new ModelAndView();mav.addObject("errors",result.getAllErrors());mav。 setViewName("redirect:entryView/"+comment.getEntryId());return mav;它会起作用吗?
  • 你试过了吗?我的观点是,向客户端的浏览器发送 302 重定向本质上与在响应对象中嵌入对象的想法(这就是 ModelAndView 和 Errors 对象所做的)相冲突。
【解决方案2】:

尝试使用“添加评论”表单的页面视图,而不是重定向到显示新评论的视图:

if(result.hasErrors()) {
    return "commentForm";
}

您可能还需要在方法签名中添加@ModelAttribute Comment...

【讨论】:

    【解决方案3】:

    bkent314 是对的:

    看看这两种方法,这是一种有效的方法。 我将域对象与表单 gui 对象(FolderCreateCommand)分开,但这是我的风格。在这种情况下,我使用 ModelAndView 作为返回而不是字符串,因为这样我可以完全控制模型。

    @RequestMapping(method = RequestMethod.GET, params = "form")
    public ModelAndView createForm() {
        return modelAndViewForCreate(new FolderCreateCommand(..default values..));
    }
    
    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView create(@Valid FolderCreateCommand folderCreateCommand,
              BindingResult bindingResult) {
    
        if (bindingResult.hasErrors()) {
            return modelAndViewForCreate(folderCreateCommand);
        }
        Folder folder = this.folderService.createFolder(folderCreateCommand);
        return redirectToShow(folder);
    }
    
    
    private ModelAndView modelAndViewForCreate(FolderCreateCommand folderCreateCommand) {
        ModelMap uiModel = new ModelMap();
        uiModel.addAttribute("folderCreateCommand", folderCreateCommand);
        uiModel.addAttribute("parentFolders", this.folderDao.readAll());
        return new ModelAndView("folders/create", uiModel);
    }
    
    private ModelAndView redirectToShow(Folder folder) {
        return new ModelAndView(new RedirectView("/folders/" + folder.getId(), true));
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 2015-06-05
      • 1970-01-01
      • 2015-05-19
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多