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

该文详细介绍了如何使用DOM4J解析web.xml文件来实例化Servlet。通过解析用户请求的URL,匹配web.xml中的url-pattern,找到对应的servlet-class,然后通过全限定类名创建Servlet实例。文中提供了单个和多个url-pattern的情况,并给出了具体的Java代码示例进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的解析方式

说明1:System.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构造器触发,被实例化

005205c1b87f49f382be0f938b458887.png

 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();
	}
}

【测试结果】

34afa870cdd44bc8a8931a8fb0503a92.png

 2、DOM4j解析xml其他应用

https://blog.youkuaiyun.com/tangshiyilang/article/details/131287825

3、源码下载

https://download.youkuaiyun.com/download/tangshiyilang/87928643

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾林小妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值