📄 abstracturlhandlermapping.java
字号:
/*
* Copyright 2002-2004 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.handler;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContextException;
import org.springframework.util.PathMatcher;
import org.springframework.web.util.UrlPathHelper;
/**
* Abstract base class for URL-mapped HandlerMapping implementations.
* Provides infrastructure for mapping handlers to URLs and configurable
* URL lookup. For information on the latter, see alwaysUseFullPath property.
*
* <p>Supports direct matches, e.g. a registered "/test" matches "/test",
* and various Ant-style pattern matches, e.g. a registered "/t*" pattern
* matches both "/test" and "/team", "/test/*" matches all paths in the
* "/test" directory, "/test/**" matches all paths below "/test".
* For details, see the PathMatcher class.
*
* @author Juergen Hoeller
* @since 16.04.2003
* @see #setAlwaysUseFullPath
* @see #setUrlDecode
* @see org.springframework.util.PathMatcher
*/
public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
private UrlPathHelper urlPathHelper = new UrlPathHelper();
private boolean lazyInitHandlers = false;
private final Map handlerMap = new HashMap();
/**
* Set if URL lookup should always use full path within current servlet
* context. Else, the path within the current servlet mapping is used
* if applicable (i.e. in the case of a ".../*" servlet mapping in web.xml).
* Default is false.
* @see org.springframework.web.util.UrlPathHelper#setAlwaysUseFullPath
*/
public void setAlwaysUseFullPath(boolean alwaysUseFullPath) {
this.urlPathHelper.setAlwaysUseFullPath(alwaysUseFullPath);
}
/**
* Set if context path and request URI should be URL-decoded.
* Both are returned <i>undecoded</i> by the Servlet API,
* in contrast to the servlet path.
* <p>Uses either the request encoding or the default encoding according
* to the Servlet spec (ISO-8859-1).
* <p>Note: Setting this to true requires J2SE 1.4, as J2SE 1.3's
* URLDecoder class does not offer a way to specify the encoding.
* @see org.springframework.web.util.UrlPathHelper#setUrlDecode
*/
public void setUrlDecode(boolean urlDecode) {
this.urlPathHelper.setUrlDecode(urlDecode);
}
/**
* Set the UrlPathHelper to use for resolution of lookup paths.
* <p>Use this to override the default UrlPathHelper with a custom subclass,
* or to share common UrlPathHelper settings across multiple HandlerMappings
* and MethodNameResolvers.
* @see org.springframework.web.servlet.mvc.multiaction.AbstractUrlMethodNameResolver#setUrlPathHelper
*/
public void setUrlPathHelper(UrlPathHelper urlPathHelper) {
this.urlPathHelper = urlPathHelper;
}
/**
* Set whether to lazily initialize handlers. Only applicable to
* singleton handlers, as prototypes are always lazily initialized.
* Default is false, as eager initialization allows for more efficiency
* through referencing the controller objects directly.
* <p>If you want to allow your controllers to be lazily initialized,
* make them "lazy-init" and set this flag to true. Just making them
* "lazy-init" will not work, as they are initialized through the
* references from the handler mapping in this case.
*/
public void setLazyInitHandlers(boolean lazyInitHandlers) {
this.lazyInitHandlers = lazyInitHandlers;
}
/**
* Look up a handler for the URL path of the given request.
* @param request current HTTP request
* @return the looked up handler instance, or null
*/
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
logger.debug("Looking up handler for [" + lookupPath + "]");
return lookupHandler(lookupPath);
}
/**
* Look up a handler instance for the given URL path.
* <p>Supports direct matches, e.g. a registered "/test" matches "/test",
* and various Ant-style pattern matches, e.g. a registered "/t*" matches
* both "/test" and "/team". For details, see the PathMatcher class.
* @param urlPath URL the bean is mapped to
* @return the associated handler instance, or null if not found
* @see org.springframework.util.PathMatcher
*/
protected Object lookupHandler(String urlPath) throws BeansException {
// direct match?
Object handler = this.handlerMap.get(urlPath);
if (handler == null) {
// pattern match?
for (Iterator it = this.handlerMap.keySet().iterator(); it.hasNext();) {
String registeredPath = (String) it.next();
if (PathMatcher.match(registeredPath, urlPath)) {
handler = this.handlerMap.get(registeredPath);
}
}
}
return handler;
}
/**
* Register the given handler instance for the given URL path.
* @param urlPath URL the bean is mapped to
* @param handler the handler instance
* @throws BeansException if the handler couldn't be registered
*/
protected void registerHandler(String urlPath, Object handler) throws BeansException {
Object mappedHandler = this.handlerMap.get(urlPath);
if (mappedHandler != null) {
throw new ApplicationContextException("Cannot map handler [" + handler + "] to URL path [" + urlPath +
"]: there's already handler [" + mappedHandler + "] mapped");
}
// eagerly resolve handler if referencing singleton via name
if (!this.lazyInitHandlers && handler instanceof String) {
String handlerName = (String) handler;
if (getApplicationContext().isSingleton(handlerName)) {
handler = getApplicationContext().getBean(handlerName);
}
}
if (urlPath.equals("/*")) {
setDefaultHandler(handler);
}
else {
this.handlerMap.put(urlPath, handler);
logger.info("Mapped URL path [" + urlPath + "] onto handler [" + handler + "]");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -