Browse Source

1117 完善手写tomcat

Demi 6 months ago
parent
commit
b245176eb9

+ 0 - 124
.idea/uiDesigner.xml

@@ -1,124 +0,0 @@
-<?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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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.svg" 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>

+ 0 - 6
.idea/vcs.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>

+ 2 - 2
.idea/.gitignore → Java0715/.idea/.gitignore

@@ -1,7 +1,7 @@
-# Default ignored files
+# 默认忽略的文件
 /shelf/
 /workspace.xml
-# Editor-based HTTP Client requests
+# 基于编辑器的 HTTP 客户端请求
 /httpRequests/
 # Datasource local storage ignored files
 /dataSources/

+ 0 - 0
.idea/compiler.xml → Java0715/.idea/compiler.xml


+ 0 - 1
.idea/encodings.xml → Java0715/.idea/encodings.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="Encoding">
-    <file url="file://$PROJECT_DIR$/game.dat" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
   </component>

+ 5 - 5
.idea/jarRepositories.xml → Java0715/.idea/jarRepositories.xml

@@ -1,11 +1,6 @@
 <?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" />
@@ -16,5 +11,10 @@
       <option name="name" value="JBoss Community repository" />
       <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
   </component>
 </project>

+ 1 - 3
.idea/misc.xml → Java0715/.idea/misc.xml

@@ -8,7 +8,5 @@
       </list>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/out" />
-  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK" />
 </project>

+ 1 - 2
Java0715/src/main/java/com/sf/javase/day14/MyLinkedList.java

@@ -1,7 +1,6 @@
 package com.sf.javase.day14;
 
-import org.junit.jupiter.api.Test;
-import org.omg.CORBA.portable.ValueOutputStream;
+
 
 import java.util.StringJoiner;
 

+ 3 - 2
lesson/src/com/sf/tomcat/my/HelloServlet.java

@@ -5,6 +5,7 @@ import com.sf.tomcat.Response;
 import java.io.OutputStream;
 
 // 将所有为实现的方法实现
