XML、Servlet
尚硅谷JavaWeb筆記-03

XML

  • Extensible Markup Language 可延伸標記式語言
  • 常用於:
    • 保存資料
    • 作為配置文件
    • 傳輸(但現在json為主)

特性

  • 格式:<標籤名>夾住的值</標籤名>
    • 或單標籤內用空格分開屬性<book id="SN65421" name="小王子"/>
  • 標籤名不可以數字或符號開始
  • 標籤名不可包含空格
  • 所有標籤都必須關閉
  • 大小寫敏感
  • 必須正確嵌套,例如a元素在b元素中打開,也必須在b元素中關閉
  • 屬性值必須用""引號包住

範例

<?xml version="1.0" encoding="UTF-8"?>
<!-- xml 聲明 version 是版本的意思 encoding 是編碼 -->
<books> <!-- 這是 xml 注釋 -->
    <book id="SN123123413241"> <!-- book 標籤描述一本圖書 id 屬性描述 的是圖書 的編號 -->
        <name>java 程式設計思想</name> <!-- name 標籤描述 的是圖書 的資訊 -->
        <author>華仔</author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
        <price>9.9</price> <!-- price 單詞是價格,描述的是圖書 的價格 -->
    </book>
    <book id="SN12341235123"> <!-- book 標籤描述一本圖書 id 屬性描述 的是圖書 的編號 -->
        <name>葵花寶典</name> <!-- name 標籤描述 的是圖書 的資訊 -->
        <author>班長</author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
        <price>5.5</price><!-- price 單詞是價格,描述的是圖書 的價格 -->
    </book>
    <book id="SN65421" name="小王子"/>
</books>

在Java中解析xml

  • 利用dom4j,首先去下載jar包導入
  • 範例:
// 第一步,通過創建 SAXReader 對象。來讀取 xml 檔,獲取 Document 物件
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 第二步,通過 Document 對象。拿到 XML 的根項目物件
Element root = document.getRootElement();
// Element.elements(標籤名)它可以拿到當前元素下的指定的子元素的集合
List<Element> books = root.elements("book");
 第四小,遍歷每個 book 標籤對象。然後獲取到 book 標籤物件內的每一個元素,
