Servlet知识入门
Servlet: server applet
Servlet概念:運行在服務器端的小程序,是Java EE的靈魂組成部分,servlet和jsp的依賴都在tomcat服務器中。
- Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。他不跟正常的Java類一樣,沒有main方法,只能用tomcat等Web服務器來執行它。
- 將來我們自定義一個類,實現Servlet接口,復寫這個接口的方法 ,才可以使用Servlet
1、servlet入門程序
1.配置servlet:在WEB-INF中的web.xml中進行配置,這里我們給入門程序ServletDemo1和ServletDemo2配置xml,每一個servlet都要在xml文件中配置這兩項
<!--配置Servlet --><servlet><servlet-name>demo1</servlet-name> // 給servlet起的名字<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> //該servlet的全類名</servlet><servlet-mapping> // 一個映射<servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> // 資源路徑</servlet-mapping><!-- 配置servlet --><servlet><servlet-name>demo2</servlet-name><servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class></servlet><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping>2.編寫程序,定義servletDemo1這個Java類,繼承Servlet接口,然后覆蓋重寫接口中的5個方法即可。
package cn.itcast.web.servlet;import javax.servlet.*; import java.io.IOException;/** * servlet快速入門 */ public class ServletDemo1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("hello servlet");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {} }3.啟動tomcat服務器后,在瀏覽器中輸入url訪問tomcat,輸入http://localhost/day13_tomcat/demo1,訪問第一個servlet。xml文件中的url-pattern是demo1,對應到ServletDemo1這個servlet,所以服務器會運行其中的service,把hello servlet打印到Idea的Tomcat運行窗口中。
Servlet的執行原理:
2、Servlet的五個方法詳解
Servlet中的五個方法,重要的有三個,是生命周期方法。
package cn.itcast.web.servlet;import javax.servlet.*; import java.io.IOException;public class ServletDemo2 implements Servlet {/*** 初始化方法* 在servlet被創建時執行,只會執行一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init...");}/*** 獲取ServletConfig對象(了解即可)* ServletConfig:Servlet的配置對象* @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 提供服務方法* 每一次Servlet被訪問時都會執行,執行多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service...");}/*** 獲取servlet的一些信息,版本,作者等等(了解即可)* @return*/@Overridepublic String getServletInfo() {return null;}/*** 銷毀方法* 在servlet被殺死(即服務器正常關閉時),非正常關閉就不會被執行*/@Overridepublic void destroy() {System.out.println("destory...");} }Servlet中的生命周期方法:1. 被創建:執行init方法,只執行一次一般用于加載資源* Servlet什么時候被創建?* 默認情況下,第一次被訪問時,Servlet被創建* 可以配置執行Servlet的創建時機:* 在web.xml文件中的<servlet>標簽下配置1. 第一次被訪問時,創建* <load-on-startup>的值為負數2. 在服務器啟動時,創建* <load-on-startup>的值為0或正整數實例代碼:<!-- 配置servlet --><servlet><servlet-name>demo2</servlet-name><servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class><!-- 指定Servlet的創建時機1.第一次被訪問時,創建 <load-on-startup>的值為負數2.在服務器啟動時,創建 <load-on-startup>的值為0或正整數--><load-on-startup>-5</load-on-startup></servlet>* Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的* 多個用戶同時訪問時,可能存在線程安全問題,同一個Servlet變成了多個用戶的共享資源。* 解決:盡量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對修改值,修改值就會存在并發安全問題(多個用戶同時修改造成數據不一致)。2. 提供服務:執行service方法,執行多次* 每次訪問Servlet時,Service方法都會被調用一次。3. 被銷毀:執行destroy方法,只執行一次* Servlet被銷毀時執行。服務器關閉時,Servlet被銷毀* 只有服務器正常關閉時,才會執行destroy方法。* destroy方法在Servlet被銷毀之前執行,一般用于釋放資源3、Servlet3.0版本(支持注解配置了)
Servlet3.0:由于之前的servlet每增加一個就要在web.xml文件中增加配置,非常麻煩,所以到了Servlet3.0版本也可以支持注解配置。可以不需要web.xml了
對于注解不熟悉的同學可以參考我關于注解的一篇文章:[https://editor.csdn.net/md/?articleId=123341140]
下面我們就來創建一個Servlet3.0以上版本的項目:
 
 使用servlet3.0:
然后在瀏覽器輸入url,http://localhost/day13_servlet/demo2,localhost是本機IP,day13_servlet是項目虛擬路徑,可以在run->edit configuration->Deploymen->Application context進行配置,demo2就是注解中給該servlet添加的資源路徑,所以就可以直接找到Servletdemo這個類,如圖
 
 服務器端顯示如下(idea)
 
 讓我們看一看WebServlet這個注解的內容:
注意兩個最重要的屬性String[] urlPatterns() default {};這是該資源的url,所以可以這么加注解:
@WebServlet(urlPatterns = “/demo2”)
還有String[] value() default {};也代表了url(value屬性通常都是設為最重要的屬性),但是value的好處是可以默認不寫,所以可以簡寫
@WebServlet( “/demo2”)
另外,@WebServlet注解還有一些不太常用的方式來配置urlpartten,這個注解的屬性: String[] urlPatterns() default {};//相當于是一個字符串數組,所以一個Servlet可以配置多個資源路徑可以訪問:
/*** servlet路徑配置的幾種方式,*是通配符,表示可以書寫任意內容就能訪問到*/ // @WebServlet({"/d4","/dd4","/ddd4"}) // 一個servlet可以配置多個路徑 // @WebServlet("/user/demo4") // 兩層路徑 需要輸入 http://localhost/user/demo4 // @WebServlet("/user/*") //需要輸入 http://localhost/user/任何內容@WebServlet("*.do") //需要輸入 http://localhost/任意內容.do public class ServletDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("demo4...");} }Tomcat和Idea的相關配置:
IDEA會為每一個tomcat部署的項目單獨建立一份配置文件,所以Idea可以直接用圖形化操作直接修改虛擬目錄、端口號等等東西。但是這個跟實際tomcat部署的web項目不是一個東西,
- 查看控制臺的log輸出:Using CATALINA_BASE: “C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcast”
工作空間項目 和 tomcat部署的web項目
- tomcat真正訪問的是“tomcat部署的web項目”,“tomcat部署的web項目"對應著"工作空間項目” 的web目錄下的所有資源
- WEB-INF目錄下的資源不能被瀏覽器直接訪問,所以那些靜態資源注意不要寫到WEB-INF中,要寫到Web下。
斷點調試Tomcat項目:加斷點后,使用"小蟲子"啟動 dubug 啟動Tomcat
Servlet體系結構(接口的兩個子類)
眾所周知,要實現原生Servlet接口,每次都要覆蓋重寫其中的五個方法,其實除了service方法我們都很不常用,所以我們很難受,所以對Servlet接口進行了升級,GenericServlet 類和HttpServlet類。
Servlet的體系結構: Servlet -- 接口|GenericServlet -- 抽象類|HttpServlet -- 抽象類GenericServlet類將Servlet接口中四個不常用的方法進行了空實現,當我們繼承它時, 只需要重寫其中的抽象方法service,方便了許多,其他四個如果需要也可以直接覆蓋重寫。但是我們最常用的還是繼承了GenericServlet類的HttpServlet 類,以后我們使用的基本都是這個類 *HttpServlet 類:對HTTP協議進行了封裝,對servlet中的service方法增加了對請求方式的判斷(通過request對象) 我們繼承這個類的時候,直接覆蓋重寫doget和dopost方法(其他五個不太常用),非常的方便。如圖HTTPServlet中將service方法增添了對請求方式的判斷,并用響應的請求方式進行響應(doget、dopost)
 
由于HttpServlet已經對所有方法進行了實現,我們在使用時通常只需直接覆蓋重寫doGet和doPost方法即可:
package cn.itcast.web.servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** HttpServlet的簡單使用*/ @WebServlet("/demo3") public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");} }關于HTTP協議,以及HTTPServlet的兩個重要參數request和response將會在下一篇文章介紹,關于servlet的內容暫且告一段落。
總結
以上是生活随笔為你收集整理的Servlet知识入门的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: nexus5 android 7.0,A
- 下一篇: WEB服务器、应用程序服务器、HTTP服
