java EE 第十二週 web前端開發的周總結 (含思維導圖)

第十週思維導圖

Tomcat

目錄分析

  • bin 可執行文件
  • conf 配置文件
  • lib 依賴jar包
  • logs 日誌文件
  • temp 臨時文件
  • webapps 存放
  • work 存放運行時的數據

Tomcat 安裝

  • 官網下載壓縮
  • 解壓到一個沒有特殊符號的目錄中(一般爲純英文即可)
  • 不建議將服務器軟件放在磁盤層次很多的文件夾
  • 不建議放在中文路徑下
  • Tomcat 安裝需要配置JAVA_HOME 環境變量

啓動問題

  • 啓動Tomcat一閃而過

    • 原因:沒有配置JAVA_HOME

    • 解決方式:配置JAVA_HOME

      JAVA_HOME環境變量
      C:\Java\jdk1.8.0_231

      path環境變量
      %JAVA_HOME%\bin

  • 啓動報錯

    • 原因:端口號被佔用、重複啓動

    • 解決方案

      • 暴力:找到佔用端口號,相應的進程,殺死進程

        命令:netstat -ano
        找到進程pid,強制關閉進程

      • 溫柔:修改Tomcat本身的端口號

關閉

  • 正常關閉:bin目錄下shutdown.bat;dos窗口下
    ctrl+c,直接正常關閉。
  • 強制關閉

配置

  • 項目部署方式

    • 1、直接把項目放在webapps文件夾下即可

      • hello:項目的訪問路徑—>虛擬目錄
      • 簡單部署:將項目打包成war包,war包放在文件夾中
    • 2、配置server.xml文件部署項目

      • 在文件中加入
      • docbase:項目存放路徑
      • path:虛擬目錄
    • 3、在conf\Catalina\localhost創建任意名稱的
      xml文件(推薦)

      • docbase 項目存放的路徑
      • path 虛擬目錄
  • java動態項目的結構

    • 根目錄

      • WEB-INF

        • web.xml:web項目的核心配置文件
        • classes目錄:放置字節碼文件的目錄
        • lib:放置依賴的jar包
  • IDEA與tomcat的相關配置

    • 1、IDEA會爲每一個項目單獨建立一份配置文件

      • 查看控制檯
        Using CATALINA_BASE:

        “C:\Users\14607.IntelliJIdea2019.1\system\tomcat\Unnamed_Web-Project_3”

    • 2、工作空間項目 和 tomcat部署的web項目

      • tomcat真正訪問的是"tomcat"部署的項目,"tomcat部署的web"對應的"工作空間"的web目錄下的所有資源

      • WEB-INF 下的資源無法被瀏覽器直接訪問

      • 斷點調試:使用小蟲子debug啓動

Servlet

概念:運行在服務器端的小程序

  • Servlet是一個接口,定義了Java類被瀏覽器訪問到(Tomcat識別)的規則。

簡單入門

(Servlet2.0)

  • 1、創建一個JavaEE項目

  • 2、定義一個類,實現Servlet接口

  • 3、實現接口的方法

  • 4、配置Servlet(在web.xml)

    demo1 com.qianfeng.ljf.servlet.ServletDemo1

    demo1 /demo1
  • 原理

    • 1:當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑。
    • 2:查找web.xml文件,是否有對應的標籤內容
    • 3:如果有,則會找到對應的全類名
    • 4:tomcat會將字節碼文件加載進內場,並且創建其對象。
    • 5:調用其方法

接口方法

  • public void init(ServletConfig servletConfig)
    【在Servlet被訪問的時候。只會執行一次】
  • public void service(ServletRequest servletRequest, ServletResponse servletResponse)
    【每次Servlet被訪問,執行。執行多次】
  • public void destroy()
    【在Servlet被殺死時執行,在服務器正常關閉時,執行,執行一次。】
  • public String getServletInfo()
  • public ServletConfig getServletConfig()

生命週期

  • 創建

    • 創建時機

      • 1、被瀏覽器第一次訪問時

      • 2、配置創建時機

        • 1、第一次被訪問時,創建
          值爲負數
        • 2、啓動服務器時,創建
          值爲0或正整數
    • 注意:init方法只執行一次,Servlet是單例的,存在線程安
      全問題,儘量不要在Servlet中定義成員變量(不要修改)

  • 提供服務

    • 多次執行service方法
  • 銷燬

    • 執行一次destroy方法(服務器正常關閉,在對象銷燬前執行)

