Java篇-Servlet應(yīng)用

一 : Servle簡(jiǎn)介

Servlet運(yùn)行在服務(wù)端的java小程序,是sun公司提供的一套接口規(guī)范,用來(lái)處理客戶端請(qǐng)求,響應(yīng)給瀏覽器的動(dòng)態(tài)資源,但Servlet的實(shí)質(zhì)就是java代碼,通過(guò)java的API動(dòng)態(tài)的向客戶端輸出內(nèi)容

Servlet架構(gòu)

二 : 實(shí)現(xiàn)Servlet接口以及方法

Java Resources包下創(chuàng)建一個(gè)java類并且實(shí)現(xiàn) Servlet的接口
并且實(shí)現(xiàn)接口中的方法,并且手動(dòng)web.xml文件配置相應(yīng)的Servlet信息

public class QuickStartServlet implements Servlet{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("Servlet Destroy");
    }


    @Override
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("Servlet IS init");
        //獲得servlet 的name 
        String servlet = config.getServletName();
        System.out.println(servlet);
        
        //獲得servlet的初始化參數(shù)
        String parm = config.getInitParameter("url");
        System.out.println(parm);
        
        //獲得ServletContext
        ServletContext serContext = config.getServletContext();
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("Servlet IS Running");
        res.getWriter().write("Servlet IS Running");
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

}

運(yùn)行服務(wù)器并訪問(wèn),打印結(jié)果 :

Servlet IS init
QuickStartServlet
jdbc:mysql://mydb
Servlet IS Running

停止服務(wù)器打印結(jié)果 :

Servlet Destroy

三 : Servlet生命周期

在第二部分的打印結(jié)果中,我們可以分析和總結(jié)出Servlet的生命周期特點(diǎn)
① : init(ServletConfig config) 在Servlet對(duì)象創(chuàng)建的時(shí)候執(zhí)行,當(dāng)然,也可以在服務(wù)器啟動(dòng)后調(diào)用,在web.xml中配置,下面會(huì)提到.
ServletConfig 為該servlet對(duì)象的配置信息

② : public void service(ServletRequest req, ServletResponse res)在每次訪問(wèn)請(qǐng)求的時(shí)候都會(huì)執(zhí)行.
ServletRequest req : 代表請(qǐng)求 ,內(nèi)部封裝的http請(qǐng)求的信息
ServletResponse res : 代表響應(yīng),內(nèi)部封裝的是響應(yīng)返回的信息

③ : destroy() servlet銷毀的時(shí)候執(zhí)行(服務(wù)器關(guān)閉servlet就銷毀了)

四 : HttpServlet

在實(shí)際開發(fā)中,不會(huì)去直接實(shí)現(xiàn)Servlet接口,因?yàn)橐貙懙姆椒ㄌ?我們一般創(chuàng)建類繼承HttpServlet,我們只要重寫doGetdoPost就好了,而實(shí)現(xiàn)Servlet接口以及實(shí)現(xiàn)接口方法的任務(wù)就交給HttpServlet及父類去搞定,我們并不需要太關(guān)心.
doGetdoPost每次訪問(wèn)都會(huì)調(diào)用(get 方式 調(diào)用doGet,post 方式調(diào)用doPost)

實(shí)現(xiàn)步驟 :
新創(chuàng)建一個(gè)Servlet

第一步

默認(rèn)繼承了HttpServlet
第二步

點(diǎn)擊next,然后修改一下URL Mappings 會(huì)自動(dòng)在web.xml中配置好需要的相關(guān)配置,十分智能不需要手動(dòng)添加了,接著finish就完成了創(chuàng)建
第三步

創(chuàng)建的繼承HttpServlet代碼

request.Method() 獲得請(qǐng)求方式
如果是get將調(diào)用doGet()
如果是post將調(diào)用doPost()

public class QuickStartServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
        response.getWriter().write("doGet running....");
    }

}

四 : Servlet訪問(wèn)流程

在訪問(wèn)請(qǐng)求來(lái)到時(shí)Tomcat服務(wù)器中的Tomat引擎(核心代碼)會(huì)幫助處理 :
① 解析請(qǐng)求的資源地址
② 創(chuàng)建servlet對(duì)象
③ 創(chuàng)建代表請(qǐng)求的request對(duì)象和代表響應(yīng)的response對(duì)
象,每次訪問(wèn)service方法,都會(huì)創(chuàng)建一對(duì)新的requestresponse對(duì)象

流程

五 : Servlet配置

  • servlet類的配置 :
<servlet>
    <servlet-name>QuickStartServlet</servlet-name>
    <servlet-class>com.TianTianBaby.servlet.QuickStartServlet</servlet-class>
    <init-param>
      <param-name>url</param-name>
      <param-value>jdbc:mysql://mydb</param-value>
    </init-param>
  </servlet>
  • servlet虛擬路徑配置
