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构造器触发,被实例化
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