DOM4J解析web.xml文件,实例化Servlet

news2024/11/26 13:27:40

1、DOM4J解析web.xml文件实例化Servlet

原理分析:我们解析用户在地址栏中输入的地址信息如add.do,用这个地址去web.xml文件中通过DOM4J技术,解析判断add.do对应的是哪个url-pattern,找到后获取对应的servlet-name。在用这个servlet-name去找到对应额servlet-class。使用类的全限定实现servlet的实例化。

特殊说明:在web.xml中,Servlet的配置文件url-pattern可以写一个也可以写多个,在解析的时候需要考虑到单个或多个的情况。

1.2、创建类模拟servlet

包名:com.it.servlet

public class AddServlet {
	public AddServlet(){
		System.out.println("===========AddServlet被实例化==========");
	}
}

1.2、创建测试使用的web.xml配置文件

将需要解析的web.xml配置文件放在工程的src目录下,案例中使用的Eclipse开发工具,如果使用maven工程或者idea工程,可以将配置放置在resources目录中都可以。

    其中add.do是真是存在的,upd.do和delete.do是不存在的,仅作为模拟数据使用。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>AddServlet</servlet-name>
    <servlet-class>com.it.servlet.AddServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AddServlet</servlet-name>
    <url-pattern>/add.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>UpdServlet</servlet-name>
    <servlet-class>com.it.servlet.UpdServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UpdServlet</servlet-name>
    <url-pattern>/upd.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>DeleteServlet</servlet-name>
    <servlet-class>com.it.servlet.DeleteServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DeleteServlet</servlet-name>
    <url-pattern>/delete.do</url-pattern>
  </servlet-mapping>
  
</web-app>

1.3、解析web.xml-只有一个url-pattern的解析方式

说明1System.getProperty("user.dir")获取运行项目的路径

【测试代码】

package com.it.test;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class TestParseWebXML {
	public static void main(String[] args) throws Exception{
		 String url="/add.do";
		   SAXReader reader=new SAXReader();
		   File file=new File(System.getProperty("user.dir")+"//src//web.xml");
	       Document doc=reader.read(file);
		   //得到xml的跟节点
		   Element root= doc.getRootElement();
		   //通过跟节点得到子节点
		   List<Element> elements= root.elements();
		   String servletName="";
		   //寻找第一个参数:通过url找到对应的servlet-name的值
		   for (Element eles:elements) {
			  //判断进入servlet-mapping元素中,此时web.xml有多个servlet-mapping
			  if(eles.getName().equals("servlet-mapping")){
				  //判断servlet-mapping中的url-pattern的值url参数相等
				  if(eles.elementText("url-pattern").equals(url)){
					  //如果条件满足,就获取对应的servlet-name的值
					  servletName=eles.elementText("servlet-name");
				  }
			  }
		   }
		 //寻找第二个参数:通过servlet-name找到对应的servlet-class的值
		   String servletClass="";
		   for (Element eles:elements) {
				  //先进入到servlet元素中,此时有多个servlet元素
				  if(eles.getName().equals("servlet")){
					  //判断servlet-name是否与上面的servletName相等
					  if(eles.elementText("servlet-name").equals(servletName)){
						  //如果条件满足,获取servlet-class的值
						  servletClass=eles.elementText("servlet-class");
					  }
				  }
			   }
		   //通过servletClass的全限定类名实现类的实例化
		   Class.forName(servletClass).newInstance();
	}
}

【测试结果】

AddServlet构造器触发,被实例化

 1.4、解析web.xml-有多个url-pattern的解析方式

【对应的servlet-mapping配置】

<servlet-mapping>
  <servlet-name>AddServlet</servlet-name>
  <url-pattern>/add.do</url-pattern>
  <url-pattern>/add1.do</url-pattern>
  <url-pattern>/add2.do</url-pattern>
  <url-pattern>/add3.do</url-pattern>
</servlet-mapping>

1.5、具体解析方式

说明1:我们此时设置url的值为add2.do

【代码测试】

