两个不同的视图取决于使用Spring MVC 3的URL文件扩展名

时间:2011-07-01 17:21:57

标签: java spring spring-mvc

我希望具有相同的请求映射,但根据文件扩展名解析为不同的视图。我有两个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
    }

}

我有以下y我的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"%>

...

这就是我在servletContext.xml中配置ViewResolver的方法:

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

2 个答案:

答案 0 :(得分:5)

看看ContentNegotiatingViewResolver。来自javadoc

  

此视图解析程序使用请求的媒体类型为请求选择合适的视图。

     

如果请求的路径具有文件扩展名,并且setFavorPathExtension(boolean)属性为true,则检查mediaTypes属性是否匹配媒体类型。

此解析器还有一个section of the ref manual

答案 1 :(得分:0)

遵循斯卡弗曼的建议。我确实使用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";
}

这些jsps:

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

资源包views.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”,即使您设置了&lt;%@ page contentType =“text / xml”%&gt;在呈现XML的JSP中。

之后我可以做以下请求:

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)