整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          servlet總結(jié)二:web服務(wù)器配置與啟動

          servlet總結(jié)二:web服務(wù)器配置與啟動

          們先來看一下web服務(wù)器在整個B/S架構(gòu)中的位置:

          我們發(fā)現(xiàn)web服務(wù)器有種承上啟下的作用,它是游覽器和java程序建立連接的一個橋梁;

          我們先去下載web服務(wù)器Tomcat

          https://www.apache.org/:Tomcat屬于apache組織下的一個開源的項(xiàng)目,

          圖上面的每一個單詞都代表一個項(xiàng)目,tomcat只是apache組織里面的冰山一角;apache里面還包含了很多我們常用的一些框架:struts,大數(shù)據(jù)相關(guān)的HBase,Hadoop等待太多了;

          我們點(diǎn)擊Tomcat進(jìn)入:https://tomcat.apache.org/

          目前tomcat的最新版本是10,我們下載并安裝;tomcat是綠色版,下載后直接解壓就可以了;

          tomcat目錄結(jié)構(gòu)

          啟動命令:C:\apache-tomcat-8.5.73\bin\startup.bat

          tomcat服務(wù)器是純java語言寫的,所以要運(yùn)行tomcat一定要有java運(yùn)行環(huán)境,所以第一步先配置JAVA_HOME:C:\Program Files\Java\jdk1.8.0_101;

          配置了以上步驟就可以運(yùn)行tomcat了,但是如果現(xiàn)在cmd命令窗口里面直接運(yùn)行tomcat好需要配置兩個地方:

          1、配置啟動命令的path;

          path:C:\apache-tomcat-8.5.73\bin

          2、配置CATALINA_HOME(tomcat的家)

          CATALINA_HOME:C:\apache-tomcat-8.5.73

          配置以上兩步驟就可以在任何地方啟動tomcat了,CATALINA是tomcat的作者;

          文鏈接:https://juejin.cn/post/7107099957219295262

          一、Servlet 概述


          1、Servlet名字

          Servlet=Server + applet

          Server:服務(wù)器 applet:小程序 Servlet:服務(wù)器端的小程序


          2、Servlet在Web應(yīng)用中的作用

          ①生活中的例子

          ②對應(yīng)Web應(yīng)用

          ③具體細(xì)節(jié)

          ④Servlet扮演角色 在整個Web應(yīng)用中,Servlet主要負(fù)責(zé)處理請求、協(xié)調(diào)調(diào)度功能。我們可以把Servlet稱為Web應(yīng)用中的『控制器』



          二、Servlet HelloWorld


          1、HelloWorld分析

          ①目標(biāo) 在頁面上點(diǎn)擊超鏈接,由Servlet處理這個請求,并返回一個響應(yīng)字符串:Hello,I am Servlet! 。

          ②思路


          2、具體操作

          ①創(chuàng)建動態(tài)Web Module 《踩坑+排雷新版IDEA2021.1創(chuàng)建配置Javaweb項(xiàng)目并部署在Tomcat容器》

          ②創(chuàng)建前端頁面超鏈接 begin.html 的代碼如下:

          <!DOCTYPE html>
          <html lang="en">
          <head>
            <meta charset="UTF-8">
            <title>Title</title>
          </head>
          <body>
            <a href="hello">請點(diǎn)擊我</a>
          </body>
          </html>
          復(fù)制代碼

          ③創(chuàng)建HelloServlet的Java類

          package com.yeman.Servlets;
          
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import javax.servlet.http.HttpServlet;
          import java.io.IOException;
          import java.io.PrintWriter;
          
          /**
           * @Author: Yeman
           * @Date: 2022-02-11-18:15
           * @Description:
           */
          public class Hello extends HttpServlet {
              @Override
              public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
                  System.out.println("執(zhí)行了Hello這個Servlet!");
                  
                  // 返回響應(yīng)字符串
                  // 1、獲取能夠返回響應(yīng)數(shù)據(jù)的字符流對象
                  PrintWriter writer=res.getWriter();
          
                  // 2、向字符流對象寫入數(shù)據(jù)
                  writer.write("Hello,I am Servlet!");
                  
              }
          }
          復(fù)制代碼

          ④配置Hello Servlet 配置文件位置:WEB-INF/web.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                   version="4.0">
              <!-- 配置Servlet本身 -->
              <servlet>
              	 <!-- 給Servlet設(shè)置一個簡短名稱 -->
                  <servlet-name>Hello</servlet-name>
                  <!-- 配置Servlet的全類名 -->
                  <servlet-class>com.yeman.Servlets.Hello</servlet-class>
              </servlet>
              <!-- 將Servlet和訪問地址關(guān)聯(lián)起來 -->
              <servlet-mapping>
                  <servlet-name>Hello</servlet-name>
                  <url-pattern>/hello</url-pattern>
              </servlet-mapping>
          </web-app>
          復(fù)制代碼

          ⑤測試

          ⑥小結(jié) 需求:在瀏覽器上點(diǎn)超鏈接能夠訪問Java程序。


          3、梳理概念

          ①原生Tomcat

          ②IDEA中的Tomcat實(shí)例

          ③IDEA中的Web工程

          ④根據(jù)Web工程生成的war包

          ⑤Web工程中的資源 [1]靜態(tài)資源

          • HTML文件
          • CSS文件
          • JavaScript文件
          • 圖片文件

          [2]動態(tài)資源

          • Servlet

          ⑥訪問資源的地址 [1]靜態(tài)資源

          /Web應(yīng)用名稱/靜態(tài)資源本身的路徑

          [2]動態(tài)資源

          /Web應(yīng)用名稱/虛擬路徑

          ⑦Web應(yīng)用名稱

          ⑧總體的邏輯結(jié)構(gòu)



          三、Servlet 繼承關(guān)系


          1、繼承關(guān)系

          javax.servlet.Servlet接口----->javax.servlet.GenericServlet抽象類 ----->javax.servlet.http.HttpServlet抽象子類


          2、相關(guān)方法

          ①javax.servlet.Servlet接口:

          • void init(config) - 初始化方法
          • void service(request,response) - 服務(wù)方法
          • void destory() - 銷毀方法

          ②javax.servlet.GenericServlet抽象類:

          • void service(request,response) - 仍然是抽象的

          ③javax.servlet.http.HttpServlet 抽象子類:

          • void service(request,response) - 不是抽象的

          String method=req.getMethod(); 獲取請求的方式 各種if判斷,根據(jù)請求方式不同,決定去調(diào)用不同的do方法:

          if (method.equals("GET")) {
                          this.doGet(req,resp);
                      } else if (method.equals("HEAD")) {
                          this.doHead(req, resp);
                      } else if (method.equals("POST")) {
                          this.doPost(req, resp);
                      } else if (method.equals("PUT")) {
                      ......
          復(fù)制代碼

          在HttpServlet這個抽象類中,do方法都差不多:

          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);
              }
          }
          復(fù)制代碼

          3、小結(jié)

          ①繼承關(guān)系: HttpServlet -> GenericServlet -> Servlet

          ②Servlet中的核心方法:init(),service(),destroy()

          ③服務(wù)方法: 當(dāng)有請求過來時,service方法會自動響應(yīng)(其實(shí)是tomcat容器調(diào)用的)。

          ④在HttpServlet中會分析請求的方式:到底是get、post、head還是delete等,然后再決定調(diào)用的是哪個do開頭的方法。

          ⑤在HttpServlet中的do方法默認(rèn)都是405的實(shí)現(xiàn)風(fēng)格,需要子類去實(shí)現(xiàn)對應(yīng)的方法,否則默認(rèn)會報(bào)405錯誤。因此,我們在新建Servlet時,需要考慮請求方法,從而決定重寫哪個do方法。



          四、Servlet 生命周期


          1、生命周期

          從出生到死亡的過程就是生命周期。對應(yīng)Servlet中的三個方法init(),service(),destroy()。

          默認(rèn)情況下:第一次接收請求時,這個Servlet會進(jìn)行實(shí)例化(調(diào)用構(gòu)造方法)、初始化(調(diào)用init())、然后服務(wù)(調(diào)用service())。從第二次請求開始,每一次都是服務(wù)。當(dāng)容器關(guān)閉時,其中的所有的servlet實(shí)例會被銷毀,調(diào)用銷毀方法。

          Servlet實(shí)例Tomcat只會創(chuàng)建一個,所有的請求都是這個實(shí)例去響應(yīng)。默認(rèn)情況下,第一次請求時,Tomcat才會去實(shí)例化,初始化,然后再服務(wù)。這樣的好處是什么是可以提高系統(tǒng)的啟動速度,這樣的缺點(diǎn)是什么是第一次請求耗時較長。因此得出結(jié)論: 如果需要提高系統(tǒng)的啟動速度,當(dāng)前默認(rèn)情況即可,如果需要提高響應(yīng)速度,就應(yīng)該設(shè)置Servlet的初始化時機(jī)。


          2、初始化時機(jī)

          我們可以通過<load-on-startup>來設(shè)置servlet啟動的先后順序,數(shù)字越小,啟動越靠前,最小值0。可以讓其在系統(tǒng)啟動時便實(shí)例化初始化,提高后期響應(yīng)速度。

          修改web.xml中Servlet的配置:

          <!-- 配置Servlet本身 -->
          <servlet>
              <!-- 全類名太長,給Servlet設(shè)置一個簡短名稱 -->
              <servlet-name>HelloServlet</servlet-name>
          
              <!-- 配置Servlet的全類名 -->
              <servlet-class>com.yeman.servlet.HelloServlet</servlet-class>
          
              <!-- 配置Servlet啟動順序 -->
              <load-on-startup>1</load-on-startup>
          </servlet>
          復(fù)制代碼

          3、Servlet 容器

          ①容器 在開發(fā)使用的各種技術(shù)中,經(jīng)常會有很多對象會放在容器中。

          ②容器提供的功能 容器會管理內(nèi)部對象的整個生命周期。對象在容器中才能夠正常的工作,得到來自容器的全方位的支持。

          • 創(chuàng)建對象
          • 初始化
          • 工作
          • 清理

          ③容器本身也是對象 特點(diǎn)1:往往是非常大的對象 特點(diǎn)2:通常的單例的

          ④典型Servlet容器產(chǎn)品舉例 Tomcat、jetty、jboss、Weblogic、WebSphere、glassfish

          ⑤Servlet在容器中是:單例的、線程不安全的。

          單例:所有的請求都是同一個實(shí)例去響應(yīng) 線程不安全:一個線程需要根據(jù)這個實(shí)例中的某個成員變量值去做邏輯判斷,但是在中間某個時機(jī),另一個線程改變了這個成員變量的值,從而導(dǎo)致第一個線程的執(zhí)行路徑發(fā)生了變化。

          注意:盡量的不要在servlet中定義成員變量,如果不得不定義成員變量,那么不要去:①修改成員變量的值 ②根據(jù)成員變量的值做一些邏輯判斷。


          4、小結(jié)



          五、ServletConfig 和 ServletContext


          1、ServletConfig 接口

          ①接口概覽

          ②接口方法

          ③初始化參數(shù)舉例

          <!-- 配置Servlet本身 -->
          <servlet>
              <!-- 全類名太長,給Servlet設(shè)置一個簡短名稱 -->
              <servlet-name>HelloServlet</servlet-name>
          
              <!-- 配置Servlet的全類名 -->
              <servlet-class>com.yeman.servlet.HelloServlet</servlet-class>
          
              <!-- 配置初始化參數(shù) -->
              <init-param>
                  <param-name>goodMan</param-name>
                  <param-value>me</param-value>
              </init-param>
          
              <!-- 配置Servlet啟動順序 -->
              <load-on-startup>1</load-on-startup>
          </servlet>
          復(fù)制代碼

          ④體驗(yàn)

          public class HelloServlet implements Servlet {
          
              // 聲明一個成員變量,用來接收init()方法傳入的servletConfig對象
              private ServletConfig servletConfig;
          
              public HelloServlet(){
                  System.out.println("HelloServlet對象創(chuàng)建!");
              }
          
              @Override
              public void init(ServletConfig servletConfig) throws ServletException {
          
                  System.out.println("HelloServlet對象初始化");
          
                  // 將Tomcat調(diào)用init()方法時傳入的servletConfig對象賦值給成員變量
                  this.servletConfig=servletConfig;
          
              }
          
              @Override
              public ServletConfig getServletConfig() {
          
                  // 返回成員變量servletConfig,方便使用
                  return this.servletConfig;
              }
          
              @Override
              public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
          
                  // 控制臺打印,證明這個方法被調(diào)用了
                  System.out.println("我是HelloServlet,我執(zhí)行了!");
          
                  // 返回響應(yīng)字符串
                  // 1、獲取能夠返回響應(yīng)數(shù)據(jù)的字符流對象
                  PrintWriter writer=servletResponse.getWriter();
          
                  // 2、向字符流對象寫入數(shù)據(jù)
                  writer.write("Hello,I am Servlet!");
          
                  //=============分割線===============// 測試ServletConfig對象的使用
                  // 1.獲取ServletConfig對象:在init()方法中完成
                  System.out.println("servletConfig=" + servletConfig.getClass().getName());
          
                  // 2.通過servletConfig對象獲取ServletContext對象
                  ServletContext servletContext=this.servletConfig.getServletContext();
                  System.out.println("servletContext=" + servletContext.getClass().getName());
          
                  // 3.通過servletConfig對象獲取初始化參數(shù)
                  Enumeration<String> enumeration=this.servletConfig.getInitParameterNames();
                  while (enumeration.hasMoreElements()) {
                      String name=enumeration.nextElement();
                      System.out.println("name=" + name);
          
                      String value=this.servletConfig.getInitParameter(name);
                      System.out.println("value=" + value);
                  }
              }
          
              @Override
              public String getServletInfo() {
                  return null;
              }
          
              @Override
              public void destroy() {
                  System.out.println("HelloServlet對象即將銷毀,現(xiàn)在執(zhí)行清理操作");
              }
          }
          復(fù)制代碼

          ⑤Servlet標(biāo)準(zhǔn)和JDBC標(biāo)準(zhǔn)對比: 廣義Servlet:javax.servlet包下的一系列接口定義的一組Web開發(fā)標(biāo)準(zhǔn)。遵循這一套標(biāo)準(zhǔn),不同的Servlet容器提供了不同的實(shí)現(xiàn)。 狹義Servlet:javax.servlet.Servlet接口和它的實(shí)現(xiàn)類,也就是實(shí)際開發(fā)時使用的具體的Servlet。

          同樣都體現(xiàn)了面向接口編程的思想,同時也體現(xiàn)了解耦的思想:只要接口不變,下層方法有任何變化,都不會影響上層方法。


          2、ServletContext 接口

          ①簡介

          代表整個Web應(yīng)用,是單例。

          典型的功能:

          • 獲取某個資源的真實(shí)路徑:getRealPath()
          • 獲取整個Web應(yīng)用級別的初始化參數(shù):getInitParameter()
          • 作為Web應(yīng)用范圍的域?qū)ο?/li>

          存入數(shù)據(jù):setAttribute() 取出數(shù)據(jù):getAttribute(

          ②體驗(yàn) [1]配置Web應(yīng)用級別的初始化參數(shù)

            <!-- 配置Web應(yīng)用的初始化參數(shù) -->
              <context-param>
                  <param-name>handsomeMan</param-name>
                  <param-value>alsoMe</param-value>
              </context-param>
          復(fù)制代碼

          [2]獲取參數(shù)

          String handsomeMan=servletContext.getInitParameter("handsomeMan");
          System.out.println("handsomeMan=" + handsomeMan);
          復(fù)制代碼


          六、請求轉(zhuǎn)發(fā)與重定向


          1、接力

          發(fā)一個請求給Servlet,接力棒就傳遞到了Servlet手中。而絕大部分情況下,Servlet不能獨(dú)自完成一切,需要把接力棒繼續(xù)傳遞下去,此時我們就需要請求的『轉(zhuǎn)發(fā)』或『重定向』。


          2、轉(zhuǎn)發(fā)

          ①本質(zhì):轉(zhuǎn)交

          ②完整定義:在請求的處理過程中,Servlet完成了自己的任務(wù),需要把請求轉(zhuǎn)交給下一個Servlet繼續(xù)處理。

          ③代碼

          request.getRequestDispatcher("/fruit/apple/red/big.html").forward(request, response);
          復(fù)制代碼

          ④類比

          關(guān)鍵:由于轉(zhuǎn)發(fā)操作的核心部分是在服務(wù)器端完成的,所以瀏覽器感知不到,整個過程中瀏覽器只發(fā)送一次請求。


          3、重定向

          ①本質(zhì):一種特殊的響應(yīng)

          ②完整定義:在請求的處理過程中,Servlet完成了自己的任務(wù),然后以一個響應(yīng)的方式告訴瀏覽器:要完成這個任務(wù)還需要你另外再訪問下一個資源”。

          ③代碼

          response.sendRedirect("/app/fruit/apple/red/big.html");
          復(fù)制代碼

          關(guān)鍵:由于重定向操作的核心部分是在瀏覽器端完成的,所以整個過程中瀏覽器共發(fā)送兩次請求。


          4、對比


          5、應(yīng)用場景

          可以簡單的判斷:能用轉(zhuǎn)發(fā)的先用轉(zhuǎn)發(fā),如果轉(zhuǎn)發(fā)不行,再使用重定向。

          需要通過同一個request對象把數(shù)據(jù)攜帶到目標(biāo)資源:只能用轉(zhuǎn)發(fā)。

          如果希望前往下一個資源之后,瀏覽器刷新訪問的是第二個資源:只能用重定向。



          七、獲取請求參數(shù)


          1、請求參數(shù)的概念

          瀏覽器在給服務(wù)器發(fā)送請求的同時,攜帶的參數(shù)數(shù)據(jù)。


          2、瀏覽器發(fā)送請求參數(shù)的基本形式

          • URL地址后面附著的請求參數(shù)

          /orange/CharacterServlet?username=Tom

          • 表單
          • Ajax請求

          3、服務(wù)器對請求參數(shù)的封裝

          總體上來說,服務(wù)器端將請求參數(shù)封裝為Map<String, String[]>。

          鍵:請求參數(shù)的名字 值:請求參數(shù)的值組成的數(shù)組


          4、獲取請求參數(shù)的方法


          5、測試

          ①HTML代碼

          <!-- 測試請求參數(shù)的表單 -->
          <form action="/orange/ParamServlet" method="post">
          
              <!-- 單行文本框 -->
              <!-- input標(biāo)簽配合type="text"屬性生成單行文本框 -->
              <!-- name屬性定義的是請求參數(shù)的名字 -->
              <!-- 如果設(shè)置了value屬性,那么這個值就是單行文本框的默認(rèn)值 -->
              個性簽名:<input type="text" name="signal" value="單行文本框的默認(rèn)值" /><br/>
          
              <!-- 密碼框 -->
              <!-- input標(biāo)簽配合type="password"屬性生成密碼框 -->
              <!-- 用戶在密碼框中填寫的內(nèi)容不會被一明文形式顯示 -->
              密碼:<input type="password" name="secret" /><br/>
          
              <!-- 單選框 -->
              <!-- input標(biāo)簽配合type="radio"屬性生成單選框 -->
              <!-- name屬性一致的radio會被瀏覽器識別為同一組單選框,同一組內(nèi)只能選擇一個 -->
              <!-- 提交表單后,真正發(fā)送給服務(wù)器的是name屬性和value屬性的值 -->
              <!-- 使用checked="checked"屬性設(shè)置默認(rèn)被選中 -->
              請選擇你最喜歡的季節(jié):
              <input type="radio" name="season" value="spring" />春天
              <input type="radio" name="season" value="summer" checked="checked" />夏天
              <input type="radio" name="season" value="autumn" />秋天
              <input type="radio" name="season" value="winter" />冬天
          
              <br/><br/>
          
              你最喜歡的動物是:
              <input type="radio" name="animal" value="tiger" />路虎
              <input type="radio" name="animal" value="horse" checked="checked" />寶馬
              <input type="radio" name="animal" value="cheetah" />捷豹
          
              <br/>
          
              <!-- 多選框 -->
              <!-- input標(biāo)簽和type="checkbox"配合生成多選框 -->
              <!-- 多選框被用戶選擇多個并提交表單后會產(chǎn)生『一個名字?jǐn)y帶多個值』的情況 -->
              你最喜歡的球隊(duì)是:
              <input type="checkbox" name="team" value="Brazil"/>巴西
              <input type="checkbox" name="team" value="German" checked="checked"/>德國
              <input type="checkbox" name="team" value="France"/>法國
              <input type="checkbox" name="team" value="China" checked="checked"/>中國
              <input type="checkbox" name="team" value="Italian"/>意大利
          
              <br/>
          
              <!-- 下拉列表 -->
              <!-- 使用select標(biāo)簽定義下拉列表整體,在select標(biāo)簽內(nèi)設(shè)置name屬性 -->
              你最喜歡的運(yùn)動是:
              <select name="sport">
                  <!-- 使用option屬性定義下拉列表的列表項(xiàng) -->
                  <!-- 使用option標(biāo)簽的value屬性設(shè)置提交給服務(wù)器的值,在option標(biāo)簽的標(biāo)簽體中設(shè)置給用戶看的值 -->
                  <option value="swimming">游泳</option>
                  <option value="running">跑步</option>
          
                  <!-- 使用option標(biāo)簽的selected="selected"屬性設(shè)置這個列表項(xiàng)默認(rèn)被選中 -->
                  <option value="shooting" selected="selected">射擊</option>
                  <option value="skating">溜冰</option>
              </select>
          
              <br/>
          
              <br/><br/>
          
              <!-- 表單隱藏域 -->
              <!-- input標(biāo)簽和type="hidden"配合生成表單隱藏域 -->
              <!-- 表單隱藏域在頁面上不會有任何顯示,用來保存要提交到服務(wù)器但是又不想讓用戶看到的數(shù)據(jù) -->
              <input type="hidden" name="userId" value="234654745" />
          
              <!-- 多行文本框 -->
              自我介紹:<textarea name="desc">多行文本框的默認(rèn)值</textarea>
          
              <br/>
          
              <!-- 普通按鈕 -->
              <button type="button">普通按鈕</button>
          
              <!-- 重置按鈕 -->
              <button type="reset">重置按鈕</button>
          
              <!-- 表單提交按鈕 -->
              <button type="submit">提交按鈕</button>
          </form>
          復(fù)制代碼

          ②Java代碼

          ervlet概述

          servlet=server + applet:運(yùn)行在服務(wù)器端的java程序

          Servlet是一個接口,一個類想通過瀏覽器被訪問到,那么這個類就必須直接或間接的實(shí)現(xiàn)Servlet接口

          Servlet執(zhí)行原理

          Servlet生命周期

          • init()

          servlet創(chuàng)建對象時,調(diào)用此方法完成初始化操作

          • service()

          用戶訪問servlet時,調(diào)用此方法完成業(yè)務(wù)邏輯的處理

          • destory()

          servlet對象銷毀,調(diào)用此方法完成銷毀操作

          Servlet體系結(jié)構(gòu)

          HttpServlet

          • Servlet可以映射多個url
          • url映射模式

          Request

          • 請求行

          • 請求頭

          • 請求體(請求參數(shù))

          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 設(shè)置解碼為UTF-8,解決post中文亂碼問題, 需放在首行
              req.setCharacterEncoding("UTF-8");
              
              doGet(req, resp);
          }
          • 請求轉(zhuǎn)發(fā)

          服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式

          • 域?qū)ο?/li>

          一個作用范圍的對象,可以在范圍共享數(shù)據(jù)

          request域: 代表一次請求的范圍,一般用于一次請求中轉(zhuǎn)發(fā)的多個資源中共享數(shù)據(jù)

          Response

          response對象表示web服務(wù)器給瀏覽器返回的響應(yīng)信息。

          作用:返回給瀏覽器的響應(yīng)信息。

          • 響應(yīng)行

          • 響應(yīng)頭

          • 響應(yīng)體

            • 響應(yīng)重定向

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("訪問到了CServlet,接下來重定向DServlet");
          
            // 方式一:設(shè)置重定向
            resp.setStatus(302);
            //        resp.setHeader("Location", "/項(xiàng)目名/DServlet");
          
            // 方式二:設(shè)置重定向
            resp.sendRedirect("/項(xiàng)目名/DServlet");
          }


          • 中文亂碼

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 第一種方式:設(shè)置編碼,一定要設(shè)置首行
            //        resp.setCharacterEncoding("GBK");
          
            // 第二種方式:統(tǒng)一瀏覽器和服務(wù)器編碼
            resp.setContentType("text/html;charset=UTF-8");
          
            // 頁面輸出中文
            PrintWriter writer=resp.getWriter();
            writer.write("中文");
          }

          ServletContext

          web容器在啟動時,會為每個web項(xiàng)目創(chuàng)建一個對應(yīng)的ServletContext對象。

          ServletContext: 代表當(dāng)前web項(xiàng)目

          • ServletContext對象

          • 域?qū)ο螅ü蚕頂?shù)據(jù))

          當(dāng)前項(xiàng)目范圍內(nèi),共享數(shù)據(jù)(多個Servlet都可以獲取)。

          • 獲取文件MIME類型

          互聯(lián)網(wǎng)通信過程中定義的一種文件數(shù)據(jù)類型格式。

          Cookie

          Cookie:客戶端會話技術(shù)。

          作用:在一次會話的多次請求之間共享數(shù)據(jù),將數(shù)據(jù)保存到客戶端(瀏覽器)。

          服務(wù)器可以發(fā)送多個Cookie。

          默認(rèn)情況下,瀏覽器關(guān)閉(會話結(jié)束),cookie銷毀(內(nèi)存)。

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 編碼
            String encodevalue=URLEncoder.encode("杰克  ", "UTF-8");
          
            Cookie cookie=new Cookie("name", encodevalue);
          
            resp.addCookie(cookie);
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie[] cookies=req.getCookies();
          
            for (Cookie cookie : cookies) {
              // 獲取cookie的name
              String name=cookie.getName();
          
              // 獲取cookie的value
              String value=cookie.getValue();
          
              // 解碼
              String decodeValue=URLDecoder.decode(value, "UTF-8");
          
          
              System.out.println(name + ":" + decodeValue);
            }
          • Cookie特點(diǎn)

          Session

          Session:會話技術(shù);基于cookie來實(shí)現(xiàn)的。

          作用:在一次會話的多次請求之間共享數(shù)據(jù),將數(shù)據(jù)保存到服務(wù)端。

          • HttpSession

          HttpSession:域?qū)ο蟆?/p>

          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 將共享數(shù)據(jù)存到session
            // 獲取session對象
            HttpSession session=req.getSession();
            // 將session對象進(jìn)行數(shù)據(jù)存入
            session.setAttribute("name", "jack");
          
            System.out.println("已將數(shù)據(jù)存到共享數(shù)據(jù)中。。。");
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 將session中的共享數(shù)據(jù)取出來
            // 獲取session對象
            HttpSession session=req.getSession();
            // 獲取共享數(shù)據(jù)
            String name=(String) session.getAttribute("name");
          
            System.out.println(name);
          }
          • Session生命周期

          三大域?qū)ο?/h1>

          Request、Session、ServletContext

          • API

          • 生命周期

            • ServletContext

            • HttpSession

            • HttpServletRequest

          Filter:訪問服務(wù)器資源,過濾請求,完成通用操作

          web的三大組件:

          servlet(控制器)

          filter(過濾器)

          listener(監(jiān)聽器)

          • 執(zhí)行原理

          • 生命周期


          • 攔截路徑

          • 過濾器鏈

          Listener

          <listener>
              <listener-class>com.demo.listener.ServletContextListenerDemo</listener-class>
            </listener>
          package com.demo.listener;
          
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;
          
          public class ServletContextListenerDemo implements ServletContextListener {
              @Override
              public void contextInitialized(ServletContextEvent sce) {
                  System.out.println("監(jiān)聽到servletContext對象創(chuàng)建了。。。");
              }
          
              @Override
              public void contextDestroyed(ServletContextEvent sce) {
                  System.out.println("監(jiān)聽到servletContext對象銷毀了...");
              }
          }

          MVC

          三層架構(gòu)


          主站蜘蛛池模板: 亚洲综合色一区二区三区小说| 黑巨人与欧美精品一区| 能在线观看的一区二区三区| a级午夜毛片免费一区二区| 亚洲av无码一区二区三区人妖| 国产精品免费一区二区三区| 国产成人亚洲综合一区| 日韩一区二区电影| 亚洲国产一区二区视频网站| 在线精品一区二区三区| 乱子伦一区二区三区| 制服中文字幕一区二区| 北岛玲在线一区二区| 亚无码乱人伦一区二区| 亚洲Av高清一区二区三区| 肥臀熟女一区二区三区| 成人H动漫精品一区二区| 无码人妻精品一区二区三区99性 | 在线免费视频一区二区| 国产精品高清一区二区三区不卡| 国产一区二区三区在线看| 波多野结衣一区二区三区aV高清| 日韩视频一区二区在线观看| 国产一区二区不卡老阿姨| 在线精品视频一区二区| 久久久久人妻一区精品色| 一区二区三区午夜视频| 午夜福利一区二区三区高清视频| 亚洲国产专区一区| 国产成人精品一区在线| 国产精品区AV一区二区| 一区二区三区四区在线播放 | 在线视频一区二区| 一区二区三区日韩| 人妻av无码一区二区三区| 色老头在线一区二区三区| 男女久久久国产一区二区三区| 久久久精品人妻一区二区三区四| 无码精品视频一区二区三区| 精品无码av一区二区三区| 91视频一区二区三区|