参考 深入理解Tomcat(六)Digester组件 digester和rule 2. 是什么 它是用于解析xml文件的类库。...我们提到Digester其实有两种: tomat内嵌的org.apache.tomcat.util.digester.Digester maven依赖的digester。...将整个xml读取,解析,保存到内存,比如Dom4j 基于流进行分析,比如sax Digester是第二种,底层是基于sax的。 4....4.2 addSetProperties digester.addSetProperties("School"); 这个比较好理解。...总结 Digester会用流的方式解析xml,并生成对应的对象。
The Object Stack One very common use of org.apache.commons.digester3.Digester technology is to dynamically...Element Matching Patterns A primary feature of the org.apache.commons.digester3.Digester parser is that...The Digester can be configured to use different pattern-matching algorithms via the Digester.setRules...("*/a", ruleA); digester.addRule("*/a", ruleB); digester.addRule("x/a", ruleA); digester.addRule...static void main(String[] args) throws IOException, SAXException { Digester digester = new Digester
1 Digester Digester在tomcat中的作用是对conf下的server.xml文件进行实例化,其是从Catalian这个组件开始,创建Digester实例,再添加对应的规则,然后将其实例化...其主要实现过程是创建Digester实例,设置规则 protected Digester createStartDigester() { long t1=System.currentTimeMillis...(); //创建一个digester实例 Digesterdigester = new Digester(); //是否需要验证xml文档的合法性,false表示不需要进行DTD...规则校验 digester.setValidating(false); //是否需要进行节点设置规则校验 digester.setRulesValidation(true);...} return (digester); } 1.3.2 注入栈顶对象 将当前catalina压入栈顶,stack 是一个ArrayStack实例 digester.push(this
- it may be needed initNaming(); // Create and execute our Digester Digester...通过digester.parse(inputSource)解析server.xml中的元素 protected Digester createStartDigester() { long...t1=System.currentTimeMillis(); // Initialize the digester Digester digester = new Digester...(); digester.setValidating(false); digester.setRulesValidation(true); HashMap...Server/Service/")); digester.addRuleSet(new HostRuleSet("Server/Service/Engine/")); digester.addRuleSet
- it may be needed initNaming(); // Create and execute our Digester Digester digester =...Digester digester = new Digester(); //解析器标志为false digester.setValidating(false); //执行标记为成...digester.setRulesValidation(true); //用于存放对象信息 其中包含 类名 来源 端口编移配置 Map<Class<?...", "className"); digester.addSetProperties("Server"); digester.addSetNext.../Service/")); digester.addRuleSet(new HostRuleSet("Server/Service/Engine/")); digester.addRuleSet
digester 是采用 SAX 来解析 XML 文件,在 Tomcat 中就用 Digester 来解析配置,在 Struts 等很多开源项目,也都用到了 digester 来解析配置文件,在实际项目研发中...digester 的用法 弱弱问一句:有没有听过 digester,若没有听过,那势必要好好读本文啦。...定义解析规则文件 rule.xml digester 进行解析 xml,需要依赖解析规则(就是告诉 digester 怎么个解析法)。...package org.yyxj.miniframework.config; import org.apache.commons.digester.Digester; import org.apache.commons.digester.xmlrules.DigesterLoader...答疑解谜 本次主要聊了聊 xml 解析的方式,着重分享了 digester 的用法,并站在 digester 解析 xml 的基础之上,徒手模拟了一个 WEB 的迷你版的框架。
// Before digester - it may be needed initNaming(); // Create and execute our Digester...// 在createStartDigester里面配置server.xml的格式以及解析规则 Digester digester = createStartDigester();...System.nanoTime(); // 这个方法是和操作系统相关,对应着我们现实生活的时间 long t1=System.currentTimeMillis(); 通过寻找熟悉的元素,我们发现,digester...digester.addObjectCreate("Server", "org.apache.catalina.core.StandardServer...digester.parse(inputSource); 今天的server.xml解析并初始化servlet容器 过种就结束啦 最后说两句 前面这些过程以解析和生成对应对象设置环境为主, 后面就真正进入的
/** * 解析server.xml */ protected Digester createStartDigester() { long t1=System.currentTimeMillis...(); // Initialize the digester Digester digester = new Digester(); digester.setValidating...(false); digester.setRulesValidation(true); Map<Class<?..., "className"); digester.addSetProperties("Server"); digester.addSetNext("Server...", "className"); digester.addSetProperties("Server/Service/Executor"); digester.addSetNext
; static { try { digester = MessageDigest.getInstance("MD5"); }catch...* @return 返回md5加密后的十六进制字符串 */ public static String encrypt(String str) { if (digester...str == null || str.length() == 0) { return null; } synchronized (digester...){ try { digester.update(str.getBytes("UTF-8")); String s1...= new BigInteger(1, digester.digest()).toString(16); //补齐BigInteger省略的前置0
开头说两句 小刀博客: https://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上一波,我们一起学习了digester进行servlet.xml的解析和servlet容器的初始化...对每个Context都会去新建一个WebappLoader , 所以说,tomcat中的web应用都是单独的类加载器. digester.addObjectCreate(prefix + "Context...new SetParentClassLoaderRule(parentClassLoader)); addClusterRuleSet(digester..., "Server/Service/Engine/Cluster/"); SetParentClassLoaderRule: 会取出digester当前栈顶的元素,并为栈顶的元素设置类加载器 Container...top = (Container) digester.peek(); top.setParentClassLoader(parentClassLoader); 其中的parentClassLoader
方法创建 Digester 实例,通过调用 Digester 上的 push 方法将当前 Catalina 对象推送到 Digester 内部堆栈,并解析配置文件。...添加到 Digester 的规则将在 "停止 Digester "小节中讨论。...() { // Initialize the digester Digester digester = new Digester(); if (debug...the digester Digester digester = new Digester(); if (debug) digester.setDebug(...与启动Digester不同,停止Digester只对根元素感兴趣。
Digester Digester教程 load initDirs 该方法是用来确保一些与路径相关的环境变量已经设置。...initNaming 一堆环境变量的设置 剩余部分 打开配置文件流: 中间大部分代码都是试图打开conf/server.xml,如果没有,则试图打开server-embed.xml的读入流 用digester...解析输入流: inputSource.setByteStream(inputStream); digester.push(this); digester.parse(inputSource); 设置双向引用...: getServer().setCatalina(this); 其中getServer()返回的server成员变量,在之前用Digester解析 已经生成 重置输入流initStreams 调用
Digester 解析 XML 为了满足将 XML 转换为 JavaBean 的特殊需求,Apache 旗下的一个名为 Digester 的工具为我们提供了这么一个选择。...下面是一个 Digester 解析 XML 的例子片段: 清单 4....Digester 解析 XML // 定义要解析的 XML 的路径,并初始化工具类 File input = new File("books.xml"); Digester digester =...new Digester(); // 如果碰到了 这个标签,应该初始化 test.myBean.Books 这个 JavaBean 并填装相关内容 digester.addObjectCreate...test.myBean.Book 这个 JavaBean digester.addObjectCreate("books/book", "test.myBean.Book"); digester.addSetProperties
digester = new Digester(); digester.parse(new StringReader(body)); // parse xml } catch...xxe vuln code"; } 修复方式 @RequestMapping(value = "/Digester/sec", method = RequestMethod.POST) public...digester = new Digester(); digester.setFeature("http://apache.org/xml/features/disallow-doctype-decl...", true); digester.setFeature("http://xml.org/sax/features/external-general-entities", false)...digester.parse(new StringReader(body)); // parse xml return "Digester xxe security code";
", "className"); digester.addSetProperties("Server"); digester.addSetNext("Server...in the element "className"); digester.addSetProperties("Server/Listener");...", "className"); digester.addSetProperties("Server/Service"); digester.addSetNext...我们从Catalina的load方法开始,当执行到load中的digester.parse(inputSource)时,即跳转到Digester类的parse方法中,之后开始解析server.xml中依次遇到的各个元素...当遇到server元素的时候,在代码中方法的执行顺序为Catalina.load->Digester.parse->Digester.startElement startElement方法如下:
,每个 digester 从 paths channel 读取文件名,并将结果发送给 c。...代码如下: func digester(done <-chan struct{}, paths <-chan string, c chan<- result) { for path := range...没有关闭输出 channel c,因为 多个 digester 在共享这个channel。...关闭操作放到 MD5All 中实现,当所有 digester 运行结束时,MD5All 关闭这个channel。...20 wg.Add(numDigesters) for i := 0; i < numDigesters; i++ { go func() { digester
return; // 只能被加载一次 } loaded = true; initDirs(); // 废弃的方法 // Before digester...- it may be needed initNaming(); // 和JNDI 相关的内容 忽略 // Create and execute our Digester...// 创建并且执行我们的 Digester 对象 Server.xml Digester digester = createStartDigester();...// 省略掉了 Digester文件处理的代码 getServer().setCatalina(this); // Server对象绑定 Catalina对象 getServer...通过Apache下的Digester组件完成了Server.xml文件的解析 通过getServer().init() 方法完成了Server,Service,Engin,Connector等核心组件的初始化操作
: http://jakarta.apache.org]] log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax...SessionListener: contextInitialized() log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax...log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax). log4j:WARN
Creating encryptors and digesters Creating encryptor and digester artifacts with the encryption namespace...There's a tag for each type of encryptor/digester (including some util classes), and each tags is able...-- Registers an org.jasypt.digest.StringDigester--> Again...Let's see some examples: <encryption:string-digester
根据digester构建规则然后在解析server.xml文件的时候根据Host标签解析对应的StandardHost实例,并给其添加规则LifecycleListenerRule,这个规则的作用就是StandardHost...是实例化后会调用addLifecycleListenerHostConfig实例添加到其LifecycleSupport句柄,具体代码执行如下: HostRuleSet.java digester.addObjectCreate...(prefix + "Host"); digester.addRule(prefix + "Host", new CopyParentClassLoaderRule()...", "hostConfigClass")); digester.addSetNext(prefix + "Host", "addChild...String name, Attributes attributes) throws Exception { //获取元素 Container c =(Container) digester.peek
领取专属 10元无门槛券
手把手带您无忧上云