第十週思維導圖
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_231path環境變量
%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.ServletDemo1demo1 /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或正整數
- 1、第一次被訪問時,創建
-
-
注意: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()
獲取所有的請求頭名稱
- String getHeader(String name)
-
常見請求頭
-
User-Agent
- 瀏覽器告訴服務器,我訪問你使用的瀏覽器版本信息
- 可以在服務器端獲取該頭的信息
【解決瀏覽器兼容性問題】
-
Referer:http://localhost/login.html
-
告訴服務器,我(當前請求)從哪裏來
-
作用
- 1、防盜鏈
- 2、統計工作
-
-
-
-
請求空行
- 作用:分割POST請求的 請求頭、請求體
-
請求體
-
獲取方式
-
獲取流對象
- BufferedReader getReader()
獲取字符輸入流,只能操作字符數據 - ServletInputStream getInputStream()
獲取字節輸入流,可以操作所有的類型的
- BufferedReader getReader()
-
-
作用:封裝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”);
- get方式:tomcat 8 已經將get方式的亂碼問題解
-
-
請求轉發
(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(服務器內部異常)
- 1xx:服務器接收客戶端消息,但是沒有接收完
-
-
設置響應行
- 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路徑”)
- 1、reponse.setStatus(302)
-
特點
(與轉發的區別)
- 地址欄發生變化
- 重定向可以訪問其他站點(服務器)的資源
- 重定向是兩次請求,不能使用request對象共享數據
ServletContext
概念:代表整個web應用,可以和程序的容器
(服務器)來通信
獲取方式
-
1、通過request對象獲取
- request.getServletContext()
-
2、通過HttpServlet獲取
- this.getServletContext()
功能
-
1、獲取MIME類型
- MIME:互聯網在通信過程中定義的一種文件數
據類型
格式:大類型/小類型 text/html img/jpeg - 獲取:String getMemeType(String file)
- MIME:互聯網在通信過程中定義的一種文件數
-
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:<%-- --%>
可以註釋所有,不能被前端頁面查看
- html:
內置對象
-
概念:在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的輸出流