for (Element book : books) {
// 拿到 book 下的 name 元素物件
Element nameElement = book.element("name");

Servlet

一種運行在server的java小程式,專門用來接收請求

  • Servlet是JavaWeb三大組件之一
    • 三大組件分別是Servlet 程式、Filter 篩檢程式、Listener 監聽器
  • 我們都知道網路通訊的傳送流程是這樣:
    • client > HTTP request > server > HTTP response > client
  • Servlet的優點:
    • 處理動態資源
      • 讀了就完事再也不會變的叫靜態資源,例如一張背景圖片或影片
      • 讀取時要交互的叫動態資源,例如讀取資料庫中的某個值,每次結果可能都不一樣
    • 多線程
      • 每個reques經由同一個servlet由多個執行緒處理,對JVM來說servlet只需載入一次
    • Servlet屬於J2EE架構,可以輕鬆串接Java類庫的各種功能,達成擴展
  • 加入Servlet就變成這樣:
  • client > web application(Apache) > web container(Tomcat) > servlet > DB(處理資料邏輯)

實現

  • Servlet是一個接口需要實現
  • 要實現service方法,此方法就是調用這個servlet時要做什麼反應
public class HelloServlet implements Servlet {

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws
ServletException, IOException {
System.out.println("Hello Servlet");
}
}
  • 同時需要配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <!-- servlet 標籤給 Tomcat 配置 Servlet 程式 -->
    <servlet>
        <!--servlet-name 標籤 Servlet 程式起一個別名(一般是類名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是 Servlet 程式的全類名-->
        <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 標籤給 servlet 程式配置訪問位址-->
    <servlet-mapping>
        <!--servlet-name 標籤的作用是告訴伺服器,我當前配置的位址給哪個 Servlet 程式使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 標籤配置訪問位址 <br/>
        / 斜杠在伺服器解析的時候,表示位址為:http://ip:port/工程路徑 <br/>
        /hello 表示位址為:http://ip:port/工程路徑/hello <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
  • 但一般都是透過繼承HttpServlet類來實現
  • IDEA中直接右鍵new servlet就創造好了

匹配規則

字串規則 範例 可訪問的URL
精確 /開始,不能包含萬用字元*且必須完全匹配 /myServlet /myServlet
路徑 /開始,並以/*結尾 /user/ /user/之下都可以
後綴 *.開始,並以某種後綴結尾 *.jsp 工程目錄下所有.jsp
  • 優先級別從上到下,只要匹配到了就會交給對應的servlet處理,而不管其他

生命週期

  • 執行Servlet構造器:第一次訪問時
  • 執行init初始化方法:第一次訪問時
  • 執行service方法:每次訪問都調用
  • 執行destory銷毀:在web工程停止時

Post & Get

這兩種都是傳送請求的方法,Post優於Get在於:

  • GET傳送的參數有大小限制,當需要的參數內容較多,不見得可用
  • GET傳送的資料會直接在url上看到,會有安全性的隱憂
  • POST傳送方式不能將FORM加入我的最愛
  • 一般若和資料有關係的傳送(即修改刪除)都是用POST
  • GET只會在處理頁面的載入,即檢視的部分

ServletConfig類

從類名上來看,就知道是 Servlet 程式的配置資訊類

  • 開發上通常會把參數設在DB裡面,而ServletConfig優勢在可以不需要改程式碼,直接調整web.xml
  • ServletConfig為每個Servlet自己所擁有,必須在Servlet執行init()後才會取得ServletConfig物件,而不能透過構造器手動生成
  • 如上面生命週期所述,Servlet程式預設是第一次訪問的時候由web容器(tomcat)創建
    • 同時也會創建一個對應的ServletConfig物件,它的資訊來自於web.xml

作用

  • ServletConfig 類的三大作用
    • 可以獲取 Servlet 程式的別名 servlet-name 的值
    • 獲取初始化參數 init-param
    • 獲取 ServletContext 對象

範例

    <servlet>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
    <servlet>
@Override
public void init(ServletConfig servletConfig) throws ServletException {
    // super.init(ServletConfig); // 注意如果是重寫的init必須先調用父類的init
    System.out.println("init 初始化方法");
    // 1、可以獲取 Servlet 程式的別名 servlet-name 的值
    System.out.println("HelloServlet 程式的別名是:" + servletConfig.getServletName());
    // 2、獲取初始化參數 init-param
    System.out.println("初始化參數 username 的值是;" + servletConfig.getInitParameter("username"));
    // 3、獲取 ServletContext 對象
    System.out.println(servletConfig.getServletContext());
}

// 在其他地方調用
String secretName = getServletConfig().getInitParameter("username");
String secretName =  getInitParameter("username"); 另一種方式

ServletContext

  • ServletContext 是一個接口,它表示 Servlet 上下文物件
  • 一個 web 工程,只有一個 ServletContext 物件實例
  • ServletContext 物件是一個域物件,作用範圍在整個工程
  • ServletContext 在 web 工程部署啟動的時候創建,在 web 工程停止的時候銷毀

作用

  • 獲取 web.xml 中配置的上下文參數 context-param
  • 獲取當前的工程路徑,格式: /工程路徑
  • 獲取工程部署後在伺服器硬碟上的絕對路徑
  • 像 Map 一樣存取資料
    • setAttribute()
    • getAttribute()
    • removeAttribute()

範例

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
        ServletException, IOException {
    // 1、獲取 web.xml 中配置的上下文參數 context-param
    ServletContext context = getServletConfig().getServletContext();
    String username = context.getInitParameter("username");
    System.out.println("context-param 參數 username 的值是:" + username);
    System.out.println("context-param 參數 password 的值是:" +
    context.getInitParameter("password"));
    // 2、獲取當前的工程路徑,格式: /工程路徑

    System.out.println( "當前工程路徑:" + context.getContextPath() );
    // 3、獲取工程部署後在伺服器硬碟上的絕對路徑

  	// 斜杠被伺服器解析地址為:http://ip:port/工程名/ 映射到 IDEA 代碼的 web 目錄<br/>
    System.out.println("工程部署的路徑是:" + context.getRealPath("/"));
    System.out.println("工程下 css 目錄的絕對路徑是:" + context.getRealPath("/css"));
    System.out.println("工程下 imgs 目錄 1.jpg 的絕對路徑是:" + context.getRealPath("/imgs/1.jpg"));

    // 當map存取資料
	ServletContext context = getServletContext();
	context.setAttribute("key1", "value1");

}
  • web.xml
<!--context-param 是上下文參數(它屬於整個 web 工程)-->
<context-param>
    <param-name>username</param-name>
    <param-value>context</param-value>
</context-param>
<context-param>
    <param-name>password</param-name>
    <param-value>root</param-value>
</context-param>

小結

  • 一個Servlet會有一個ServletConfig
  • 整個web應用程式只會有一個ServletContext

上次修改於 2022-01-03