前面一篇在講解 簡單瞭解request與response ,王小提出 Servlet 的疑惑,下面對 Servlet 作簡單總結。html
在 JavaWeb 項目中,處理請求和發送響應的過程是由一種叫作 Servlet 的程序來完成的,而且 Servlet 是爲了解決實現動態頁面而衍生的東西。java
簡單來說:Servlet其實就是一個遵循Servlet開發的java類,Serlvet是由服務器調用的,運行在服務器端。web
一張圖描述 Servler 在 B/S 中的做用點:瀏覽器
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
Servlet 接口主要的 3 個方法:
首先說明一點疑惑,有時候咱們在一些資料上看到別人這樣寫:
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 的類,不須要再去覆寫相應的生命週期等方法。
建立一個 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);;
}
}
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>
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 效果以下:
前臺界面附帶的參數,能夠經過 request 獲取,這也證明了前面 HttpServletRequest 封裝了 request對象,當客戶端經過HTTP協議訪問服務器時,HTTP請求頭中的全部信息都封裝在這個對象中。
關於 request\response,在實際項目開發中,request 是很是經常使用的,畢竟你要拿到用戶請求的信息,才能知道用戶要什麼,可是,像上文中這種繼承自 HttpServlet 是不會出現的,例如,採用 Spring MVC 框架後,自動幫咱們實現了 request 請求到 Controller 的騷操做。