struts的初始化

XGBoost详解(原理篇) XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。XGBoost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。Note:关于Boosting算法详见博文集成学习详解_tt丫的博客-优快云博客XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。 阅读详情
struts 的核心类是org.apache.struts.action.ActionServlet,这个类将会在struts第一次使用时,
作为servlet初始化并存入tomcat容器。很显然的,初始化将会调用init方法初始化相应的数据。

一、initInternal()方法:
    通过调用MessageResources.getMessageResources(internalName)方法生成一个
    MessageResources类,getMessageResources是通过调用MessageResourcesFactory.
    createResources(config)来实现的。至于MessageResourcesFactory是一个abstract类,任何
    继承自它的类都要实现createResources方法,生成MessageResources对象。整个程序生成
    MessageResourcesFactory使用了如下技巧:
    MessageResourcesFactory.factoryClass = factoryClass;
    MessageResourcesFactory.clazz = null;
    首先会通过factoryClass来定义一个类全名,然后通过ClassLoader.loadClass
    (factoryClass)方法来生成这个类,并赋给clazz,然后通过newInstance来生成一个对象。
    在本程序中,生成MessageResources对象实际就是对如下属性进行了初始化:
    this.factory = factory;("org.apache.struts.util.PropertyMessageResourcesFactory")
    this.config = config;("org.apache.struts.action.ActionResources")
    this.returnNull = returnNull;(true/false)

    对于MessageResources类的作用是根据不同的Locate来格式化相应的string。或者把你需要改变
    的string存放到数组中,然后通过getMessage(Locale locale, String key, Object args[])
    方法来格式化。然后把格式好的string存放到HashMap里,这样就可以为以后重用。这里的key是
    使用的locale.toString() + "." + key

    在PropertyMessageResources中的loadLocale方法用来读取resource的初始化信息。首先它会
    通过一个HashMap检测这个localKey相关的message是否已经被初始化了,如果被初始化过就跳
    出,检测的方法是locales.get(localeKey) != null。
    然后会读取如下一个文件:
    org/apache/struts/action/ActionResources_(localKey).properties,然后进行如下操作:
    Properties props = new Properties();
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    is = classLoader.getResourceAsStream(name);
    props.load(is);
    Iterator names = props.keySet().iterator();
        while (names.hasNext()) {
            String key = (String) names.next();
            if (log.isTraceEnabled()) {
                log.trace("  Saving message key '" + messageKey(localeKey, key));
            }
            messages.put(messageKey(localeKey, key), props.getProperty(key));
    }

    PropertyMessageResources 就是通过上面的loadLocale方法查找与Locale locale, String key
    相对对应的Message.查找的次序如下locale.toString(),然后是
    localeKey = localeKey.substring(0, underscore),然后是defaultLocale,然后是key。

    最后,resource类的结构如下:
    PropertyMessageResources extends MessageResources
    PropertyMessageResourcesFactory extends MessageResourcesFactory

二、initOther()方法:
    从servlet中获取config和debug两个参数,然后初始化ConvertUtils对象。由于
    ConvertUtils.deregister()的初始化,所有的Converter都是有初始值的,所以这里Struts自己
    把这些初始值设置为null,即转换出错的时候返回null,而不是初始值。使用ConvertUtils类的
    原因是由于从form传输过来的都是String类型的值,所以我们要把它们转换成相应的类型。

    提到几个技巧:
    *public boolean isIndexed() {
         if (type == null) {
             return (false);
         //技巧一:判断是否是一个Array类的方法
         } else if (type.isArray()) {
             return (true);
         //技巧二:判断type是否是List的一个父类或者父接口,或者与List为同一个类
         //要注意如果List是另一个primitive的TYPE类,那么type必须也是这个类才会
         //返回true,否则都是false。注意long.TYPE与Long.class是不同的
         } else if (List.class.isAssignableFrom(type)) {
             return (true);
         } else {
            return (false);
         }
     }

    *//componentType为Array类所存储的元素的类别
     Class componentType = indexedProperty.getClass().getComponentType();
     //生成一个新的Array
     Object newArray = Array.newInstance(componentType, (index + 1));
     System.arraycopy(indexedProperty, 0, newArray, 0, length);
     indexedProperty = newArray;
     set(name, indexedProperty);
     int newLength = Array.getLength(indexedProperty);
     for (int i = length; i < newLength; i++) {
        Array.set(indexedProperty, i, createProperty(name+"["+i+"]", componentType));
     }

