- 浏览: 90078 次
文章分类
最新评论
-
mimicom:
晕倒.. 看了一半,,发现转载的 不全..... 至少:%s/ ...
正则表达式之道(转载) -
congjl2002:
你这个说了等于没说,不明白的还不明白,明白的也不是记住了这个才 ...
BC范式(转载) -
bud407:
<o:p> </o:p>
Struts的资源文件是如何初始化的--struts源码学习 -
johnnyhg:
根本没法运行!完整的代码给出来吧!
Java中实现图片裁剪 -
星光闪烁:
struts的初始化确实是很复杂啊,代码量太大了
Struts源码的切片学习(一)-Struts初始化
<o:p> </o:p>
Struts 源码的切片学习(三)
—— ActionServlet 的初始化细节
<o:p>
</o:p>
<o:p> </o:p>
Author : zhyiwww<o:p>
E-Mail : zhyiwww@163.com<o:p>
Date : 2007-1-10<o:p>
转载请注明出处 www.BlogJava.net/zhyiwww<o:p>
(copyright by @ zhangyi)<o:p>
<o:p> </o:p>
<o:p> </o:p>
在 ActionServlet 初始化的过程中,有一个函数 initServlet() 用来初始化此 ActionServlet, 主要是初始化其 url, 也就是到底此 ActionServlet 接收和处理那些 url 。 <o:p> </o:p>
<o:p> </o:p>
我们先看一下代码:
protected void initServlet() throws ServletException {<o:p>
<o:p> </o:p>
// Remember our servlet name<o:p>
this.servletName = getServletConfig().getServletName();<o:p>
<o:p> </o:p>
// Prepare a Digester to scan the web application deployment descriptor<o:p>
Digester digester = new Digester();<o:p>
digester.push(this);<o:p>
digester.setNamespaceAware(true);<o:p>
digester.setValidating(false);<o:p>
<o:p> </o:p>
// Register our local copy of the DTDs that we can find<o:p>
for (int i = 0; i < registrations.length; i += 2) {<o:p>
URL url = this.getClass().getResource(registrations[i+1]);<o:p>
if (url != null) {<o:p>
digester.register(registrations[i], url.toString());<o:p>
}<o:p>
}<o:p>
/********************************************<o:p>
上面的紫色的代码是把当前的 ActionServlet 实例放入到解析堆栈中。这一步很重要。 <o:p> </o:p>
正是 actionServlet 放入了堆栈,下面的调用所取得配置参数才正是 actionSerlvet 的配置参数,而不是其他的 servlet 的配置参数。 <o:p> </o:p>
这个地方是一个难点。 <o:p> </o:p>
********************************************/<o:p>
<o:p> </o:p>
<o:p> </o:p>
// Configure the processing rules that we need<o:p>
digester.addCallMethod("web-app/servlet-mapping",<o:p>
"addServletMapping", 2);<o:p>
digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);<o:p>
digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);<o:p>
<o:p> </o:p>
/************************************************************<o:p>
上面的代码执行的时候, digester 就会调用 actionServlet 中的 addServletMapping() 方法,并传进去两个参数。 <o:p> </o:p>
在这个方法里面,就初始化了 servlet 的 url, ,也就是那种后缀的 ur 要由 actionServlet 来接收和处理。 <o:p> </o:p>
例如: *.do 还是 /action/*.do 等。 <o:p> </o:p>
这个 servlet 的 url 保存在 actionServlet 的 servletMapping 参数里面。 <o:p> </o:p>
************************************************************/<o:p>
<o:p> </o:p>
// Process the web application deployment descriptor<o:p>
if (log.isDebugEnabled()) {<o:p>
log.debug("Scanning web.xml for controller servlet mapping");<o:p>
}<o:p>
<o:p> </o:p>
InputStream input =<o:p>
getServletContext().getResourceAsStream("/WEB-INF/web.xml");<o:p>
<o:p> </o:p>
if (input == null) {<o:p>
log.error(internal.getMessage("configWebXml"));<o:p>
throw new ServletException(internal.getMessage("configWebXml"));<o:p>
}<o:p>
<o:p> </o:p>
try {<o:p>
digester.parse(input);<o:p>
<o:p> </o:p>
} catch (IOException e) {<o:p>
log.error(internal.getMessage("configWebXml"), e);<o:p>
throw new ServletException(e);<o:p>
<o:p> </o:p>
} catch (SAXException e) {<o:p>
log.error(internal.getMessage("configWebXml"), e);<o:p>
throw new ServletException(e);<o:p>
<o:p> </o:p>
} finally {<o:p>
try {<o:p>
input.close();<o:p>
} catch (IOException e) {<o:p>
log.error(internal.getMessage("configWebXml"), e);<o:p>
throw new ServletException(e);<o:p>
}<o:p>
}<o:p>
<o:p> </o:p>
// Record a servlet context attribute (if appropriate)<o:p>
if (log.isDebugEnabled()) {<o:p>
log.debug("Mapping for servlet '" + servletName + "' = '" +<o:p>
servletMapping + "'");<o:p>
}<o:p>
<o:p> </o:p>
if (servletMapping != null) {<o:p>
getServletContext().setAttribute(Globals.SERVLET_KEY, servletMapping);<o:p>
}<o:p>
<o:p> </o:p>
}<o:p>
<o:p> </o:p>
上面的过程就是 initServlet 的初始化过程,其中的难点就是对 digester.push() 的理解。
附:public void addServletMapping(String servletName, String urlPattern) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName +
", urlPattern=" + urlPattern);
}
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
this.servletMapping = urlPattern;
}
}
<o:p>
相关推荐
### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...
总的来说,理解和研究`servlet-api-src`中的`javax.servlet.Servlet`源码对于任何Java Web开发者来说都是一个重要的学习步骤。它不仅可以帮助我们深入理解Servlet的工作原理,还可以提升我们在实际项目中的开发效率...
基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip ...
在Servlet的生命周期中,`init()`方法在Servlet实例化后首次被调用,用于初始化Servlet;`service()`方法处理客户端请求;而`destroy()`方法在Servlet销毁前执行,用于释放资源。源码中,我们可以看到这些方法的具体...
- **web.xml**:部署描述符,配置ActionServlet以及Struts的初始化参数。 4. **开发流程** - 创建ActionForm:定义表单字段,用于接收和验证用户输入。 - 编写Action:实现业务逻辑,调用Service层方法,处理...
关于删除的lib库,Struts 2依赖于一系列的第三方库,包括Apache Commons、XWork、Freemarker、Java Servlet API等。这些库提供了诸如依赖注入、AOP(面向切面编程)、I18N(国际化)、数据校验等功能。在开发环境中...
Servlet初始化参数是在Servlet容器启动时设置的,这些参数可以在整个应用生命周期中被Servlet访问,通常用来配置Servlet的行为或应用的配置信息。本示例提供了对Servlet初始化参数的演示,帮助开发者了解如何在实际...
- `servlet-api.jar` 或 `javax.servlet-api-*.jar`: 提供Servlet API,是所有基于Java的Web应用程序的必备,用于处理HTTP请求和响应。 3. **插件和扩展**: - `struts2-convention-plugin-2.3.1.2.jar`: 自动化...
5. **Dispatcher Servlet**: Struts2的前端控制器,负责接收请求、调度拦截器链和Action,并返回响应。 源码包中,开发者可以详细查看这些组件的实现细节,包括类的结构、接口的设计、方法的调用等,从而加深对...
通过分析这个源码包,开发者可以学习如何配置Struts 1框架以支持文件上传,了解ActionForm的使用,以及如何处理上传后的文件。此外,还能理解Apache Commons FileUpload库的工作原理,这对任何想要深入理解Struts 1...
在“基于Struts的图书管理系统 - 源码.zip”这个压缩包中,我们可以学习到如何使用Struts框架来实现一个图书管理系统的具体实践。 1. **MVC设计模式**: MVC模式是软件工程中的一种设计模式,它将应用程序分为三个...
学习和理解Struts的源码可以帮助开发者深入掌握MVC架构的原理,以及如何有效地组织和管理Web应用的各个层面。此外,对于想要从事Java Web开发的人来说,熟悉Struts这样的经典框架,有助于理解后来的Spring MVC、...
通过对Struts 1.2.9源码的深入学习,开发者可以了解Web应用的典型开发流程,掌握如何有效地组织和管理复杂的业务逻辑,以及如何优雅地处理用户交互。虽然Struts 1已逐渐被Struts 2和Spring MVC等更新框架替代,但它...
Struts 1.0是Struts框架的早期版本,它的核心组件包括ActionServlet、ActionForm、Action和Tiles等。下面将详细介绍这些关键组件以及它们在框架中的作用。 1. **ActionServlet**:这是Struts框架的核心控制器,它...
《Java Web开发技术大全--JSP+Servlet+Struts 2+Hibernate+Spring+AJAX》.(李宁),适合java web开发者,学生,老师,或者已经工作的。内容详细全面,高清
ActionServlet的初始化过程是整个框架工作的基础,它负责加载配置、初始化模块并处理请求。通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。
- `ModuleConfigImpl`的初始化是在`ActionServlet`的`initModuleConfig`方法中完成的,通过`ModuleConfigFactory`工厂模式创建。 - 在初始化过程中,会调用`parseModuleConfigFile`方法来解析`struts-config.xml`...
`ActionServlet`在初始化过程中主要负责配置和管理整个Struts应用的环境,包括但不限于配置文件的加载、拦截器的注册以及控制器的设置等。 #### 三、Struts的初始化流程 **1. 初始化方法init()** - `Action...
2. **Action**:Action是处理业务逻辑的类,它实现了Struts中的Action接口,接收并处理由ActionServlet转发的请求。 3. **ActionForm**:用于封装用户界面提交的数据,它通常对应一个表单,负责数据验证。 4. **...
FilterDispatcher在初始化时会读取类路径下的struts.xml配置文件,完成框架的初始化。一旦读取,配置信息会被封装成JavaBean并存储在内存中,这样对每个用户的请求,Struts2都能快速响应,而不需要每次都读取XML文件...