什麽是servlet?
前面一篇在講解 簡單了解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?