什麼是servlet?

前面一篇在講解 簡單瞭解request與response ,王小提出 Servlet 的疑惑,下面對 Servlet 作簡單總結。html

1. 什麼是servlet?

在 JavaWeb 項目中,處理請求和發送響應的過程是由一種叫作 Servlet 的程序來完成的,而且 Servlet 是爲了解決實現動態頁面而衍生的東西。java

簡單來說:Servlet其實就是一個遵循Servlet開發的java類,Serlvet是由服務器調用的,運行在服務器端。web

一張圖描述 Servler 在 B/S 中的做用點:瀏覽器

2. Tomcat 和 Servlet 的關係

Tomcat 是Web應用服務器,是一個Servlet/JSP容器。 Tomcat 做爲 Servlet 容器,負責處理客戶請求,把請求傳送給 Servlet,並將 Servlet 的響應傳送回給客戶,而 Servlet 是一種運行在支持 Java 語言的服務器上的組件。tomcat

Servlet 最多見的用途是擴展 Java Web 服務器功能,提供很是安全的、可移植的、易於使用的 CGI 替代品。安全

從 Http 協議中的請求和響應能夠得知,瀏覽器發出的請求是一個請求文本,而瀏覽器接收到的也應該是一個響應文本。可是在上面這個圖中,並不知道是如何轉變的,只知道瀏覽器發送過來的請求也就是 request,咱們響應回去的就用 response。忽略了其中的細節,如今就來探究一下。服務器

①:Tomcat 將 Http 請求文本接收並解析,而後封裝成 HttpServletRequest 類型的 request 對象,全部的 Http 頭數據讀能夠經過request 對象調用對應的方法查詢到。app

②:Tomcat 同時會要響應的信息封裝爲 HttpServletResponse 類型的response 對象,經過設置 response 屬性就能夠控制要輸出到瀏覽器的內容,而後將 response 交給 Tomcat,Tomcat 就會將其變成響應文本的格式發送給瀏覽器。框架

Java Servlet API 是Servlet容器(tomcat)和servlet之間的接口,它定義了Serlvet 的各類方法,還定義了 Servlet 容器傳送給 Servlet 的對象類,其中最重要的就是 ServletRequest 和 ServletResponse 。因此說咱們在編寫Servlet時,須要實現 Servlet 接口,按照其規範進行操做。jsp

3. Servlet 接口主要方法

Servlet 接口主要的 3 個方法:

  • init()方法:只會調用一次,只是在建立servlet實例的時候纔會建立。
  • service()方法:是進行數據處理的,只要接受了一次請求,就會被調用一次
  • destroy()方法:銷燬 Servlet 對象的時候調用。中止服務器或者從新部署 Web 應用時銷燬 Servlet 對象,一樣也是調用一次

4. 編寫 Servlet

首先說明一點疑惑,有時候咱們在一些資料上看到別人這樣寫:

public class TestServlet implements Servlet {

    init()...

    service()...

    getServletConfig()...

    ...
}

而在這咱們要繼承 HttpServlet類 那麼問題來了,繼承HttpServlet 和實現Servlet 有什麼區別?

首先,直觀的不一樣,Servlet 是一個接口,若是實現這個接口,那麼就必須實現接口裏面定義的全部方法。

而 HttpServlet 實現了 Servlet 接口,並把 Servlet 接口中的方法實現了。
繼承 Httpservelt,實際上也就實現了 Servlet 接口。

可是咱們不必再去實現 Servlet 中定義的生命週期方法,由於在 Httpservlet 中已經有了默認實現,而且這些默認實現也挺規範和實用, doget 和 dopost 是執行用戶請求的終點,get 請求會調用 doget 方法,post 請求會執行 dopost 方法,咱們能夠在這2個方法中定義咱們本身的業務邏輯。

最後,HttpServlet 在實現 Servlet 接口的時候,已經實現了 Servlet 中全部的方法,所以繼承自 HttpSrvlet 的類,不須要再去覆寫相應的生命週期等方法。

4.1 編寫Java類,繼承HttpServlet

建立一個 MyServlet java 類,繼承 HttpServlet 實現 service 方法:

public class MyServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置字符編碼
        request.setCharacterEncoding("utf8");
        //從 request 對象中獲取username,password
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        request.setAttribute("username",username);
        request.setAttribute("password",password);
        request.getRequestDispatcher( "/index2.jsp").forward(request, response);;
    }
}

4.2 配置web.xml文件

web.xml 配置 Servlet 訪問路徑,能讓別人經過連接訪問到你的 Servlet:

<web-app>
  <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>club.sscai.demo.MyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

</web-app>

4.3 jsp 界面顯示

index2.jsp:

<html>
<body>
<h2>2222222</h2>
username: 
<%=request.getParameter("username") %>
<br>
password: 
<%=request.getParameter("password") %>
</body>
</html>

訪問:http://localhost:8080/MyServlet?password=1111&username=222 效果以下:

5. 總結

前臺界面附帶的參數,能夠經過 request 獲取,這也證明了前面 HttpServletRequest 封裝了 request對象,當客戶端經過HTTP協議訪問服務器時,HTTP請求頭中的全部信息都封裝在這個對象中。

關於 request\response,在實際項目開發中,request 是很是經常使用的,畢竟你要拿到用戶請求的信息,才能知道用戶要什麼,可是,像上文中這種繼承自 HttpServlet 是不會出現的,例如,採用 Spring MVC 框架後,自動幫咱們實現了 request 請求到 Controller 的騷操做。

相關文章
相關標籤/搜索