2015-04-07 2 views
2

Я новичок в Spring MVC. Я пытаюсь написать контроллер, который обрабатывает определенный маршрут. Этот контроллер отображает представление jsp и возвращает его.Показать страницу с ошибкой Spring MVC

теперь я хочу, чтобы добавить страницу ошибки в некоторых отдельных случаях (например, браузер не поддерживается)

Как сделать это весной?

Я не уверен, если это правильный подход, но вот что я нашел до сих пор: preHandle Interceptor

я могу добавить какую-перехватчик перед контроллером и проверьте состояние ошибки выполняется. Исходя из этого, я могу показать страницу с ошибкой или продолжить регулярный поток.

ответ

1

Я предлагаю две возможности.

1. Использовать перехватчик обработчика. Вы правы. Я считаю, что это лучший вариант. Определите тип браузера перед контроллером, а затем используйте информацию браузера, чтобы отобразить нужную страницу.

Посмотрите на этот пример псевдокоде, вам потребуется библиотека user-agent-utils:

public class BrowserInfo { 

    private String name; 
    private int version; 

    public BrowserInfo(String name, int version) { 
     this.name = name; 
     this.version = version; 
    } 

    // getter, setter... 
} 

/** 
* Detect browser type and make it available in your controller 
*/ 
public class BrowserResolverHandlerInterceptor extends HandlerInterceptorAdapter { 

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     // 
     // FROM: http://stackoverflow.com/a/13229552/1614378 
     // 
     String userAgent = request.getHeader("user-agent"); 
     UserAgent ua  = UserAgent.parseUserAgentString(userAgent); 

     Version browserVersion = ua.getBrowserVersion(); 
     String browserName  = ua.getBrowser().toString(); 
     int majVersion   = Integer.parseInt(browserVersion.getMajorVersion()); 

     BrowserInfo browser = new BrowserInfo(browserName, majVersion); 
     request.setAttribute("browserInfo", browser); 
     return true; 
    } 
} 

/** 
* HandlerMethodArgumentResolver. so you can use BrowserInfo as argument in you controller methods. 
*/ 
public class BrowserInfoResolver implements HandlerMethodArgumentResolver { 

    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
     return parameter.getParameterType().equals(BrowserInfo.class); 
    } 

    @Override 
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { 
     return (BrowserInfo) webRequest.getAttribute("browserInfo", RequestAttributes.SCOPE_REQUEST); 
    } 
} 

Теперь вы можете использовать его в контроллере:

@Controller 
@RequestMapping(value = "/") 
public class RootController extends AbstractWebController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String home(BrowserInfo browser, Locale locale, Model model, HttpServletRequest request) { 

     if("ie".equals(browser.getName()) && browser.getVersion() < 7){ 
      return "redirect:error"; // error.jsp or browser_not_supported.jsp... 
     } 

     return "home"; // home.jsp 
    } 
} 

2. детектировать (IE) версия браузера в вашем jsp:About conditional comments

Пример:

<!--[if gte IE 8]> 
    <style> 
     [styles for IE 8] 
    </style> 
<![endif]--> 

<!--[if lt IE 8]> 
    <style> 
     [styles for IE 7: hide all elements, show message label etc...] 
    </style> 
    <script> 
     alert("Pls update your browser. now!"); 
    </script> 
<![endif]--> 

EDIT:
(3) вы можете также отправить перенаправление внутри перехватчик. Но я лично не нравится. Потому что вы разделите свою «логику страницы» между Interceptor и Controller. В любом случае, я верю, что перенаправление перехватчиком будет быстрее, чем перенаправление контроллером.

+0

примеры, которые я нашел в Интернете, добавляли переадресацию в перехватчик (перенаправление на/ошибка, а затем другой контроллер обрабатывает его) вместо передачи флага и обработки его в основном контроллере. Что ты думаешь по этому поводу? – sublime

+0

@sublime я обновил свой ответ. но это только мое личное мнение. – dit

0

Проверьте это в фильтре или передInterceptor, чтобы выбросить исключение.

сделать собственный код ошибки для вашего исключения.

браузер не например поддерживается быть - 450 и сопоставить их через web.xml, как показано ниже

<error-page> 
<error-code>450</error-code> 
<location>/450</location> 
</error-page> 

теперь делают контроллер, который обрабатывает эту ошибку.

take a look at this example for reference

Смежные вопросы