javaWeb核心技術第七篇之HTTP、Tomcat、Servlet、Request和Response

- Web服務器
  - 概念:
    - web資源:
      "英文直譯""的意思
      資源:一切數據文件
      web資源:經過網絡能夠訪問到的資源,一般指的是一切放在服務器上的文件"
    - web資源的分類:
      - 靜態的web資源:
        "    內容是一成不變的"
      - 動態的web資源:
        "    內容有可能在不一樣的時間或者不一樣的人訪問的時候會發生改變的"
    - web技術分類
      - 靜態的web技術
        "    例如: html  css  js  ....."
      - 動態的web技術
        "    例如:servlet  jsp"
    - 軟件的架構
      - c/s架構(Client/Server   客戶端/服務器)
        "    例如:qq  迅雷  lol"
      - b/s架構(Browser/Server   瀏覽器/服務器)
        "    例如:京東  淘寶  "
      - 區別
        - c/s:須要客戶下載客戶端,頁面比較炫,和服務器交互少,能夠在客戶端處理部分業務邏輯,可下降服務器的壓力.須要維護客戶端和服務器端
        - b/s:只須要客戶有一個瀏覽器,一切頁面從服務器加載,和服務器交互頻繁,由服務器處理業務邏輯,服務器壓力較大.只須要維護服務器端.
    - 通信機制
      - 基於http協議
        - 瀏覽器發送給服務器的內容:請求(request)
        - 服務器返回給瀏覽器的內容:響應(response)
        - 注意:先有請求,後有響應,一次請求對應一次響應
  - web服務器
    - 做用:將咱們編寫好的網頁發佈出去,別人就能夠經過網絡訪問
    - 常見的web服務器
      "名稱        廠商            特色
      Weblogic     oracle        大型的收費的支持javaEE全部規範的web服務器(servlet和jsp)
      websphere     ibm            大型的收費的支持javaEE全部規範的web服務器(servlet和jsp)
      tomcat     apache        小型的免費的支持servlet和jsp規範的"web服務器""
    - Tomcat服務器★
    
        Tomcat如何優化?    
            1: 優化鏈接配置.修改鏈接數,關閉客戶端的dns查詢(DNS查詢須要佔用網絡,再獲取對方ip的時候會消耗必定的時間)
            2: 優化jdk,擴大tomcat使用的內存,默認爲128M
      - 下載
        - http://tomcat.apache.org/download-70.cgi
        - core:
          - zip:能夠在window上運行的(咱們今天使用)
          - tar.gz:運行在linux上的
      - 安裝
        - 解壓縮便可
      - 目錄結構
        - bin:存放可執行的文件
        - ★conf:存放配置文件
        - lib:存放的是tomcat運行時和項目運行時必須的jar包
        - logs:存放的是日誌文件(catalina.out)
        - temp:存放臨時文件(不用管)
        - ★★webapps:存放要發佈的web項目
        - ★work:存放項目運行時產生的java文件和class文件
      - 啓動
        "    雙擊 tomcat目錄下/bin/startup.bat"
      - 關閉
        "    方式1:點 x
            方式2:ctrl + c
            (記住)方式3:雙擊 tomcat目錄下/bin/shutdown.bat"
      - 配置
        - 常見問題
          - 一閃而過
            "查看JAVA_HOME是否配置正確"
          - 端口占用: 能夠修改Tomcat的端口號
            "修改 tomcat目錄下/conf/server.xml 大約70行
                             <Connector port="8080" protocol="HTTP/1.1"
                               connectionTimeout="20000"
                               redirectPort="8443" />
                        須要將 8080 修改爲其餘的端口號
                        端口號:0~65535
                            0~1024:系統預留的端口號 通常不要使用 可是可使用80端口
                            80端口是http協議的默認端口號,訪問的時候能夠不寫端口號"
      - 訪問格式
        - tomcat的訪問路徑(8080是tomcat的默認的端口號)
          "    http://localhost:8080"
        - 格式:http://ip地址:端口號/項目名/資源?參數名稱=值&參數名稱=值
- web項目
  - 目錄結構:★
    "myweb(目錄名:項目名)
                |
                |---資源文件  html img css js
                |---WEB-INF(目錄:特色,經過瀏覽器直接訪問不到)
                |        |
                |        |---lib(目錄:項目運行的jar包)
                |        |---classes(目錄:存放的class文件)
                |        |---web.xml(核心配置文件,在servlet2.5版本中必須有,serlvet3.0版本不是必須的)"
  - 項目訪問路徑:
    "http://localhost:80/myweb/1.html
    協議://ip地址:端口/項目名稱/資源"
  - Tomcat和Eclipse整合  