三、initServlet()方法:
    这个方法主要是通过digester类解析web.xml,对String servletMapping属性进行初始化。对于
    digester说明如下:这是一个基于DOM的SAX实现的类,它是事件触发的,根据xml文件的结构,
    每次读到一个节点元素就会触发一个事件。

    InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");
    这是一个比较少见的方法。首先通过this.servletName = getServletConfig().
    getServletName()获取servlet的名称,然后根据
    if (servletName.equals(this.servletName)) {
        this.servletMapping = urlPattern;
    }
    来判断当前读到的servlet名称是否是我们运行的servlet的名称,如果是,就把url-pattern作为
    我们的servletMapping。

四、getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this)
    把自己存储到servletContext中,属性名为Globals.ACTION_SERVLET_KEY。

五、ModuleConfig moduleConfig = initModuleConfig("", config)
    这个方法使用由initOther()方法获取的config值为要解析的xml路径,用来初始化ModuleConfig。
    它首先采用与生成MessageResourcesFactory同样的方法产生一个MessageResourcesFactory对象:
    MessageResourcesFactory为一个抽象类,每一个继承它的类都要实现
    createModuleConfig(String prefix)方法。本程序使用的缺省的MessageResourcesFactory类为
    org.apache.struts.config.impl.DefaultModuleConfigFactory,它
    的createModuleConfig(String prefix)方法会生成一个ModuleConfigImpl类。

    ModuleConfigImpl类相当于一个JavaBean,用来存放一个web模块运行时所需要的配置信息。当
    然,一个web模块可以拥有多个ModuleConfig,但是缺省的是prefix长度为0的ModuleConifg。它
    的每个属性几乎都是由HashMap组成的,它通过一个configured布尔值来描述当前的ModuleConfig
    是否已经被初始化完毕,在每存放一个属性的时候都会监测这个值。如果初始化完毕而还要改变
    里面的属性值,则会报出IllegalStateException("Configuration is frozen")异常,现在对它
    的属性简单说明如下:
    * protected HashMap actionConfigs:
      这个HashMap用来存储ActionConfig对象。
    * protected HashMap dataSources
      这个HashMap用来存储DataSourceConfig对象。
    * protected HashMap exceptions
      这个HashMap用来存储ExceptionConfig对象。
    * protected HashMap formBeans
      这个HashMap用来存储FormBeanConfig对象。
    * protected HashMap forwards
      这个HashMap用来存储ForwardConfig对象。
    * protected HashMap messageResources
      这个HashMap用来存储MessageResourcesConfig对象。
    * protected ArrayList plugIns
      这个HashMap用来存储PlugInConfig对象。
    * protected ControllerConfig controllerConfig
      ControllerConfig类
    * protected boolean configured
      标志这个ModuleConfig是(true)否(false)配置完成。
    * protected String prefix
      用来标志和区分ModuleConfig类,同时在使用上面的config类初始化相应的资源以后,也是通
      过这个prefix来区分所属的不同的web模块。
    * protected String actionMappingClass = "org.apache.struts.action.ActionMapping"
      ActionMapping类名,缺省为org.apache.struts.action.ActionMapping。

    初始化ModuleConfig的方法如下:
    首先是使用getServletConfig().getInitParameter("mapping")来获取设定的ActionMapping类
    名,然后通过initConfigDigester()方法来生成一个digester。最后用","分隔config,对每一
    块调用parseModuleConfigFile(prefix, paths, config, digester, path)方法解析。注意,这
    个方法实际上只有两个参数是有意义的:path为我们要解析的xml文件,config用来初始化完成
    后保存到servletContext中。

    如果ModuleConfig中存放的FormBeanConfig为Dydamic类型,那么就调用
    DynaActionFormClass.createDynaActionFormClass(FormBeanConfig)初始化
    DynaActionFormClass,并存放到DynaActionFormClass.dynaClasses 的 static HashMap中。这
    里的key为FormBeanConfig.getName() + moduleConfig.getPrefix()。
    
    如果当前的ModuleConfig为缺省的ModuleConfig,那么将会调用如下几个方法:
    defaultControllerConfig(config)
    defaultMessageResourcesConfig(config)
    defaultFormBeansConfig(config)
    defaultForwardsConfig(config)
    defaultMappingsConfig(config)
    在struts1.1以后,这个特例将会被废弃:

    defaultControllerConfig(config)为ControllerConfig通过getInitParameter(s)方法初始化如
    下几个属性:bufferSize,content,locale(true/false),maxFileSize,nocache(true/false)
    ,multipartClass,tempDir。

    defaultMessageResourcesConfig(config)为MessageResourcesConfig通过getInitParameter(s)
    方法初始化如下几个属性:application,factory,null(true/false)。

    其它的几个方法就是获取不同的对象,然后把它们相应的存储到servlet中。关心如下:
    ActionFormBeans=>FormBeanConfig,ActionForwards=>ForwardConfig,
    ActionMappings=>ActionConfig。

六、initModuleMessageResources(ModuleConfig config)
    通过存储在ModuleConfig中的MessageResourcesConfig对象,逐个初始化MessageResource,
    然后再把初始化好的MessageResources存放到ServletContext中,attributeName为
    MessageResourcesConfig.getKey() + ModuleConfig.getPrefix()。

七、initModuleDataSources(ModuleConfig config)
    通过存储在ModuleConfig中的DataSourceConfig对象,逐个初始化DataSource。然后对于每一个
    DateSource通过BeanUtils.populate(ds, dscs[i].getProperties())方法初始化其属性。再把初
    始化好的DateSource存放到ServletContext中,attributeName为
    DataSourceConfig.getKey() + ModuleConfig.getPrefix()。同时也存放到名位dataSources的
    FastHashMap中,key为DataSourceConfig.getKey()。

    这里还会根据生成的DateSource对象是否是GenericDataSource类型,如果是则调用
    GenericDataSource.open()方法。GenericDataSource是一个非常简单的数据库连接池,它的
    open()方法用来初始化连接池,生成最小数目的GenericConnection,这里的open()方法根据
    String driver变量是否为null来判断是否已经被初始化过。需要仔细说明的是getConnection()
    方法,它首先从连接池中取出GenericConnection对象,然后检查其是否是可链接的,如果是就
    返回,否则继续取出,同时activeCount-1。如果没有取到,则会检查当前可使用的
    GenericConnection是否达到最大值(activeCount < maxCount),如果没有,调用
    createConnection()方法声成一个新的GenericConnection,然后检查其是否是可链接,如果可以
    则返回。returnConnection(GenericConnection conn)方法则是通过把GenericConnection放回到
    连接池,然后activeCount-1。

    这个方法中使用到了ServletContextWriter类,DateSource的log信息就通过这个类写入。对这个
    类说明如下:
    它继承自PrintWriter,而PrintWriter又继承自Writer。Writer类所作的事情就是在同步的情况下
    调用abstract方法:abstract public void write(char cbuf[], int off, int len),这个方法
    将会根据调用者的需要由调用者实现。
    PrintWriter则首先通过ensureOpen()方法检验这个类中是否有写入的对象(Writer类或其子类),
    如果有则根据不同的情况调用这个写入对象的write方法(out.write(....))。这个类的print(...)
    方法就是据不同的情况调用相应的write(...)方法。而println(...)与之的区别就是每次多写入一
    个换行字符串。还有一个区别是println(...)会根据是否需要autoflush进行flush,而write(...)
    方法不会。
    ServletContextWriter类的作用是把字符写入ServletContext中。ServletContextWriter类方法中
    真正实现了write方法:
    public void write(char c) {
        if (c == '/n')
            flush();
        else if (c != '/r')
            buffer.append(c);
    }
    public void flush() {
        if (buffer.length() > 0) {
            context.log(buffer.toString());
            buffer.setLength(0);
        }
    }

八、initModulePlugIns(moduleConfig)
    通过存储在ModuleConfig中的PlugInConfig对象,逐个初始化PlugIn对象,存放到一个数组中,
    然后再把这个数组存放到ServletContext中,attributeName为
    Globals.PLUG_INS_KEY + ModuleConfig.getPrefix()。

    对每一个生成的PlugIn对象通过
    BeanUtils.populate(plugIns[i], plugInConfigs[i].getProperties())方法初始化其属性。然后
    再把PlugInConfig对象存放到由其生成的PlugIn对象中。

    最后,通过plugIns[i].init(this, (ModuleConfig) config)初始化这个plugIn对象。

