摘要:學習筆記工作以來就一直在用各種框架,比如,這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前學習基礎的時候也沒好好看這塊,抽個時間學習總結一下,也能更好的理解掌握現在的框架。
Servlet學習筆記
工作以來就一直在用各種web框架,比如SpringMVC,Spring Cloud這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前學習java基礎的時候也沒好好看servlet這塊,抽個時間學習總結一下,也能更好的理解掌握現在的web框架。
1. servlet簡介servlet的全稱是server applet,服務端小程序,是運行在服務器端用java編寫的程序,用于處理及響應客戶端的需求,動態生成web內容。
Servlet是個特殊的java類,這個類必須繼承HtppServlet,每個Servlet可以響應客戶端的請求。Servlet提供不同的方法用于響應客戶端請求:
doGet:用于響應客戶端的get請求;
doPost:用于響應客戶端的post請求;
doPut:用于響應客戶端的put請求;
doDelete:用于響應客戶端的delete請求;
大部分時候,Servlet對所有請求的響應都是完全一樣的,這個時候,我們就可以采用重寫service()方法來代替上面的幾個方法。
void service(HttpServletRequest req, HttpServletResponse resp)
一般情況下,在MVC應用中,Servlet扮演控制器的角色:
Model:對應JavaBean;
View:對應JSP頁面;
Controller:對應Servlet;
所以,在SpringMVC中對外暴露接口的本質就是一個servlet,它的名字是:org.springframework.web.servlet.DispatcherServlet。
2. servlet實例大概了解了servlet之后,我們通過新建一個工程來使用原始的servlet對外暴露服務。
2.1 新建工程使用eclipse新建一個動態web項目,
項目建好后目錄結構應該是這樣的:
│ .classpath │ .project │ ├─.settings │ .jsdtscope │ org.eclipse.jdt.core.prefs │ org.eclipse.wst.common.component │ org.eclipse.wst.common.project.facet.core.xml │ org.eclipse.wst.jsdt.ui.superType.container │ org.eclipse.wst.jsdt.ui.superType.name │ ├─build │ └─classes ├─src └─WebContent ├─META-INF │ MANIFEST.MF │ └─WEB-INF └─lib2.2 新建servlet
新建好后的java代碼如下:
package com.servletDemo.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class MyServlet */ @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public MyServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }2.3 編譯打包
將導出的war包丟進tomcat的webapps下面,重啟tomcat。訪問:http://localhost:8080/servletDemo/MyServlet,就可以看到返回結果。沒錯,就是這個簡單!
2.4 配置Servlet的兩種方式使用servlet有兩種配置方式:
Servlet類上使用@WebServlet注解進行配置
在web.xml文件中配置
1)@WebServlet注解
在上面的例子中就是使用WebServlet注解的方式配置的,@WebServlet("/MyServlet")的意思是如果請求是/MyServlet,則由MyServlet類的實例提供服務。@WebServlet注解還有很多其他屬性,如下:
屬性 | 類型 | 是否必須 | 說明 |
---|---|---|---|
asyncSupported | boolean | 否 | 指定Servlet是否支持異步操作模式 |
displayName | String | 否 | 指定Servlet顯示名稱 |
initParams | WebInitParam[] | 否 | 配置初始化參數 |
loadOnStartup | int | 否 | 標記容器是否在應用啟動時就加載這個Servlet |
name | String | 否 | 指定Servlet名稱 |
urlPatterns/value | String[] | 否 | 這兩個屬性作用相同,指定Servlet處理的url |
比如上面的類注解可以添加一些其他屬性:
@WebServlet( name="servletdemo", urlPatterns={"/MyServlet"}, loadOnStartup=1 ) public class MyServlet extends HttpServlet { }
2)web.xml配置
除了注解的方式,還可以通過web.xml配置,在WEB-INF下新建web.xml,進行servlet配置:
My web app servletdemo com.servletDemo.servlet.MyServlet 1 servletdemo /MyServlet
注意:配置了web.xml就需要把@WebServlet注解刪掉,否則啟動tomcat容器的時候會報錯兩個servlet指向同一個URL。
再重新編譯打包丟進容器,重啟并訪問:http://localhost:8080/servletDemo/MyServlet。結果是一樣的:
2.5 一個Servlet處理多個URL請求當瀏覽器發送了一次請求到服務器時,servlet容器會根據請求的url-pattern找到對應的Servlet類,執行對應的doPost或doGet方法,再將響應信息返回給瀏覽器,這種情況下,一個具體的Servlet類只能處理對應的web.xml中配置的url-pattern請求,一個Servlet類,一對配置信息。 但是我們知道現在大部分的javaweb框架都是可以編寫一個java類而可以處理多個url請求的。那么使用原生的servlet如何做到呢?
有兩種方法。一是根據請求的地址,截取其中的具體方法名,然后使用if-else判斷匹配,再執行具體的方法。二是根據截取出來的方法名,使用反射機制,來執行具體的方法。
具體解決方案可以參考:https://blog.csdn.net/codeMas...。
2. Filter介紹Filter可以認為是Servlet的一種“加強版”。它主要是對用戶請求進行預處理,也可以對HttpServletResponse進行后續處理,是個典型的處理鏈。使用Filter的完整流程一般是:Filter對用戶請求進行預處理,接著請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后續處理。
Filter可以攔截多個請求或響應,一個請求或響應也可以被多個Filter攔截。
創建Filter類需要實現javax.servlet.Filter接口,該接口定義了如下三個方法:
void init(FilterConfig config)
void destory()
void doFilter(ServletRequest request, ServletResponse respone, FilterChain chain)
Filter實例:
1)編寫Filter類
package com.servletDemo.servlet; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class MyFilter implements Filter { public MyFilter() { } public void destroy() { System.out.println("進入Filter的destroy方法...時間:" + new Date()); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("進入Filter的doFilter方法...時間:" + new Date()); chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { System.out.println("進入Filter的init方法...時間:" + new Date()); } }
2)配置web.xml
和servlet的配置一樣,也需要配置url匹配策略,添加了Filter的web.xml如下:
My web app MyFilter com.servletDemo.servlet.MyFilter MyFilter /MyServlet servletdemo com.servletDemo.servlet.MyServlet 1 servletdemo /MyServlet
將工程部署上去,訪問:
http://localhost:8080/servletDemo/MyServlet,
從控制臺打印的日志可以看出,http請求先經過了filter再到servlet。日志打印順序:
...... 進入Filter的init方法...時間:Wed Sep 05 16:54:08 CST 2018 九月 05, 2018 4:54:08 下午 org.apache.catalina.startup.HostConfig deployWAR 信息: Deployment of web application archive D:softwareapache-tomcat-7.0.90webappsservletDemo.war has finished in 74 ms ...... 信息: Deployment of web application directory D:softwareapache-tomcat-7.0.90webappsROOT has finished in 56 ms 九月 05, 2018 4:54:12 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-apr-8080"] 九月 05, 2018 4:54:12 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["ajp-apr-8009"] 九月 05, 2018 4:54:12 下午 org.apache.catalina.startup.Catalina start 信息: Server startup in 9575 ms 進入Filter的doFilter方法...時間:Wed Sep 05 16:54:15 CST 2018 進入servlet的doget方法...時間:Wed Sep 05 16:54:15 CST 20183. Listener介紹
當web應用在web容器中運行時,web應用內部會不斷的發生各種事件:web應用被啟動、web應用被停止、用戶session開始、用戶session結束、用戶請求到達等,通常來這些web事件對開發者是透明的,但是Servlet API提供了大量的監聽器來監聽web應用的內部事件,從而允許當web內部事件發生時回調事件監聽器內的方法。使用Listener需要兩步(和Servlet、Filter一樣):
定義Listener實現類;
通過注解或web.xml配置。
常用的web事件監聽器接口有如下幾個:
ServletContextListener:用于監聽web應用的啟動和關閉;
ServletContextAttributeListener:用于監聽ServletContext范圍(applocation)內屬性的改變;
ServletRequestListener:用于監聽用戶請求;
ServletRequestAttributeListener:用于監聽ServletRequest范圍(request)內屬性的改變;
HttpSessionListener:用于監聽用戶session的開始和結束;
HttpSessionAttributeListener:用于監聽HttpSession范圍(session)內屬性的改變;
Listener實例
1)編寫Listenter類,此處以監聽web容器的啟動和關閉作為例子,其他監聽類型類似。
package com.servletDemo.servlet; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class MyListener implements ServletContextListener { public MyListener() { } public void contextDestroyed(ServletContextEvent paramServletContextEvent) { System.out.println("web應用關閉了..."); } public void contextInitialized(ServletContextEvent paramServletContextEvent) { System.out.println("web應用啟動了..."); } }
2)配置web.xml
listener的配置比較簡單,只需要配置一個節點就可以了。
com.servletDemo.servlet.MyListener
重啟部署到tomcat,容器啟動的時候會打印日志:
...... 九月 05, 2018 5:13:37 下午 org.apache.catalina.startup.HostConfig deployWAR 信息: Deploying web application archive D:softwareapache-tomcat-7.0.90webappsservletDemo.war web應用啟動了... 進入Filter的init方法...時間:Wed Sep 05 17:13:38 CST 2018 九月 05, 2018 5:13:38 下午 org.apache.catalina.startup.HostConfig deployWAR 信息: Deployment of web application archive D:softwareapache-tomcat-7.0.90webappsservletDemo.war has finished in 127 ms ...... 信息: Starting ProtocolHandler ["http-apr-8080"] 九月 05, 2018 5:13:42 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["ajp-apr-8009"] 九月 05, 2018 5:13:42 下午 org.apache.catalina.startup.Catalina start 信息: Server startup in 10147 ms
項目源碼:https://github.com/WangJun-SC...
參考:https://baike.baidu.com/item/...
https://www.cnblogs.com/xdp-g...
https://blog.csdn.net/codeMas...
https://www.cnblogs.com/whgk/...
Servlet工作原理解析:https://www.ibm.com/developer...
http://www.runoob.com/servlet...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76987.html
摘要:個人的學習筆記是的簡稱,是運行在服務器或應用服務器上的程序,它是作為來自瀏覽器或其他客戶端的請求和服務器上的數據庫或應用程序之間的中間層,就是一個類,運行在服務器上。處理數據并生成結果。所有的文件都必須遵守這個標準。 個人的學習筆記 Servlet(Server Applet)是Java Servlet的簡稱,是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器...
摘要:首先我們需要了解下的文件結構。的安裝目錄里,所有的都放在下。假設某個的名字叫。那么會有在目錄下會有一個文件夾。如何讓使用這個文件呢這時候就要修改文件了。中的寫錯了類名,導致錯誤地址欄中寫的錯誤應當與中配置的相同導致錯誤 首先我們需要了解Tomcat下的文件結構。tomcat的安裝目錄里,所有的web application都放在webapps下。假設某個webapp的名字叫test。那...
摘要:一基本語法聲明聲明語句成員變量或方法聲明語句聲明局部變量注意區分二者區別。局部變量在每次調用方法時都會重新初始化。注意此時代碼是被原封不動地導入,所以變量的作用域仍然在這個中。動作,運行期間的命令廣義的擁有私有變量,和等方法的工具類。 JSP(JAVA Server Pages):一種特殊的Servlet,直接在HTML中內嵌JSP代碼,由JSP Engine自動轉為Servlet代碼...
摘要:經過前面幾次反射機制的學習,這次用反射的知識寫一個類似于框架處理機制的小。和在引入反射知識前,先簡單介紹下框架和。再次使用反射獲取的最新值,組成返回,同時根據方法的返回值,去中獲取對應的。最后根據的返回值和的名稱組成最終展示的視圖。 經過前面幾次反射機制的學習,這次用反射的知識寫一個類似于Struts框架處理機制的小demo。 Servlet 和 Sturts 在引入反射知識前,先簡單...
摘要:應用應用中中的路徑問題在設置頁面路徑的時候設置一定要用可以通過獲得進行拼接,不然會有可能出現路徑錯誤的問題,這是由于在不同的位置符號會有不同的意思。 web應用應用中URL中的路徑問題 ①在設置頁面路徑的時候設置一定要用contextPath(可以通過application.getContextPath()獲得)進行拼接,不然會有可能出現路徑錯誤的問題,這是由于在不同的位置/符號會有...
閱讀 3722·2021-11-17 09:33
閱讀 2744·2021-09-22 15:12
閱讀 3351·2021-08-12 13:24
閱讀 2449·2019-08-30 11:14
閱讀 1739·2019-08-29 14:09
閱讀 1330·2019-08-26 14:01
閱讀 3067·2019-08-26 13:49
閱讀 1782·2019-08-26 12:16