struts之actionServlet初始化

2023-10-28 19:08

本文主要是介绍struts之actionServlet初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随着Struts2的推出,很多人认为原有的Struts1.2已经没有学习的价值,其实并不是这样,不管怎么样,原有的Struts1.2要比现有的 Struts2成熟,而且Struts2推出的时间还不是很长,所以,Struts1.2至少在现阶段的应用还是要比Struts2的应用要广。所以,认 真深入的学习Struts1.2还是很有必要的。
首先是Struts1.2的核心类,ActionServlet类。
ActionServlet位于org.apache.struts.action包内,这个类将会在struts第一次使用时,作为servlet初始化并存入Servlet容器。在初始化时:
首先调用init() 方法,Struts 的初始化实现就是在这里实现的。在执行init()方法时,会调用initInternal(),初始化内部文件 ActionResources.properties,它通过internal = MessageResources.getMessageResources(internalName)得到内部文件;
调用 initOther() ,从web.xml中加载ActionServlet的初始化参数,包括config/ convertNull,其中config默认路径为"/WEB-INF/struts-config.xml",protected String config = "/WEB-INF/struts-config.xml", 从web.xml中读取config参数:
String value;
value = getServletConfig().getInitParameter("config");
if (value != null) {
    config = value;
}

获得convertNull的值,getServletConfig().getInitParameter("convertNull");
调用 initServlet() ,从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把其放入HashMap缓存,读取并解析web.xml的内容,
getServletConfig().getServletName();
Digester digester = new Digester(); 
digester.push(this); 
// 把当前的 ActionServlet 对象放入到解析堆栈中
调用initServlet() ,运行时,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);

上面要从web.xml获得的元素值:
<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)调用 initChain() ,读取web.xml中命令链文件初始值chainConfig,如果没有,则用默认的"org/apache/struts/chain/chain-config.xml"
调用 initModuleConfigFactory()和 initModuleConfig("", config) ,创建 ModuleConfig 对象。Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的;
调用initModuleMessageResources(moduleConfig) ,用户资源文件的初始化;
调用initModulePlugIns(moduleConfig) ,用户插件的初始化;
调用initModuleFormBeans(moduleConfig); initModuleForwards(moduleConfig); initModuleExceptionConfigs(moduleConfig); initModuleActions(moduleConfig) ,把struts配置文件中的其他配置存储到servletContext中;
调用moduleConfig.freeze() ,固定组件配置;随后解析 以"config/"开头的其他struts配置文件,遍历web.xml中servletConfig配置的initParameterNames,如 发现以"config/" 开始的parameter,则根据此值初始化其它的ModuleConfig;
之后调用initModulePrefixes(this.getServletContext()),initModulePrefixes(this.getServletContext()) ,初始化其他模块并存储。

到此,ActionServlet初始化工作就算完成,后半段的初始化工作我解释的不是非常详细,只是想读者去好好阅读Struts的源代码,去品味下开发Struts的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。

这篇关于struts之actionServlet初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295316

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

在struts.xml中,如何配置请求转发和请求重定向!

<span style="font-size:18px;"><span style="white-space:pre"> </span><!--<strong>下面用请求转发action </strong>,<strong>这样过去id不会丢</strong>,如果用重定向的话,id会丢 --><result name="updatePopedom"<span style="color:#ff00

修改struts中:fielderror.ftl 模板

在项目登录页面: 当验证码输入有误时,应该提示:验证码输入有误,请重新输入 ,但是页面出现乱了! 错误原因: 在产生错误信息时,页面中增加了<ul> <li><span></span></li></ul>标签,该如何修改改, 解决方法(一): 在项目的src下,新建文件夹:template.simple,在文件夹里面放修改好的fielderror.ftl文件。 fi

Struts 2的工作流程

基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被 FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据 struts.xml中的配置找到对应的返回结果result

@postconstruct初始化的操作

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式: @PostConstruct Public void someMethod() {}

spring和tomcat初始化的类和注解

1.InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。 spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用 实

LabVIEW环境中等待FPGA模块初始化完成

这个程序使用的是LabVIEW环境中的FPGA模块和I/O模块初始化功能,主要实现等待FAM(Field-Programmable Gate Array Module,FPGA模块)的初始化完成,并处理初始化过程中的错误。让我们逐步分析各部分的功能: 1. Wait for FAM Initialization框架 此程序框架用于等待I/O模块成功初始化。如果在5秒钟内模块没有完成配

dp(背包问题) 恰好、至少、至多初始化

状态表示的初始化(一般情况) f[i][j] i:前i件物品 体积至少为j 枚举体积时可以是负数(体积为负数时等价于体积为0) max f[i][j] = {-0x3f} f[i][0] = 0min f[i][j] = { 0x3f} f[i][0] = 0cnt f[0][0] = 1 体积至多为j 枚举体积时不能是负数 max f[i][j] = 0min f[i][j]

Windows11上使用WSL2,提示:系统尚未使用systemd作为初始化系统(PID 1)启动

前言 略 报错信息 System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down 解决方法 使用如下命令 # windows终端,执行如下命令wsl --update# 登录ubuntu系统,执行如下命令s