天天看點

JavaWeb學習筆記——servlet

1. 使用 JavaEE版的 Eclipse開發動态的 WEB工程(JavaWEB項目)

1). 把開發選項切換到 JavaEE

2). 可以在 Window -> Show View中找到 Package Explorer,并把其拖拽到開發區的左邊

3). 在 Servers面闆中建立 Tomcat伺服器.一定要關聯到 Tomcat安裝的根目錄

4). 建立一個 Dynamic Web Project.其中 Target Runtime需選擇 Tomcat6.0

5). 開發 Java WEB應用

6). 可以通過 run on server  來運作WEB 項目.

2. Servlet 的 HelloWorld

1). 建立一個 Servlet接口的實作類.

public class HelloServlet implements Servlet

2). 在 web.xml檔案中配置和映射這個 Servlet

<!-- 配置和映射 Servlet -->

<servlet>

<!-- Servlet 注冊的名字 -->

<servlet-name>helloServlet</servlet-name>

<!-- Servlet 的全類名 -->

<servlet-class>com.test.javaweb.HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<!-- 需要和某一個 servlet節點的 serlvet-name子節點的文本節點一緻 -->

<servlet-name>helloServlet</servlet-name>

<!-- 映射具體的通路路徑: /代表目前 WEB應用的根目錄. -->

<url-pattern>/hello</url-pattern>

</servlet-mapping>

3. Servlet 容器:運作 Servlet、JSP、Filter等的軟體環境.

1). 可以來建立 Servlet,并調用 Servlet的相關生命周期方法.

2). JSP, Filter, Listener, Tag ...

4. Servlet 生命周期的方法:以下方法都是由 Serlvet容器負責調用.

1). 構造器:隻被調用一次.隻有第一次請求 Servlet時, 建立 Servlet 的執行個體. 調用構造器.

這說明 Serlvet 的單執行個體的!

2). init 方法:隻被調用一次.在建立好執行個體後立即被調用.用于初始化目前 Servlet.

3). service: 被多次調用.每次請求都會調用 service方法. 實際用于響應請求的.

4). destroy: 隻被調用一次.在目前 Servlet所在的 WEB應用被解除安裝前調用.用于釋放目前 Servlet所占用的資源.

5. load-on-startup 參數:

1).  配置在 servlet節點中:

<servlet>

<!-- Servlet 注冊的名字 -->

<servlet-name>secondServlet</servlet-name>

<!-- Servlet 的全類名 -->

<servlet-class>com.test.javaweb.SecondServlet</servlet-class>

<!-- 可以指定 Servlet被建立的時機 -->

<load-on-startup>2</load-on-startup>

</servlet>

2). load-on-startup: 可以指定 Serlvet被建立的時機.若為負數,則在第一次請求時被建立.若為0 或正數,則在目前 WEB應用被

Serlvet 容器加載時建立執行個體,且數組越小越早被建立.

6. 關于 serlvet-mapping:

1). 同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping> 元素的<servlet-name>子元素的設定值可以是同一個

Servlet的注冊名。

2). 在Servlet映射到的URL中也可以使用* 通配符,但是隻能有兩種固定的格式:

一種格式是“*.擴充名”,另一種格式是以正斜杠(/)開頭并以“/*”結尾。

<servlet-mapping>

<servlet-name>secondServlet</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

OR

<servlet-mapping>

<servlet-name>secondServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

注意: 以下的既帶/ 又帶擴充名的不合法.

<servlet-mapping>

<servlet-name>secondServlet</servlet-name>

<url-pattern>/*.action</url-pattern>

</servlet-mapping>

7. ServletConfig: 封裝了 Serlvet的配置資訊,并且可以擷取 ServletContext對象

1). 配置 Serlvet的初始化參數

<servlet>

<servlet-name>helloServlet</servlet-name>

<servlet-class>com.test.javaweb.HelloServlet</servlet-class>

<!-- 配置 Serlvet的初始化參數。 且節點必須在 load-on-startup節點的前面 -->

<init-param>

<!-- 參數名 -->

<param-name>user</param-name>

<!-- 參數值 -->

<param-value>root</param-value>

</init-param>

<init-param>

<param-name>password</param-name>

<param-value>1230</param-value>

</init-param>

<load-on-startup>-1</load-on-startup>

</servlet>

2). 擷取初始化參數:

> getInitParameter(String name): 擷取指定參數名的初始化參數

    > getInitParameterNames(): 擷取參數名組成的 Enumeration對象.

    String user = servletConfig.getInitParameter("user");

System.out.println("user: " + user);

Enumeration<String> names = servletConfig.getInitParameterNames();

while(names.hasMoreElements()){

String name = names.nextElement();

String value = servletConfig.getInitParameter(name);

System.out.println("^^" + name + ": " + value);

}

3). 擷取 Serlvet的配置名稱(了解)

8. ServletContext

1). 可以由  SerlvetConfig擷取:

ServletContext servletContext = servletConfig.getServletContext();

2). 該對象代表目前 WEB應用: 可以認為 SerlvetContext是目前 WEB應用的一個大管家.可以從中擷取到目前 WEB應用的各個方面的資訊.

①. 擷取目前 WEB 應用的初始化參數

設定初始化參數: 可以為所有的Servlet 所擷取,而 Servlet的初始化參數隻用那個 Serlvet可以擷取.

<!-- 配置目前 WEB應用的初始化參數 -->

<context-param>

<param-name>driver</param-name>

<param-value>com.mysql.jdbc.Driver</param-value>

</context-param>

方法:

getInitParameter

getInitParameterNames

代碼:

ServletContext servletContext = servletConfig.getServletContext();

String driver = servletContext.getInitParameter("driver");

System.out.println("driver:" + driver);

Enumeration<String> names2 = servletContext.getInitParameterNames();

while(names2.hasMoreElements()){

String name = names2.nextElement();

System.out.println("-->" + name);

}

②. 擷取目前 WEB 應用的某一個檔案在伺服器上的絕對路徑,而不是部署前的路徑

getRealPath(String path);

代碼:

String realPath = servletContext.getRealPath("/note.txt");

System.out.println(realPath);

③. 擷取目前 WEB 應用的名稱:

getContextPath()

代碼:

String contextPath = servletContext.getContextPath();

System.out.println(contextPath);

④. 擷取目前 WEB 應用的某一個檔案對應的輸入流.

getResourceAsStream(String path): path 的 /為目前 WEB應用的根目錄.

代碼:

InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");

⑤. 和 attribute 相關的幾個方法:

9. GET 請求和 POST請求:

1). 使用GET方式傳遞參數:

①. 在浏覽器位址欄中輸入某個URL位址或單擊網頁上的一個超連結時,浏覽器發出的HTTP請求消息的請求方式為GET。

②. 如果網頁中的<form>表單元素的method 屬性被設定為了“GET”,浏覽器送出這個FORM表單時生成的HTTP請求消息的請求方式也為GET。

③. 使用GET請求方式給WEB伺服器傳遞參數的格式:  

http://www.test.com/counter.jsp?name=lc&password=123

④. 使用GET方式傳送的資料量一般限制在1KB 以下。

2). 使用 POST方式傳遞參數:

①. POST 請求方式主要用于向WEB 伺服器端程式送出FORM 表單中的資料: form表單的 method置為 POST

②. POST 方式将各個表單字段元素及其資料作為HTTP 消息的實體内容發送給WEB 伺服器,傳送的資料量要比使用GET方式傳送的資料量大得多。  

POST /counter.jsp HTTP/1.1

referer: http://localhost:8080/Register.html

content-type: application/x-www-form-urlencoded

host: localhost:8080

content-length: 43

name=zhangsan&password=123              --請求體中傳遞參數.

10. 如何在 Serlvet中擷取請求資訊:

1). Servlet 的 service()方法用于應答請求:因為每次請求都會調用 service()方法

public void service(ServletRequest request, ServletResponse response)

throws ServletException, IOException

ServletRequest: 封裝了請求資訊.可以從中擷取到任何的請求資訊.

ServletResponse: 封裝了響應資訊,如果想給使用者什麼響應,具體可以使用該接口的方法實作.

這兩個接口的實作類都是伺服器給予實作的, 并在伺服器調用service 方法時傳入.

2). ServletRequest: 封裝了請求資訊.可以從中擷取到任何的請求資訊.

①. 擷取請求參數:

> String getParameter(String name): 根據請求參數的名字,傳回參數值.

若請求參數有多個值(例如checkbox), 該方法隻能擷取到第一個送出的值.

> String[] getParameterValues(String name): 根據請求參數的名字,傳回請求參數對應的字元串數組.

> Enumeration getParameterNames(): 傳回參數名對應的 Enumeration 對象,

類似于 ServletConfig(或ServletContext) 的getInitParameterNames() 方法.

> Map getParameterMap(): 傳回請求參數的鍵值對: key:參數名,  value:參數值, String數組類型.

②. 擷取請求的URI:

HttpServletRequest httpServletRequest = (HttpServletRequest) request;

String requestURI = httpServletRequest.getRequestURI();

System.out.println(requestURI); //  /day_29/loginServlet

③. 擷取請求方式:

String method = httpServletRequest.getMethod();

System.out.println(method); //GET

④. 若是一個 GET 請求,擷取請求參數對應的那個字元串,即 ? 後的那個字元串.

String queryString = httpServletRequest.getQueryString();

System.out.println(queryString); //user=test&password=123456&interesting=game&interesting=party&interesting=shopping

⑤. 擷取請求的Serlvet 的映射路徑

   String servletPath = httpServletRequest.getServletPath();

   System.out.println(servletPath);  //  /loginServlet

⑥. 和 attribute 相關的幾個方法:   

3). HttpServletRequest: 是 SerlvetRequest的子接口.針對于 HTTP請求所定義.裡邊包含了大量擷取 HTTP請求相關的方法.

4). ServletResponse: 封裝了響應資訊,如果想給使用者什麼響應,具體可以使用該接口的方法實作.

①. *getWriter(): 傳回PrintWriter 對象.調用該對象的 print()方法, 将把 print() 中的參數直接列印

到客戶的浏覽器上.

②. 設定響應的内容類型: response.setContentType("application/msword");

③. void sendRedirect(String location): 請求的重定向. (此方法為HttpServletResponse 中定義.)

-----------------------------------------------------------------------------

在 web.xml 檔案中設定兩個WEB 應用的初始化參數, user, password.

定義一個 login.html, 裡邊定義兩個請求字段: user, password.發送請求到 loginServlet

在建立一個 LoginServlet, 在其中擷取請求的user, password. 比對其和web.xml 檔案中定義的請求參數是否一緻

若一緻, 響應 Hello:xxx, 若不一緻,響應 Sorry: xxx  xxx為 user.

-----------------------------------------------------------------------------