package com.it.test;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * dom4j,模拟解析web.xml配置文件。
 * @author Administrator
 *
 */
public class TestParseWebXML {
	public static void main(String[] args) throws Exception{
		 String url="/add2.do";
		   SAXReader reader=new SAXReader();
		   File file=new File(System.getProperty("user.dir")+"//src//web.xml");
	       Document doc=reader.read(file);
		   //得到xml的跟节点
		   Element root= doc.getRootElement();
		   //通过跟节点得到子节点
		   List<Element> elements= root.elements();
		   String servletName="";
		   //寻找第一个参数:通过url找到对应的servlet-name的值
	       for (Element eles:elements) {
				if(eles.getName().equals("servlet-mapping")){
					//得到当前的servlet-mapping元素下的子元素(serlvet-name,url-pattern)
					List<Element> urlpattern=eles.elements();
                     用来遍历一个servlet-mapping中的多个url-pattern
					for (Element e:urlpattern) {
						if(e.getName().equals("url-pattern")){
							if(e.getText().equals(url)){//第一次/add.do;第二次/add1.do....
								servletName=eles.elementText("servlet-name");
							}
						}
					}
				}
		   }
		   //寻找第一个参数:通过servlet-name找到对应的servlet-class的值
		   String servletClass="";
		   for (Element eles:elements) {
				  //先进入到servlet元素中,此时有多个servlet元素
				  if(eles.getName().equals("servlet")){
					  //判断servlet-name是否与上面的servletName相等
					  if(eles.elementText("servlet-name").equals(servletName)){
						  //如果条件满足,获取servlet-class的值
						  servletClass=eles.elementText("servlet-class");
					  }
				  }
			   }
		   //通过servletClass的全限定类名实现类的实例化
		   Class.forName(servletClass).newInstance();
	}
}

【测试结果】

 2、DOM4j解析xml其他应用

https://blog.csdn.net/tangshiyilang/article/details/131287825

3、源码下载

https://download.csdn.net/download/tangshiyilang/87928643

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

servlet规范过滤器

我们可以把servlet程序看作是一个最终要执行的目标。我们可以使用过滤器filter来添加过滤代码&#xff0c;这个过滤代码可以添加到servlet执行之前&#xff0c;也可以添加到servlet执行之后。Filter可以做到在servlet这个目标程序执行之前过滤&#xff0c;也可以在目标程序执行…

【深度学习】BERT变种—百度ERNIE 3.0

预训练的模型在各种自然语言处理&#xff08;NLP&#xff09;任务中取得了最先进的成果。扩大预训练语言模型的规模可以提高其泛化能力。然而&#xff0c;现有的大规模预训练模型&#xff0c;主要依赖纯文本学习&#xff0c;缺乏大规模知识指导学习&#xff0c;模型能力存在局限…

尚硅谷大数据Flink1.17实战教程-笔记02【部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

pycharm-设置python文件模板及常用的模板内容使用

pycharm设置文件和代码&#xff08;File and Code Templates&#xff09;模板步骤如下&#xff1a; 1.pycharm工具栏"file"->"Settings"->"Editor"->"Code Style"->"File and Code Templates",点击右侧python …

Badboy内置浏览器,提示脚本错误解决方法

Badboy内置浏览器&#xff0c;提示脚本错误解决方法 使用Badboy录制脚本的时候&#xff0c;浏览器弹框提示 “&#xff01;当前页面的脚本发生错误。” 使用Badboy录制脚本的时候&#xff0c;弹框提示“当前页面的脚本发生错误” 解决方案1&#xff1a;在弹窗中选中不再弹出…

Java IO 学习总结(三)BufferedInputStream 缓冲流

Java IO 学习总结&#xff08;一&#xff09;输入流/输出流 Java IO 学习总结&#xff08;二&#xff09;File 类 Java IO 学习总结&#xff08;三&#xff09;BufferedInputStream 前言&#xff1a; 学习IO流&#xff0c;记录并分享。文章如有错误&#xff0c;恳请指正。 B…

