当前位置: 首页 > 面试题库 >

具有多个视图解析器的Spring MVC

曹昊焱
2023-03-14
问题内容

我尝试使用2个视图解析器:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.evgeni.dfr.controller" />

    <context:annotation-config />
    <mvc:annotation-driven />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="cache" value="false" />
        <property name="viewClass" value="com.evgeni.drf.faces.FacesView" />
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".xhtml" />

        <property name="order" value="1" />
    </bean>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
        <property name="order" value="0" />
    </bean>
</beans>

该应用程序始终仅使用顺序最低的一个,而不使用另一个。在当前情况下,如果我的控制器返回“ someView”,则The requested resource (/MyProject/WEB-INF/views/someView.jsp) is not available.即使存在“ pages / someView.xhtml” ,应用也会响应。

Spring version - 3.2.3

编辑:如果我在控制器中有2个方法,并且methodA返回“ viewA”,而methodB返回“ viewB”。我们在“ views”文件夹中有viewA.jsp,在“ pages”中有viewB.xhtml。

情况1:UrlBasedViewResolver-> order = 1,InternalResourceViewResolver-> order = 2

methodA-> The requested resource (/MyProject/WEB-INF/pages/viewA.xhtml) is not available.;

methodB -> OK

情况2:UrlBasedViewResolver-> order = 2,InternalResourceViewResolver-> order = 1

方法A->确定;

methodB -> `The requested resource (/MyProject/WEB-INF/views/viewB.jsp) is not available.`;

问题答案:

我认为你误解了订单优先级。该ViewResolver最高顺序是链中最后一个解析器。由于你给的InternalResourceViewResolver订单是0,因此它将成为链中的第一个解析器,并且InternalResourceViewResolver无论返回什么视图名称,都会解析该视图。因此,如果要使用多个解析器,则InternalResourceViewResolver必须是顺序最高的解析器。

InternalResourceViewResolver订单值更改为2:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.evgeni.dfr.controller" />

    <context:annotation-config />
    <mvc:annotation-driven />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="cache" value="false" />
        <property name="viewClass" value="com.evgeni.drf.faces.FacesView" />
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".xhtml" />
        <property name="order" value="1" />
    </bean>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
        <property name="order" value="2" />
    </bean>
</beans>

编辑:

检查javadoc后,似乎这两个解析程序无法链接,因为InternalResourceViewResolverUrlBasedViewResolver(InternalResourceViewResolver扩展了UrlBasedViewResolver)。两个解析器始终与返回值匹配。我认为你将需要一些自定义功能才能执行此操作。



 类似资料:
  • MVC提供的配置简化了视图解析器的注册工作。 以下的代码展示了在MVC Java编程配置下,如何为内容协商配置FreeMarker HTML模板和Jackson作为JSON数据的默认视图解析: @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override

  • 主要内容:视图,视图的分类,视图解析器,同时配置多个视图解析器,视图控制器Spring MVC 的控制器方法支持 ModelAndView、ModelMap、View、String 多种类型的返回值,但无论控制器方法的返回值是哪种类型,Spring MVC 内部最终都会将它们封装成一个 ModelAndView 对象。 ModelAndView 对象由 model(模型数据)和 view(视图)两部分组成,但这里的 view 通常并不是一个真正的 View 视图对象,而

  • 我需要在我的代码中添加5个文本视图。目前只有一个,它用于在谷歌地图中放置标记。我希望除此之外,你还可以插入另外4个数据插入,如(描述、年龄、工作、爱好)。下面我还放了我制作的自定义对话框,你可以检查一下吗?随意要求任何东西。我该怎么办? Customdialog.xml

  • 我的问题是--如何创建自定义列表视图,而不仅仅是重复一个自定义视图,而是像在Instagram或其他应用程序中,列表包括其他视图,这看起来就像滚动视图和列表视图android其他视图一样,但Roman Guy说“在滚动视图中的列表视图是一种非常糟糕的方式”,我同意这一点,不要相信谷歌使用这种方式... 使用ListView或Recolyer View实现此功能的最佳方法是什么

  • 我试图将spring配置为仅使用我的html文件而不是jsp视图解析器,但无法使其工作。我尝试了许多不同的配置,只是希望每次输入localhost:8080/时重定向到/web-inf/views/index.html。现在我在tomcat控制台中的内容是: PageNotFound-在名为“app servlet”的DispatcherServlet中未找到URI为[/web-inf/views

  • 问题内容: 我必须在Android中构建更复杂的自定义视图。最终布局应如下所示: 但是,我只想在XML文件中定义它(不定义SomeView,SomeOtherView等): 这在Android中可行吗?如果可以,那么最干净的方法是什么?我想到的可能解决方案是“重写addView()方法”和“删除所有视图并在以后再次添加它们”,但是我不确定该走哪条路… 在此先感谢您的帮助!:) 问题答案: 绝对有可