日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet知识入门

發布時間:2023/12/29 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的執行原理:

  • 當服務器接受到客戶端瀏覽器的請求后,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
  • 查找web.xml文件,是否有對應的標簽體內容。
  • 如果有,則在找到對應的全類名
  • tomcat會將字節碼文件加載進內存(反射技術),并且創建其對象
  • 調用其方法
  • 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:

    步驟:1. 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml2. 定義一個類,實現Servlet接口3. 復寫Servlet接口中的方法4. 在類上使用@WebServlet注解,進行配置,因為注解是加在類上,所以不需要知道全類名,只需知道url* @WebServlet("資源路徑")package cn.itcast.wen.servlet;import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /*** servlet3注解配置*/ @WebServlet( "/demo2") public class Servletdemo 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("Servlet3.0來了...");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {} }

    然后在瀏覽器輸入url,http://localhost/day13_servlet/demo2,localhost是本機IP,day13_servlet是項目虛擬路徑,可以在run->edit configuration->Deploymen->Application context進行配置,demo2就是注解中給該servlet添加的資源路徑,所以就可以直接找到Servletdemo這個類,如圖

    服務器端顯示如下(idea)

    讓我們看一看WebServlet這個注解的內容:

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package javax.servlet.annotation;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet {String name() default "";//相當于<Servlet-name>String[] value() default {};//代表urlPatterns()屬性配置String[] urlPatterns() default {};//相當于<url-pattern>int loadOnStartup() default -1;//相當于<load-on-startup>WebInitParam[] initParams() default {};boolean asyncSupported() default false;String smallIcon() default "";String largeIcon() default "";String description() default "";String displayName() default "";}

    注意兩個最重要的屬性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部分重要源碼public abstract class HttpServlet extends GenericServlet {private static final long serialVersionUID = 1L;private static final String METHOD_DELETE = "DELETE";private static final String METHOD_HEAD = "HEAD";private static final String METHOD_GET = "GET";private static final String METHOD_OPTIONS = "OPTIONS";private static final String METHOD_POST = "POST";private static final String METHOD_PUT = "PUT";private static final String METHOD_TRACE = "TRACE";private static final String HEADER_IFMODSINCE = "If-Modified-Since";private static final String HEADER_LASTMOD = "Last-Modified";private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");public HttpServlet() {}protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String protocol = req.getProtocol();String msg = lStrings.getString("http.method_get_not_supported");if (protocol.endsWith("1.1")) {resp.sendError(405, msg);} else {resp.sendError(400, msg);}}protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (DispatcherType.INCLUDE.equals(req.getDispatcherType())) {this.doGet(req, resp);} else {NoBodyResponse response = new NoBodyResponse(resp);this.doGet(req, response);response.setContentLength();}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String protocol = req.getProtocol();String msg = lStrings.getString("http.method_post_not_supported");if (protocol.endsWith("1.1")) {resp.sendError(405, msg);} else {resp.sendError(400, msg);}}// 這個service方法就是判斷請求方式,并對應相應的方法進行反應protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();long lastModified;if (method.equals("GET")) {lastModified = this.getLastModified(req);if (lastModified == -1L) {this.doGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader("If-Modified-Since");} catch (IllegalArgumentException var9) {ifModifiedSince = -1L;}if (ifModifiedSince < lastModified / 1000L * 1000L) {this.maybeSetLastModified(resp, lastModified);this.doGet(req, resp);} else {resp.setStatus(304);}}} else if (method.equals("HEAD")) {lastModified = this.getLastModified(req);this.maybeSetLastModified(resp, lastModified);this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}}public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request = (HttpServletRequest)req;response = (HttpServletResponse)res;} catch (ClassCastException var6) {throw new ServletException("non-HTTP request or response");}this.service(request, response);} }

    由于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知识入门的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。