springmvc 与velocity的配置 返回html

本文介绍如何在Spring MVC中自定义VelocityView,包括配置、工具箱支持及响应头处理等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!--视图 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;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值