摘要:一個應用程序中可以有很多,這些都共享同一個對象,我們經常將對象叫域對象。常用的的獲取對象的向對象綁定數據的從對象取出數據的獲取當前應用的初始化參數的獲取資源文件,返回流的獲取資源文件,返回路徑
第一個Servlet開發步驟
01_創建一個普通Java類,實現Servlet接口 02_將寫好的Servlet類,還得配置到web.xml文件中去 Demo01.java編寫一個簡單的Servlet程序輸出英文字符串到瀏覽器【實現Servlet接口】
public class Demo01 implements Servlet{ @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { OutputStream os = servletResponse.getOutputStream(); os.write("web.xmlHello Servlet
".getBytes()); os.flush(); os.close(); } }
為什么建議創建Servlet直接繼承HttpServlet類呢Demo01 cn.itheima.servlet.Demo01 Demo01 /xxx
創建Servlet有三種方式,前二種創建的Servlet能處理任意協議的請求, 但我們做Web開發,大多都是處理Http協議,所有建議直接繼承HttpServlet類 再者,HttpServlet類,也繼承與實現了前二種方式的類或接口,且有適合于HTTP協議特點的方法方式一:編寫一個簡單的Servlet程序輸出英文字符串到瀏覽器【實現Servlet接口】
編寫一個簡單的Servlet程序輸出英文字符串到瀏覽器【實現Servlet接口】
public class Demo01 implements Servlet{ @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { OutputStream os = servletResponse.getOutputStream(); os.write("方式二:編寫一個簡單的Servlet程序輸出中文字符串到瀏覽器【繼承GenericServlet類】Hello Servlet
".getBytes()); os.flush(); os.close(); } }Demo01 cn.itheima.servlet.Demo01 Demo01 /Demo01
編寫一個簡單的Servlet程序輸出中文字符串到瀏覽器【繼承GenericServlet類】
public class Demo02 extends GenericServlet{ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { servletResponse.setContentType("text/html;charset=UTF-8"); PrintWriter pw = servletResponse.getWriter(); pw.write("編寫一個簡單的Servlet程序輸出當前時間到瀏覽器【繼承HttpServlet類】你好,Servlet,我們今天見面了
"); pw.flush(); pw.close(); } }Demo02 cn.itheima.servlet.Demo02 Demo02 /Demo02
編寫一個簡單的Servlet程序輸出當前時間到瀏覽器【繼承HttpServlet類】
public class Demo03 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write("什么是Servlet生命周期現在時間為:" + new Date().toLocaleString()+"
"); pw.flush(); pw.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } }Demo03 cn.itheima.servlet.Demo03 如果在瀏覽器地址欄輸入URL后回車,這種方式屬于GET請求 Demo03 /Demo03
Servlet是運行于Web服務器中的Servlet引擎/容器中,客戶端是不能直接調用Servlet的,必須由Servlet引擎/容器才能調用。因此Servlet在引擎/容器中從創建到銷毀的全過程,稱之為Servlet生命周期Servlet生命周期分為四個過程,分別是:
01——構造器(執行一次) 02——初始化(執行一次)-----------------------------在默認情況下,首次訪問該Servlet時執行 03——doGet/doPost/service(執行多次)----------------------非首次訪問該Servlet時執行 04——銷毀(執行一次) Servlet是單例的,被多個客戶端線程共享,建議不要用實例變量Servlet運行過程圖解 ServletConfig對象有什么作用
當Servlet配置了初始化參數后,Servlet引擎/容器在創建Servlet對象時, 會自動將這些初始化參數封裝到ServletConfig對象中,并在調用Servlet的 init(ServletContext)方法時,將ServletConfig對象傳遞給Servlet。 從而程序員可以通過ServletConfig對象就可以得到當前Servlet的初始化參數信息常用的API
ServletContext的getInitParameterNames():獲取當前Servlet的所有初始化參數
ServletContext的getInitParameter():獲取當前Servlet的一個初始化參數 Demo04.java
public class Demo04 extends HttpServlet { private ServletConfig config; public Demo04() { } @Override public void init(ServletConfig config) throws ServletException { this.config = config; /* //獲取web.xml文件中的servlet初始化參數 EnumerationServlet創建時間enums = config.getInitParameterNames(); while(enums.hasMoreElements()){ String key = enums.nextElement(); String value = config.getInitParameter(key); //在控制臺顯示 System.out.println(key+"-"+value); } */ } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); Enumeration enums = config.getInitParameterNames(); while(enums.hasMoreElements()){ String key = enums.nextElement(); String value = config.getInitParameter(key); //在瀏覽器中顯示 pw.write(key+"--"+value+"
"); } pw.flush(); pw.close(); } @Override public void destroy() { } }
在默認情況下,Servlet是客戶端首次訪問時,Servlet引擎/容器才創建并對其初始化, 有時我們希望Servlet創建與初始化的時間能夠提前到Web服務器啟動時,這樣客戶 端首次訪問時,就不用創建與初始化Servlet了,提高了訪問速度,我們可以用自動 加載Servlet來完成任務 配置的數值越小,越先創建與初始化,只限于0,1,2,3等等,負數與沒有配置效果一樣 如果配置負數,必須用戶首次訪問時才創建與初始化該Servlet
web.xml什么是Servlet虛擬路徑Demo04 cn.itheima.servlet.Demo04 1 Demo04 /Demo04
一個在web.xml文件中,可供外界能訪問Web服務器中Servlet的字符串 即什么是缺省Servlet/xxx這個就是Servlet虛擬路徑 為什么要配置Servlet虛擬路徑 Servlet位于Servlet引擎/容器中,Servlet引擎/容器又位于Web服務器中, 客戶端是不可能知道Servlet的名字的,但Servlet畢竟要處理客戶端提交的請求, 就必須讓客戶端訪問,那么要訪問Servlet,就必須給客戶端一個有效的訪問路徑, 又不能暴露Servlet真實保存在服務器中的位置,于是就只能配置Servlet虛擬路徑 如何配置Servlet虛擬路徑 Servlet虛擬路徑的配置是在web.xml文件中,一個Servlet可以配置在一個或多個虛擬路徑上, 也可以使用*.xx或者是/xx通配符形式來配置Servlet路徑通配符 不能出現/*.do的情況,只能分成二個url-pattern來書寫 當一個真正的index.html與一個虛擬路徑為index.html同時存在時, 以虛擬路徑為主 web.xmlDemo05 cn.itheima.servlet.Demo05 1 Demo05 /Demo05 /xx /yy /index.html /* *.do
如果某個Servlet的映射的虛擬路徑為一個正斜杠(/),那么這個Servlet就成為 當前Web應用程序的默認Servlet默認Servlet有什么作用 ----專用于處理其它正常Servlet不處理的客戶端請求 Servlet讀取硬盤中的圖片
Tomcat中就有默認Servlet在Tomcat/conf/web.xml文件中,注冊了一個名稱為DefaultServlet的Servlet, 并將這個Servlet設置為了缺省Servlet,像404,500,等頁面,就是由這個DefaultServlet
來響應給客戶端的,當程序員有一個缺省Servlet時,Tomcat又有一個缺省Servlet時, 以程序員為主。
項目中,我們以Tomcat中的缺省Servlet為主,即程序員不用寫缺省Servlet
Demo06.java public class Demo06 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //輸入流指向圖片 InputStream is = this.getClass().getClassLoader().getResourceAsStream("../../images/girl1.jpg"); //輸出流指向瀏覽器 OutputStream os = response.getOutputStream(); //讀取圖片并輸出到瀏覽器 byte[] buf = new byte[2048]; int len = 0; while((len=is.read(buf))>0){ os.write(buf,0,len); } //關閉流 os.close(); is.close(); } }ServletContext對象 ServletContext對象有什么作用Demo06 cn.itheima.servlet.Demo06 關于路徑問題: /webapps /day11 /images/girl_1.jpg /WEB-INF/classes/Demo06.class /lib /web.xml Demo06 /
Tomcat啟動時,會為每個部署在Tomcat中的Web應用程序都創建一個對應的ServletContext對象,
它代表當前Web應用。即一個Web應用程序對應著一個ServletContext對象。
一個Web應用程序中可以有很多Servlet,這些Servlet都共享同一個ServletContext對象,我們經常
將ServletContext對象叫域對象。
ServletConfig的getServletContext():獲取ServletContext對象 ServletContext的setAttribute():向ServletContext對象綁定數據 ServletContext的getAttribute():從ServletContext對象取出數據 ServletContext的getInitParameter():獲取當前Web應用的初始化參數 ServletContext的getResourceAsStream():獲取資源文件,返回流 ServletContext的getRealPath():獲取資源文件,返回路徑 Demo07.java public class Demo07 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { System.out.println("Demo07::doGet()"); //InputStream is = this.getServletContext().getResourceAsStream("/images/girl_2.png"); String filePath = this.getServletContext().getRealPath("/images/girl_3.png"); System.out.println(filePath); InputStream is = new FileInputStream(filePath); OutputStream os = response.getOutputStream(); byte[] buf = new byte[1024*2]; int len = 0; while((len=is.read(buf))>0){ os.write(buf,0,len); } os.close(); is.close(); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70007.html
摘要:,容器的作用是負責處理客戶請求,當客戶請求來到時,容器獲取請求,然后調用某個,并把的執行結果返回給客戶。將請求發送給服務器端是的容器。將該請求轉換成一個消息,并將其放入一個隊列。繼承自類,其在中扮演的角色是中心控制器。 容器就是你的程序運行時需要的環境 1,Tomcat是Servlet的運行環境,即一個Servlet容器。 2,Servlet容器的作用是負責處理客戶請求,當客戶請求來到...
閱讀 1675·2021-11-15 11:37
閱讀 3408·2021-09-28 09:44
閱讀 1649·2021-09-07 10:15
閱讀 2784·2021-09-03 10:39
閱讀 2687·2019-08-29 13:20
閱讀 1291·2019-08-29 12:51
閱讀 2204·2019-08-26 13:44
閱讀 2125·2019-08-23 18:02