2011-07-21 118 views
0

我使用的是spring框架3. 我有一個用於發表評論的文章。提交表格時,會檢查是否有任何錯誤。 如果沒有錯誤,控制器返回字符串Java,Spring框架MVC - 重定向

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

,情況正常。

但是,當存在一定的誤差,如果控制器返回

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

的錯誤都應該displaed與彈簧form.tld以標籤的形式接近:

<form:errors path="author"/> 

但沒有顯示錯誤! 當我試圖返回

"entryView/"+comment.getEntryId(); 

沒有重定向:前綴,那麼它要/rus/WEB-INF/jsp/entryView/8.jsp並有HTTP狀態404.但是,必須去http://example.com/rus/entryView/8,即評論文章和表單所在的頁面!

這是視圖解析器:

<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(); 
    } 
} 
} 
+0

控制器方法的其餘部分是如何定義的? –

回答

3

誤差的<form:errors path="author"/>作品像這樣的顯示:

  • 在驗證過程中/綁定,Errors都在HttpServletResponse對象保存爲屬性
  • 此JSP標記的實現調用response.getAttribute(name)來查找要顯示的Errors實例

當您使用redirect:url,即是在指示春天到302 Found發送到客戶端的瀏覽器強制瀏覽器做出要求,以新的URL。

由於重定向頁面正在使用一組不同的請求/響應對象,因此原始Errors丟失。

將「錯誤」傳遞到要重定向到的頁面以便新頁面顯示它的最簡單方法是自己處理它,方法是向Session對象添加消息,第二頁的控制器可以看看(或通過在URL中傳遞參數)。

+0

嗯,但如果我改變我的控制器,所以它返回ModelAndView並輸入它:ModelAndView mav = new ModelAndView(); mav.addObject(「errors」,result.getAllErrors()); mav.setViewName(「redirect:entryView/「+ comment.getEntryId()); return mav;它會起作用嗎? – Twisty

+0

你試過了嗎?我的觀點是,通過發送客戶端瀏覽器的302重定向與在響應對象中嵌入對象(這是ModelAndView和Errors對象的作用)的想法相沖突。 –

+0

我試過了,但還是不行。我認爲,唯一的方法是通過會議... – Twisty

2

嘗試使用「添加註釋」的形式,而不是重定向到顯示的新註釋視圖的頁面視圖:

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

您可能還需要在方法簽名中添加@ModelAttribute Comment .. 。

2

bkent314是正確的:

看一看這兩方法是defently工作的方式。 我從窗體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)); 
}