③ 调用 initServlet(); 从web.xml 中加载ActionServlet 的初始化参数如servlet-name ,加载DTD 文件并把其放入HashMap 缓存,读取并解析web.xml 的内容
// Remember our servlet name
getServletConfig().getServletName ();
<servlet>
<servlet-name >action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name> <!-- 得到"config" 参数-->
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>convertNull</param-name> <!-- 得到"convertNull" 参数-->
<param-value>true</param-value>
</init-param>
.......
</servlet>
// Prepare a Digester to scan the web application deployment descriptor
Digester digester = new Digester();
// 把当前的 ActionServlet 对象放入到解析堆栈中
digester.push(this);
// 指明要考虑命名空间
digester.setNamespaceAware(true);
// 缺省值[false] ,解析器只是检查XML 是否格式良好(well formed)
digester.setValidating(false);
// Register our local copy of the DTDs that we can find
// struts 可使用 struts-core-1.3.5.jar 包 中的DTD 中来处理struts 配置文件,这样可适用于那些没有连接到internet 的应用环境
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i + 1]);
if (url != null) {
// 读取DTD 文件并把其放入 HashMap 缓存
digester.register(registrations[i], url.toString());
}
}
/************************************************************
// 一些文档类型定义,用来验证相应的配置文件如struts-config.xml 是否正确
protected String[] registrations =
{
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",
"/org/apache/struts/resources/struts-config_1_0.dtd ",
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN",
"/org/apache/struts/resources/struts-config_1_1.dtd ",
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN",
"/org/apache/struts/resources/struts-config_1_2.dtd ",
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN",
"/org/apache/struts/resources/struts-config_1_3.dtd ",
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
"/org/apache/struts/resources/web-app_2_3.dtd "
}; // ③ initServlet();
************************************************************/
// Configure the processing rules that we need
// 运行时,digester 就会调用 ActionServlet 中的 addServletMapping () 方法,并传入两个参数
digester.addCallMethod("web-app/servlet-mapping", "addServletMapping ", 2);
digester.addCallParam("web-app/servlet-mapping/servlet-name ", 0);
digester.addCallParam("web-app/servlet-mapping/url-pattern ", 1);
得到
<servlet-mapping>
<servlet-name >action</servlet-name>
<url-pattern >*.do</url-pattern>
</servlet-mapping>
/************************************************************
// 来判断当前 servlet 名称是否为正在运行的 servlet 名称,如是,就把 url-pattern 作为 servletMapping
public void addServletMapping (String servletName, String urlPattern) {
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName
+ ", urlPattern=" + urlPattern);
}
this.servletMapping = urlPattern;
}
}
************************************************************/
// 读取配置文件web.xml 的内容
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");
// 如找不到/WEB-INF/web.xml 文件,则报错
if (input == null) {
log.error(internal.getMessage("configWebXml"));
throw new ServletException(internal.getMessage("configWebXml"));
}
/************************************************************
// 报错信息定义在org\apache\struts\action\ActionResources.properties 中
configWebXml=The /WEB-INF/web.xml was not found.
************************************************************/
// 解析input 流文件,每读到一个节点元素就触发一个事件
digester.parse(input);
注: Digester 是一个基于 DOM 的 SAX 实现的类,它是事件触发的,可以将XML 文件转换为任意的Java 对象,支持规则的对任意XML 文档的处理。原先是struts 项目的一部分,后因其通用性而划归Commons 子项目。
// 把servletMapping 存储到servletContext 中,属性名为Globals.SERVLET_KEY ( " org.apache.struts.action.SERVLET_MAPPING " )
if (servletMapping != null) {
getServletContext().setAttribute(Globals.SERVLET_KEY,servletMapping);
}
相关推荐
可以对struts进行深入的学习.个人觉得是个很不错的文档,因积分的问题不得不出卖自己的珍藏之物
struts1学习资料:里面包含struts源码工程 ActionServlet DispatchAction Action LookUpDispatchAction的用法 还包含html logic bean tiles标签的详细使用方法和validate验证框架的具体案例
如下图2所示: <br/> 控制:通过图2大家可以看到有一个XML文件Struts-config.xml,与之相关联的是Controller,在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一...
The file struts-config.xml instructs ActionServlet on how to use the extended classes. There are several advantages to this approach: • The entire logical flow of the application is in a ...
网上书店(使用技术为JSP+Servlet+IBatis,完成前台功能) 网上银行(使用技术为Struts+Hibernate。 JSP页面采用Tiles框架布局,表单验证没有采用Validator框架验证。 JDK:1.4以上 数据库:SQL Server2000 开发工具...
第13章 简化企业开发瑰宝之二 第14章 程序员的伴侣 第2篇 范例演练篇 第15章 学以致用 第16章 幕后英雄的用武之地 第17章 Web开发的制胜法宝 第18章 数据分析大师 第19章 体验完美视觉盛宴 第3篇 项目实战篇 第20...
行动和ActionServlet的控制器实现 ,视图层的JSP文件组成。中央控制器控制,接收到一个请求,这个请求重定向到相应的 模块控制器执行动作。随后,该模块控制器处理请求并返回结果到中央控制器使用一个 JavaBean对象...
以及最早学习到的java web中的javax.servlet.Filter的概念, 都是一种链式的处理流程,这一个环节处理完成,然后处理另一个环节,这样就可以在一个处理本身的之前和之后做一些事情了。 比如说,struts2中Action在...
非常适合java学习的一个项目,我们的刘春阳老师创造性的把所有的java相关的技术都结合在这一个Training项目中,深入浅出的传授给我们的知识,倾心大奉献了:里面包含了jsp,servlet,struts,spring,hibernate,Ext,js,css,...
JSP(TagLib)——>ActionForm——>Action ——> Event——>EJBAction——>EJB ——>DAO——>Database JSP(TagLib) (forward) <——Action <——EventResponse<—— ??Turbine:??主要应用方面:WEB层。??主要应用...
该案例既提供了ide无关的、基于ant管理的项目源码,也提供了基于netbeans ide的项目源码,最大限度地满足读者的需求。 作者简介: 李刚,从事10年的Java EE应用开发。曾任LITEON公司的J2EE技术主管,负责该公司的...