2013-07-24 2 views
0

Я занимался программированием с использованием весны mvc, и я решил сделать пример относительно согласования контента.Содержание Переговоры при просмотре различных форматов вывода

Я начал с URI «/ продукты»:

  • Когда я прошу /products.json это возвращает меня JSON, которые, я рад
  • Когда я прошу /products.xml это возвращает правильный xml, снова я доволен тем, что
  • Когда я запрашиваю представление html (/ products), на данный момент я показываю только простую таблицу html для продуктов, но что, если я хочу включить дополнительный динамический контент для html-страницы, такой как облако тегов или похожие продукты (вещи, не связанные с продуктами)?

Ниже приведен мой код для метода контроллера.

@RequestMapping(method = RequestMethod.GET) 
    public ModelAndView getAllProducts(){ 
     ModelAndView result = new ModelAndView("index"); 
     GenericListElementWrapper<Product> products = new GenericListElementWrapper<Product>(); 

     products.setList(productDao.getAll()); 
     ModelMap modelMap = new ModelMap(); 
     modelMap.addAttribute("products",products); 
     result.addAllObjects(modelMap); 

     return result; 
    } 

То, что я хотел бы достичь заключается в следующем:

  • способ иметь держать мой единственный метод контроллера, но вид HTML будет иметь дополнительный контент

идеи, которые я был:

  • Возможно использование сервлет-фильтров для обогащения мод elAndView только для текста/html mimetype? Но тогда вы делаете это для всех html-запросов, которые могут быть нежелательными?

  • В настоящее время я объясняю себя, чувствуя, что хочу, чтобы клиенту было полностью отображено html-представление. Возможно, я неправильно рассматриваю эту проблему, и я должен думать о том, как получить дополнительный контент после загрузки страницы через javascript?

Так можно ли достичь моего предполагаемого решения? Другая часть заключается в том, действительно ли мое предполагаемое решение действительно желательно на практике: P

ответ

1

Возможность добавления перехватчика и сопоставление его с выбранным вами путем. interceptor.postHandle обеспечивает доступ к ModelAndView после выполнения обработчиком вашего контроллера. Позволяет добавить дополнительные.

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/my/path"/> 
     <ref bean="enhancedContentInterceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

@Component 
public class EnhancedContentInterceptor implements HandlerInterceptor { 

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

     return true; 
    } 

    public void postHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 

     if (request.getContentType().equals("text/html")) { 
      modelAndView.addObject("tags", tagProvider.getTags()); 
     } 
    } 

    public void afterCompletion(HttpServletRequest request, 
      HttpServletResponse response, Object handler, Exception ex) 
      throws Exception {} 

    } 
}