Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据使用SpringMVC3的URL文件扩展名,有两种不同的视图_Java_Spring_Spring Mvc - Fatal编程技术网

Java 根据使用SpringMVC3的URL文件扩展名,有两种不同的视图

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() {

我希望具有相同的请求映射,但根据文件扩展名解析为不同的视图。我有两个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有以下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,仅此而已。误导性标题。