Два разных представления в зависимости от расширения файла URL с использованием Spring MVC 3 - PullRequest
3 голосов
/ 01 июля 2011

Я хочу иметь одно и то же сопоставление запросов, но разрешить другое представление в зависимости от расширения файла. У меня есть две JSP, одна из которых отображает HTML, а другая - XML. В зависимости от расширения файла я должен разрешить к соответствующему jsp.

Это мой контроллер:

@Controller
public class FileManagementController {

    @RequestMapping(value="/filemanagements", method=RequestMethod.GET)
    public ModelAndView list() {
        //if file extension .xml return  /filemanagement/listXml
        //if no file extension present return /filemanagement/list
    }

}

И у меня есть следующий корень моего WebApp:

/ JSP / filemanagement / list.jsp

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

..

/ JSP / filemanagement / listXml.jsp

<?xml version="1.0" encoding="UTF-8"?>
<%@page contentType="text/xml" pageEncoding="UTF-8"%>

....

Вот так я настроил свой ViewResolver в servletContext.xml:

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
</bean>

Ответы [ 2 ]

5 голосов
/ 01 июля 2011

Посмотрите на ContentNegotiatingViewResolver.Из javadoc :

Этот распознаватель представлений использует запрошенный тип мультимедиа для выбора подходящего представления для запроса.

Если запрошенный путь имеет расширение файла и если свойство setFavorPathExtension(boolean) имеет значение true, свойство mediaTypes проверяется на соответствующий тип носителя.

Также существует раздел справочного руководства , охватывающий этот резольвер.

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

Следуя советам скаффмана. Я решил это, используя ContentNegotiatingViewResolver.

servletContext.xml:

<bean id="resourceResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"/>

<bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
</bean>

<mvc:annotation-driven/>

Средство распознавания автоматически выбирается ContentNegotiatingViewResolver.

Контроллер:

@Controller
@RequestMapping("/filemanagements")
public class FileManagementController {

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView list(@RequestParam(required=false) String contentType) {
        return new ModelAndView(baseLogicView + "/list");
    }

    private static final String baseLogicView = "/filemanagement";
}

Эти сообщения:

/WEB-INF/jsp/filemanagements/list.jsp
/WEB-INF/jsp/filemanagements/listXml.jsp

Представления комплекта ресурсов.properties:

/filemanagement/list.(class)=org.springframework.web.servlet.view.JstlView
/filemanagement/list.url=/WEB-INF/jsp/filemanagement/listXml.jsp
/filemanagement/list.contentType=text/xml

Необходимо было указать там contentType, потому что если вы этого не сделаете, по умолчанию это "text / html; charset = ISO-8859-1" , даже если вы установили <% @ page contentType = "text / xml"%> в JSP, который отображает XML.

После этого я мог сделать следующие запросы:

http://localhost:8080/filemanagement-web/filemanagements (list.jsp)
http://localhost:8080/filemanagement-web/filemanagements.html (list.jsp)
http://localhost:8080/filemanagement-web/filemanagements.xml (listXml.jsp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...