Servlet技術的特點及使用


一、Servlet的簡介

  1. Servlet的概述
    servlet是運行在服務端的java程序 servlet是一套規范(接口) 外界都可以訪問到
  2. servlet的快速入門
    步驟:
    (1) 創建一個類 實現servlet
    (2)覆蓋servlet接口中的全部方法(尤其是service方法)
    (3)需要進行虛擬路徑的配置
    web.xml配置部分:
        
        
        
                
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    6. <display-name></display-name>
    7. <servlet>
    8. <!--servlet-name 這里的名字可以任意取,不過需要和 servlet-mapping中的servlet-name匹配
    9.         每一個Servlet標簽中只能配置一組屬性-->
    10. <servlet-name>Demo1</servlet-name>
    11. <!-- 這里需要填寫正確的完整包名來指向java源文件 -->
    12. <servlet-class>com.heima.servlet.Demo1</servlet-class>
    13. </servlet>
    14. <servlet-mapping>
    15. <!-- 這里的name需要和servlet標簽中的名字匹配 每一個Servlet-mapping 標簽中只能配置一組-->
    16. <servlet-name>Demo1</servlet-name>
    17. <!-- 對外訪問的路徑 -->
    18. <url-pattern>/demo1</url-pattern>
    19. </servlet-mapping>
    20. <welcome-file-list>
    21. <!-- 這里代表的是歡迎頁面,可以自己去尋找 -->
    22. <welcome-file>index.jsp</welcome-file>
    23. </welcome-file-list>
    24. </web-app>
    Demo1.java工程內容:
         
         
         
                 
    1. package com.heima.servlet;
    2. import java.io.IOException;
    3. import java.io.PrintWriter;
    4. import javax.servlet.Servlet;
    5. import javax.servlet.ServletConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. public class Demo1 implements Servlet
    10. {
    11. @Override
    12. public void service(ServletRequest req, ServletResponse res)
    13. throws ServletException, IOException
    14. {
    15. // 主要業務處理的地方,每次訪問都會執行
    16. PrintWriter writer = res.getWriter();
    17. writer.print("<h1>Hello World</h1>");
    18. writer.print("<h1>Hello World</h1>");
    19. System.out.println(getServletInfo());
    20. }
    21. @Override
    22. public void destroy()
    23. {
    24. // 服務器正常關閉的時候調用
    25. }
    26. @Override
    27. public void init(ServletConfig arg0) throws ServletException
    28. {
    29. // 在服務器servlet對象創建的時候執行
    30. }
    31. @Override
    32. public ServletConfig getServletConfig()
    33. {
    34. // 這個方法用於返回ServletConfig對象,內部封裝的是Servlet配置信息
    35. return null;
    36. }
    37. @Override
    38. public String getServletInfo()
    39. {
    40. // 用來返回Servlet的一些信息
    41. return "";
    42. }
    43. }

    由於servlet頁面回寫的時候使用的PrintWrite流,寫出中文由於編碼問題會出現亂碼,可以通過這個方法解決
    res.setContentType("text/html;charset=utf-8");


        
二、Servlet的生命周期

  1. java中的生命周期:對象什么時候創建 什么時候銷毀 這個過程中必然要實行的方法
  2. servlet對象的生命周期:
    創建:默認第一次訪問servlet時創建 創建之后對象駐留在內存中 等待為后面的訪問服務,所以說,servlet對象只有一個。
    銷毀:服務器關閉 web應用從服務器中移除

    與生命周期想過的方法說明
        
        
        
                
    1. public void service(ServletRequest req, ServletResponse res)
    2. throws ServletException, IOException
    3. {
    4. // 主要業務處理的地方每次訪問都會執行
    5. }
    6. @Override
    7. public void destroy()
    8. {
    9. // 服務器正常關閉的時候調用
    10. }
    11. @Override
    12. public void init(ServletConfig arg0) throws ServletException
    13. {
    14. // 在服務器servlet對象創建的時候執行
    15. }

三、Servlet的相關配置文件

  1. 基本配置
    基本格式:
    配置servlet的實體:
         
         
         
                 
    1. <servlet>
    2. <sevlet-name>隨意書寫</servlet-name>
    3. <servlet-class>servlet類的一個全包名</servlet-class>
    4. </servlet>
    配置servlet的對外訪問的虛擬路徑
          
          
          
                  
    1. <servlet-mapping>
    2. <sevlet-name>和那么上面的name一致</servlet-name>
    3. <url-pattern>/虛擬路徑</url-pattern>
    4. </servlet-mapping>
    例子:
         
         
         
                 
    1. <servlet>
    2. <!--servlet-name 這里的名字可以任意取,不過需要和 servlet-mapping中的servlet-name匹配 -->
    3. <servlet-name>Demo1</servlet-name>
    4. <!-- 這里需要填寫正確的完整包名來指向java源文件 -->
    5. <servlet-class>com.heima.servlet.Demo1</servlet-class>
    6. </servlet>
    7. <servlet-mapping>
    8. <!-- 這里的name需要和servlet標簽中的名字匹配 -->
    9. <servlet-name>Demo1</servlet-name>
    10. <!-- 對外訪問的路徑 -->
    11. <url-pattern>/demo1</url-pattern>
    12. </servlet-mapping>
    虛擬路徑的寫法:
    完全匹配:  就是客戶端的訪問地址與配置完全一致才可以訪問到
          
          
          
                  
    1. <url-pattern>/demo1</url-pattern>

    目錄匹配:以/開始以*結束     /aaa/bbb/*
          
          
          
                  
    1. <url-pattern>/demo1/*</url-pattern>

    擴展名匹配:以*開始 以擴展名結束    *.abc ,如果直接寫*.abc那么前面就不需要加/
          
          
          
                  
    1. <url-pattern>/demo1/*.jpg </url-pattern>

    注意:目錄匹配和擴展名匹配不能混用  /aaa/bbb/*.abc(錯誤的!!!)
  2. 服務器一啟動就實例化servlet
    格式:寫在Servlet標簽內,<load-on-startup>數字</load-on-startup> 
              數字代表實例化的順序 數字越小越早創建
         
         
         
                 
    1. <servlet>
    2. <servlet-name>Demo2</servlet-name>
    3. <servlet-class>com.heima.servlet.Servlet</servlet-class>
    4. <load-on-startup>2</load-on-startup>
    5. </servlet>

  3. 缺省的servlet
    格式:缺省的servlet就是所有的servlet都不匹配 缺省的servlet去負責執行
              就是將url-pattern配置成/
         
         
         
                 
    1. <servlet-mapping>
    2. <servlet-name>Demo2</servlet-name>
    3. <url-pattern>/</url-pattern>
    4. </servlet-mapping>
    注意:其實所有的web資源都是servlet負責返回的,建議在開發中不要自己寫缺省servlet使用Tomcat自己的web.xml文件中的默認缺省

  4. 歡迎頁面:相當於IIS里面的的默認打開頁面
         
         
         
                 
    1. <welcome-file-list>
    2. <!-- 這里代表的是歡迎頁面,可以自己去尋找 -->
    3. <welcome-file>index.jsp</welcome-file>
    4. </welcome-file-list>
  5. tomcat默認的全局web.xml
    1. 缺省的servlet


    2. jsp處理的servlet


    3. session默認失效時間


    4. MIME類型(下載資源)

    5. 歡迎頁面

      注意:tomcat的全局的web.xml對tomcat中所有的web應用都適用

四、Servlet的繼承體系

  1. 使用IDE工具創建Servlet類和web.xml配置的對應關系

  2. 我們自己創建servlet的繼承關系
    關系:自定義servlet----->HttpServlet------>GenericServlet------>Servlet
    1. service方法的演化過程
      servlet接口中service方法


      GenericServlet中的service方法

      HttpServlet中service方法

      這里service調用的是本類中的另外一個重載service方法。


      在service(HttpServletRequest,HttpServletResponse)方法中可以進行提交方式的判斷。通過HttpServlet類中的常量來實現。
      HttpServlet類中的常量屬性

      判斷實現的方式:



    2. init(ServletConfig config)演變過程
      在servlet接口中的init方法

      在GenericServlet中的init方法

      這個有參方法用來接收Servlet的配置信息,進行賦值

      這個無參重載方法主要用於覆寫,切不影響GenericServlet中的一些get方法
      問題:有參數的init和無參數的init的關系?
      首先他們是重載關系。
      有參發放主要用來賦值和調用無參方法。所以在子類中覆蓋覆寫無參方法不影響最有效果。

    3. destroy()的演變過程
      servlet接口中的destroy方法


      GenericServlet中的destroy方法


五、ServletConfig對象

  1. 概述:是Servlet的配置對象 內部封裝的是servlet的配置信息 在web容器調用init方法時 將ServletConfig作為參數進行傳遞
  2. 怎樣獲取?
    通過getServletConfig()
    查看GenericServlet的源碼發現。

    可以直接返回GenericServlet類中的config變量,該變量在此類中的有參inti方法中進行了賦值。可以直接調用的原因是應為inti的在服務器開啟的時候就自動調用了此方法,所以可以正常服務,而不會去除null值。前提是子類不覆蓋有參inti方法。
  3. ServletConfig的作用
    1. 獲取servlet的名稱
            
            
            
                    
      1. ServletConfig sc=getServletConfig();
      2. System.out.println(sc.getServletName());

      取出的值就是這里的Servlet-name的值
    2. 獲取初始化參數(多個參數的獲取方式)
      設置參數方式:通過init-param來設置參數

            
            
            
                    
      1. ServletConfig sc=getServletConfig();
      2. Enumeration <String> names = sc.getInitParameterNames();
      3. while(names.hasMoreElements())
      4. {
      5. String name=names.nextElement();
      6. System.out.println(name+" "+sc.getInitParameter(name));
      7. }
    3. 可以獲取web應用的上下文對象 ServletContext

六、ServletContext對象

  1. 概述
    HttpServletservletContext是servlet上下文對象 實質代表web應用上下文對象 對象只有一個 而且所有的servlet共享一個ServletContext

    servletContext什么時候創建?
    服務器啟動的時候 就會創建ServletContext對象 將這個對象放置在內存中中 供所有的setvlet訪問(有點想靜態變量)

    servletContext什么時候銷毀?
    關閉服務器時銷毀  web應用新哦那個服務器中移除
  2. 怎么獲得ServletContext對象
    通過servletConfig對象獲得
         
         
         
                 
    1. ServletContext context = getServletConfig().getServletContext();

    通過getServletContext()直接獲得
    在GenericServlet類中有此方法

  3. ServletContext的作用
    1. 獲取初始化參數
      XML文件設置:

      實現代碼:
            
            
            
                    
      1. ServletContext context = getServletConfig().getServletContext();
      2. Enumeration <String> enums =context.getInitParameterNames();
      3. while(enums.hasMoreElements())
      4. {
      5. String name=enums.nextElement();
      6. System.out.println(name+" "+context.getInitParameter(name));
      7. }

    2.  可以獲取web資源的絕對路徑:context.getRealPath() 
      重點:getRealPath()相對的位置:相對web應用

      ReadFile方法:
            
            
            
                    
      1. public void readFile(String path)
      2. {
      3. BufferedReader bufr;
      4. try
      5. {
      6. bufr = new BufferedReader(new FileReader(path));
      7. System.out.println(bufr.readLine());
      8. }
      9. catch (Exception e)
      10. {
      11. // TODO Auto-generated catch block
      12. e.printStackTrace();
      13. }
      14. }

    3.  可以作為域對象:域對象:代表存儲數據的區域的對象
      1. context.setAttribute(鍵,值):設置對象的鍵和值
      2. context.getAttribute(鍵):通過鍵獲取值
               
               
               
                       
        1. ServletContext context =getServletContext();
        2. //設置屬性鍵值
        3. context.setAttribute("name", "zhansan");
        4. //通過鍵獲取值
        5. String attribute=(String) context.getAttribute("name");







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM