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物件,它的資訊來自於
作用
- 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