云上使用 Stable Diffusion ,模型数据如何共享和存储

随着人工智能技术的爆发&#xff0c;内容生成式人工智能&#xff08;AIGC&#xff09;成为了当下热门领域。除了 ChatGPT 之外&#xff0c;文本生成图像技术更令人惊艳。 Stable Diffusion&#xff0c;是一款开源的深度学习模型。与 Midjourney 提供的直接将文本转化为图像的服…

基于JAVA的心理咨询预约系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 心理健康在现代社会中…

vue js vue3 uniapp日期操作工具类组件,格式化、加减日月年

官网文档 官网&#xff1a;https://momentjs.com/ 文档&#xff1a;https://momentjs.com/docs/ 安装 npm install moment -s全局引用 import moment from moment;//uniapp vue3 全局引用 app.config.globalProperties.$moment moment;日期格式 示例&#xff1a;YYYY-MM-…

Unity3d_shader_Outline()

1、[Unity] 引入“全局轮廓”&#xff0c;只需附加组件即可使用轮廓着色器 【Unity】コンポーネントをアタッチするだけでアウトラインシェーダが使用できる「Global Outline」紹介 - コガネブログ 下载&#xff1a;https://github.com/rickomax/globaloutline 2、[Unity] 綺…

latent-diffusion model环境配置,这可能是你能够找到的最细的博客了

文章目录 前言一、环境配置1.创建requirement.txt文件2.提前从Github上下载好taming-transformers和clip3.创建conda环境&#xff0c;并安装requirement.txt文件4.安装torch 1.85.本地下载Bert模型权重&#xff0c;修改加载Bert的代码6.测试环境 2.训练自己的LDM模型 前言 最近…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…

使用了并发工具类库,线程安全就高枕无忧了吗?

1、说明 在代码审核讨论的时候&#xff0c;我们有时会听到有关线程安全和并发工具的一些片面的观点和结论&#xff0c;比如“把 HashMap 改为 ConcurrentHashMap&#xff0c;就可以解决并发问题了呀”&#xff0c;“要不我们试试无锁的 CopyOnWriteArrayList 吧&#xff0c;性能…

并发线程 (2) - C++线程间共享数据【详解:如何使用锁操作】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 快乐在于态度&#xff0c;成功在于细节&#xff0c;命运在于习惯。 Happiness lies in the attitude, s…

【机器学习】——神经网络与深度学习

目录 引入 一、神经网络及其主要算法 1、前馈神经网络 2、感知器 3、三层前馈网络&#xff08;多层感知器MLP&#xff09; 4、反向传播算法 二、深度学习 1、自编码算法AutorEncoder 2、自组织编码深度网络 ①栈式AutorEncoder自动编码器 ②Sparse Coding稀疏编码 …

(一)OC对象本质---内存布局

Apple OSS Distributions GitHubApple Open Source 开源源码链接 面试题1 一个NSObject对象占用多少内存&#xff1f; 系统分配了16个字节给NSObject对象&#xff08;通过malloc_size函数获得&#xff09; ​​​​​​​但NSObject对象内部只使用了8个字节的空间&#xf…

【状态估计】粒子滤波器、Σ点滤波器和扩展/线性卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

推荐一些简单却很实用的工具,快收藏起来吧

第一个工具&#xff1a;remove.bg 这是一个在线抠图的神器&#xff0c;它能够帮助你轻松地消除图片中的背景。相信很多人都知道&#xff0c;手动抠图真的很累&#xff0c;抠着抠着就会觉得烦躁。但是&#xff0c;使用这个神器&#xff0c;你只需要点击上传图片&#xff0c;就能…

Git安装与使用方法入门

目录 Git简介 Git下载与安装 Git配置环境变量 Git使用方法入门 Git简介 Git是一个帮助开发者追踪代码变化和团队协作的工具。它记录了代码修改的历史&#xff0c;并允许回到过去的版本。开发者可以创建分支来独立开发新功能&#xff0c;而不影响主代码。团队成员可以共享代…