6乳绕、Servlet(B站 狂神說java)

6瓦堵、Servlet

6.1、Servlet簡介

  • Servlet就是sun公司開發(fā)動態(tài)web的一門技術(shù)

  • Sun在這些API中提供一個接口叫做:Servlet嗅蔬,如果你想開發(fā)一個Servlet程序剑按,只需要完成兩個小步驟:

    • 編寫一個類,實現(xiàn)Servlet接口

    • 把開發(fā)好的Java類部署到web服務(wù)器中澜术。

把實現(xiàn)了Servlet接口的Java程序叫做艺蝴,Servlet

6.2、HelloServlet

Serlvet接口Sun公司有兩個默認的實現(xiàn)類:HttpServlet鸟废,GenericServlet

  1. 構(gòu)建一個普通的Maven項目猜敢,刪掉里面的src目錄,以后我們的學習就在這個項目里面建立Moudel盒延;這個空的工程就是Maven主工程缩擂;

  2. 關(guān)于Maven父子工程的理解:

    父項目中會有

     <modules>
       <module>servlet-01</module>
   </modules>

子項目會有

  <parent>
       <artifactId>javaweb-02-servlet</artifactId>
       <groupId>com.kuang</groupId>
       <version>1.0-SNAPSHOT</version>
   </parent>
父項目中的java子項目可以直接使用
son extends father
  1. Maven環(huán)境優(yōu)化

    1. 修改web.xml為最新的

    2. 將maven的結(jié)構(gòu)搭建完整

  2. 編寫一個Servlet程序

1567911804700.png
1.  編寫一個普通類

2.  實現(xiàn)Servlet接口,這里我們直接繼承HttpServlet
public class HelloServlet extends HttpServlet {
   
   //由于get或者post只是請求實現(xiàn)的不同的方式添寺,可以相互調(diào)用胯盯,業(yè)務(wù)邏輯都一樣;
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //ServletOutputStream outputStream = resp.getOutputStream();
       PrintWriter writer = resp.getWriter(); //響應(yīng)流
       writer.print("Hello,Serlvet");
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
   }
}
  1. 編寫Servlet的映射

    為什么需要映射:我們寫的是JAVA程序计露,但是要通過瀏覽器訪問博脑,而瀏覽器需要連接web服務(wù)器楞捂,所以我們需要再web服務(wù)中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑趋厉;

   <!--注冊Servlet-->
 <servlet>
     <servlet-name>hello</servlet-name>
     <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
 </servlet>
 <!--Servlet的請求路徑-->
 <servlet-mapping>
     <servlet-name>hello</servlet-name>
     <url-pattern>/hello</url-pattern>
 </servlet-mapping>

  1. 配置Tomcat

    注意:配置項目發(fā)布的路徑就可以了

  2. 啟動測試寨闹,OK!

6.3君账、Servlet原理

Servlet是由Web服務(wù)器調(diào)用繁堡,web服務(wù)器在收到瀏覽器請求之后,會:

1567913793252.png

6.4乡数、Mapping問題

  1. 一個Servlet可以指定一個映射路徑
   <servlet-mapping>
     <servlet-name>hello</servlet-name>
     <url-pattern>/hello</url-pattern>
 </servlet-mapping>
  1. 一個Servlet可以指定多個映射路徑
 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello4</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello5</url-pattern>
    </servlet-mapping>  
  1. 一個Servlet可以指定通用映射路徑
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>
  1. 默認請求路徑
       <!--默認請求路徑-->
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
  1. 指定一些后綴或者前綴等等….
    
<!--可以自定義后綴實現(xiàn)請求映射
   注意點椭蹄,*前面不能加項目映射的路徑
   hello/sajdlkajda.qinjiang
   -->
<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>*.qinjiang</url-pattern>
</servlet-mapping>
  1. 優(yōu)先級問題 指定了固有的映射路徑優(yōu)先級最高,如果找不到就會走默認的處理請求净赴;
   
<!--404-->
<servlet>
  <servlet-name>error</servlet-name>
  <servlet-class>com.kuang.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>error</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

6.5绳矩、ServletContext

web容器在啟動的時候,它會為每個web程序都創(chuàng)建一個對應(yīng)的ServletContext對象玖翅,它代表了當前的web應(yīng)用翼馆;

1、共享數(shù)據(jù)

我在這個Servlet中保存的數(shù)據(jù)金度,可以在另外一個servlet中拿到应媚;

public class HelloServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
      //this.getInitParameter()   初始化參數(shù)
      //this.getServletConfig()   Servlet配置
      //this.getServletContext()  Servlet上下文
      ServletContext context = this.getServletContext();

      String username = "秦疆"; //數(shù)據(jù)
      context.setAttribute("username",username); //將一個數(shù)據(jù)保存在了ServletContext中,名字為:username 猜极。值 username

  }

}

public class GetServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      ServletContext context = this.getServletContext();
      String username = (String) context.getAttribute("username");

      resp.setContentType("text/html");
      resp.setCharacterEncoding("utf-8");
      resp.getWriter().print("名字"+username);

  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doGet(req, resp);
  }
}


  <servlet>
      <servlet-name>hello</servlet-name>
      <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello</url-pattern>
  </servlet-mapping>


  <servlet>
      <servlet-name>getc</servlet-name>
      <servlet-class>com.kuang.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>getc</servlet-name>
      <url-pattern>/getc</url-pattern>
  </servlet-mapping>

測試訪問結(jié)果中姜;

2、獲取初始化參數(shù)

    <!--配置一些web應(yīng)用初始化參數(shù)-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param> 
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String url = context.getInitParameter("url");
    resp.getWriter().print(url);
}

3跟伏、請求轉(zhuǎn)發(fā)

  @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    System.out.println("進入了ServletDemo04");
    //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //轉(zhuǎn)發(fā)的請求路徑
    //requestDispatcher.forward(req,resp); //調(diào)用forward實現(xiàn)請求轉(zhuǎn)發(fā)丢胚;
    context.getRequestDispatcher("/gp").forward(req,resp);
}
1567924457532.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市受扳,隨后出現(xiàn)的幾起案子携龟,更是在濱河造成了極大的恐慌,老刑警劉巖辞色,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骨宠,死亡現(xiàn)場離奇詭異,居然都是意外死亡相满,警方通過查閱死者的電腦和手機层亿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來立美,“玉大人匿又,你說我怎么就攤上這事〗ㄌ悖” “怎么了碌更?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵裕偿,是天一觀的道長。 經(jīng)常有香客問我痛单,道長嘿棘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任旭绒,我火速辦了婚禮鸟妙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挥吵。我一直安慰自己重父,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布忽匈。 她就那樣靜靜地躺著房午,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丹允。 梳的紋絲不亂的頭發(fā)上郭厌,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音嫌松,去河邊找鬼沪曙。 笑死,一個胖子當著我的面吹牛萎羔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碳默,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贾陷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘱根?” 一聲冷哼從身側(cè)響起髓废,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎该抒,沒想到半個月后慌洪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凑保,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年冈爹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧引。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡频伤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芝此,到底是詐尸還是另有隱情憋肖,我是刑警寧澤因痛,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站岸更,受9級特大地震影響鸵膏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怎炊,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一谭企、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧结胀,春花似錦赞咙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秸抚,卻和暖如春速和,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剥汤。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工颠放, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吭敢。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓碰凶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹿驼。 傳聞我的和親對象是個殘疾皇子欲低,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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