我尝试解决以下问题:
我已经设置了自己的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请求!
任何帮助表示赞赏!
谢谢!
答案 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处理。