- Http協議:
  - 協議:規定內容的傳輸的格式
  - http協議:
    "用來制定互聯網上數據的傳輸格式"
  - 包含:
    - 瀏覽器發送給服務器的內容  請求
      "規定請求數據的格式"
    - 服務器返回給瀏覽器的內容  響應
      "規定響應數據的格式"
  - 請求的格式:
    "請求行 請求頭 請求體"
    - 請求行:請求的第一行
      - 格式:請求方式 請求資源 協議/版本
        "例如:  GET /33/1.html HTTP/1.1"
      - 請求方式:
        "常見的兩種 get和post
        get請求:請求參數會在地址欄上顯示,參數大小有限制,不安全
              http://ip地址:端口號/項目名/資源?參數名稱=值&參數名稱=值
        post請求:請求參數不在地址欄上顯示,參數大小不受限制.較爲安全
            格式:
                參數名稱=值&參數名稱=值"
    - 請求頭
      - 格式: key/value的格式 (value能夠爲多個值的)
      - 常見的請求頭
        - Accept: text/html,image/*        --支持數據類型
        - Accept-Charset: ISO-8859-1    --字符集
        - Accept-Encoding: gzip        --支持壓縮
        - Accept-Language:zh-cn         --語言環境
        - Host: www.baidu.cn:80        --訪問主機
        - If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT      --緩存文件的最後修改時間
        - Referer: http://www.baidu.com/index.jsp     --來自哪一個頁面、防盜鏈
        - User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
          "擴展知識:
              Trident內核表明產品Internet Explorer,又稱其爲IE內核
              Gecko內核表明做品Mozilla FirefoxGecko,火狐
              Chrome內核表明做品Chrome,谷歌"
        - Cookie
        - Connection: close/Keep-Alive       --連接狀態
      - 重要的頭:
        - Referer  User-Agent Cookie If-Modified-Since
    - 請求體
      "和請求頭之間有一個空行
      post請求的參數:只有表單提交的時候明確了method="post"這時候是post請求,其餘的都是get請求
      參數名稱=值&參數名稱=值
      username=jack&password=1234"
  - 響應的格式:
    "響應行 響應頭 響應體"
    - 響應行:響應信息的第一行
      - 格式:
        - 協議/版本 響應的狀態碼 狀態碼說明
      - 例如:
        - HTTP/1.1 200 OK
      - 狀態碼:
        - 1xx    :請求已發送
        - 2xx    :響應已完成
          - 200:響應成功(請求成功)
        - 3xx    :須要瀏覽器進一步操做才能夠完成
          - 302:重定向(配合location頭使用)
          - 304:讀緩存(Not Modified表示沒有改變)
        - 4xx :用戶訪問錯誤(Not Found 表示:路徑寫錯了,你訪問的路徑不存在)
          - 404:用戶訪問的資源不存在
        - 5xx :服務器內部錯誤(其實就是代碼有問題,改代碼)
          - 500:服務器內部異常
    - 響應頭
      - 格式: key/value的格式 (value能夠爲多個值的)
      - 常見的響應頭
        - Location: http://www.it315.org/index.jsp     --跳轉方向
        - Server:apache tomcat            --服務器型號
        - Content-Encoding: gzip             --數據壓縮
        - Content-Length: 80             --數據長度
        - Content-Language: zh-cn         --語言環境
        - Content-Type: text/html; charset=GB2312         --數據類型(MIME類型)  大類型/小類型 text/css  text/javascript  image/jpeg image/bmp
        - Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT    --最後修改時間
        - Refresh: 1;url=http://www.it315.org        --定時刷新
        - Content-Disposition: attachment; filename=aaa.zip    --下載
        - Set-Cookie:SS=Q0=5Lb_nQ; path=/search
        - Expires: -1                    --緩存
        - Cache-Control: no-cache              --緩存
        - Pragma: no-cache                   --緩存
        - Connection:Keep-Alive               --鏈接
      - 重點的頭:
        - Set-Cookie Location Content-Type Refresh Content-Disposition Last-Modified
    - 響應體
      "和響應頭之間有一個空行,
      瀏覽器解析的內容"
- servlet入門:
  "本質上就是一個運行在服務器上的類"
  - 做用:1.接受請求   2.調用Service  處理業務邏輯   3.生成響應結果
  - 入門步驟:
    - 1.編寫一個類
      - 必須實現Servlet接口
      - 重寫裏面的方法
    - 2.編寫配置文件(項目下 web-inf/web.xml)
      "註冊servlet   綁定路徑
                  <!-- 註冊servlet 
                      servlet-name:給servlet起個名稱 名稱自定義,保證惟一
                      servlet-class:serlvet的全限定名(包名+類名)
                  -->
                  <servlet>
                      <servlet-name>helloservlet</servlet-name>
                      <servlet-class>cn.baidu.demo.HelloServlet</servlet-class>
                  </servlet>
                  
                  <!-- 綁定路徑
                      servlet-name:在servlet標籤中給servlet起好的名稱
                      url-pattern:路徑  暫時都以"/"開頭
                   -->
                  <servlet-mapping>
                      <servlet-name>helloservlet</servlet-name>
                      <url-pattern>/hello</url-pattern>
                  </servlet-mapping>"
    - 3.測試
      "            localhost/項目名/綁定的路徑
                  localhost/33/hello"

在服務器中,爲何須要項目部署?  爲了讓網絡經過服務器訪問到項目


回顧:
    tomcat服務器和Http協議:
    web服務器:
        概念:
            web資源:
            web資源分類:
                靜態的web資源:內容一層不變
                動態的web資源:根據不一樣的人和不一樣的時間,可能會發生變化
            web技術:
                靜態的web技術:html css js...
                動態的web技術:Servlet jsp
            結構:
                B/S(瀏覽器/服務器):
                C/S(客戶端/服務器):
            通信機制:
                基於HTTP協議
                一次請求一次響應,先有請求後有響應
        web服務器:
            Tomcat:
                下載:
                安裝:
                目錄結構:
                    bin:
                    conf:
                    webapps:
                    work:
                啓動:
                    bin/startup.bat
                關閉:
                    X
                    ctrl + c
                    ★ bin/shutdown.bat
                訪問:
                    協議://地址:端口/資源
        web項目:
            項目名稱:
                |-------html
                |-------css
                |-------js
                |-------img
                |-------WEB-INF
                |-----------lib
                |-----------classes
                |-----------web.xml
        http:
            請求:瀏覽器發送給服務器的內容(request)
                請求行
                    請求信息的第一行
                        請求方式 請求的資源 協議/版本        http/1.0 http/1.1
                請求頭 
                    格式:
                        key/value  (value能夠爲多個值)
                請求體
                    當請求是post的時候,存放post請求所攜帶的參數
            響應:服務器返回給瀏覽器的內容(response)
                響應行 
                    響應信息的第一行
                        協議/版本 狀態碼 說明
                響應頭 
                    格式:
                        key/value  (value能夠爲多個值)
                響應體
                    瀏覽器解析的內容
////////////////////////////////////////////
servlet:
    
案例-使用servlet完成用戶登陸功能
    需求分析:
        用戶在表單中填寫完用戶名和密碼後,點擊登陸的時候,向服務器發送登陸的請求,
        在服務器上處理請求,處理完畢後將處理信息響應到頁面
            處理結果:
                登陸成功:歡迎...登陸...
                登陸失敗:用戶名或密碼錯誤
                異常:當前功能正在維護....
        技術分析:
            html:表單
                form
                    action:提交路徑
                    method:提交方式
                        get
                        post
            servlet:
                request
                response
    ////////////////
    項目:
        com.baidu.web
        com.baidu.service
        com.baidu.dao
        com.baidu.domain
        com.baidu.utils
        
        導入jar包
        導入工具類
- Servlet的概述
  - Servlet就是運行在web服務器上的java程序,本質上就是一個類.
    "一個類要想經過瀏覽器被訪問到,那麼這個類就必須直接或間接的實現Servlet接口"
  - 做用:
    - 接收瀏覽器的請求
    - 處理請求
    - 生成響應信息
- Servlet入門★
  - 1.編寫一個類
    "    實現servlet接口
        重寫Service(request,response)方法"
  - 2.編寫配置文件(web.xml)
    "    註冊servlet
        綁定路徑"
  - 3.測試
    "    http://localhost:8080/項目名稱/綁定路徑"
- Servlet API
  "查詢javaEE的API"
  - Servlet:接口
    - (掌握★)init:初始化(第一次訪問Servlet的實現類時候進行初始化,也就是說開啓實現Servlet類和繼承Servlet類的實現類,或者說是開啓繼承Servlet類的實現類和Servlet類的實現類)
    - (掌握★)service:提供服務(每次訪問都執行都提供服務)
    - (掌握★)destroy:銷燬(Servlet開啓後,調用這個方法就是關閉或者銷燬繼承類)(服務器正常關閉,會把每個servlet都給銷燬了.(銷燬的是Servlet的對象,也就是實現類的對象))
    - (理解)getServletConfig():獲取當前Servlet的配置對象
    - (瞭解)getServletInfo():獲取Servlet信息
  - GenericServlet:(通用Servlet)
    "實現了servlet接口的抽象類,
    實現servlet中除service方法以外的全部方法"
  - HttpServlet:
    "繼承GenericServlet,實現了Servlet的全部方法."
- Servlet的生命週期★
  "從建立到死亡的過程"
  - init:初始化
  - service:提供服務
  - destroy:銷燬
  - 面試題總結:
    "當瀏覽器第一次訪問該servlet的時候,服務器會給咱們建立該servlet的對象,並調用init()方法進行初始化,init()方法執行完畢後service方法會跟着執行.
    之後再訪問該servlet的時候,服務器不會給咱們建立該servlet的對象,也不會調用init()方法進行初始化,可是會調用service()方法給咱們提供服務,而且是訪問一次調用一次.
    當服務器正常關閉的時候或項目從服務器中移除的時候,服務器會的調用destroy()方法,將該servlet的對象銷燬
    ★: 不論訪問多少次只有一個servlet對象"
    這個servlet是一個單實例,多線程的.
package com.baidu_02;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo implements Servlet{

    /*
     * 初始化:init
     * 調用者:tomcat服務器
     * 執行時機:servlet第一次訪問的時候
     * 執行次數:1次
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ServletLife 的init方法執行了, ServletLife出生了...55555");
    }
    //提供服務的service
//        調用者:tomcat服務器
//          執行時機:每次訪問的時候
//         執行次數:訪問一次執行一次
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("ServletLife 的service方法執行了,爲您提供服務...66666");
    }

//銷燬:destroy
//    調用者:tomcat服務器
//     執行時機:服務器正常關閉和項目從服務器移除
//     執行次數:1次
    //分爲兩種,一種是正常銷燬,另外一種是不正常銷燬,正常服務器死亡銷燬例如在Servers窗口點擊了紅色按鈕.另外一種是不正常服務器死亡銷燬了,好比宕機就是斷電,或者在Console點擊了紅色按鈕(服務器就是死掉了,後面的也就不執行了)
    public void destroy() {
        System.out.println("ServletLife 的destory方法執行了...死亡了...44444444");
    }
    
    /*
     * 獲取當前的Servlet的配置信息(web.xml中配置信息)
     */
    public ServletConfig getServletConfig() {
        
        return null;
    }


    
    /*
     * 當前servlet的基本信息
     */
    @Override
    public String getServletInfo() {
        
        return null;
    }


    

}

    
- Servlet配置:
  - servlet標籤:(註冊Servlet)
    - servlet-name:給Servlet起名稱
    - servlet-class:Servlet全限定名(包名+類名)
  - servlet-mapping標籤:(綁定路徑)
    - servlet-name:已經註冊好的Servlet名稱
    - url-pattern:
      - 1.徹底匹配: /a/b/hello      以"/"開始
      - 2.目錄匹配: /a/*               以"/"開始,以"*"結尾
      - 3.後綴名匹配:  .jsp   .action    以"."開始,匹配後綴名
      - 注意事項:
        "一個路徑只能對應一個servlet,
        一個servlet能夠對應多個路徑"
  - Tomcat的web.xml文件(瞭解)
    "做用:處理其餘servlet都處理不了的請求"
    - DefaultServlet 在tomcat的conf/web.xml中配置的
      "咱們項目的web.xml配置文件優先匹對,匹對不上再找Tomcat的web.xml"
  - servlet中的其餘標籤:
    - init-param(瞭解):配置servlet的初始化參數的
      "<init-param>
              <param-name>Str</param-name>
              <param-value>tom123</param-value>
          </init-param>"
    - load-on-startup:修改servlet的初始化時機的
      "<load-on-startup>正整數</load-on-startup>
      設置servlet的初始化時機,隨着服務器的啓動而初始化.
      數字越小初始化的優先級越高"
  - 路徑:
    - 相對路徑(不多使用,瞭解便可)
      - ./ 當前目錄下  ./也能夠省略不寫
      - ../ 上一級目錄
    - 絕對路徑
      - 帶協議和主機的絕對路徑(訪問站外資源)
        "http://localhost:80/34/js/jquery-1.11.3.min.js"
      - 不帶協議和主機的絕對路徑(訪問站內資源)
        "/34/js/jquery-1.11.3.min.js"
  - 訪問項目時,設置默認首頁
    - 在web.xml中 經過welcome-file-list標籤設置的(能夠刪除)
      "訪問的時候直接寫項目名稱,就能夠訪問到默認設置的資源"
  - ServletConfig(瞭解)
    "Servlet的配置對象"
    - 做用:
      "獲取Servlet的名稱
      獲取Servlet的初始化參數
      獲取上下文對象(全局管理者ServletContext)"
    - 建立
      "    服務建立Servlet的同時,也建立了Servlet的配置對象,經過Servlet的init方法傳遞給Servlet."
    - 獲取:
      "經過 getServletConfig方法獲取便可"
    - 常見的方法:
      - 獲取servlet的名稱(註冊到tomcat的名稱)
        "String getServletName()"
      - 獲取serlvet的初始化參數
        "String getInitParameter(String name)"
      - 獲取上下文(全局管理者ServletContext)
        "ServletContext getServletContext()"

/*

/*

案例1-統計CountServlet被訪問的次數
    需求分析:
        服務器上有一個CountServlet,要統計CountServlet被訪問的次數.經過調用ShowServlet展現CountServlet被訪問的次數
    技術分析:
        ServletContext對象

案例2-文件下載
    需求分析:
        將服務器上的文件保存到本地
    技術分析:
        Response
    步驟分析:
        //設置兩個頭 
            //設置文件的類型
              response.setContentType(文件mime類型);
            //設置文件下載專用頭
              response.setHeader("content-disposition","attachment;filename="+文件名稱);

            //設置一個流
             輸出流
    
案例3-點擊切換驗證碼
    做用:
        防止暴力破解

- ServletContext:
  "上下文對象,全局管理者,知曉一個項目中全部Servlet的一切信息"
  - 做用:
    "獲取全局的初始化參數
    獲取文件的mime類型
    資源共享
    獲取資源的路徑"
  - 生命週期
    - 建立:當服務器啓動的時候,服務器會爲每個項目建立servletcontext對象,一個項目只有一個servletcontext對象
    - 銷燬:項目從服務器上移除或者服務器正常關閉的時候
  - 獲取方式
    - 方式1:經過ServletConfig對象獲取
      "ServletContext ServletConfig().getServletContext();"
    - 方式2:經過getServletContext方法獲取
      "ServletContext getServletContext();"
  - 經常使用方法:
    - (理解)獲取指定的項目初始化參數
      "String getInitParameter(String name)"
    - (瞭解)獲取項目全部初始化參數名稱
      "Enumeration getInitParameterNames()"
    - (掌握)獲取一個文件的mime類型
      "String getMimeType(String 文件名)"
    - (掌握)資源共享: 至關於一個map集合
      - setAttribute(String name,Object value):設置
      - getAttribute(String name):獲取指定的屬性值
      - removeAttribute(String name):移除指定的屬性
    - (掌握)獲取資源在服務器上的路徑
      "String getRealPath(String filepath)
      注意:
          filepath:直接從項目的根目錄開始寫
          getRealPath("/")  ---> d:/tomcat/webapps/14"
    - (理解)以流的方式返回一個文件
      "InputStream getResourceAsStream(String filepath)"
- response
  "設置服務器發送給瀏覽器的內容"
  - 操做響應行
    "格式:
        協議/版本  狀態碼  狀態說明
    狀態碼分類:
        1xx:已發送請求
        2xx:響應完成
            200:正常完成響應
        3xx:還需瀏覽器進一步操做
            302:重定向 配合響應頭location使用
            304:讀緩存
        4xx:用戶操做錯誤
            404:用戶訪問的資源不存在
        5xx:服務器錯誤
            500:程序異常"
    - 經常使用方法
      - (理解)setStatus(int code):針對1   2   3
      - (瞭解)sendError(int code):針對 4   5
  - 操做響應頭
    "格式:
        key/value形式(value能夠爲多個值)"
    - 經常使用方法
      - (重點)setHeader(String name,String value);
        "設置一個字符串形式的響應頭"
      - 瞭解:
        "setIntHeader(String name,int value);設置一個整型的響應頭
        setDateHeader(String name,long value);設置一個時間的響應頭
        追加:
        addHeader(String name,String value):追加一個字符串形式的響應頭 若無設置則設置,若已設置則追加
        addIntHeader(String name,int value);追加一個整型的響應頭
        addDateHeader(String name,long value);追加一個時間的響應頭
        "
    - 常見的響應頭
      - location:重定向
        "須要配合302狀態碼一塊兒使用"
        - 方式1(瞭解):  
          "response.setStatus(302);
          response.setHeader("location","路徑");"
        - 方式2(掌握):
          "response.sendRedirect("路徑");"
      - refresh:定時刷新
        - java中(使用比較少)
          "response.setHeader("refresh","秒數;url=跳轉的路徑"); 幾秒以後跳轉到指定的路徑上"
        - html中
          "<meta http-equiv="refresh" content="3;url=/14/2.html">"
      - content-type:設置文件的mime類型
      //tomcat傳遞方式都是以iso-8859-1編碼傳遞的
        "設置文件的mime類型 而且通知瀏覽器用什麼編碼打開"
        - 方式1(瞭解):
          "格式:
              response.setHeader("content-type","mime類型;charset=編碼");"
        - 方式2(掌握):
          "response.setContentType("文件的mime類型;charset=utf-8");"
      - content-disposition:文件下載專用頭
        "response.setHeader("content-disposition","attachment;filename="+文件名稱);"
  - 操做響應體
    "頁面上須要解析的內容"
    - 經常使用方法:
      - PrintWriter getWriter():字符流
      - ServletOutputStream getOutputStream():字節流
      - 注意事項:
        "本身編寫的文件   通常都使用字符流輸出 如:txt  html等
        音頻,視頻等文件使用字節流輸出
        字節流和字符流互斥,不能同時使用
        服務器會幫咱們釋放資源,建議本身關閉;底層使用的緩存流
        "
    


HTTP & Tomcat

    1. web服務器

        web資源:經過網絡能夠訪問到的資源,一般指放在服務器上的文件

            1. 靜態web資源:

                內容是一成不變的

            2. 動態web資源:

                內容有可能隨着訪問時間和人不一樣而發生改變

            3. 靜態web技術:

                html css js

            4. 動態web技術:

                servlet jsp

        軟件架構:

            1. c/s架構(Client/Server 客戶端/服務器)

            2. b/s架構(Browser/Server 瀏覽器/服務器)

        通信機制:

            1. 基於http協議

                瀏覽器發送給服務器的內容:請求(request)

                服務器返回給瀏覽器的內容:響應(response)

                注意:先有請求,後有響應,一次請求對應一次響應

        web服務器:

            常見的web服務器

            Weblogic    oracle        大型收費支持javaEE全部規範的web服務器(servlet和jsp)

            websphere    ibm        大型收費支持javaEE全部規範的web服務器(servlet和jsp)
        
            tomcat        apache        小型免費支持servlet和jsp規範的web服務器

        Tomcat服務器

            下載

                http://tomcat.apache.org/download-70.cgi

                zip 能夠在windows上使用

                tar.gz 運行在linux上

            目錄結構

                bin:    存放可執行的文件

                conf:    存放配置文件

                lib:    存放的是tomcat運行時和項目運行時必須的jar包

                logs:    存放的是日誌文件

                temp:    臨時文件

                webapps:    須要發佈的項目放在這

                work:    存放項目運行時產生的java和class文件


            啓動tomcat

                運行tomcat目錄下 /bin/startup.bat

            關閉tomcat

                1. 直接關閉

                2. 運行 /bin/shutdown.bat

            tomcat配置:

                修改tomcat端口號:

                /conf/server.xml 大約70行

                <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
                
                   redirectPort="8443" />

                (0-1024是系統預留的端口號,通常不要使用,可是可使用90端口,

                80端口是http協議的默認端口號,訪問的時候能夠不寫端口號)

            訪問格式:

                http://localhost:8080

                http://ip:端口號/項目名/資源?參數名=值&參數名=值
            


        Http協議:

            協議:規定內容的傳輸的格式

            http協議:規定互聯網上數據的傳輸的格式


            請求:

                

            響應:

                狀態碼:

                    1xx: 請求已經成功發送

                    2xx: 響應已經完成

                        200:響應成功(請求成功)

                    3xx: 須要瀏覽器進一步操做才能夠完成

                        302:重定向(配合location頭使用)

                        304: 讀緩存

                    4xx:用戶訪問錯誤

                        404:用戶訪問的資源不存在

                    5xx:服務器內部錯誤

                        500:服務器內部異常


        Eclipse上配置Tomcat:

            1. Window --> Preference --> 搜索server --> 選擇Runtime Environments

            2. 將tomcat安裝地址,添加到Server Runtime Environments列表中

            3. 建立一個動態 web project,在servers窗口中添加你的tomcat服務器

            4. 在servers窗口雙擊服務器,

                1. 配置項目工做空間,2. 選擇部署路徑

                添加項目,開啓服務器


Servlet:


    一個類若是想要被(瀏覽器)訪問到,就必須直接或者間接的實現Servlet接口

    做用:

        1. 接受瀏覽器的請求

        2. 處理請求

        3. 生成響應信息

    入門使用:

        1. 編寫一個類

            實現servlet接口
        
            重寫Service(request, response)方法

        2. 編寫配置文件(web.xml)
    
            將訪問路徑與java類綁定起來

        3. 測試

            http://192.xxx.xxx.xx:8888/項目名/路徑名

    Servlet API

        Servlet接口:

            init() -- 初始化時

            service()

            destory() -- 銷燬時(正常關閉服務器或者刪除項目)

            getServletConfig() -- 獲取當前Servlet的配置對象

            getServletInfo() -- 獲取Servlet信息

        GenericServlet(抽象類,繼承Servlet)

            實現了出了service方法外的全部方法

        HttpServlet(也是抽象類):

            繼承了GenericService實現了全部Servlet的方法



        方法詳細說明:

            根據反射,利用xml文件建立servlet對象,建立三個參數對象:

            request response servletconfig

            初始化方法:init方法中,利用this.config = config,爲全局變量賦值

            getServletConfig() 方法就是獲取私有全局變量的方法

            servletConfig對象就是配置文件信息對象,能夠獲取web.xml中信息

            (能夠獲取到web.xml中自定義的key value 參數)

            
            HttpServlet中的service方法:

                String method = reg.getMethod();

                if(method == "get"){
                
                    doGet(request, response);

                } else if (method == "post"){

                    doPost(resquest, response);

                }

    
    Servlet的生命週期:

        當瀏覽器第一次訪問該servlet的時候,服務器會給咱們建立該servlet的對象,
        
        並調用inizgt()方法進行初始化,init()方法執行完畢後service方法會跟着執行.

        之後再訪問該servlet的時候,服務器不會給咱們建立該servlet的對象,

        也不會調用init()方法進行初始化,可是會調用service()方法給咱們提供服務,

        而且是訪問一次調用一次.

        當服務器正常關閉的時候或則項目從服務器中移除的時候,

        服務器會的調用destroy()方法,將該servlet的對象銷燬

        ★: 不論訪問多少次只有一個servlet對象

        
        ServletConfig:

            1. 封裝了servlet的配置信息,一個servlet有一個ServletConfig

            2. Servlet建立時,會調用有參init方法,建立ServletConfig(再調用無參init)

                拿到ServletConfig對象:getServletConfig();

            3. 做用:

                1. 拿到web.xml中的servlet的名字:<servlet-name></servlet-name>

                2. 拿到web.xml中該servlet自定義參數標籤中的值(根據鍵)

                    <init-param>
                        <param-name>name</param-name>
                        <param-value>value</param-value>
                    </init-param>

                    String value = config.getInitParameter("name");

                3. 拿到ServletContext對象

                    config.getServletContext();

        
        ServletContext:

            1. 封裝了整個web應用信息,一個項目有一個ServletContext

            2. 獲取ServletContext對象:

                直接:this.getServletContext();

                public ServletContext getServletContext(){

                    return getServletConfig().getServletContext();

                }
    
            3. 做用:

                1. 獲取整個web應用的全局初始化參數

                    String value = context.getInitParameter("name");

                    web.xml中:

                    <context-param>

                        <param-name>name</param-name>

                        <param-value>tom</param-value>

                    </context-param>

                2. 存儲數據:ServletContext是一個域對象

                    全部servlet均可以將數據存進去,共同使用

                    存、取、刪:

                    setAttribute(name,value);  String,Object

                    getAttribute(name);    String

                    removeAttribute(name);    String

        Response:

            設置服務器發送給瀏覽器的內容

            1. 操做響應行:

                格式: 協議/版本  狀態碼  狀態說明

                狀態碼分類:

                    1xx:已發送請求

                    2xx:響應完成

                        200:正常完成響應

                    3xx:還須要瀏覽器進一步操做

                        302:重定向,配合響應頭中的location使用

                        304:讀緩存

                    4xx:用戶操做錯誤

                        404:用戶訪問的資源不存在

                    5xx:服務器錯誤

                        500:程序異常

                方法:

                    setStatus(int code)針對 1 2 3

                    sendError(int code) 針對 4 5

            2. 操做響應頭:

                格式:  key/value

                方法:

                    setHeader(String name, String value);
                
                其餘方法:

                    setIntHeader(String name, int value);
                    setDataHeader(String name, long value);
                    addHeader(String name, String value);沒有就設置,有就追加
                    addIntHeader(String name, int value);
                    addDateHeader(String name, long value);

                常見的響應頭:

                    1. location:重定向

                        讓瀏覽器從新訪問其餘服務器資源
            
                        (算是從新訪問,地址欄跟新)

                        操做響應內容:須要同時配合302狀態碼使用

                        response.setStatus(302);
                        response.setHeader("location","路徑");

                        簡便、經常使用使用方法:

                        response.sendRedirect("路徑");

                    2. refresh:定時刷新

                        java:(少)

                        response.setHeader("refresh","秒數;url=");

                        html:

                        <meta http-equiv="refresh" content="3;url=路徑">
            
                    3. content-type:設置文件類型

                        設置文件類型,並通知瀏覽器用什麼編碼打開
                        
                        常見互聯網媒體類型(MIME類型)
                        
                            text/html : HTML格式

                            text/plain :純文本格式 
    
                            text/xml :  XML格式

                               image/gif :gif圖片格式 
  
                            image/jpeg :jpg圖片格式

                            image/png:png圖片格式

                response.setHeader("content-type","text/html;charset=utf-8");

                response.setContentType("text/html;charset=utf-8");

                    PS:中文亂碼緣由

                    http協議響應頭不支持中文,同一採用ISO-8859-1編碼

                    瀏覽器:火狐、谷歌採用 UTF-8  IE採用GBK

                    文件下載 --> 通過響應頭(文字 --> ISO字節)--> 客戶端

                    文件上傳 --> 通過響應頭(字節 --> ISO文字)--> 服務端

                    待商議

                    


                    4. 文件下載
                
                    步驟:

                        1. 獲取前端傳來的文件名

                        2. 根據文件名,使用ServletContext對象

        response.setHeader("content-disposition","attachment;filename="+文件名稱);

                    下載以前要將文件名字反編碼成 ISO-8859-1 文字

                    傳送到頭文件中,頭文件按照ISO解碼,發送給瀏覽器

                    火狐、谷歌將字節編碼成UTF-8顯示,IE編碼成GBK


    PS:

    1. 發送get請求,參數中空格處理:

處理方式1:

http://baidu.com?name=han&content=hello world

url = 「http://baidu.com?name=han&content=」+URLEncoder.encode(「hello world」,「utf-8」); 

    
    2. 文件下載中,在響應頭中設置的文件名裏面包含空格,使下載文件時沒法獲取空格以後的文件名

    處理方式:

        設置響應頭時,使用雙引號將文件名括起來

        response.setHeader("content-disposition", "attachment;filename=\""+name+"\"");



        request:
            

            請求行 請求頭 請求體


            requestAPI:

                request.getMethod()    獲取請求方式

                request.getContextPath()    獲取本項目名

                request.getServletPath()    獲取本servlet名

                request.RemoteAddr()    獲取客戶IP地址


            請求頭:

                獲取頭信息

                    request.getHeader(String name)

            請求體:

                請求體中包含了請求攜帶的參數

                get方式沒有請求體,post有

                獲取參數的方法:

                request.getParameter(String name); String 

                    根據參數名獲取參數值

                request.getParameterValues(String name); String[]

                    根據參數名獲取一組參數值(checkbox)

                request.getParameterMap(); Map(String name, String[] values)

                    獲取表單提交上來的全部參數值,以name爲鍵,

                    存放在Map中(能夠配合BeanUtils使用,使用populate方法,

                    直接給Bean對象賦值)

            
            獲取中文參數亂碼:
            
                接受到http流傳送來的中文,須要手動處理亂碼

                以ISO格式將亂碼解碼,在按照想要的格式從新編碼

                如果post請求,參數在請求體中,能夠直接使用api讓tomcat處理

                get:

                    new String(str.getBytes("iso-8859-1"),"utf-8");

                post:

                    request.setCharacterEncoding("utf-8")


            頁面、後臺跳轉方式:請求轉發

                請求轉發:

                    並不以向瀏覽器發送響應信息做爲本次請求的結束,

                    而是將同一個request對象繼續傳送到下一個頁面、後臺程序

                    中去,一直使用客戶方發送的第一個請求。

                使用:

                request.getRequestDispatcher("路徑").forward(request, response)

                
                特色:

                    1. 地址欄訪問地址不變,一直是第一次請求時的訪問地址

                    2. 一直使用同一個request對象,可使用request對象傳遞數據

                    3. 每次跳轉都視爲服務器內部跳轉,相對路徑爲本服務器地址內

                       每次跳轉以後相對路徑都會變爲服務器根目錄,不是某個頁面

                       或程序(路徑須要從項目名寫起)

                重定向(sendRedirect)的不一樣點:

                    1. 地址欄每次跳轉都改變,顯示最新訪問的路徑

                    2. request每次跳轉都會結束生命週期,不可以使用它來傳參

                    3. 能夠訪問服務器以外的資源(跳轉到其餘ip地址)
    

簡單來講,若是隻是返回頁面,不關乎地址問題,那就轉發

若是須要進行下一步業務操做,從而須要改變地址,那就重定向吧

重定向時的網址能夠是任何網址
  轉發的網址必須是本站點的網址
重定向與請求轉發使用
先後兩個頁面 有數據傳遞 用請求轉發,沒有則用重定向。
好比servlet查詢了數據須要在頁面顯示,就用請求轉發。
好比servlet作了update操做跳轉到其餘頁面,就用重定向。    
    
回顧:

Request
    行
        得到請求方式 : request.getMethod();
        得到項目名稱 : request.getContextPath()
        得到資源名稱 : request.getServletPath()
        得到遠程主機的地址: request.getRemoteAddr()
    頭
        Request.getHeader(name) : 根據名稱得到一個指定的頭信息
    體(請求參數)
        Request.getParameter(name) : 根據名稱得到一個指定的value
        Request.getParameterValues(name) : 根據名稱得到一組指定的value
        Request.getParameterMap() : 得到全部的表單中鍵值對
    請求轉發:
       request.getRequestDispatcher("路徑").forward(request.response)
    重定向:
        request.sendRedirect("路徑")
    亂碼處理
        Get 
            new String(亂碼.getBytes(iso-8859-1),"編碼");
        Post 
            Request.setCharacterEncoding(編碼)   通知tomcat處理
            response.setHeader("content-type","text/html;charset=utf-8")
相關文章
相關標籤/搜索