1

我尝试解决以下问题:

我已经设置了自己的 viewResolver,为我的所有请求添加了页眉和页脚(感谢 stackoverflow ;p)。这工作正常。

问题是我的 ajax 请求,将视图返回到特定容器,也会自动获取页眉和页脚,这当然不是预期的。

如果请求包含“/ajax/”,如何让 viewResolver 采取不同的行动?实际上,jstl-Viewer 对他们来说工作得很好,但目前,我自己的解析器是唯一使用的解析器,因为我不知道如何告诉 spring 在 '/ajax/' 上采取不同的行动。

这是我自己的解析器,非常简单,只是取自这里:

public class ViewTemplate extends InternalResourceView {
    @Override
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String dispatcherPath = prepareForRendering(request, response);
        request.setAttribute("partial", dispatcherPath.substring(nthOccurrence( dispatcherPath, '/' , 2 ) + 1));

        RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/layout.jsp");
        rd.include(request, response);
    }

    // more functions like nthOccurrence


}

我是否必须告诉这个解析器 if indexOf("/ajax/") != -1 jstView 需要被调用?如果是,如何?还是我做错了?我想保留我的页眉/页脚,因为它们适用于所有非 ajax 请求!

任何帮助表示赞赏!

谢谢!

4

1 回答 1

1

您已将 View 的代码而不是 ViewResolver 正确放置,我认为一个好的解决方案可能是链接 ViewResolver - 只需为您的 ajax 视图声明一个新的 ViewResolver。对于 Ajax 相关的视图,让这个视图解析器返回一个值,否则返回 null,这将自动让 ViewResolver 考虑链中的下一个 ViewResolver,它可以是您当前的 ViewResolver。

例如。

<beans:bean id="ajaxViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="order" value="1"></beans:property>
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="viewNames">
        <beans:list>
            <beans:value>ajax*</beans:value>
        </beans:list>
    </beans:property>
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

在上述情况下,如果您从控制器返回视图名称为“ajaxsomeview”,那么它将由 ajaxViewResolver 处理,如果您返回“somethingelse”,它将由您当前的 ViewResolver 处理。

于 2012-07-29T22:23:07.293 回答