【问题标题】:How to map multiple Internal Resources in Spring MVC如何在 Spring MVC 中映射多个内部资源
【发布时间】:2017-05-02 03:53:31
【问题描述】:

在我的项目中有 SpringMVC InternalResourceViewResolver 用于根 URL 映射以重定向到主页。

在不影响现有应用程序的情况下,我需要添加一个内部资源视图解析器,以便我可以在 WEB-INF 中移动一些页面并保护直接访问。

到目前为止,我发现 Spring MVC 只允许一个 InternalResourceViewResolver 并且添加 order 元素也不能正常工作。

这里是 spring xml 供参考,它不起作用。 我需要添加第二个解析器,这样可以防止直接访问页面,这些页面当前在 WEB-INF 之外,我正在寻找一个有效的 SpringMVC 配置,以便我可以移动这些:

<bean id="firstViewResolver"
   class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix">
        <value>/</value>
    </property>
    <property name="suffix">
        <value>.ftl</value>
    </property> <property name="order" value="0"/> 
</bean>

<bean id="secondViewResolver"
 class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix">
        <value>/WEB-INF/pages/</value>
    </property>
    <property name="suffix">
        <value>.ftl</value>
    </property> <property name="order" value="1"/> 
</bean>

更新 由于这些方法似乎都不适合我,我正在尝试使用 Servlet 过滤器或侦听器方法来执行此任务。 Spring MVC 应该有一个永久的解决方案,因为这似乎是一个常见的要求,我看到很多人都在为此苦苦挣扎。

【问题讨论】:

    标签: java html spring spring-mvc


    【解决方案1】:

    Spring 不允许您定义 2 个 internalResourceViewResolver。现在你有两个选择:

    • 您可以将所有带有 .ftl 扩展名的文件移动到您的 pages 文件夹中 WEB-INF 并继续使用您的“secondViewResolver”。
    • 您可以继续使用“firstViewResolver”并访问页面内的视图 文件夹通过返回字符串,如

      “WEB-INF/pages/YourViewName.ftl”

      当您访问 WEB-INF/pages 之外的视图时,从您的控制器 目录由 返回字符串,如

      “YourViewName.ftl”。

    • 您可以继续使用“secondViewResolver”并访问外部的视图 WEB-INF/pages 通过返回类似

      的字符串

      "../../YourViewName.ftl"

      来自您的 当您通过返回字符串访问页面文件夹内的视图时,控制器 喜欢

      “你的视图名称.ftl”。

    • 另一种解决方案是包含不同的 viewResolver。例如:您可以添加 一个 urlBasedViewResolver 和一个 internalResourceViewResolver 每个都有不同的 前缀和顺序。

    【讨论】:

    • 如果我不能拥有 2 个相同类型的视图解析器,我该如何使用 secondViewResolver?我也不想改变现有的逻辑(第一视图解析器)。有没有其他可以在这里使用的视图解析器(除了 InternalResourceViewResolver)?
    • 我的意思是您可以使用前缀作为“/WEB-INF/pages/”,就像您在 bean 中所做的那样,ID 为“secondViewResolver”。
    • 如果您不想更改逻辑中的任何内容,那么最好的选择是将所有 .ftl 文件放在 WEB-INF/pages 中,或者将所有 .ftl 文件放在其中。
    • 我已经编辑了我的答案。第 4 点应该对您有所帮助。请尝试使用 urlBasedViewResolver 和 internalResourceViewResolver
    • 谢谢,我试试这个
    【解决方案2】:

    尝试将您的文件与此配置一起移动到资源文件夹内名为 freemaker 的新文件夹:

    <mvc:view-resolvers>
        <mvc:content-negotiation>
            <mvc:default-views>
                <bean id="firstViewResolver"
                    class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
                    <property name="prefix">
                        <value>/</value>
                    </property>
                    <property name="suffix">
                        <value>.ftl</value>
                    </property> <property name="order" value="0"/> 
                </bean>
            </mvc:default-views>
        </mvc:content-negotiation>
        <mvc:freemarker cache="false"/>
    </mvc:view-resolvers>
    
    <mvc:freemarker-configurer>
        <mvc:template-loader-path location="/freemarker"/>
    </mvc:freemarker-configurer>
    

    From the doc

    但请注意,FreeMarker、Velocity、Tiles、Groovy 标记和脚本模板也需要配置底层视图技术。 MVC 命名空间提供专用元素。 例如使用 FreeMarker:

    <mvc:view-resolvers>
        <mvc:content-negotiation>
            <mvc:default-views>
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
            </mvc:default-views>
        </mvc:content-negotiation>
        <mvc:freemarker cache="false"/>
    </mvc:view-resolvers>
    
    <mvc:freemarker-configurer>
        <mvc:template-loader-path location="/freemarker"/>
    </mvc:freemarker-configurer>
    

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多