Ищите краткий способ добавить информацию заголовка на каждую страницу в Spring MVC через объект Model контроллера. - PullRequest
0 голосов
/ 27 июля 2011

У меня есть тег <TITLE> в моих JSP, который устанавливается с использованием значения из обработчика запросов:

<title><c:out value="${title}"/></title>

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

Но я все еще не доволен тем, как это выглядит в коде (мои фактические методы контроллера намного длиннее, чем приведенные здесь примеры, поэтому я пытаюсь свести их к минимуму инасколько это возможно).

Есть ли более точный способ добавления этой информации из контроллера?(Его нельзя добавить в JSP).

@RequestMapping(value = "/foo", method = RequestMethod.GET)
public final String foo(final ModelMap model) {
    addTitle(model, "Desolation Row is the title of this page");
    return "foo";
}

@RequestMapping(value = "/goo", method = RequestMethod.GET)
public final String goo(final ModelMap model) {
    addTitle(model, "Leopardskin Pillbox Hat is the title of this page");
    return "goo";
}

public ModelMap addTitle(ModelMap model, String title) {
    model.addAttribute("title", title);
    return model;
}

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Если вы хотите отделить метод addTitle от ваших контроллеров, возможно, вы можете поместить их в реализацию HandlerInterceptor?

Примерно так:

public class TitleInterceptor implements HandlerInterceptor {
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
           String requestUrl = (String)request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); 
           String title = "";
           if ("/url1.htm".equals(requestUrl)) {
              title = "Title 1";
           } else if ("/url2.htm".equals(requestUrl)) {
              title = "Title 2";
           }
           modelAndView.getModel().put("title", title)
        }

}

Если вам потребуется некоторая обработка для определения заголовка, возможно, ModelAndView, доступный перехватчику, будет содержать данные, которые помогут в определении заголовка с учетомURL-адрес.Если никакой обработки не требуется, достаточно простого сопоставления заголовка с URL-адресом, вы даже можете реализовать его как настраиваемую Map во время конфигурации bean-компонента в вашем applicationContext.xml

Некоторые ссылки, которые я нашел полезными при реализации HandlerInterceptor, можно найтиздесь: http://whitesboard.blogspot.com/2009/10/handlerinterceptors-in-spring-web-mvc.html http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/web/servlet/HandlerInterceptor.html

0 голосов
/ 27 июля 2011

Если вы не хотите идти по дороге Interceptor или Aspect (сохраняя все в контроллере):

  • Создать BaseController, что все контроллеры extend
  • Иметь HashMap в BaseController URL-адресах для заголовков
  • Поместите туда также метод addTitle, модифицируя так, чтобы он возвращал ту же строку, что и имя JSP.

BaseController код:

public ModelMap addTitle(ModelMap model, String page) {
   model.addAttribute("title", titleMap.get(page));
   return page;
}

Код контроллера становится:

@RequestMapping(value = "/goo", method = RequestMethod.GET)
public final String goo(final ModelMap model) {
   return super.addTitle(model, "goo");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...