九、初始化结束
    完成了这个初始化以后,会调用ModuleConfig.freeze()令这个ModuleConfig变得不可改变。然后
    会遍历ServletConfig中的initParameterNames,如果有以"config/"开头的,则通过这个parameter
    的值继续初始化其它的ModuleConfig,且这个ModuleConfig的prefix为"config/"后的字符串。
    
    同样调用如下方法:
    initModuleMessageResources(moduleConfig);
    initModuleDataSources(moduleConfig);
    initModulePlugIns(moduleConfig);
    moduleConfig.freeze();

    最后调用destroyConfigDigester()释放内存。
多智能体强化学习MASAC算法:从原理到PyTorch实战详解 深度强化学习通过智能体与环境的交互试错来学习最优策略,是解决复杂序列决策问题的核心技术。其核心原理在于利用价值函数或策略梯度来最大化累积奖励,在机器人控制、游戏AI等领域展现出巨大技术价值。当面对多个智能体需要协同或竞争的复杂动态环境时,单智能体算法因环境非平稳性而面临挑战,多智能体强化学习应运而生。Multi-Agent Soft Actor-Critic (MASAC) 算法融合了SAC的稳定高效与中心化训练去中心化执行的范式,通过维护中心化Critic网络和独立策略网络,有效解决了多智能体协作中的信用 阅读详情

相关推荐

VMware vCenter 6.7证书过期急救指南:从503报错到完美修复的全流程

本文详细解析了VMware vCenter 6.7因STS证书过期导致503报错的根本原因,并提供了一套从诊断到修复的完整实战流程。内容包括使用checksts.py脚本检测STS证书状态,通过fixsts.sh脚本更新证书,以及利用Certificate-Manager全面重置所有过期证书,帮助管理员快速恢复服务并避免常见陷阱。

weixin_29234239的博客 766

struts源代码阅读(struts 初始化)

struts作为J2EE的MVC框架已经取得了很大的成功,下面将分几篇文章说明struts源程序的结构。第一篇  struts的初始化struts 的核心类是org.apache.struts.action.ActionServlet,这个类将会在struts第一次使用时,作为servlet初始化并存入tomcat容器。很显然的,初始化将会调用init方法初始化相应的数据。一、initIntern

独舞九天的技术专栏 1182

从SFF-8087到SFF-8643:详解服务器硬盘背板连接线缆的演变与实战接线

本文深度解析了服务器硬盘背板连接技术从SFF-8087到SFF-8643的演进历程,重点介绍了SAS、SATA和U.2接口的技术特点与实战接线方案。通过对比不同连接器标准的物理特性和电气规范,提供了混合环境下的线缆选择策略和常见故障排查指南,帮助IT专业人员优化存储系统性能与稳定性。

weixin_30603633的博客 271

Struts2初始化过程

Struts2运行原理 Struts2基于Servlet框架的filter机制实现。所以需要在web.xml中添加如下配置。 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts...

weixin_33770878的博客 299

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1464

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 257

Struts的初始化

Struts源码的切片学习(一)-Struts的初始化.doc

622

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 909

Struts框架初始化流程

重新看了一下孙卫琴老师的《精通Struts》,总结了一下Struts框架的初始化流程如下:1.调用initInternal()方法,初始化struts框架内在的消息资源,如与系统相关的通知、警告和错误信息。2.调用ininOther()方法,从web.xml文件中加载ActionServlet的初始化信息,如config参数3.调用initServlet()方法,从web.xml文件中加载Ac

林的专栏 887

Ambari 安装部署教程(手把手教学)【超级详细】

本文为读者提供了一套超详细的 Apache Ambari 安装部署教程,采用手把手教学方式,适合初学者及大数据运维人员。内容涵盖前期准备、环境配置、Ambari Server 与 Agent 安装、集群初始化配置、常见问题排查等全流程操作,确保用户能够顺利搭建稳定的 Hadoop 大数据平台管理系统。

Five的博客 1万+

2026.1.9:最新VSCode集成claude插件完美解决方案,跳过登录界面,使用国内Kimi K2进行计费

本文介绍了如何安装配置Claude插件并连接Kimi K2 API的详细步骤:1)搜索安装Claude插件;2)进入设置关闭登录提示;3)在settings.json中添加API配置,包括ANTHROPIC_AUTH_TOKEN(需替换为Kimi API Key)和ANTHROPIC_BASE_URL;4)通过Kimi官网获取API Key。完成配置后即可正常使用该插件。文中配有完整的操作截图指引。