Servlet3.0

  • 好處:支持註解配置,可以不需要web.xml

  • 步驟

    • 1、創建一個JAVAEE項目,選擇Servlet的版本
      3.0以上,可以不創建web.xml

    • 2、定義一個類,實現Servlet接口

    • 3、重寫方法

    • 4、在類上使用@WebServlet註解,進行配置
      @WebServlet(“資源路徑”)

      @WebServlet("/myservlet")

  • urlpattern 配置

    • 1、可以定義多個路徑:
      @WebServlet({ “/d4” , “/dd4” , “/ddd4” })

    • 2、路徑定義規則

      • 1、/xxx
      • 2、/xxx/xxx
      • 3、*.do

體系結構

  • Servlet(接口)

  • GenericServlet(抽象類)

    • 將Servlet接口中其他方法做了默認空實現,只將service方法作爲抽象方法作爲抽象方法
    • 繼承GenericServlet類時,只需實現service()方法即可
  • HttpServlet(抽象類)

    • 對http協議的一種封裝,簡化操作
    • 1、定義類繼承HttpServlet
    • 2、腹瀉doGet/doPost 方法

Request

請求消息數據

  • 請求行

    請求方式 請求url 請求協議/版本
    GET /login.html HTTP/1.1

    • 獲取方式

      • 獲取請求方式GET String getMethod()

      • 獲取Servlet路徑 String getServletPath()

      • 獲取get方式請求參數 String getQueryString()

        name=zhangsan&password=123456

      • 獲取協議及版本 String getProtocol()

        HTTP/1.1

      • 獲取客戶機的IP地址 String getRemoteAddr()

      • 獲取虛擬目錄 String getContextpath()

        /day14

      • 獲取請求的URI String getResquestURI()

        • String getResquestURI()
        /day14/demo1
        URI	統一資源標識符
        
          • StringBuffer getRequestURL()

          http://loaclhost/day14/demo1URL
          統一資源定位符

    • 請求方式

      • get

        • 1、請求參數在請求行中,在url後
        • 2、請求的url長度有限制
        • 3、不太安全
      • post

        • 1、請求參數在請求體中
        • 2、請求的url長度沒有限制
        • 3、相對安全
  • 請求頭

    請求頭名稱:請求值

    Host:localhost

    User-Agent:Mozilla/5.0 (Windows NT 6.1;Win64;)…
    Accept-Language:zh-Ch,zh;q=0.8;zh-TW…

    Accept-Encoding:gzip,deflate

    Referer:http://loaclhost/login.html

    Connect:keep-live

    Upgrade-Insecure-Requests:1

    • 獲取方式

      • String getHeader(String name)
        通過請求頭的名稱獲取請求頭的值
      • Enumeration getHeaderNames()
        獲取所有的請求頭名稱
    • 常見請求頭

      • User-Agent

        • 瀏覽器告訴服務器,我訪問你使用的瀏覽器版本信息
        • 可以在服務器端獲取該頭的信息
          【解決瀏覽器兼容性問題】
      • Referer:http://localhost/login.html

        • 告訴服務器,我(當前請求)從哪裏來

        • 作用

          • 1、防盜鏈
          • 2、統計工作
  • 請求空行

    • 作用:分割POST請求的 請求頭、請求體
  • 請求體

    • 獲取方式

      • 獲取流對象

        • BufferedReader getReader()
          獲取字符輸入流,只能操作字符數據
        • ServletInputStream getInputStream()
          獲取字節輸入流,可以操作所有的類型的
    • 作用:封裝POST請求消息的請求參數

其他功能

  • 獲取請求參數的通用方式

    • 1、String getParameter(String name)
      根據參數名稱獲取參數值

    • 2、String[] getParameterValues(String names)
      根據參數的名稱獲取參數值的數組

    • 3、Enumeration getParameterNames()
      獲取所有請求的參數名稱

    • 4、Map<String,String[]> getParameterMap()
      獲取所有參數的map集合

    • 解決中文亂碼

      • get方式:tomcat 8 已經將get方式的亂碼問題解
        決了
      • post方式:會亂碼。解決方式:獲取參數前,設 置request的編碼
        request.setCharacterEncoding(“utf-8”);
  • 請求轉發
    

(forward)

- 步驟

	- 通過request對象獲取轉發器對象RequestDispatcher
	- 使用轉發器對象進行轉發forward(req,resp)
	- 簡潔代碼

	  request.getRequestDispatcher("findUserServlet").forward(request,response);

