WEB前端(六)--Servlet

Servlet

Servlet是由SUN公司提供的一門動態Web資源開發技術。
Servlet是JavaWeb的三大組件之一,它屬於動態資源。Servlet的做用是處理請求,服務器會把接收到的請求交給Servlet來處理,在Servlet中一般須要:html

  • 接收請求數據
  • 處理請求
  • 完成響應

實現Servlet的方式

  • 實現javax.servlet.Servlet接口(不方便);
  • 繼承javax.servlet.GenericServlet類(不方便);
  • 繼承javax.servlet.http.HttpServlet類(方便);
Servlet接口
public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}

建立準備JavaWeb應用所需內容:

  • 建立/WEB-INF目錄
  • 建立/WEB-INF/classes目錄
  • 建立/WEB-INF/lib目錄
  • 建立/WEB-INF/web.xml文件

完成一個Servlet須要兩步

編寫Servlet類
public class HelloServlet implements Servlet {
    public void init(ServletConfig config) throws ServletException {}
    public ServletConfig getServletConfig() {return null;}
    public void destroy() {}
    public String getServletInfo() {return null;}

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        System.out.println("hello servlet!");
    }
}
在web.xml文件中配置Servlet
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/helloworld</url-pattern>
</servlet-mapping>

Servlet生命週期

一、實例化 在第一次訪問servlet的時候建立servlet對象,只調用一次。證實servlet對象在Tomcat中是單例。
二、初始化init()方法 建立完servlet對象的時候調用,只調用1次。
三、服務service()方法 每次發出請求是調用。調用N次
四、銷燬 destroy()方法 銷燬servlet對象的時候調用,中止服務器或者從新部署web應用時銷燬servlet對象。只調用一次。
imagejava

Servlet調用過程

  1. 首先,客戶機瀏覽器根據ip地址,找到要訪問的服務器;鏈接上這臺服務器;而後客戶機的瀏覽器發送http請求頭給服務器;
  2. 服務器收到請求頭,之後分析協議請求頭,得知客戶機要訪問的主機、web應用、哪個資源 ;
  3. 服務器上的動態資源,都對應着一個servlet類, 若是該資源是 第一次 被外部訪問,也就意味着servlet類是第一次被訪問,那麼,服務器會建立一個該Servlet類的一個對象 ,這個對象有生命週期方法,
  4. 建立完畢之後,自動執行init()方法,進行初始化; (只有這裏,纔會對 第一次 很在乎),而後,服務器建立表明請求的ServletRequest對象;表明迴應的ServletResponse對象,這時候的ServletResponse是 空的迴應頭; (這一步是每次訪問都會執行)
  5. 接着調用servlet的service()方法,來響應客戶機的請求 ;執行咱們寫的邏輯 ;
  6. Servlet對象將service()方法的處理結果返回;也就是將數據寫到了ServletResponse對象中
  7. 服務器,發現ServletResponse對象中有數據了 ,就會從ServletResponse中取出數據,構建一個http響應頭,回送給客戶機;
  8. Servlet 經過調用 destroy() 方法終止

image

HttpServlet

image
HttpServlet類是GenericServlet的子類,它提供了對HTTP請求的特殊支持,因此一般咱們都會經過繼承HttpServlet來完成自定義的Servlet。web

Servlet接口相關類型

  • ServletRequest:service() 方法的參數,它表示請求對象,它封裝了全部與請求相關的數據,它是由服務器建立的;

image

  • ServletResponse:service()方法的參數,它表示響應對象,在service()方法中完成對客戶端的響應須要使用這個對象;

image

  • ServletConfig:init()方法的參數,它表示Servlet配置對象,它對應Servlet的配置信息,那對應web.xml文件中的<servlet>元素。

image

ServletRequest和ServletResponse

  ServletRequest和ServletResponse是Servlet#service() 方法的兩個參數,一個是請求對象,一個是響應對象,能夠從ServletRequest對象中獲取請求數據,可使用ServletResponse對象完成響應。你之後會發現,這兩個對象就像是一對恩愛的夫妻,永遠不分離,老是成對出現。
  ServletRequest和ServletResponse的實例由服務器建立,而後傳遞給service()方法。若是在service() 方法中但願使用HTTP相關的功能,那麼能夠把ServletRequest和ServletResponse強轉成HttpServletRequest和HttpServletResponse。這也說明咱們常常須要在service()方法中對ServletRequest和ServletResponse進行強轉,這是很心煩的事情。不事後面會有一個類來幫咱們解決這一問題的。瀏覽器

GenericServlet

  GenericServlet是Servlet接口的實現類,咱們能夠經過繼承GenericServlet來編寫本身的Servlet。
image服務器

HttpServletRequest方法:

  • String getParameter(String paramName):獲取指定請求參數的值;
  • String getMethod():獲取請求方法,例如GET或POST;
  • String getHeader(String name):獲取指定請求頭的值;
  • void setCharacterEncoding(String encoding):設置請求體的編碼!由於GET請求沒有請求體,因此這個方法只只對POST請求有效。當調用request.setCharacterEncoding(「utf-8」)以後,再經過getParameter()方法獲取參數值時,那麼參數值都已經經過了轉碼,即轉換成了UTF-8編碼。因此,這個方法必須在調用getParameter()方法以前調用!

HttpServletResponse方法:

  • PrintWriter getWriter():獲取字符響應流,使用該流能夠向客戶端輸出響應信息。例如response.getWriter().print(「<h1>Hello JavaWeb!</h1>」);
  • ServletOutputStream getOutputStream():獲取字節響應流,當須要向客戶端響應字節數據時,須要使用這個流,例如要向客戶端響應圖片;
  • void setCharacterEncoding(String encoding):用來設置字符響應流的編碼,例如在調用setCharacterEncoding(「utf-8」);以後,再response.getWriter()獲取字符響應流對象,這時的響應流的編碼爲utf-8,使用response.getWriter()輸出的中文都會轉換成utf-8編碼後發送給客戶端;
  • void setHeader(String name, String value):向客戶端添加響應頭信息,例如setHeader(「Refresh」, 「3;url=http://www.baidu.com」),表示3秒後自動刷新到http://www.baidu.com
  • void setContentType(String contentType):該方法是setHeader(「content-type」, 「xxx」)的簡便方法,即用來添加名爲content-type響應頭的方法。content-type響應頭用來設置響應數據的MIME類型,例如要向客戶端響應jpg的圖片,那麼能夠setContentType(「image/jepg」),若是響應數據爲文本類型,那麼還要臺同時設置編碼,例如setContentType(「text/html;chartset=utf-8」)表示響應數據類型爲文本類型中的html類型,而且該方法會調用setCharacterEncoding(「utf-8」)方法;
  • void sendError(int code, String errorMsg):向客戶端發送狀態碼,以及錯誤消息。例如給客戶端發送404:response(404, 「您要查找的資源不存在!」)

ServletContext

ServletContext對象的做用是在整個Web應用的動態資源之間共享數據!例如在AServlet中向ServletContext對象中保存一個值,而後在BServlet中就能夠獲取這個值,這就是共享數據了。
imagecookie

獲取ServletContext對象

  • ServletConfig中的getServletContext()方法
  • GenericServlet中的getServletContext()方法
  • HttpSession中的getServletContext()方法
  • ServletContextEvent中的getServletContext()方法

ServletContext是JavaWeb四大域對象之一:

  • PageContext;
  • ServletRequest;
  • HttpSession;
  • ServletContext;

Servlet必須掌握的其餘知識

forward() 與redirect()的區別?

1.  getRequestDispatch().forward() 請求轉發跳轉發生在服務器<容器>所以能夠取得,瀏覽器不知道請求被轉發了,因此地址欄上不會看到變化,sendRedirect發生在瀏覽器,要求瀏覽器從新請求另外一個URL,故又稱爲重定向,地址欄上會顯示URL的變動。
2.  若是但願下一個頁面可使用此屬性,用getRequestDispatch
3.  若是session.setAtrribute(「name」,「aa」) 若是但願下一個頁面可使用屬性,兩個方法均可以用,可是建議使getRequestDispatch
4.  若是但願跳轉到本網站外的URL,只能用sendRedirectsession

何時調用doGet和doPost

1.Serlvet接口只定義了一個服務方法就是service,而HttpServlet類實現了該方法而且要求調用下列的方法之一:
2.doGet:處理GET請求
3.doPost:處理POST請求
4.當發出客戶端請求的時候,調用service 方法並傳遞一個請求和響應對象。Servlet首先判斷該請求是GET 操做仍是POST 操做。而後它調用下面的一個方法:doGet 或 doPost。若是請求是GET就調用doGet方法,若是請求是POST就調用doPost方法。doGet和doPost都接受請求(HttpServletRequest)和響應(HttpServletResponse)。app

頁面間對象傳遞的方法是什麼

1.在要傳遞值的頁面,Response.sendRedirect(url)
2.session
3.cookie
4.applicaiton
5.request.serAttribute(「uname」,u);
6.request.getRequestDispacther(「/…/…」)框架

共享數據在web中的範圍(四種會話跟蹤技術)

(1).page:僅在當前頁可用(保存在當前的PageContext中)
(2).request:僅用於當前客戶端的請求(保存在ServletRequest對象中),它在同一個請求範圍內有效.
(3).session:僅在當前的HttpSession的生命週期內,當前瀏覽器窗口的整個生存期都有效.關閉瀏覽器時,這個對象會跟着消失,在整個對話期間都有效.
(4).application:在整個應用範圍內都有效,只有當服務器重啓時,這個對象纔會消失.jsp

JSP和Servlet的區別

1.JSP在本質上就是SERVLET,可是二者的建立方式不同.Servlet徹底是JAVA程序代碼構成擅長於流程控制和事務處理而經過Servlet來生成動態網頁;JSP由HTML代碼和JSP標籤構成,能夠方便地編寫動態網頁
2.所以在實際應用中採用Servlet來控制業務流程,而採用JSP來生成動態網頁.在struts框架中,JSP位於MVC設計模3.JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。JSP編譯後是「類servlet」。Servlet和JSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML裏分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。JSP側重於視圖,Servlet主要用於控制邏輯。

Cookie 和Session

Cookie:服務器在客戶端保存用戶的信息
Session:服務器能夠爲每一個用戶瀏覽器建立一個會話對象

談談Servlet過濾器的做用?

Servlet是特殊的Servlet,可以對特定的請求路徑進行過濾,在訪問這個路徑以前,先執行過濾器,過濾器進行預處理,過濾器決定是否繼續執行後續的文件。典型的應用,能夠把用戶驗證的代碼寫在過濾器中,而後把過濾的路徑配製成須要驗證的文件的路徑。

談談Servlet監聽器的做用

Servlet監聽器對特定的事件進行監聽,當產生這些事件的時候,會執行監聽器的代碼。能夠對應用的加載、卸載,對session的初始化、銷燬,對session中值變化等事件進行監聽。

相關文章
相關標籤/搜索