001: /*
002: * Copyright 2002-2007 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.mvc;
018:
019: import javax.servlet.http.HttpServletRequest;
020: import javax.servlet.http.HttpServletResponse;
021:
022: import org.springframework.web.servlet.ModelAndView;
023: import org.springframework.web.util.UrlPathHelper;
024:
025: /**
026: * Abstract base class for <code>Controllers</code> that return a view name
027: * based on the request URL.
028: *
029: * <p>Provides infrastructure for determining view names from URLs and configurable
030: * URL lookup. For information on the latter, see <code>alwaysUseFullPath</code>
031: * and <code>urlDecode</code> properties.
032: *
033: * @author Juergen Hoeller
034: * @since 1.2.6
035: * @see #setAlwaysUseFullPath
036: * @see #setUrlDecode
037: */
038: public abstract class AbstractUrlViewController extends
039: AbstractController {
040:
041: private UrlPathHelper urlPathHelper = new UrlPathHelper();
042:
043: /**
044: * Set if URL lookup should always use full path within current servlet
045: * context. Else, the path within the current servlet mapping is used
046: * if applicable (i.e. in the case of a ".../*" servlet mapping in web.xml).
047: * Default is "false".
048: * @see org.springframework.web.util.UrlPathHelper#setAlwaysUseFullPath
049: */
050: public void setAlwaysUseFullPath(boolean alwaysUseFullPath) {
051: this .urlPathHelper.setAlwaysUseFullPath(alwaysUseFullPath);
052: }
053:
054: /**
055: * Set if context path and request URI should be URL-decoded.
056: * Both are returned <i>undecoded</i> by the Servlet API,
057: * in contrast to the servlet path.
058: * <p>Uses either the request encoding or the default encoding according
059: * to the Servlet spec (ISO-8859-1).
060: * <p>Note: Setting this to "true" requires JDK 1.4 if the encoding differs
061: * from the VM's platform default encoding, as JDK 1.3's URLDecoder class
062: * does not offer a way to specify the encoding.
063: * @see org.springframework.web.util.UrlPathHelper#setUrlDecode
064: */
065: public void setUrlDecode(boolean urlDecode) {
066: this .urlPathHelper.setUrlDecode(urlDecode);
067: }
068:
069: /**
070: * Set the UrlPathHelper to use for the resolution of lookup paths.
071: * <p>Use this to override the default UrlPathHelper with a custom subclass,
072: * or to share common UrlPathHelper settings across multiple MethodNameResolvers
073: * and HandlerMappings.
074: * @see org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#setUrlPathHelper
075: */
076: public void setUrlPathHelper(UrlPathHelper urlPathHelper) {
077: this .urlPathHelper = urlPathHelper;
078: }
079:
080: /**
081: * Return the UrlPathHelper to use for the resolution of lookup paths.
082: */
083: protected UrlPathHelper getUrlPathHelper() {
084: return this .urlPathHelper;
085: }
086:
087: /**
088: * Retrieves the URL path to use for lookup and delegates to
089: * {@link #getViewNameForRequest}.
090: */
091: protected ModelAndView handleRequestInternal(
092: HttpServletRequest request, HttpServletResponse response) {
093: String lookupPath = getUrlPathHelper().getLookupPathForRequest(
094: request);
095: String viewName = getViewNameForRequest(request);
096: if (logger.isDebugEnabled()) {
097: logger.debug("Returning view name '" + viewName
098: + "' for lookup path [" + lookupPath + "]");
099: }
100: return new ModelAndView(viewName);
101: }
102:
103: /**
104: * Return the name of the view to render for this request, based on the
105: * given lookup path. Called by {@link #handleRequestInternal}.
106: * @param request current HTTP request
107: * @return a view name for this request (never <code>null</code>)
108: * @see #handleRequestInternal
109: * @see #setAlwaysUseFullPath
110: * @see #setUrlDecode
111: */
112: protected abstract String getViewNameForRequest(
113: HttpServletRequest request);
114:
115: }
|