- 特點

	- 轉發路徑不變
	- 轉發只能訪問當前服務器下的資源
	- 轉發只能是一次請求,可以使用request對象來共享數據
  • 共享數據

    • 域對象

      • 域對象:一個有作用範圍的對象,可以在範圍內共享數據

        • request域:代表一次請求的範圍,一般用於請求多個轉發的多個資源中共享數據
        • 1.void setAttribute(String name,Object obj)
          存儲數據
        • 2.Object getAttitude(String name)
          通過鍵獲取值
        • 3.void removeAttribute(String name)
          通過鍵移除鍵值對
  • 獲取ServletContext()

    • ServletContext getServletContext()
  • getPart() 用於文件上傳

體系結構

  • ServletRequest
  • HttpServletRequest
  • org.apache.catalina.connector.RequestFacade類(Tomcar)

Response

響應消息數據

HTTP/1.1 200 OK
Content-Type:text/html;charset=UTF-8
Content-Length:101
Date:Web,06 Jun 2019 07:08:43 GMT

<html>
<head></head>
<body>
<h1></h1>
</body>
</html>
  • 響應行

    協議版本 響應狀態碼 狀態碼描述

    • 組成:協議版本 響應狀態碼 狀態碼描述

    • 響應狀態碼

      • 服務器告訴客戶端本次請求和響應的一個狀態

      • 分類

        • 1xx:服務器接收客戶端消息,但是沒有接收完
          成,等待一段時間後,發送1xx多狀態碼
        • 2xx:成功
        • 3xx:302(重定向),304(訪問緩衝)
        • 4xx:客戶端錯誤。
          404(請求路徑沒有對應資源)
          405(請求方式沒有對應的doxxx方法)
        • 5xx:服務端錯誤。
          500(服務器內部異常)
    • 設置響應行

      • setStatus(int src) 設置狀態碼
  • 響應頭

    • 組成:頭名稱:值

    • 常見的響應頭

      • content-type:服務器告訴客戶端本次響應體數
        據格式以及編碼

      • content-disposition:服務器告訴客戶端以什麼
        格式打開響應的數據

        • in-line 默認當前頁面打開
        • attachment;filename=xxx文件名
          以附件的形式打開響應體。用於文件下載
      • content-length:字節的個數(瞭解)

    • 設置響應頭

      • setHeader(String name,String value)
  • 響應空行

  • 響應體:傳輸的數據(HTML頁面、圖片等)

    • 設置響應體

      • 使用字符輸出流 PrintWriter getWriter()
      • 使用字節輸出流 ServletOutputStream getOutputStream
      • 使用上面兩個輸出流,將數據輸出到客戶端服務器

重定向

(redirect)

  • 概念:資源的跳轉方式

  • 步驟

    • 1、reponse.setStatus(302)
      【設置資源的跳轉方式】
    • 2、response.setHeader(“loacation”,"/newServlet")
      【設置響應頭location,重定向的Servlet路徑或url】
    • 簡單實現
      response.setRedirect(“ul路徑”)
  •           特點
    

(與轉發的區別)

- 地址欄發生變化
- 重定向可以訪問其他站點(服務器)的資源
- 重定向是兩次請求,不能使用request對象共享數據

ServletContext

概念:代表整個web應用,可以和程序的容器

       (服務器)來通信

獲取方式

  • 1、通過request對象獲取

    • request.getServletContext()
  • 2、通過HttpServlet獲取

    • this.getServletContext()

功能

  • 1、獲取MIME類型

    • MIME:互聯網在通信過程中定義的一種文件數
      據類型
      格式:大類型/小類型 text/html img/jpeg
    • 獲取:String getMemeType(String file)
  • 2、域對象

    • 作用:共享數據

    • 設置、獲取、移除域對象

      • 1.setAttribute(String name,Object value)
      • 2.getAttribute(String name)
      • 3.removeAttribute(String name)
    • 域對象範圍:所有用戶請求的數據

  • 3、獲取文件的真實(服務器)路徑

    • 方法:String getRealPath(String path)

    • 獲取WEB-INF目錄的資源訪問

      • context.getRealPath("/b.txt")
    • 獲取web目錄下的資源訪問

      • context.getRealPath("/WEB-INF/c.txt")
    • 獲取src目錄下的資源訪問

      • context.getRealPath(“WEB-INF/classes/a.txt”)

Jsp

