|
Spring Framework example source code file (VelocityView.java)
The Spring Framework VelocityView.java source code/* * Copyright 2002-2007 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.web.servlet.view.velocity; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.app.tools.VelocityFormatter; import org.apache.velocity.context.Context; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.tools.generic.DateTool; import org.apache.velocity.tools.generic.NumberTool; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContextException; import org.springframework.util.ClassUtils; import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.servlet.view.AbstractTemplateView; import org.springframework.web.util.NestedServletException; /** * View using the Velocity template engine. * * <p>Exposes the following JavaBean properties: * <ul> * <li>url: the location of the Velocity template to be wrapped, * relative to the Velocity resource loader path (see VelocityConfigurer). * <li>encoding (optional, default is determined by Velocity configuration): * the encoding of the Velocity template file * <li>velocityFormatterAttribute (optional, default=null): the name of * the VelocityFormatter helper object to expose in the Velocity context of this * view, or <code>null if not needed. VelocityFormatter is part of standard Velocity. * <li>dateToolAttribute (optional, default=null): the name of the * DateTool helper object to expose in the Velocity context of this view, * or <code>null if not needed. DateTool is part of Velocity Tools 1.0. * <li>numberToolAttribute (optional, default=null): the name of the * NumberTool helper object to expose in the Velocity context of this view, * or <code>null if not needed. NumberTool is part of Velocity Tools 1.1. * <li>cacheTemplate (optional, default=false): whether or not the Velocity * template should be cached. It should normally be true in production, but setting * this to false enables us to modify Velocity templates without restarting the * application (similar to JSPs). Note that this is a minor optimization only, * as Velocity itself caches templates in a modification-aware fashion. * </ul> * * <p>Depends on a VelocityConfig object such as VelocityConfigurer being * accessible in the current web application context, with any bean name. * Alternatively, you can set the VelocityEngine object as bean property. * * <p>Note: Spring's VelocityView requires Velocity 1.3 or higher, and optionally * Velocity Tools 1.0 or higher (depending on the use of DateTool and/or NumberTool). * * @author Rod Johnson * @author Juergen Hoeller * @see VelocityConfig * @see VelocityConfigurer * @see #setUrl * @see #setExposeSpringMacroHelpers * @see #setEncoding * @see #setVelocityEngine * @see VelocityConfig * @see VelocityConfigurer */ public class VelocityView extends AbstractTemplateView { private Map toolAttributes; private String velocityFormatterAttribute; private String dateToolAttribute; private String numberToolAttribute; private String encoding; private boolean cacheTemplate = false; private VelocityEngine velocityEngine; private Template template; /** * Set tool attributes to expose to the view, as attribute name / class name pairs. * An instance of the given class will be added to the Velocity context for each * rendering operation, under the given attribute name. * <p>For example, an instance of MathTool, which is part of the generic package * of Velocity Tools, can be bound under the attribute name "math", specifying the * fully qualified class name "org.apache.velocity.tools.generic.MathTool" as value. * <p>Note that VelocityView can only create simple generic tools or values, that is, * classes with a public default constructor and no further initialization needs. * This class does not do any further checks, to not introduce a required dependency * on a specific tools package. * <p>For tools that are part of the view package of Velocity Tools, a special * Velocity context and a special init callback are needed. Use VelocityToolboxView * in such a case, or override <code>createVelocityContext and * <code>initTool accordingly. * <p>For a simple VelocityFormatter instance or special locale-aware instances * of DateTool/NumberTool, which are part of the generic package of Velocity Tools, * specify the "velocityFormatterAttribute", "dateToolAttribute" or * "numberToolAttribute" properties, respectively. * @param toolAttributes attribute names as keys, and tool class names as values * @see org.apache.velocity.tools.generic.MathTool * @see VelocityToolboxView * @see #createVelocityContext * @see #initTool * @see #setVelocityFormatterAttribute * @see #setDateToolAttribute * @see #setNumberToolAttribute */ public void setToolAttributes(Properties toolAttributes) { this.toolAttributes = new HashMap(toolAttributes.size()); for (Enumeration attributeNames = toolAttributes.propertyNames(); attributeNames.hasMoreElements();) { String attributeName = (String) attributeNames.nextElement(); String className = toolAttributes.getProperty(attributeName); Class toolClass = null; try { toolClass = ClassUtils.forName(className); } catch (ClassNotFoundException ex) { throw new IllegalArgumentException( "Invalid definition for tool '" + attributeName + "' - tool class not found: " + ex.getMessage()); } this.toolAttributes.put(attributeName, toolClass); } } /** * Set the name of the VelocityFormatter helper object to expose in the * Velocity context of this view, or <code>null if not needed. * <p>VelocityFormatter is part of the standard Velocity distribution. * @see org.apache.velocity.app.tools.VelocityFormatter */ public void setVelocityFormatterAttribute(String velocityFormatterAttribute) { this.velocityFormatterAttribute = velocityFormatterAttribute; } /** * Set the name of the DateTool helper object to expose in the Velocity context * of this view, or <code>null if not needed. The exposed DateTool will be aware of * the current locale, as determined by Spring's LocaleResolver. * <p>DateTool is part of the generic package of Velocity Tools 1.0. * Spring uses a special locale-aware subclass of DateTool. * @see org.apache.velocity.tools.generic.DateTool * @see org.springframework.web.servlet.support.RequestContextUtils#getLocale * @see org.springframework.web.servlet.LocaleResolver */ public void setDateToolAttribute(String dateToolAttribute) { this.dateToolAttribute = dateToolAttribute; } /** * Set the name of the NumberTool helper object to expose in the Velocity context * of this view, or <code>null if not needed. The exposed NumberTool will be aware of * the current locale, as determined by Spring's LocaleResolver. * <p>NumberTool is part of the generic package of Velocity Tools 1.1. * Spring uses a special locale-aware subclass of NumberTool. * @see org.apache.velocity.tools.generic.NumberTool * @see org.springframework.web.servlet.support.RequestContextUtils#getLocale * @see org.springframework.web.servlet.LocaleResolver */ public void setNumberToolAttribute(String numberToolAttribute) { this.numberToolAttribute = numberToolAttribute; } /** * Set the encoding of the Velocity template file. Default is determined * by the VelocityEngine: "ISO-8859-1" if not specified otherwise. * <p>Specify the encoding in the VelocityEngine rather than per template * if all your templates share a common encoding. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** * Return the encoding for the Velocity template. */ protected String getEncoding() { return this.encoding; } /** * Set whether the Velocity template should be cached. Default is "false". * It should normally be true in production, but setting this to false enables us to * modify Velocity templates without restarting the application (similar to JSPs). * <p>Note that this is a minor optimization only, as Velocity itself caches * templates in a modification-aware fashion. */ public void setCacheTemplate(boolean cacheTemplate) { this.cacheTemplate = cacheTemplate; } /** * Return whether the Velocity template should be cached. */ protected boolean isCacheTemplate() { return this.cacheTemplate; } /** * Set the VelocityEngine to be used by this view. * If this is not set, the default lookup will occur: A single VelocityConfig * is expected in the current web application context, with any bean name. * @see VelocityConfig */ public void setVelocityEngine(VelocityEngine velocityEngine) { this.velocityEngine = velocityEngine; } /** * Return the VelocityEngine used by this view. */ protected VelocityEngine getVelocityEngine() { return this.velocityEngine; } /** * Invoked on startup. Looks for a single VelocityConfig bean to * find the relevant VelocityEngine for this factory. */ protected void initApplicationContext() throws BeansException { super.initApplicationContext(); if (getVelocityEngine() == null) { // No explicit VelocityEngine: try to autodetect one. setVelocityEngine(autodetectVelocityEngine()); } checkTemplate(); } /** * Autodetect a VelocityEngine via the ApplicationContext. * Called if no explicit VelocityEngine has been specified. * @return the VelocityEngine to use for VelocityViews * @throws BeansException if no VelocityEngine could be found * @see #getApplicationContext * @see #setVelocityEngine */ protected VelocityEngine autodetectVelocityEngine() throws BeansException { try { VelocityConfig velocityConfig = (VelocityConfig) BeanFactoryUtils.beanOfTypeIncludingAncestors( getApplicationContext(), VelocityConfig.class, true, false); return velocityConfig.getVelocityEngine(); } catch (NoSuchBeanDefinitionException ex) { throw new ApplicationContextException( "Must define a single VelocityConfig bean in this web application context " + "(may be inherited): VelocityConfigurer is the usual implementation. " + "This bean may be given any name.", ex); } } /** * Check that the Velocity template used for this view exists and is valid. * <p>Can be overridden to customize the behavior, for example in case of * multiple templates to be rendered into a single view. * @throws ApplicationContextException if the template cannot be found or is invalid */ protected void checkTemplate() throws ApplicationContextException { try { // Check that we can get the template, even if we might subsequently get it again. this.template = getTemplate(); } catch (ResourceNotFoundException ex) { throw new ApplicationContextException("Cannot find Velocity template for URL [" + getUrl() + "]: Did you specify the correct resource loader path?", ex); } catch (Exception ex) { throw new ApplicationContextException( "Could not load Velocity template for URL [" + getUrl() + "]", ex); } } /** * Process the model map by merging it with the Velocity template. * Output is directed to the servlet response. * <p>This method can be overridden if custom behavior is needed. */ protected void renderMergedTemplateModel( Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { exposeHelpers(model, request); Context velocityContext = createVelocityContext(model, request, response); exposeHelpers(velocityContext, request, response); exposeToolAttributes(velocityContext, request); doRender(velocityContext, response); } /** * Expose helpers unique to each rendering operation. This is necessary so that * different rendering operations can't overwrite each other's formats etc. * <p>Called by Other Spring Framework examples (source code examples)Here is a short list of links related to this Spring Framework VelocityView.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.