初始化Dispatcher完成,
init.initStaticContentLoader(config, dispatcher);
继续初始化filter配置信息的静态内容加载器
public StaticContentLoader initStaticContentLoader( HostConfig filterConfig, Dispatcher dispatcher ) {
StaticContentLoader loader = dispatcher.getContainer().getInstance(StaticContentLoader.class);
loader.setHostConfig(filterConfig);
return loader;
}
StaticContentLoader
通过一个路径加载静态资源,
我们看看StaticContentLoader类的定义
public interface StaticContentLoader {
/**
* @param path Requested resource path
* @return true if this loader is able to load this type of resource, false otherwise
*/
public boolean canHandle(String path);
/**
* @param filterConfig The filter configuration
*/
public abstract void setHostConfig(HostConfig filterConfig);
/**
* Locate a static resource and copy directly to the response, setting the
* appropriate caching headers.
*
* @param path The resource name
* @param request The request
* @param response The response
* @throws IOException If anything goes wrong
*/
public abstract void findStaticResource(String path, HttpServletRequest request, HttpServletResponse response)
throws IOException;
}
他的默认实现是DefaultStaticContentLoader
public void setHostConfig(HostConfig filterConfig) {
String param = filterConfig.getInitParameter("packages");
String packages = getAdditionalPackages();
if (param != null) {
packages = param + " " + packages;
}
this.pathPrefixes = parse(packages);
initLogging(filterConfig);
}
protected String getAdditionalPackages() {
return "org.apache.struts2.static template org.apache.struts2.interceptor.debugging static";
}
初始化struts内部所有的静态资源信息,说白了就是初始化sturts自带的标签库.
看图
初始化基本完成,剩下三件事,
prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
PrepareOperations是预处理操作,在一个request请求到来之前的预处理操作
然后是初始化ExecuteOperations,包含执行操作过滤器
以上初始化只是创建了该对象,当struts2拦截器收到请求的时候才会处理,那是后话。
接下来
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
public List<Pattern> buildExcludedPatternsList( Dispatcher dispatcher ) {
return buildExcludedPatternsList(dispatcher.getContainer().getInstance(String.class, StrutsConstants.STRUTS_ACTION_EXCLUDE_PATTERN));
}
private List<Pattern> buildExcludedPatternsList( String patterns ) {
if (null != patterns && patterns.trim().length() != 0) {
List<Pattern> list = new ArrayList<Pattern>();
String[] tokens = patterns.split(",");
for ( String token : tokens ) {
list.add(Pattern.compile(token.trim()));
}
return Collections.unmodifiableList(list);
} else {
return null;
}
}
用来取出不需要处理的请求。
看doFilter就可以明白
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
prepare.setEncodingAndLocale(request, response);
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request, response, true);
if (mapping == null) {
boolean handled = execute.executeStaticResourceRequest(request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);
}
}
} finally {
prepare.cleanupRequest(request);
}
}
注意上面代码中if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns))
如果包含了不需要处理的请求,直接chain.doFilter(request, response);
否则进入struts内部,
这样,所有的初始化类创建工作依然是完成了。
- 大小: 31.4 KB
- 大小: 19.3 KB
分享到:
相关推荐
在Eclipse中关联Struts2.1.8源码,可以帮助开发者更好地理解和调试代码。步骤包括: - 下载Struts2.1.8的源码包。 - 在Eclipse中,右键点击项目,选择"Build Path" -> "Configure Build Path" -> "Libraries" -> ...
struts源码包,解压后会有一个src文件夹,此文件夹下的就是struts的源码。
孙卫琴 struts 源码 孙卫琴 struts 源码 孙卫琴 struts 源码
4. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action和视图之间传递数据。OGNL使得数据访问更为灵活,可以方便地获取和设置对象属性。 5. **配置灵活性**:Struts2...
通过深入研究Struts源码,我们可以了解到框架如何处理请求、执行业务逻辑以及如何将数据呈现给用户。这对于提升Java Web开发技能,理解MVC模式,以及进行性能优化都有着极大的帮助。同时,熟悉源码也有助于开发者更...
本项目源码提供了一个基础的Struts2应用程序实例,对于初学者来说,这是一个很好的学习资源,可以深入理解Struts2的工作原理和架构。 Struts2的核心组件包括: 1. **Action类**:Action类是业务逻辑的载体,它是...
4. Struts2(2.1.2) 部分源码阅读 从 org.apache.struts2.dispatcher.FilterDispatcher 开始 Java 代码阅读,我们可以看到 FilterDispatcher 的 init 方法,它负责初始化 Dispatcher 对象,并创建了一个 ...
这篇博文“Struts2源码解读”深入剖析了Struts2的核心机制,帮助开发者更好地理解和利用这个框架。源码分析是提升编程技能和解决问题的关键,特别是对于复杂的框架如Struts2,理解其内部工作原理能够帮助我们优化...
深入理解Struts2的源码对于提升Java Web开发技能,尤其是在面试中讨论底层实现时,具有非常重要的价值。 首先,我们来看看Struts2的核心组件和设计理念: 1. **Action**:在Struts2中,Action类是业务逻辑处理的...
4. `ConfigurationProvider`和`Configuration`:`ConfigurationProvider`解析Struts2的配置文件,如`struts.xml`。默认实现`XmlConfigurationProvider`和`StrutsXmlConfigurationProvider`负责读取和解析这些配置。 ...
深入学习Struts2的源码,有助于理解其运行机制,从而更好地优化代码、调试问题,甚至开发自己的扩展。对于Java Web开发者来说,掌握Struts2的基本原理和使用技巧,能够显著提高开发效率和应用质量。
本资料“struts2学习 源码”旨在帮助初学者理解Struts2的核心概念和工作原理,通过来自达内的详细代码实例来提供直观的学习体验。 Struts2框架的关键特性包括: 1. **动作(Action)**:在Struts2中,业务逻辑通常...
这里的"struts-1.3.9 源码"指的是Struts 1.x系列的第9次次要版本的源代码。Struts 1.3.9是在2008年发布的,它提供了许多增强和修复了之前版本中的问题,以提高框架的稳定性和安全性。 首先,我们来看看`LICENSE.txt...
通过对Struts 1.2.9源码的深入学习,开发者可以了解Web应用的典型开发流程,掌握如何有效地组织和管理复杂的业务逻辑,以及如何优雅地处理用户交互。虽然Struts 1已逐渐被Struts 2和Spring MVC等更新框架替代,但它...
在深入理解Struts2的工作原理时,源码分析是必不可少的步骤。Struts2的核心设计理念和设计模式相比Struts1.x有了显著的变化,这使得它成为一个独立且成熟的框架。 首先,Struts2的架构基于WebWork的核心,这意味着...
通过深入学习OGNL的源码,开发者可以更好地定制和优化Struts2应用,提升性能,增强安全性,并能解决遇到的特定问题。这是一项值得投入时间和精力的任务,特别是对于那些希望在Web开发领域有深入理解的人来说。
STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析...
在深入理解Struts 2的源码之前,我们需要先了解其核心概念和组件。 1. **Action类与ActionMapping** Struts 2的核心是Action类,它是业务逻辑处理的中心。每个Action类对应一个用户请求,处理后返回一个Result。...
struts2.0工程源码(完整的struts2.0学习工程源码) 这是一个完整的工程源码,包括所用到的jar包和发布配置文件。 导入到eclipse里几个运行,struts2.0入门学习工程,适合struts2.0广大爱好者和初学者学习和交流。
孙卫琴 struts 源码 孙卫琴 struts 源码 孙卫琴 struts 源码 103m