<!--视图 velocity 可以不用jsp 替换jsp视图即可返回时必须返回 xx.html--> <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath"> <value>WEB-INF/views/</value> </property> <property name="configLocation" value="classpath:properties/velocity.properties"/> </bean> <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="prefix" value=""/> <property name="viewNames" value="*.html"/> <property name="contentType" value="text/html;charset=UTF-8"/> <property name="viewClass" value="com.frame.mall.core.velocity.VelocityView"/> </bean> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="requestContextAttribute" value="rc"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean>
需要引入的实体类
package com.frame.mall.core.velocity; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.velocity.context.Context; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.tools.view.CookieTool; import org.apache.velocity.tools.view.ParameterTool; import org.apache.velocity.tools.view.ViewToolContext; import org.springframework.web.servlet.view.velocity.VelocityToolboxView; import org.springframework.web.util.NestedServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.util.Map; /**create by wangyanlong * VelocityToolboxView: VelocityView子类,增加了对速度的工具工具箱和工具ViewTool回调速度/速度工具1.3 * init方法的支持。 指定一个“toolboxConfigLocation”,例如“/ WEB-INF/toolbox.xml”,以自动加载速度的工具工 * 具箱定义文件,揭露在指定的范围定义的所有工具 。如果没有配置指定位置,没有工具箱将被载入和暴露。这种观点将 * 总是创建一个特殊的速度范围内,即一类的ChainedContext这是鉴于对速度的工具包的一部分实例。这允许使用 从速度工具,如LinkTool, * 这就需要用一个特殊的背景下实现ViewContext接口(即ChainedContext) * 初始化的视图工具包。这种观点还检查是被称为“toolAttributes”指定工具:如果他们执行ViewTool接口, * 他们将获得与速度范围内进行初始化。这使得从AS LinkTool作为工具包的观点,速度等工具,对界定被"toolAttributes" * 在VelocityToolboxView,而不是一个单独的XML文件中的工具箱。这是一个单独的类主要是为了避免在速度 * 上需要依赖包的查看工具VelocityView本身。在Spring 2.0中,这个类需要1.2或更高速度的工具。 */ public class VelocityView extends VelocityToolboxView { private static final Log logger = LogFactory .getLog(VelocityView.class); public static final String RENDER_XML = "RENDER_TO_XML"; public static final String RENDER_JSON = "RENDER_TO_JSON"; public static final String KEY_HTTP_STATUS = "KEY_HTTP_STATUS"; public static final String USE_OTHER_CHARSET = "USE_OTHER_CHARSET_CONTENT_KEY"; public static final String KEY_IGNORE_TOOLS = "IGNORE_EXPORT_TOOL"; public VelocityView() { super(); } public static void processHeader(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) { if (model.get(USE_OTHER_CHARSET) != null) { response.setCharacterEncoding((String) model .remove(USE_OTHER_CHARSET)); } if (model.get(KEY_HTTP_STATUS) != null) { response.setStatus((Integer) model.get(KEY_HTTP_STATUS)); } if (model.get(USE_OTHER_CHARSET) != null) { response.setCharacterEncoding((String) model .remove(USE_OTHER_CHARSET)); } if (model.get(RENDER_XML) != null) { model.remove(RENDER_XML); response.setContentType("text/xml"); model.put("charset", "UTF-8"); if (StringUtils.isNotBlank(request.getParameter("charset"))) { response.setCharacterEncoding(request.getParameter("charset")); model.put("charset", request.getParameter("charset")); } } else if (model.get(RENDER_JSON) != null) { // json视图设置 model.remove(RENDER_JSON); response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); } } @Override protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { processHeader(request, response, model); try { PrintWriter writer = response.getWriter();// IllegalStateException Context velocityContext = createVelocityContext(model, request, response); getTemplate().merge(velocityContext, writer); response.getWriter().flush(); } catch (IllegalStateException e) {// response output logger.error("uri:" + request.getRequestURI() + ", model:" + model, e); } catch (MethodInvocationException ex) { Throwable cause = ex.getWrappedThrowable(); throw new NestedServletException( "Method invocation failed during rendering of Velocity view with name '" + getBeanName() + "': " + ex.getMessage() + "; reference [" + ex.getReferenceName() + "], method '" + ex.getMethodName() + "'", cause == null ? ex : cause); } catch (Exception e) { logger.error("uri:" + request.getRequestURI() + ", model:" + model, e); throw e; } } @Override protected Context createVelocityContext(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { // System.out.println("-------------期待不--------------------"); ViewToolContext velocityContext = new ViewToolContext( getVelocityEngine(), request, response, getServletContext()); velocityContext.putAll(model); if (model.get(KEY_IGNORE_TOOLS) == null) {// API等不需要这些渲染 ParameterTool tool = new ParameterTool(request); velocityContext.put("params", tool); CookieTool cookieTool = new CookieTool(); cookieTool.setRequest(request); cookieTool.setResponse(response); velocityContext.put("cookieTool", cookieTool); // velocityContext.putAll(Config.getPageTools()); } else { model.remove(KEY_IGNORE_TOOLS); } return velocityContext; } }