指令

  • 作用:用於配置JSP頁面,導入配置文件

  • 格式

    • <%@指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 …%>
  • 分類

    • page

      • 作用:配置JSP頁面的

      • 常見屬性

        • contentType

          • 等同於response.setContentType()設置編碼

          • 作用

            • 設置想用題的mime類型以及字符集
            • 設置當前jsp頁面的編碼(高級IDE生效,低級工具需設置pageEncoding屬性)
        • import

          • 作用:導包
        • errorPage

          • 作用:當頁面發生異常後,會自動跳珠到指定的錯
            誤頁面
        • isErrorPage

          • 作用:標識當前頁面是否是錯誤頁面
          • true:是,可以使用內置對象exception
          • false:否,默認值。不可以使用內置對象
            exception
    • include

      • 作用:頁面包含的。導入頁面的資源文件

      • <%@include file=“top.jsp”%>

      • 附:與 <%jsp:inclue page="" > 區別

        • include:先包含再編譯
        • jsp:include:先編譯,再包含
    • taglib

      • 作用:導入資源
      • <%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>

prefix:前綴,自定義,一般爲c

  • 瞭解:jsp:forward與jsp:param

    <jsp:forward page=“forwarded.jsp”>
    <jsp:param name=“username” value=“zhangsan”/>
    </jsp:forward>

    jsp:forward指令的意思是直接跳轉到page對應的頁面,可以通過 jsp:param攜帶參數。而到被跳轉的頁面可以直接通過 request(jsp內置對象) 來獲取參數的值,獲取的方式如下:

    <%
    String name = request.getParameter(“username”);
    %>
    <%=name %>

註釋

  • <%---- %>

  • 與html註釋區別

    • html:
      只能註釋html代碼片段,可以被前端頁面查看
    • jsp:<%-- --%>
      可以註釋所有,不能被前端頁面查看

內置對象

  • 概念:在jsp頁面不需要創建,直接使用的對象

  • 九個內置對象

    • 變量名

      • 真實類型

        • 作用
    • pageContext

      • pageContext

        • 當前頁面共享數據,可以獲取其他八個內置對象
    • request

      • HttpServletRequest

        • 一次請求訪問多個資源(轉發)
    • session

      • HttpSession

        • 一次會話的多個請求間
    • application

      • ServletContext

        • 所有用戶間共享數據
    • response

      • HttpServletResponse

        • 響應對象
    • page

      • Object

        • 當前頁面(Servlet)的對象 this
    • out

      • JspWriter

        • 輸出對象,數據輸出到頁面上
    • config

      • ServletConfig

        • Servlet的配置對象
    • exception

      • Throwable

        • 異常對象

執行流程

  • 1:用戶發送請求到jsp
  • 2:查找對應的jsp文件
  • 3:是否找到;是,執行下一步;否404
  • 4:是否爲第一次訪問或爲修改
    是,執行下一步;
    否,執行第7步
  • 5、調用JSP Parser將其編譯成Servlet程序
  • 6、調用JSDK將對應的Servlet程序編譯成.class文件
  • 7、執行(若爲加載,先加載)對應的.class文件
  • 8、結果頁面

案例

用戶註冊

  • 1、客戶端用戶登錄,提交數據
  • 2、Servlet接受用戶數據,使用JDBC將數據添加
    到MySQL數據庫
  • 3、使用jdbc,到數據庫查詢此用戶的信息,
    查詢到後結果,提示“註冊成功”,並將註冊信
    息使用 response將數據展示到網頁中。否則
    展示“註冊失敗”

用戶登錄

  • 1、接受客戶端數據
  • 2、到數據庫查詢用戶信息
  • 3、查詢到顯示註冊成功,跳轉成功頁面
  • 4、未查詢到,提示用戶名或密碼錯誤

文件上傳

  • 1、客戶端發送文件上傳POST請求

  • 2、服務端獲取Part對象
    Part part = request.getPart(“filename”);

  • 3、上傳的Servlet類需要加上
    @MultipartConfig註解

  • 4、使用Part對象,獲取content-disposition值
    String header = part.getHeader(“content-disposition”)
    處理header字符串得到文件名

  • 5、使用Part獲取字節輸入流
    InputStream is = part.getInputStream();

    或者另一種方式
    part.write(String path)

文件下載

  • 1、定義頁面,編輯超鏈接的href屬性,指向
    Servlet,傳遞filename
  • 2、定義Servlet,獲取文件名稱
  • 3、使用字節輸入流加載文件進內存
  • 4、指定response的響應頭
    setHeader(“content-disposition”,
    “attachment;filename=xxx文件名”)
  • 5、將文件寫入response的輸出流
    微信公衆號:愛編碼的程序員
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章