如何在Spring MVC中映射多个内部资源

时间:2017-05-02 03:53:32

标签: java html spring spring-mvc

在我的项目中,有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应该有一个永久的解决方案,因为它似乎是一个常见的要求,我看到很多人都在努力争取这个。

2 个答案:

答案 0 :(得分:0)

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

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

    “WEB-INF / pages / YourViewName.ftl”

    当您访问WEB-INF / pages之外的视图时,从控制器

    目录 像

    一样返回字符串

    “YourViewName.ftl”。

  • 您可以继续使用“secondViewResolver”并访问以外的视图 WEB-INF /页面返回字符串

    “../../ YourViewName.ftl”

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

    “YourViewName.ftl”。

  • 另一种解决方案是包含不同的viewResolvers。例如:你可以添加 urlBasedViewResolver和internalResourceViewResolver各有不同 前缀和订单。

答案 1 :(得分:0)

尝试将您的文件移动到资源文件夹中名为freemaker的新文件夹以及此配置:

function _submitForm(){
    alert('Submit Called...');

    $.ajax({
        type: "POST",
        url: ajaxCallUrl + 'api/ajax/positions/' + lastModifiedPositionId + '/save-position',
        data: $("#save_edit_position").serialize(),
        error: function(req, message) {
            showErrorNotification('It seems something went wrong, sorry...' + message);
        },
        statusCode: {
            400: function (response) {
                showErrorNotification(response.responseText);
            },
            500: function (response) {
                showErrorNotification(response.responseText);
            }
        },
        success: function(data)
        {
            var mymodal = $('#editPositionModal');
            mymodal.modal('hide');
            showNotification(data, updatePositionsTable(pageBusinessId)); // show response from the php script.
        }
    });
}

From the doc

但请注意, FreeMarker ,Velocity,Tiles,Groovy Markup和脚本模板也需要配置基础视图技术。 MVC名称空间提供专用元素。 例如使用FreeMarker:

<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>