Java 根据使用SpringMVC3的URL文件扩展名,有两种不同的视图
我希望具有相同的请求映射,但根据文件扩展名解析为不同的视图。我有两个JSP,一个用于呈现HTML,另一个用于呈现XML。根据文件扩展名,我应该解析为相应的jsp 这是我的控制器:Java 根据使用SpringMVC3的URL文件扩展名,有两种不同的视图,java,spring,spring-mvc,Java,Spring,Spring Mvc,我希望具有相同的请求映射,但根据文件扩展名解析为不同的视图。我有两个JSP,一个用于呈现HTML,另一个用于呈现XML。根据文件扩展名,我应该解析为相应的jsp 这是我的控制器: @Controller public class FileManagementController { @RequestMapping(value="/filemanagements", method=RequestMethod.GET) public ModelAndView list() {
@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有以下y根:
/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>
看看
内容协商解决方案。从:
此视图解析程序使用请求的媒体类型为请求选择合适的视图
如果请求的路径具有文件扩展名,并且setFavorPathExtension(布尔)
属性为true,则会检查mediaTypes属性是否有匹配的媒体类型
还有一个关于此解析器的说明。遵循skaffman的建议。我确实使用ContentNegotingViewResolver解决了这个问题
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/>
@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
/filemanagement/list.(class)=org.springframework.web.servlet.view.JstlView
/filemanagement/list.url=/WEB-INF/jsp/filemanagement/listXml.jsp
/filemanagement/list.contentType=text/xml
这些JSP:
<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/>
@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
/filemanagement/list.(class)=org.springframework.web.servlet.view.JstlView
/filemanagement/list.url=/WEB-INF/jsp/filemanagement/listXml.jsp
/filemanagement/list.contentType=text/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/>
@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
/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“,即使您在呈现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)
但是控制器将如何根据文件扩展名返回不同的视图。例如,如果向/filemanagement/list.xml发出请求,则应返回/filemanagement/listXml.jsp,以便InternalResourceViewResolver呈现该视图。@Alfredo:控制器应返回符号视图名,而不是文件名。例如,返回“list”而不是“listXml.jsp”。然后,视图解析器将该名称映射到视图。我发布的文档链接描述了如何做到这一点。我的错。我的意思是没有jsp后缀的/filemanagement/listXml。UrlBasedViewResolver他们就是这么做的。使用前缀和sufix属性将该逻辑视图映射到物理url。如果我返回“list”,解析程序将如何知道“list”在某些情况下意味着listXml.jsp,在其他情况下意味着list.jsp。您是否尝试了另一个具有不同请求映射的方法?一个简单的方法是包含指示返回的视图类型的PathVariable:@RequestMapping(“/foo/{viewtype}/myrequest.do”)
解决方案中没有一行显示ContentNegotiatingViewResolver。您正在使用InternalResourceViewResolver和ResourceBundeViewResolver,仅此而已。误导性标题。