根据要求使用不同的viewresolver

时间:2012-07-29 21:24:37

标签: java ajax spring

我尝试解决以下问题:

我已经设置了自己的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


}

我是否必须告诉这个解析器,如果indexOf(“/ ajax /”)!= -1需要调用jstView?如果是,怎么样? 或者我完全错了吗?我想保留我的页眉/页脚,因为它们适用于所有非ajax请求!

任何帮助表示赞赏!

谢谢!

1 个答案:

答案 0 :(得分:1)

你已经为View而不是ViewResolver设置了代码,我认为一个好的解决方案可能是链接ViewResolvers - 只需为你的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处理。