拥抱具身智能,昇腾Ascend C 8713

在Struts中实现系统的初始化工作

通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等。    在Struts中实现系统的初始化工作 在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。   Java代码   package f

Athenaer的专栏 934

LVGL hal indev(porting evdev)

LVGL中对输入设备的管理是单例实现的,而在Linux的输入设备是多个的,所以需要对其进行改造成多例实现。

Bigan(安)的博客 3344

【struts】struts初始化主线

struts2 三条主线之一:初始化主线

厚积薄发者,轻舟万重山 1150

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

struts 初始化(详细)

第一篇  struts的初始化struts 的核心类是org.apache.struts.action.ActionServlet,这个类将会在struts第一次使用时,作为servlet初始化并存入tomcat容器。很显然的,初始化将会调用init方法初始化相应的数据。一、initInternal()方法:    通过调用MessageResources.getMessageResources(

吃螃蟹的虾子 1018

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何在Struts2中实现系统的初始化…

通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等。    在Struts中实现系统的初始化工作 在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。   Java代码 package fangwei.servle

kobe00712的专栏 457

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[转载]Struts源码的切片学习之Struts的初始化

Struts源码的切片学习之Struts的初始化Author : zhyiwwwE-Mail : zhyiwww@163.comDate : 2007-1-10转载请注明出处 www....

congji3817的博客 119

Struts初始化处理

根据在web.xml中配置的初始化参数,当容器第一次启动或者ActionServlet的请求第一次发生的时候,将会加载struts ActionServlet,不管哪种方式加载,和其它Servlet一样,ActionServlet的init( )方法将被调用.这个方法的调用,将在所有的其他的请求发生之前完成.当init()方法被调用以后,struts将会完成一系列的复杂的初始化工作,让我们来看看在...

蛋蛋的小破屋 205

探讨Struts的初始化方法

  struts 的核心类是org.apache.struts.action.ActionServlet,这个类将会在struts第一次使用时,作为servlet初始化并存入tomcat容器。很显然的,初始化将会调用init方法初始化相应的数据。     一、initInternal()方法:     通过调用 MessageResources.getMessageResource...

jinjiabao 291

Struts初始化过程

导读:   Sturts初始化过程取决于在web.xml文件中配置的初始化参数,servlet容器在首次启动或servlet的第一次请求到达时加载Struts ActionServlet。在这两种情况下,要保证init()方法被调用,并且必须在servlet处理任何请求之前完成。当init()被调用时,Struts框架包执行所有必要的初始化工作。,其步骤如下:   初始化框架包的内部消息绑定。这些

浮白 1464

如何在Struts2中实现Web系统的初始化工作

如何在Struts2中实现Web系统的初始化工作

愤怒的小狐狸----博客专栏 6248

Struts初始化流程

重新看了一下孙卫琴老师的《精通Struts》,总结了一下Struts框架的初始化流程如下: 1.调用initInternal()方法,初始化struts框架内在的消息资源,如与系统相关的通知、警告和错误信息。2.调用ininOther()方法,从web.xml文件中加载ActionServlet的初始化信息,如config参数3.调用initServlet()方法,从web.xml文件中加载Ac...

yangyuwei1986的专栏 187

Struts2初始化之Dispatcher

Dispatcher也叫做核心分发器,Dispatcher类负责整个Struts2项目的初始化工作。这是一个很庞大的类,这里会挑选一些重要的方法进行分析。 很明显这是一个应用ThreadLocal的例子,它为当前线程中的一个叫做ThreadLocalMap的线程副本,使得线程与线程之间,每一个线程可以独立的修改自己的副本,而不会影响到其他线程的变量,从而使线程安全。 Dispatcher分发器的

Joseph_Geeker的博客 684

struts之actionServlet初始化

随着Struts2的推出,很多人认为原有的Struts1.2已经没有学习的价值,其实并不是这样,不管怎么样,原有的Struts1.2要比现有的 Struts2成熟,而且Struts2推出的时间还不是很长,所以,Struts1.2至少在现阶段的应用还是要比Struts2的应用要广。所以,认 真深入的学习Struts1.2还是很有必要的。 首先是Struts1.2的核心类,ActionServlet...

samson_g_q_su的博客 186
上一篇: 查询一个表中的第二大值
下一篇: Struts源码学习 RequestProcessor
myjava_024
博客等级 码龄20年 59粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值