2014-12-22 150 views
2

我是Spring,也是JSP中的新成员。我正在项目中工作,我需要创建一个页面,在特定的例外情况下应用程序将被重定向。 我有服务的方法抛出一个例外。这个方法在我们的一个页面控制器中用@RequestMapping注解来调用。因此,为了重定向到特定的错误页面,我使用@ExceptionHanlder创建了两个方法来处理此控制器中的这些异常。它看起来如何:使用JSP处理由Spring处理的异常显示消息

@ExceptionHandler(IllegalStateException.class) 
public ModelAndView handleIllegalStateException (IllegalStateException ex) { 
    ModelAndView modelAndView = new ModelAndView("redirect:/error"); 
    modelAndView.addObject("exceptionMsg", ex.getMessage()); 
    return modelAndView; 
} 

但还不够。我还需要创建ErrorPageController:

@Controller 
@RequestMapping("/error") 
public class ErrorPageController { 
    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView displayErrorPage() { 
     return new ModelAndView("error"); 
    } 
} 

现在工程显示错误页面。但我的问题是,我不能在JSP中显示错误信息...... 我:

<h3>Error page: "${exceptionMsg}"</h3> 

但我没有看到一个消息; /取而代之的是,我在URL看到消息:

localhost/error?exceptionMsg=Cannot+change+participation+status+if+the+event+is+cancelled+or+it+has+ended. 

而且因为在网址我想有只“本地主机/错误”,仅此而已这是错的。这条消息我想在JSP中显示。

+0

因为您使用空模型创建新模型和视图。但为什么你需要一个自定义异常处理程序?默认的策略包括抛出的异常在一个名为'exception'的属性中。这样它应该可用于您的错误页面。这里的主要问题是你正在做一个重定向来触发一个新的请求,因此你需要一个控制器。默认情况下,模型参数被编码为请求参数。在处理错误的控制器中,不要创建新的模型和视图,只需在页面中返回“错误”,或者在配置中声明视图控制器,就可以为您节省一个类。 –

+0

嗯,它的工作原理,但如何在JSP中显示消息?是否有可能打印其他网址?因为现在我有我打开的URL,但我想看到或被重定向到“localhost/error”。我需要这个,因为应用程序以这种方式工作... – Lui

+0

重定向不是问题在于控制器选择视图时,您正在使用该控制器销毁模型(即使其为空)。此外,对于重定向,您希望使用“RedirectAttributes”而不是普通模型。 –

回答

3

要解决这两个问题的(显示的消息,并有正确的URL )你应该在原代码中将你的异常处理方法改为例如

@ExceptionHandler(IllegalStateException.class) 
public RedirectView handleIllegalStateException(IllegalStateException ex, HttpServletRequest request) { 
    RedirectView rw = new RedirectView("/error"); 
    FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(request); 
    if (outputFlashMap != null) { 
     outputFlashMap.put("exceptionMsg", ex.getMessage()); 
    } 
    return rw; 
} 

为什么?如果你想让你的属性通过重定向持久化,你需要将它们添加到flash范围。上面的代码使用FlashMap,从文档

甲FlashMap被重定向(通常在会话)之前保存并 被重定向之后可用,并立即除去。

如果它是一个正常的控制器的方法,你可以简单地添加RedirectAttributes作为参数,但@ExceptionHandler方法,RedirectAttributes的参数都没有得到解决,所以你需要添加HttpServletRequest和使用RedirectView的。

+0

Oooo!现在太棒了! :D谢谢:) – Lui

2

你必须改变ModelAndView到:

@ExceptionHandler(IllegalStateException.class) 
public ModelAndView handleIllegalStateException (IllegalStateException ex) { 
    ModelAndView modelAndView = new ModelAndView("error"); 
    modelAndView.addObject("exceptionMsg", ex.getMessage()); 
    return modelAndView; 
} 

而且有这部分的error.jsp中:

<h3>Error page: "${exceptionMsg}"</h3> 
+0

它也有效,但仍然有与URL相同的问题...我需要有“localhost/error”URL。 – Lui