Commit 51f72a62 by ClassmateWang

fix(core): HandlerMapping.java

parent abaf93bf
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<project version="4"> <project version="4">
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<annotationProcessing> <annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true"> <profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" /> <sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
......
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SmartFoxProjectConfig">
<option name="projectInspectionClosed" value="true" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
...@@ -11,8 +11,7 @@ import com.wang.servlet.http.HttpServlet; ...@@ -11,8 +11,7 @@ import com.wang.servlet.http.HttpServlet;
public class HelloServlet extends HttpServlet { public class HelloServlet extends HttpServlet {
public static void main(String[] args) { public static void main(String[] args) {
HandlerMapping mapping = new HandlerMapping();
mapping.loadResources("application\\src\\main\\webapp\\WEB-INF\\web.xml");
} }
} }
package com.wang.servlet.core; package com.jeffrey.servlet;
/** /**
* @author: Jeffrey * @author: Jeffrey
* @date: 2022/01/23/10:43 * @date: 2022/01/23/21:27
* @description: * @description:
*/ */
public class XmlDomParser { public class LoginServlet {
} }
...@@ -2,15 +2,29 @@ ...@@ -2,15 +2,29 @@
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
>
<display-name>Archetype Created Web Application</display-name> <display-name>Archetype Created Web Application</display-name>
<servlet> <servlet>
<servlet-name>HelloServlet</servlet-name> <servlet-name>HelloServlet</servlet-name>
<servlet-class></servlet-class> <servlet-class>com.jeffrey.servlet.HelloServlet</servlet-class>
</servlet> </servlet>
<servlet-mapping> <servlet-mapping>
<servlet-name>HelloServlet</servlet-name> <servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern> <url-pattern>/hello</url-pattern>
</servlet-mapping> </servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.jeffrey.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app> </web-app>
...@@ -6,4 +6,9 @@ package com.wang.servlet.core; ...@@ -6,4 +6,9 @@ package com.wang.servlet.core;
* @description: * @description:
*/ */
public class DispatcherServlet { public class DispatcherServlet {
private HandlerMapping handlerMapping;
} }
package com.wang.servlet.core; package com.wang.servlet.core;
import org.w3c.dom.Document; import com.wang.servlet.http.HttpServlet;
import org.w3c.dom.NamedNodeMap; import lombok.extern.slf4j.Slf4j;
import org.w3c.dom.Node; import org.w3c.dom.*;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
...@@ -12,6 +11,8 @@ import javax.xml.parsers.ParserConfigurationException; ...@@ -12,6 +11,8 @@ import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* <p>加载xml 配置文件</p> * <p>加载xml 配置文件</p>
...@@ -21,72 +22,94 @@ import java.util.Map; ...@@ -21,72 +22,94 @@ import java.util.Map;
* @date: 2022/01/23/10:09 * @date: 2022/01/23/10:09
* @description: * @description:
*/ */
@Slf4j
public class HandlerMapping { public class HandlerMapping {
private final String default_xml_path = "src/main/webapp/WEB-INF/web.xml"; private static final String XML_PATH_DEFAULT = "src/main/java/webapp/WEB-INF/web.xml";
private static Map<String, HashMap<String, Class>> mapping = new HashMap<>(); /**
* (映射地址,(name,class))
*/
private final Map<String, NameToClassMapping> mapping = new ConcurrentHashMap<>();
public HandlerMapping(String location) {
loadResources(location);
}
public HandlerMapping() {
loadResources();
}
public void loadResources(String xmlLocation) { /**
* 获取映射对应的Handler的Class文件
* @param mappingPath 映射路径
* @return Handler.class
*/
public Class<HttpServlet> getHandlerClass(String mappingPath){
return mapping.get(mappingPath).getAClass();
}
/**
* 获取映射对应的Handler的名字
* @param mappingPath 映射路径
* @return Handler.servlet-name
*/
public String getHandlerName(String mappingPath){
return mapping.get(mappingPath).getName();
}
private void loadResources(String xmlLocation) {
//创建一个DocumentBuilderFactory的对象 //创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建DocumentBuilder对象 //创建DocumentBuilder对象
DocumentBuilder db = null; DocumentBuilder db = null;
try { try {
db = dbf.newDocumentBuilder(); db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parser方法加载xml文件
Document document = db.parse(xmlLocation); Document document = db.parse(xmlLocation);
//获取所有book节点的集合 //获取某一根节点下的所有标签
NodeList taglist = document.getElementsByTagName("servlet");
//通过taglist的getLength()方法可以获取taglist 的长度 NodeList servletList = document.getElementsByTagName("servlet");
System.out.println("一共有" + taglist.getLength() + "个"); Map<String,Class> nameMapClass = new HashMap<>();
//遍历每一个book节点 for (int i = 0 ; i < servletList.getLength() ; i ++){
for (int i = 0; i < taglist.getLength(); i++) { Element node = (Element) servletList.item(i);
System.out.println("=================下面开始遍历第" + (i + 1) + "本书的内容================="); String nameValue = node.getElementsByTagName("servlet-name")
//通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始 .item(0)
Node servlet = taglist.item(i); .getFirstChild()
//获取book节点的所有属性集合 .getNodeValue();
NamedNodeMap attrs = servlet.getAttributes(); String classValue = node.getElementsByTagName("servlet-class")
System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性"); .item(0)
//遍历book的属性 .getFirstChild()
for (int j = 0; j < attrs.getLength(); j++) { .getNodeValue();
//通过item(index)方法获取book节点的某一个属性 Class clazz = Class.forName(classValue);
Node attr = attrs.item(j); nameMapClass.put(nameValue,clazz);
//获取属性名
System.out.print("属性名:" + attr.getNodeName());
//获取属性值
System.out.println("--属性值" + attr.getNodeValue());
}
//解析book节点的子节点
NodeList childNodes = servlet.getChildNodes();
//遍历childNodes获取每个节点的节点名和节点值
System.out.println("第" + (i + 1) + "本书共有" +
childNodes.getLength() + "个子节点");
for (int k = 0; k < childNodes.getLength(); k++) {
//区分出text类型的node以及element类型的node
if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
//获取了element类型节点的节点名
System.out.print("第" + (k + 1) + "个节点的节点名:"
+ childNodes.item(k).getNodeName());
//获取了element类型节点的节点值
System.out.println("--节点值是:" + childNodes.item(k).getFirstChild().getNodeValue());
//System.out.println("--节点值是:" + childNodes.item(k).getTextContent());
}
} }
System.out.println("======================结束遍历第" + (i + 1) + "本书的内容=================");
NodeList servletMappingList = document.getElementsByTagName("servlet-mapping");
for (int i = 0 ; i < servletMappingList.getLength() ; i++){
Element node = (Element) servletMappingList.item(i);
String nameValue = node.getElementsByTagName("servlet-name")
.item(0)
.getFirstChild()
.getNodeValue();
String urlValue = node.getElementsByTagName("url-pattern")
.item(0)
.getFirstChild()
.getNodeValue();
mapping.put(urlValue,new NameToClassMapping(nameValue,nameMapClass.get(nameValue)));
} }
} catch (ParserConfigurationException e) { } catch (ParserConfigurationException | IOException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} catch (SAXException e) { } catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public void loadResources () { private void loadResources () {
loadResources(default_xml_path); loadResources(XML_PATH_DEFAULT);
} }
} }
package com.wang.servlet.core;
/**
* @author: Jeffrey
* @date: 2022/01/23/22:23
* @description:
*/
public class HandlerMappingFactory {
private static HandlerMapping handlerMapping = new HandlerMapping();
/**
* @return 默认配置的xml
*/
public static HandlerMapping getHandlerMapping(){
return handlerMapping;
}
}
package com.wang.servlet.core;
import com.wang.servlet.http.HttpServlet;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author: Jeffrey
* @date: 2022/01/23/22:40
* @description:
*/
@AllArgsConstructor
@Data
public class NameToClassMapping {
private String name;
private Class<HttpServlet> aClass;
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<!--输出目的地配置-->
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!-- %d{格式 yyyy-MM-dd HH:mm:ss,SSS} 时间
%c 全限定类名
%highlight{%d-5level} 输出打印优先级{颜色类型}
%style{[%t]} 对线程名添加风格{bright,magenta}
%L 行数
%M 调用logger 的方法名
-->
<PatternLayout pattern="%d{HH:mm:ss} %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} %style{[%t]}{bright,magenta} %style{%c{1.}.%M(%L)}{cyan}->>> %msg%n"/>
</Console>
</appenders>
<loggers>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<!--输出目的地配置-->
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!-- %d{格式 yyyy-MM-dd HH:mm:ss,SSS} 时间
%c 全限定类名
%highlight{%d-5level} 输出打印优先级{颜色类型}
%style{[%t]} 对线程名添加风格{bright,magenta}
%L 行数
%M 调用logger 的方法名
-->
<PatternLayout pattern="%d{HH:mm:ss} %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} %style{[%t]}{bright,magenta} %style{%c{1.}.%M(%L)}{cyan}->>> %msg%n"/>
</Console>
</appenders>
<loggers>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment