Commit abaf93bf by ClassmateWang

feat(core): HandlerMapping.java

parents
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="application" />
<module name="base" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AliAccessStaticViaInstance" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliArrayNamingShouldHaveBracket" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AliControlFlowStatementWithoutBraces" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliDeprecation" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AliEqualsAvoidNull" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AliLongLiteralsEndingWithLowercaseL" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliMissingOverrideAnnotation" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AliWrapperTypeEquality" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidCallStaticSimpleDateFormat" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidCommentBehindStatement" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidComplexCondition" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidConcurrentCompetitionRandom" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidDoubleOrFloatEqualCompare" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidManuallyCreateThread" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidMissUseOfMathRandom" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidNegationOperator" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidNewDateGetTime" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidPatternCompileInMethod" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidReturnInFinally" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidStartWithDollarAndUnderLineNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaAvoidUseTimer" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaBigDecimalAvoidDoubleConstructor" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaBooleanPropertyShouldNotStartWithIs" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaClassCastExceptionWithSubListToArrayList" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaClassCastExceptionWithToArray" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaClassMustHaveAuthor" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaClassNamingShouldBeCamel" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaCollectionInitShouldAssignCapacity" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaCommentsMustBeJavadocFormat" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaConcurrentExceptionWithModifyOriginSubList" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaConstantFieldShouldBeUpperCase" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaCountDownShouldInFinally" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaDontModifyInForeachCircle" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaEnumConstantsMustHaveComment" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaExceptionClassShouldEndWithException" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaIbatisMethodQueryForList" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaLockShouldWithTryFinally" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaLowerCamelCaseVariableNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaMethodReturnWrapperType" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaMethodTooLong" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPackageNaming" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPojoMustOverrideToString" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPojoMustUsePrimitiveField" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaPojoNoDefaultValue" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaRemoveCommentedCode" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaServiceOrDaoClassShouldEndWithImpl" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaStringConcat" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaSwitchStatement" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaTestClassShouldEndWithTestNaming" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaThreadLocalShouldRemove" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaThreadPoolCreation" enabled="false" level="BLOCKER" enabled_by_default="false" />
<inspection_tool class="AlibabaThreadShouldSetName" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaTransactionMustHaveRollback" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaUndefineMagicConstant" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaUnsupportedExceptionWithModifyAsList" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="AlibabaUseQuietReferenceNotation" enabled="false" level="MAJOR" enabled_by_default="false" />
<inspection_tool class="AlibabaUseRightCaseForDateFormat" enabled="false" level="CRITICAL" enabled_by_default="false" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="date,author,description,description:,date:,author:" />
</inspection_tool>
<inspection_tool class="MapOrSetKeyShouldOverrideHashCodeEquals" enabled="false" level="CRITICAL" enabled_by_default="false" />
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_13" default="true" project-jdk-name="13" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>socket_application</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>application</artifactId>
<properties>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>com.wang</groupId>-->
<!-- <artifactId>base</artifactId>-->
<!-- <version>1.0-SNAPSHOT</version>-->
<!-- </dependency>-->
</dependencies>
</project>
\ No newline at end of file
package com.jeffrey.servlet;
import com.wang.servlet.core.HandlerMapping;
import com.wang.servlet.http.HttpServlet;
/**
* @author: Jeffrey
* @date: 2022/01/23/11:10
* @description:
*/
public class HelloServlet extends HttpServlet {
public static void main(String[] args) {
HandlerMapping mapping = new HandlerMapping();
mapping.loadResources("application\\src\\main\\webapp\\WEB-INF\\web.xml");
}
}
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>socket_application</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.wang</groupId>
<artifactId>base</artifactId>
<properties>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
</project>
\ No newline at end of file
package com.wang.servlet.constant;
/**
* @author: Jeffrey
* @date: 2022/01/23/9:19
* @description:
*/
public class HttpRequestHeaderKeyConstant {
public static final String CONTENT_TYPE = "content-type";
public static final String CONTENT_LENGTH = "content-length";
public static final String CONNECTION = "connection";
public static final String HOST ="host";
public static final String REFERER ="referer";
}
package com.wang.servlet.core;
/**
* @author: Jeffrey
* @date: 2022/01/23/10:07
* @description:
*/
public class DispatcherServlet {
}
package com.wang.servlet.core;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* <p>加载xml 配置文件</p>
* <p>将映射关系加载到内存</p>
*
* @author: Jeffrey
* @date: 2022/01/23/10:09
* @description:
*/
public class HandlerMapping {
private final String default_xml_path = "src/main/webapp/WEB-INF/web.xml";
private static Map<String, HashMap<String, Class>> mapping = new HashMap<>();
public void loadResources(String xmlLocation) {
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建DocumentBuilder对象
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parser方法加载xml文件
Document document = db.parse(xmlLocation);
//获取所有book节点的集合
NodeList taglist = document.getElementsByTagName("servlet");
//通过taglist的getLength()方法可以获取taglist 的长度
System.out.println("一共有" + taglist.getLength() + "个");
//遍历每一个book节点
for (int i = 0; i < taglist.getLength(); i++) {
System.out.println("=================下面开始遍历第" + (i + 1) + "本书的内容=================");
//通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始
Node servlet = taglist.item(i);
//获取book节点的所有属性集合
NamedNodeMap attrs = servlet.getAttributes();
System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性");
//遍历book的属性
for (int j = 0; j < attrs.getLength(); j++) {
//通过item(index)方法获取book节点的某一个属性
Node attr = attrs.item(j);
//获取属性名
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) + "本书的内容=================");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void loadResources () {
loadResources(default_xml_path);
}
}
package com.wang.servlet.core;
/**
* @author: Jeffrey
* @date: 2022/01/23/10:43
* @description:
*/
public class XmlDomParser {
}
package com.wang.servlet.http;
import lombok.Data;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author: Jeffrey
* @date: 2022/01/23/8:19
* @description:
*/
public abstract class AbstractAttribute {
private Map<String,Object> attribute = new ConcurrentHashMap<>();
public Object getAttribute(String key){
return attribute.get(key);
}
public void setAttribute(String key,Object value){
attribute.put(key,value);
}
}
package com.wang.servlet.http;
/**
* @author: Jeffrey
* @date: 2022/01/22/21:51
* @description:
*/
public interface Http {
/**
* map中获取值
* @param key 键
* @return 值
*/
public Object getAttribute(String key);
/**
* 设置键值对
* @param key 键
* @param value 值
*/
public void setAttribute(String key,Object value);
}
package com.wang.servlet.http;
/**
* @author: Jeffrey
* @date: 2022/01/22/21:15
* @description:
*/
public class HttpServlet extends AbstractAttribute implements Http{
}
package com.wang.servlet.http;
import java.io.InputStream;
import java.util.Map;
import java.util.Set;
/**
* @author: Jeffrey
* @date: 2022/01/22/21:06
* @description:
*/
public interface HttpServletRequest extends Http {
/**
* 获取Http请求的Method类型
* @return method str
*/
public String getMethod();
/**
* 获取全路径
* @return uri path
*/
public String getRequestURI();
/**
* 获取除去域名/端口号的URL
* @return url path
*/
public String getRequestUrl();
/**
* 获取会话对象
* @return HttpSession 对象
*/
public HttpSession getSession();
/**
* 获取Http 请求的头部
* @return Http 头部映射
*/
public Map<String,String> getHeaders();
/**
* 根据var 获取指定的Http头部请求参数
* @param var key
* @return value
*/
public String getHeader(String var);
/**
* 获取Http 请求数据流
* @return http请求体的数据流
*/
public InputStream getInputStream();
/**
* 获取数据传输类型
* @return ContentTypeConstant类型
*/
public String getContentType();
/**
* 获取url 中封装的数据
* @param key 键
* @return value
*/
public Object getParameter(String key);
/**
* 获取所有的parameter 的键的Set
* @return HashSet
*/
public Set<String> getParameterNames();
}
package com.wang.servlet.http;
import com.wang.servlet.message.HttpMessage;
import io.netty.channel.Channel;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Map;
import java.util.Set;
import static io.netty.handler.codec.http.HttpHeaderNames.*;
/**
* @author: Jeffrey
* @date: 2022/01/23/8:18
* @description:
*/
public class HttpServletRequestWrapper extends AbstractAttribute implements HttpServletRequest {
private String method;
private String url;
private String uri;
private Map<String,String> headers;
private Channel socketChannel;
private HttpMessage message;
private Map<String,Object> parameters;
private HttpSession httpSession;
public HttpServletRequestWrapper(String method,
String url,
String uri,
Map<String, String> headers,
Channel socketChannel,
HttpMessage message,
Map<String, Object> parameters,
HttpSession httpSession) {
this.method = method;
this.url = url;
this.uri = uri;
this.headers = headers;
this.socketChannel = socketChannel;
this.message = message;
this.parameters = parameters;
this.httpSession = httpSession;
}
@Override
public String getMethod() {
return this.method;
}
@Override
public String getRequestURI() {
return this.uri;
}
@Override
public String getRequestUrl() {
return this.url;
}
@Override
public HttpSession getSession() {
return this.httpSession;
}
@Override
public Map<String, String> getHeaders() {
return this.headers;
}
@Override
public String getHeader(String var) {
return headers.get(var);
}
@Override
public InputStream getInputStream() {
ByteArrayInputStream inputStream = new ByteArrayInputStream(message.getBytes());
return inputStream;
}
@Override
public String getContentType() {
return this.headers.get(CONTENT_TYPE);
}
@Override
public Object getParameter(String key) {
return this.parameters.get(key);
}
@Override
public Set<String> getParameterNames() {
return this.parameters.keySet();
}
}
package com.wang.servlet.http;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* @author: Jeffrey
* @date: 2022/01/22/21:06
* @description:
*/
public interface HttpServletResponse {
public void setHeader(String name, String value);
public void addHeader(String name, String value);
public void setStatus(int sc);
public String getCharacterEncoding();
public String getContentType();
public OutputStream getOutputStream() throws IOException;
public PrintWriter getWriter() throws IOException;
public void setCharacterEncoding(String charset);
public void setContentLength(int len);
public void setContentType(String type);
}
package com.wang.servlet.http;
import java.nio.channels.Channel;
/**
* @author: Jeffrey
* @date: 2022/01/22/21:25
* @description:
*/
public interface HttpSession extends Http {
/**
* 绑定会话
* @param channel 哪个 channel 要绑定会话
* @param username 会话绑定用户
*/
void bind(Channel channel, String username);
/**
* 解绑会话
* @param channel 哪个 channel 要解绑会话
*/
void unbind(Channel channel);
/**
* 根据用户名获取 channel
* @param username 用户名
* @return channel
*/
Channel getChannel(String username);
}
package com.wang.servlet.http;
/**
* @author: Jeffrey
* @date: 2022/01/23/10:02
* @description:
*/
public class HttpSessionFactory {
private static HttpSession session = new HttpSessionImpl();
public static HttpSession getSession(){
return session;
}
}
package com.wang.servlet.http;
import java.nio.channels.Channel;
/**
* @author: Jeffrey
* @date: 2022/01/23/10:02
* @description:
*/
public class HttpSessionImpl implements HttpSession {
@Override
public Object getAttribute(String key) {
return null;
}
@Override
public void setAttribute(String key, Object value) {
}
@Override
public void bind(Channel channel, String username) {
}
@Override
public void unbind(Channel channel) {
}
@Override
public Channel getChannel(String username) {
return null;
}
}
package com.wang.servlet.message;
import com.wang.servlet.http.HttpSession;
import io.netty.channel.Channel;
import com.wang.servlet.http.HttpServletRequestWrapper;
import com.wang.servlet.http.HttpSessionFactory;
import java.util.HashMap;
import java.util.Map;
import static com.wang.servlet.constant.HttpRequestHeaderKeyConstant.*;
/**
* @author: Jeffrey
* @date: 2022/01/23/9:30
* @description:
*/
public class HttpConvert {
private Channel channel;
public HttpConvert(Channel channel) {
this.channel = channel;
}
public HttpServletRequestWrapper convertToRequest(HttpMessage httpMessage){
String method;
String url;
String license;
Map<String,Object> parameterMap = new HashMap<>();
Map<String,String> map;
String uri;
String host;
String connection;
String contentType;
String contentLength;
String body;
HttpSession session = HttpSessionFactory.getSession();
/*请求行解析*/
String line = httpMessage.getLine();
String[] lineSplit = line.split(" ");
method = lineSplit[0];
url = lineSplit[1];
license = lineSplit[2];
/*/login/login?hai=222&li=555*/
String[] urlSplit = url.split("/?");
if(urlSplit.length > 1){
String[] paramSplit = urlSplit[1].split("&");
for (String s :paramSplit){
String[] array = s.split("=");
parameterMap.put(array[0],array[1]);
}
}
/*请求头解析*/
map = httpMessage.getHeader();
host = map.get(HOST);
connection = map.get(CONNECTION);
contentType = map.get(CONTENT_TYPE);
contentLength = map.get(CONTENT_LENGTH);
uri = map.get(REFERER) == null ? host + url : map.get(REFERER);
/*请求体解析*/
body = httpMessage.getBody();
HttpServletRequestWrapper httpRequest =
new HttpServletRequestWrapper(method,
url,
uri,
map,
channel,
httpMessage,
parameterMap,
session
);
return httpRequest;
}
}
package com.wang.servlet.message;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
* @author: Jeffrey
* @date: 2022/01/22/22:29
* @description:
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class HttpMessage {
/**
* 请求行和响应行
*/
private String line;
/**
* 请求头和响应头
*/
private Map<String,String> header;
/**
* 分隔符
*/
private final byte[] separator = "\r\n".getBytes(StandardCharsets.UTF_8);
/**
* 请求体和响应体
*/
private String body;
/**
* 请求体数据流
*/
private byte[] bytes;
}
package com.wang.servlet.message;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import io.netty.util.CharsetUtil;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author: Jeffrey
* @date: 2022/01/22/22:46
* @description: Http 协议解析类, 行,头,体
*/
public class HttpMessageCodecSharable extends MessageToMessageCodec<ByteBuf,HttpMessage> {
@Override
protected void encode(ChannelHandlerContext ctx, HttpMessage msg, List<Object> out) throws Exception {
/*这里需要自己创建ByteBuf*/
ByteBuf buffer = ctx.alloc().buffer();
buffer.writeBytes(msg.getLine().getBytes(StandardCharsets.UTF_8));
buffer.writeBytes(msg.getSeparator());
Map<String,String> map = msg.getHeader();
for (String name: map.keySet()){
buffer.writeBytes(name.getBytes(StandardCharsets.UTF_8));
/*0x3A = :*/
buffer.writeByte(0x3A);
buffer.writeBytes(map.get(name).getBytes(StandardCharsets.UTF_8));
buffer.writeBytes(msg.getSeparator());
}
/*分隔符*/
buffer.writeBytes(msg.getSeparator());
buffer.writeBytes(msg.getBody().getBytes(StandardCharsets.UTF_8));
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
String s = msg.toString(CharsetUtil.UTF_8);
HttpMessage message = new HttpMessage();
Map<String,String> map = new HashMap<>();
String[] split = s.split("\r\n");
message.setLine(split[0]);
int i = 1;
while (i < split.length-1 && !split[i].equals("") ){
String[] strings = split[i].split(":");
if (strings[0].toLowerCase().equals("host")){
strings[1] = strings[1] + ":" +strings[2];
}
map.put(strings[0],strings[1]);
i++;
}
message.setHeader(map);
message.setBody(split[split.length-1]);
/*请求体字节流*/
message.setBytes(message.getBody().getBytes(StandardCharsets.UTF_8));
out.add(message);
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
/**
* @author: Jeffrey
* @date: 2022/01/22/21:11
* @description:
*/
public class TestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = (String) req.getAttribute("username");
super.doPost(req, resp);
}
}
#Generated by Maven
#Sun Jan 23 10:55:20 CST 2022
groupId=com.wang
artifactId=base
version=1.0-SNAPSHOT
com\wang\servlet\core\HandlerMapping.class
com\wang\servlet\message\HttpMessage.class
com\wang\servlet\http\HttpServlet.class
com\wang\servlet\message\HttpConvert.class
com\wang\servlet\http\HttpSession.class
com\wang\servlet\http\HttpServletRequestWrapper.class
com\wang\servlet\http\AbstractAttribute.class
com\wang\servlet\http\HttpSessionImpl.class
com\wang\servlet\http\HttpSessionFactory.class
com\wang\servlet\http\Http.class
com\wang\servlet\message\HttpMessageCodecSharable.class
com\wang\servlet\core\XmlDomParser.class
com\wang\servlet\http\HttpServletRequest.class
com\wang\servlet\http\HttpServletResponse.class
com\wang\servlet\core\DispatcherServlet.class
com\wang\servlet\constant\HttpRequestHeaderKeyConstant.class
F:\Code\socket_application\base\src\main\java\com\wang\servlet\core\XmlDomParser.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\AbstractAttribute.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpSession.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\Http.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpServletRequest.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpSessionImpl.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\core\DispatcherServlet.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\message\HttpMessage.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpServlet.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpServletRequestWrapper.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\constant\HttpRequestHeaderKeyConstant.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\core\HandlerMapping.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\message\HttpMessageCodecSharable.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpSessionFactory.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\http\HttpServletResponse.java
F:\Code\socket_application\base\src\main\java\com\wang\servlet\message\HttpConvert.java
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite tests="0" failures="0" name="TestServlet" time="0" errors="0" skipped="0">
<properties>
<property name="idea.version" value="2021.3"/>
<property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
<property name="java.vm.version" value="13.0.1+9"/>
<property name="sun.boot.library.path" value="D:\codingSoft\jdk\jdk-13.0.1\bin"/>
<property name="maven.multiModuleProjectDirectory" value="F:\Code\socket_application\base"/>
<property name="java.vm.vendor" value="Oracle Corporation"/>
<property name="java.vendor.url" value="https://java.oracle.com/"/>
<property name="guice.disable.misplaced.annotation.check" value="true"/>
<property name="path.separator" value=";"/>
<property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
<property name="sun.os.patch.level" value=""/>
<property name="user.script" value=""/>
<property name="user.country" value="CN"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="user.dir" value="F:\Code\socket_application\base"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="java.runtime.version" value="13.0.1+9"/>
<property name="os.arch" value="amd64"/>
<property name="java.io.tmpdir" value="C:\Users\97337\AppData\Local\Temp\"/>
<property name="line.separator" value="
"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="user.variant" value=""/>
<property name="os.name" value="Windows 10"/>
<property name="maven.ext.class.path" value="D:\codingSoft\JetbrainsToolBox\apps\IDEA-U\ch-0\213.5744.223\plugins\maven\lib\maven-event-listener.jar"/>
<property name="classworlds.conf" value="D:\codingSoft\maven\apache-maven-3.3.9\apache-maven-3.3.9\bin\m2.conf"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.library.path" value="D:\codingSoft\jdk\jdk-13.0.1\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\codingSoft\jdk\jdk-13.0.1\bin;D:\codingSoft\jdk\jdk-13.0.1\jre\bin;D:\codingSoft\maven\apache-maven-3.3.9\apache-maven-3.3.9\bin;D:\codingSoft\git\Git\cmd;C:\Users\97337\AppData\Local\Microsoft\WindowsApps;D:\codingSoft\adb;C:\Users\97337\AppData\Local\Microsoft\WindowsApps;D:\日常应用\BandZiP\;D:\codingSoft\vscode\Microsoft VS Code\bin;."/>
<property name="jdk.debug" value="release"/>
<property name="java.class.version" value="57.0"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="os.version" value="10.0"/>
<property name="user.home" value="C:\Users\97337"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.specification.version" value="13"/>
<property name="user.name" value="97337"/>
<property name="java.class.path" value="D:\codingSoft\maven\apache-maven-3.3.9\apache-maven-3.3.9\boot\plexus-classworlds-2.5.2.jar"/>
<property name="java.vm.specification.version" value="13"/>
<property name="sun.arch.data.model" value="64"/>
<property name="sun.java.command" value="org.codehaus.classworlds.Launcher -Didea.version=2021.3 -s D:\codingSoft\maven\apache-maven-3.3.9\apache-maven-3.3.9\conf\settings.xml install"/>
<property name="java.home" value="D:\codingSoft\jdk\jdk-13.0.1"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="java.version" value="13.0.1"/>
<property name="java.vendor" value="Oracle Corporation"/>
<property name="maven.home" value="D:\codingSoft\maven\apache-maven-3.3.9\apache-maven-3.3.9"/>
<property name="file.separator" value="\"/>
<property name="java.version.date" value="2019-10-15"/>
<property name="java.vendor.url.bug" value="https://bugreport.java.com/bugreport/"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="sun.cpu.endian" value="little"/>
<property name="sun.cpu.isalist" value="amd64"/>
</properties>
</testsuite>
\ No newline at end of file
-------------------------------------------------------------------------------
Test set: TestServlet
-------------------------------------------------------------------------------
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>socket_application</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>base</module>
<module>application</module>
</modules>
<properties>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.wang</groupId>
<artifactId>base</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--SLF4J+log4j 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.39.Final</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!---->
</dependencies>
</project>
\ 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