<servlet-mapping>
    <servlet-name>QuickStartServlet</servlet-name>
    <url-pattern>/quickStartServlet</url-pattern>
  </servlet-mapping>

其中類的配置中的servlet-name要與虛擬路徑中servlet-name保持一致,因?yàn)橥ㄟ^(guò)虛擬路徑url-pattern確定servlet-name找尋對(duì)應(yīng)的servlet-class.

  • url-pattern通常配置

①完全匹配 : 訪問(wèn)的資源與配置的資源完全相同才能訪問(wèn)到

    <url-pattern>/quickStartServlet</url-pattern>

②目錄匹配 : /虛擬目錄..../*

    <url-pattern>/aaa/bbb/ccc/*</url-pattern>

③擴(kuò)展名匹配 : *.擴(kuò)展名

    <url-pattern>*.abcdtz</url-pattern>

第二種與第三種不要混用/aaa/bbb/*.abcd(錯(cuò)誤)

  • 歡迎頁(yè)面匹配

會(huì)按照匹配順序逐一尋找,默認(rèn)的頁(yè)面

 <welcome-file-list>
    <welcome-file>login.html</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  • 服務(wù)器啟動(dòng)實(shí)例化Servlet配置

Servlet默認(rèn)第一次訪問(wèn)時(shí)創(chuàng)建
當(dāng)Servlet配置時(shí)

   <load-on-startup>3</load-on-startup>

servlet對(duì)象在服務(wù)器啟動(dòng)時(shí)就創(chuàng)建,數(shù)字代表優(yōu)先級(jí),數(shù)字越小優(yōu)先級(jí)越高

  • 缺省Servlet

將url-pattern配置/,代表該servlet是缺省的servlet
缺省的servlet : 當(dāng)你訪問(wèn)資源地址所有的servlet都不匹配時(shí),缺省的servlet負(fù)責(zé)處理.

web應(yīng)用中所有的資源的響應(yīng)都是servlet負(fù)責(zé),包括靜態(tài)資源.
當(dāng)我們?cè)谧约旱膚eb應(yīng)用中沒(méi)有配置缺省的,訪問(wèn)時(shí)又沒(méi)有找到相應(yīng)的動(dòng)態(tài)資源,則Tomcat中web.xml給我們配置了一個(gè)缺省的servlet負(fù)責(zé)處理這些靜態(tài)資源

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

如果還找不到,這時(shí)候會(huì)給我們返回404

六 : ServletContext

ServletContext代表是一個(gè)web應(yīng)用的環(huán)境(上下文)對(duì)象,ServletContext對(duì)象內(nèi)部封裝是該web應(yīng)用的信息,ServletContext對(duì)象一個(gè)web應(yīng)用只有一個(gè),一個(gè)web應(yīng)用可以有多個(gè)servlet對(duì)象.

ServletContext對(duì)象的生命周期

創(chuàng)建 : 服務(wù)器啟動(dòng)或者發(fā)布web應(yīng)用
銷毀 : 服務(wù)器關(guān)閉或移除web應(yīng)用

獲取ServletContext對(duì)象方式
ServletContext context = getServletContext();
ServletContext context = config.getServletContext();
ServletContext的作用

①獲得web應(yīng)用全局的初始化參數(shù)
配置全局的初始化參數(shù) :

<context-param>
    <param-name>driver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>

通過(guò)context對(duì)象獲得參數(shù)

ServletContext context = getServletContext();
//1.獲得初始化參數(shù)
String initPar = context.getInitParameter("driver");

②獲得web應(yīng)用中任何資源的絕對(duì)路徑

String apath = context.getRealPath("/tz.txt");

相當(dāng)于

//在讀取src(classes)下的資源是可以同類加載器--專門加載classes下的文件的
//getResource()參數(shù)是一個(gè)相對(duì)地址,相對(duì)于classes
String path = ContextServlet.class.getClassLoader().getResource("c.txt").getPath();

③ServletContext是一個(gè)域?qū)ο?/p>

域?qū)ο缶褪谴鎯?chǔ)數(shù)據(jù)的區(qū)域.在整個(gè)web應(yīng)用,素有的web資源都可以隨意向ServletContext域中存取數(shù)據(jù),數(shù)據(jù)可以共享

在域?qū)ο笾写嫒霐?shù)據(jù)

context.setAttribute("name", "tt");

在域?qū)ο笾腥〕鰯?shù)據(jù)

//域?qū)ο?-從servletContext中取數(shù)據(jù)
String att = (String)getServletContext().getAttribute("name");

在域?qū)ο笾幸瞥龑傩?/p>

getServletContext().removeAttribute(String name)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容