+// http://localhost:8080/hello
 public class HelloServlet extends MyHttpServlet{
 
     @Override
@@ -28,11 +29,11 @@ public class HelloServlet extends MyHttpServlet{
 
     @Override
     public void init() {
-
+        System.out.println("HelloServlet init");
     }
 
     @Override
     public void destroy() {
-
+        System.out.println("HelloServlet destroy");
     }
 }

+ 16 - 4
lesson/src/com/sf/tomcat/my/MyRequestHandler.java

@@ -27,13 +27,25 @@ public class MyRequestHandler implements Runnable {
             Request request = new Request(socket.getInputStream());
             Response response = new Response(socket.getOutputStream());
             // 先让 /hello请求对应的处理逻辑 就是HelloServlet
+            MyServlet servlet = null;
+            // 确定使用的是哪个Servlet逻辑
             if("/hello".equals(request.getUri())){
-                HelloServlet servlet = new HelloServlet();
-                servlet.service(request, response);
+                servlet = new HelloServlet();
+                // 确定使用哪个Servlet时 给它调用整个生命周期
+//                servlet.init();
+//                servlet.service(request, response);
+//                servlet.destroy();
             }else if("/login".equals(request.getUri())){
-                LoginServlet servlet = new LoginServlet();
-                servlet.service(request, response);
+                servlet = new LoginServlet();
+//                servlet.service(request, response);
             }
+            if(servlet == null){
+                System.out.println("没有找到合适的Servlet");
+                return;
+            }
+            servlet.init();
+            servlet.service(request, response);
+            servlet.destroy();
 
         }catch (Exception e) {
             e.printStackTrace();

+ 1 - 1
web-demo/learn-html/05-a.html

@@ -14,7 +14,7 @@
                 _blank 是在新窗口中打开
     -->
     <!-- 直接找到同级路径下的页面 此时默认使用的是 ./ -->
-    <a href="hello.html" target="_blank"> 使用blank跳转hello </a>
+    <a id="1" href="hello.html" target="_blank"> 使用blank跳转hello </a>
     <!-- 换行是br 可以没有/ -->
     <br />
     <a href="hello.html" target="_self"> 使用self跳转hello </a>

+ 1 - 1
xml-demo/src/main/java/com/sf/xml/Test.java → xml-demo/src/main/java/com/sf/xml/TestDom4j.java

@@ -10,7 +10,7 @@ import java.util.Iterator;
 import java.util.List;
 
 // dom4j 官网 https://dom4j.github.io/
-public class Test {
+public class TestDom4j {
 
     public static void main(String[] args) throws Exception {
 //        read();

+ 87 - 0
xml-demo/src/main/java/com/sf/xml/TestJsoup.java

@@ -0,0 +1,87 @@
+package com.sf.xml;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Attribute;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class TestJsoup {
+
+    public static void main(String[] args) throws Exception {
+//        read();
+//        read1();
+
+        Document document = getDocument();
+//        Element element = document.getElementById("1");
+//        System.out.println(element.text());
+//        String[] arr = element.text().split(" ");
+//        User user = new User(arr[0], Integer.parseInt(arr[1]), arr[2], arr[3]);
+//        System.out.println(user);
+
+        Elements elements = document.getElementsByAttribute("id");
+        System.out.println(elements.size());
+        Element element = elements.get(0);
+        System.out.println(element.text());
+    }
+
+    public static Document getDocument() throws Exception {
+        // 获取文件路径
+        String path = TestJsoup.class.getClassLoader().getResource("user.xml").getPath();
+        // String path = "src/main/resources/user.xml";
+        // 将xml文件 转为Document对象
+        Document document = Jsoup.parse(new File(path), "UTF-8");
+        return document;
+    }
+
+    public static void read() throws Exception {
+        // 获取文件路径
+        String path = TestJsoup.class.getClassLoader().getResource("user.xml").getPath();
+        // String path = "src/main/resources/user.xml";
+        // 将xml文件 转为Document对象
+        Document document = Jsoup.parse(new File(path), "UTF-8");
+        // 直接获取user标签  getElementsByTag是通过标签名获取元素
+        Elements elements = document.getElementsByTag("user");
+        for (Element element : elements) {
+            // 获取每一个user标签的 子标签
+            Elements children = element.children();
+            for (Element child : children) {
+                System.out.println(child.text());
+            }
+            System.out.println("--------------");
+        }
+    }
+
+    public static void read1() throws Exception {
+        Document document = getDocument();
+        Elements elements = document.getElementsByTag("user");
+
+        List<User> userList = new ArrayList<User>();
+        // 迭代器遍历
+        Iterator<Element> iterator = elements.iterator();
+        while (iterator.hasNext()) {
+            Element element = iterator.next();
+            // 这里select是选择器 意思是 直接选择对应名字的标签(一个或多个)
+            Elements name = element.select("name");
+            Elements age = element.select("age");
+            Elements gender = element.select("gender");
+            Elements address = element.select("address");
+            // 可以通过id方法 获取id的值
+            String id = element.id();
+            // 如果设置了其他属性名 可以通过attribute获取属性
+            Attribute attribute = element.attribute("desc");
+            // 然后通过getValue() 获取属性值
+            System.out.println(attribute.getValue());
+//            User user = new User(name.text(), Integer.parseInt(age.text()), gender.text(), address.text());
+            User user = new User(Long.parseLong(id),name.text(), Integer.parseInt(age.text()), gender.text(), address.text());
+            userList.add(user);
+        }
+        System.out.println(userList);
+    }
+}

+ 77 - 0
xml-demo/src/main/java/com/sf/xml/User.java

@@ -0,0 +1,77 @@
+package com.sf.xml;
+
+// xml中对应的实体类
+public class User {
+
+    private Long id;
+    private String name;
+    private int age;
+    private String gender;
+    private String address;
+
+    public User(Long id, String name, int age, String gender, String address) {
+        this.id = id;
+        this.name = name;
+        this.age = age;
+        this.gender = gender;
+        this.address = address;
+    }
+
+    public User(String name, int age, String gender, String address) {
+        this.name = name;
+        this.age = age;
+        this.gender = gender;
+        this.address = address;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", age=" + age +
+                ", gender='" + gender + '\'' +
+                ", address='" + address + '\'' +
+                '}';
+    }
+}

+ 41 - 0
xml-demo/src/main/java/com/sf/xml/sax/Book.java

@@ -0,0 +1,41 @@
+package com.sf.xml.sax;
+
+public class Book {
+
+    private Long id;
+    private String name;
+    private String author;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    @Override
+    public String toString() {
+        return "Book{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", author='" + author + '\'' +
+                '}';
+    }
+}

+ 84 - 0
xml-demo/src/main/java/com/sf/xml/sax/MyHandler.java

@@ -0,0 +1,84 @@
+package com.sf.xml.sax;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// 自定义解析器  需要继承默认的解析器 重写需要自定义的处理逻辑
+public class MyHandler extends DefaultHandler {
+
+    // 要存储数据的容器
+    private List<Book> bookList;
+    // 当前的名字
+    private String currentName;
+    // 当前处理的Book对象
+    private Book currentBook;
+
+    @Override
+    public void startDocument() throws SAXException {
+        System.out.println("start Document");
+        super.startDocument();
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+        System.out.println("start Element : " + qName);
+        // qName是当前元素的名字
+        // attributes是所有属性
+        currentName = qName;
+        if(qName.equals("books")){
+            // 当遍历到根标签时  开始存储数据
+            bookList = new ArrayList<Book>();
+        }
+        if(qName.equals("book")){
+            currentBook = new Book();
+            String id = attributes.getValue("id");
+            // 将string 转为 long
+            currentBook.setId(Long.parseLong(id));
+        }
+//        super.startElement(uri, localName, qName, attributes);
+    }
+
+    // 处理文本的事件
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        System.out.println("characters : " + new String(ch, start, length));
+        // 字符数组 偏移量 长度 可以构造出字符串
+        String str = new String(ch, start, length);
+        if(currentName.equals("name")){
+            currentBook.setName(str);
+        }
+        else if(currentName.equals("author")){
+            currentBook.setAuthor(str);
+        }
+//        super.characters(ch, start, length);
+    }
+
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        System.out.println("end Element : " + qName);
+        currentName = "";
+//        currentBook = null;
+        if(qName.equals("book")){
+            bookList.add(currentBook);
+        }
+//        super.endElement(uri, localName, qName);
+    }
+
+    @Override
+    public void endDocument() throws SAXException {
+        System.out.println("end Document");
+        super.endDocument();
+    }
+
+    public List<Book> getBookList() {
+        return bookList;
+    }
+
+    public void setBookList(List<Book> bookList) {
+        this.bookList = bookList;
+    }
+}

+ 28 - 0
xml-demo/src/main/java/com/sf/xml/sax/TestSax.java

@@ -0,0 +1,28 @@
+package com.sf.xml.sax;
+
+import org.xml.sax.XMLReader;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+public class TestSax {
+
+    public static void main(String[] args) throws Exception {
+        // 使用的步骤
+        // 1 获取xml解析器
+        // 2 自定义解析器
+        // 3 注册自定义解析器 解析xml
+
+        // 先通过解析器工厂来创建对象
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+        SAXParser saxParser = factory.newSAXParser();
+        // xml阅读器
+        XMLReader xmlReader = saxParser.getXMLReader();
+        // 注册自定义解析器
+        MyHandler handler = new MyHandler();
+        xmlReader.setContentHandler(handler);
+        // 解析xml  通过当前类获取类加载器  然后获取资源 传入文件本身
+        xmlReader.parse(TestSax.class.getClassLoader().getResource("book.xml").getFile());
+        System.out.println(handler.getBookList());
+    }
+}

+ 11 - 0
xml-demo/src/main/resources/book.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<books>
+    <book id="1001">
+        <name>三体</name>
+        <author>刘慈欣</author>
+    </book>
+    <book id="1002">
+        <name>三国演义</name>
+        <author>罗贯中</author>
+    </book>
+</books>

+ 37 - 0
xml-demo/src/main/resources/testA.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+</head>
+<body>
+<!--
+    a标签可以进行链接的跳转
+      属性 href 用来定义链接
+            可以使用相对路径
+      属性 target 用来定义打开的方式
+            _blank 是在新窗口中打开
+-->
+<!-- 直接找到同级路径下的页面 此时默认使用的是 ./ -->
+<a id="1" href="hello.html" target="_blank"> 使用blank跳转hello </a>
+<!-- 换行是br 可以没有/ -->
+<br/>
+<a href="hello.html" target="_self"> 使用self跳转hello </a>
+<br/>
+<a href="hello.html"> 默认跳转到hello </a> <!-- 默认就是在自身窗口中打开 -->
+<br/>
+
+<!-- 指定url地址 -->
+<a href="https://www.koobietech.com/#/" target="_blank">四福科技</a>
+<br/>
+<!-- 找其他路径下的页面 先找到当前路径 然后再找到对应的地址-->
+<a href="./base/test.html" target="_blank">test.html</a>
+<br/>
+<!-- 如果需要先找到上一个层级 使用 ../ -->
+
+<!-- 绝对路径 从当前位置开始找其他位置 是相对路径 否则以/开头 代表绝对路径 -->
+<a href="/base/test.html" target="_blank">绝对路径下的base test</a>
+
+</body>
+</html>

+ 15 - 0
xml-demo/src/main/resources/user.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<users>
+    <user id="1" desc="sth">
+        <name>zhangsan</name>
+        <age>18</age>
+        <gender>male</gender>
+        <address>学府路34号</address>
+    </user>
+    <user id="2" desc="no sth">
+        <name>lisi</name>
+        <age>20</age>
+        <gender>female</gender>
+        <address>学府路120号</address>
+    </user>
+</users>