Open Source Repository

Home /spring/spring-web-servlet-3.0.5 | Repository Home



org/springframework/web/servlet/view/velocity/VelocityLayoutViewResolver.java
/*
 * 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
   */
  @Override
  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;
  }


  @Override
  protected AbstractUrlBasedView buildView(String viewNamethrows Exception {
    VelocityLayoutView view = (VelocityLayoutViewsuper.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;
  }

}