001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.web.servlet.view.velocity;
018:
019: import org.springframework.web.servlet.view.AbstractUrlBasedView;
020:
021: /**
022: * Convenience subclass of VelocityViewResolver, adding support
023: * for VelocityLayoutView and its properties.
024: *
025: * <p>See VelocityViewResolver's javadoc for general usage info.
026: *
027: * @author Juergen Hoeller
028: * @since 1.2.7
029: * @see VelocityViewResolver
030: * @see VelocityLayoutView
031: * @see #setLayoutUrl
032: * @see #setLayoutKey
033: * @see #setScreenContentKey
034: */
035: public class VelocityLayoutViewResolver extends VelocityViewResolver {
036:
037: private String layoutUrl;
038:
039: private String layoutKey;
040:
041: private String screenContentKey;
042:
043: /**
044: * Requires VelocityLayoutView.
045: * @see VelocityLayoutView
046: */
047: protected Class requiredViewClass() {
048: return VelocityLayoutView.class;
049: }
050:
051: /**
052: * Set the layout template to use. Default is "layout.vm".
053: * @param layoutUrl the template location (relative to the template
054: * root directory)
055: * @see VelocityLayoutView#setLayoutUrl
056: */
057: public void setLayoutUrl(String layoutUrl) {
058: this .layoutUrl = layoutUrl;
059: }
060:
061: /**
062: * Set the context key used to specify an alternate layout to be used instead
063: * of the default layout. Screen content templates can override the layout
064: * template that they wish to be wrapped with by setting this value in the
065: * template, for example:<br>
066: * <code>#set( $layout = "MyLayout.vm" )</code>
067: * <p>The default key is "layout", as illustrated above.
068: * @param layoutKey the name of the key you wish to use in your
069: * screen content templates to override the layout template
070: * @see VelocityLayoutView#setLayoutKey
071: */
072: public void setLayoutKey(String layoutKey) {
073: this .layoutKey = layoutKey;
074: }
075:
076: /**
077: * Set the name of the context key that will hold the content of
078: * the screen within the layout template. This key must be present
079: * in the layout template for the current screen to be rendered.
080: * <p>Default is "screen_content": accessed in VTL as
081: * <code>$screen_content</code>.
082: * @param screenContentKey the name of the screen content key to use
083: * @see VelocityLayoutView#setScreenContentKey
084: */
085: public void setScreenContentKey(String screenContentKey) {
086: this .screenContentKey = screenContentKey;
087: }
088:
089: protected AbstractUrlBasedView buildView(String viewName)
090: throws Exception {
091: VelocityLayoutView view = (VelocityLayoutView) super
092: .buildView(viewName);
093: // Use not-null checks to preserve VelocityLayoutView's defaults.
094: if (this.layoutUrl != null) {
095: view.setLayoutUrl(this.layoutUrl);
096: }
097: if (this.layoutKey != null) {
098: view.setLayoutKey(this.layoutKey);
099: }
100: if (this.screenContentKey != null) {
101: view.setScreenContentKey(this.screenContentKey);
102: }
103: return view;
104: }
105:
106: }
|