/* * Copyright 2002-2006 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 org.springframework.web.servlet.view.AbstractUrlBasedView; /** * Convenience subclass of VelocityViewResolver, adding support * for VelocityLayoutView and its properties. * * <p>See VelocityViewResolver's javadoc for general usage info. * * @author Juergen Hoeller * @since 1.2.7 * @see VelocityViewResolver * @see VelocityLayoutView * @see #setLayoutUrl * @see #setLayoutKey * @see #setScreenContentKey */ public class VelocityLayoutViewResolver extends VelocityViewResolver { private String layoutUrl; private String layoutKey; private String screenContentKey; /** * Requires VelocityLayoutView. * @see VelocityLayoutView */ protected Class requiredViewClass() { return VelocityLayoutView.class; } /** * Set the layout template to use. Default is "layout.vm". * @param layoutUrl the template location (relative to the template * root directory) * @see VelocityLayoutView#setLayoutUrl */ public void setLayoutUrl(String layoutUrl) { this.layoutUrl = layoutUrl; } /** * Set the context key used to specify an alternate layout to be used instead * of the default layout. Screen content templates can override the layout * template that they wish to be wrapped with by setting this value in the * template, for example:<br> * <code>#set( $layout = "MyLayout.vm" )</code> * <p>The default key is "layout", as illustrated above. * @param layoutKey the name of the key you wish to use in your * screen content templates to override the layout template * @see VelocityLayoutView#setLayoutKey */ public void setLayoutKey(String layoutKey) { this.layoutKey = layoutKey; } /** * Set the name of the context key that will hold the content of * the screen within the layout template. This key must be present * in the layout template for the current screen to be rendered. * <p>Default is "screen_content": accessed in VTL as * <code>$screen_content</code>. * @param screenContentKey the name of the screen content key to use * @see VelocityLayoutView#setScreenContentKey */ public void setScreenContentKey(String screenContentKey) { this.screenContentKey = screenContentKey; } protected AbstractUrlBasedView buildView(String viewName) throws Exception { VelocityLayoutView view = (VelocityLayoutView) super.buildView(viewName); // Use not-null checks to preserve VelocityLayoutView's defaults. if (this.layoutUrl != null) { view.setLayoutUrl(this.layoutUrl); } if (this.layoutKey != null) { view.setLayoutKey(this.layoutKey); } if (this.screenContentKey != null) { view.setScreenContentKey(this.screenContentKey); } return view; } }