📄 tilestool.java
字号:
package org.apache.velocity.tools.struts;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.util.Iterator;
import java.util.Map;
import java.util.Stack;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.tiles.AttributeDefinition;
import org.apache.struts.tiles.ComponentContext;
import org.apache.struts.tiles.ComponentDefinition;
import org.apache.struts.tiles.Controller;
import org.apache.struts.tiles.DefinitionAttribute;
import org.apache.struts.tiles.DefinitionNameAttribute;
import org.apache.struts.tiles.DefinitionsFactoryException;
import org.apache.struts.tiles.DirectStringAttribute;
import org.apache.struts.tiles.TilesUtil;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.ImportSupport;
import org.apache.velocity.tools.view.context.ViewContext;
/**
* View tool to use struts-tiles with Velocity.
* <p><pre>
* Template example(s):
* <!-- insert a tile -->
* $tiles.myTileDefinition
*
* <!-- get named attribute value from the current tiles-context -->
* $tiles.getAttribute("myTileAttribute")
*
* <!-- import all attributes of the current tiles-context into the velocity-context. -->
* $tiles.importAttributes()
*
* Toolbox configuration:
* <tool>
* <key>tiles</key>
* <scope>request</scope>
* <class>org.apache.velocity.tools.struts.TilesTool</class>
* </tool>
* </pre></p>
*
* <p>This tool should only be used in the request scope.</p>
*
* @author <a href="mailto:marinoj@centrum.is">Marino A. Jonsson</a>
* @since VelocityTools 1.1
* @version $Revision: 477914 $ $Date: 2006-11-21 13:52:11 -0800 (Tue, 21 Nov 2006) $
*/
public class TilesTool extends ImportSupport
{
protected static final Log LOG = LogFactory.getLog(TilesTool.class);
static final String PAGE_SCOPE = "page";
static final String REQUEST_SCOPE = "request";
static final String SESSION_SCOPE = "session";
static final String APPLICATION_SCOPE = "application";
protected Context velocityContext;
/**
* A stack to hold ComponentContexts while nested tile-definitions
* are rendered.
*/
protected Stack contextStack;
/******************************* Constructors ****************************/
/**
* Default constructor. Tool must be initialized before use.
*/
public TilesTool() {}
/**
* Initializes this tool.
*
* @param obj the current ViewContext
* @throws IllegalArgumentException if the param is not a ViewContext
*/
public void init(Object obj)
{
if (!(obj instanceof ViewContext))
{
throw new IllegalArgumentException("Tool can only be initialized with a ViewContext");
}
ViewContext viewContext = (ViewContext)obj;
this.velocityContext = viewContext.getVelocityContext();
this.request = viewContext.getRequest();
this.response = viewContext.getResponse();
this.application = viewContext.getServletContext();
}
/***************************** View Helpers ******************************/
/**
* A generic tiles insert function.
*
* <p>This is functionally equivalent to
* <code><tiles:insert attribute="foo" /></code>.</p>
*
* @param obj Can be any of the following:
* AttributeDefinition,
* tile-definition name,
* tile-attribute name,
* regular uri.
* (checked in that order)
* @return the rendered template or value as a String
* @throws Exception on failure
*/
public String get(Object obj)
{
try
{
Object value = getCurrentContext().getAttribute(obj.toString());
if (value != null)
{
return processObjectValue(value);
}
return processAsDefinitionOrURL(obj.toString());
}
catch (Exception e)
{
LOG.error("Exeption while rendering Tile " + obj + ": ", e);
return null;
}
}
/**
* Fetches a named attribute-value from the current tiles-context.
*
* <p>This is functionally equivalent to
* <code><tiles:getAsString name="foo" /></code>.</p>
*
* @param name the name of the tiles-attribute to fetch
* @return attribute value for the named attribute
*/
public Object getAttribute(String name)
{
Object value = getCurrentContext().getAttribute(name);
if (value == null)
{
LOG.warn("Tile attribute '" + name + "' wasn't found in context.");
}
return value;
}
/**
* Imports the named attribute-value from the current tiles-context into the
* current Velocity context.
*
* <p>This is functionally equivalent to
* <code><tiles:importAttribute name="foo" /></code>
*
* @param name the name of the tiles-attribute to import
*/
public void importAttribute(String name)
{
this.importAttribute(name, PAGE_SCOPE);
}
/**
* Imports the named attribute-value from the current tiles-context into the
* named context ("page", "request", "session", or "application").
*
* <p>This is functionally equivalent to
* <code><tiles:importAttribute name="foo" scope="scopeValue" /></code>
*
* @param name the name of the tiles-attribute to import
* @param scope the named context scope to put the attribute into.
*/
public void importAttribute(String name, String scope)
{
Object value = getCurrentContext().getAttribute(name);
if (value == null)
{
LOG.warn("Tile attribute '" + name + "' wasn't found in context.");
}
if (scope.equals(PAGE_SCOPE))
{
velocityContext.put(name, value);
}
else if (scope.equals(REQUEST_SCOPE))
{
request.setAttribute(name, value);
}
else if (scope.equals(SESSION_SCOPE))
{
request.getSession().setAttribute(name, value);
}
else if (scope.equals(APPLICATION_SCOPE))
{
application.setAttribute(name, value);
}
}
/**
* Imports all attributes in the current tiles-context into the
* current velocity-context.
*
* <p>This is functionally equivalent to
* <code><tiles:importAttribute /></code>.</p>
*/
public void importAttributes()
{
this.importAttributes(PAGE_SCOPE);
}
/**
* Imports all attributes in the current tiles-context into the named
* context ("page", "request", "session", or "application").
*
* <p>This is functionally equivalent to
* <code><tiles:importAttribute scope="scopeValue" /></code>.</p>
*
* @param scope the named context scope to put the attributes into.
*/
public void importAttributes(String scope)
{
ComponentContext context = getCurrentContext();
Iterator names = context.getAttributeNames();
if (scope.equals(PAGE_SCOPE))
{
while (names.hasNext())
{
String name = (String)names.next();
velocityContext.put(name, context.getAttribute(name));
}
}
else if (scope.equals(REQUEST_SCOPE))
{
while (names.hasNext())
{
String name = (String)names.next();
request.setAttribute(name, context.getAttribute(name));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -