1. 程式人生 > >什麽是servlet?

什麽是servlet?

輸出 瀏覽器 srv use utf UNC 常見 adding java類

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

1. 什麽是servlet?

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

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

一張圖描述 Servler 在 B/S 中的作用點:

技術分享圖片

2. Tomcat 和 Servlet 的關系

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

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

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

技術分享圖片

①:Tomcat 將 Http 請求文本接收並解析,然後封裝成 HttpServletRequest 類型的 request 對象,所有的 Http 頭數據讀可以通過request 對象調用對應的方法查詢到。

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

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

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 的騷操作。

什麽是servlet?