JavaWeb之Servlet

1. Servlet

其實servlet就是一個Java程序,運行在服務器上,用於接收和響應客戶端的請求

2. 創建Servlet

創建一個servlet繼承,繼承HttpServlet,重寫doget、dopost方法

3.配置Servlet

<?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>
 <!--註冊一個名爲HelloServlet的Servelt,路徑爲xxx-->
 <servlet-name>HelloServlet</servlet-name>
 <servlet-class>com.kernel.test.HelloServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <!--將url-pattern裏面設置的路徑映射到已註冊的Servlet上-->
 <servlet-name>HelloServlet</servlet-name>
 <url-pattern>/hello.do</url-pattern>
 </servlet-mapping>
 </web-app>

4. Servlet執行流程

從地址欄上獲取路徑,然後找到Web.xml這個配置文件,將路徑和pattern向匹配,如果不能匹配,返回404,如果能匹配上,找到和這個pattern對應是servlet-name,然後通過這個servlet-name,找到servlet裏面的servlet-name,是否內容相同,如果不相同,返回404,如果相同,找到這個servlet-name對應的class文件的路徑,然後執行該class的servce方法

5. Servlet生命週期

當第一次發出http請求時,會調用init方法,創建servlet。然後每次訪問都會調用service方法,直到從tomcat服務器將項目移出或者調用shutdown.bat纔會調用destroy,銷燬servlet

6. Servlet初始化時機

默認情況下,只有初次請求servlet時,纔會調用init方法,創建實例。我們通常在web.xml文件的servlet標籤中增加一個子標籤,on-load-startup中增加一個正整數,數值通常大於1,數值越少,說明它實例越早被創建。

<servlet>
 <servlet-name>HelloServlet</servlet-name>
 <servlet-class>com.kernel.test.HelloServlet</servlet-class>
 <load-on-startup>4</load-on-startup>
 </servlet>

7. ServletConfig

可以通過該對象的實例獲取Servlet的配置信息
當我們引入別人的Servlet生成的jar包時,假如這個Servlet需要一個參數,我們我們使用這個Servlet的時候,在註冊這個Servlet,必須要在Servlet中定義init-nit-param。

8. Servlet匹配方式

全路徑匹配:/list
前半段匹配:/list/
擴展名匹配:
.擴展名

9. ServerContext

Servlet上下文,每個Web工程都有且僅有一個ServletContext對象,可以獲取全局配置參數,還可以使用ServletContext讀取配置文件

10. HttpServletRequest

request.getHeader():獲取請求頭
request.getParameter():獲取提交過來的數據

11. 請求參數中文亂碼解決方案

  • POST

    POST提交參數產生中文亂碼的原因是客戶端和服務端通信的編碼不一致,我們只需設置雙方爲統一的編碼就可以了
    request.setCharacterEncoding("UTF-8");

  • GET

    對於以GET提交的中文參數,即使設置以指定編碼方式接收數據也沒用。默認還是會使用ISO8859-1這個編碼接收數據,所以我們的解決策略是先以ISO8859-1編碼接收數據,接收到的數據爲字節數組,然後通過字節數組構建字符串,代碼如下:
    String name = request.getParameter("name");
    String name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;

12. HttpServletResponse

response.getOutputStream():向瀏覽器發送數據
response.setStatus():設置響應狀態碼
響應數據中,如果有中文,會出現亂碼問題,代碼如下:
response.setHeader("Content-type", "text/html;charset=UTF-8")

13.請求轉發和重定向

請求轉發
request.getRequestDispatcher("index.html").forward(request, response);
重定向(兩種寫法)
response.setStatus(302);
response.setHeader("Location", "index.html");
response.sendRedirect("index.html");
請求轉發和重定向的區別:
重定向地址欄發生變化,請求轉發定地址欄沒有變化
重定向需要向服務器發送兩次請求,請求轉發向服務器發送一次請求
重定向在客戶端完成,請求轉發在服務器完成
重定向速度慢,請求轉發速度快
重定向可以跳轉到任意路徑,請求轉發只能在跳轉到本項目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章