Servlet課上筆記html
這兩天在學習servlet,課上本身動手記了了一些筆記,內容不是很詳細,有些地方可能作的不是很明瞭,畢竟在課堂生仍是以聽和練爲主,因此你們要是看就對付看吧。java
Servlet:
一、什麼是Servlet?
是一個java類,要按照servlet規範來編寫,而且要部署在符合servlet規範的容器當中運行。其
做用是擴展web服務器的功能(生成動態資源,與CGI程序相似)。
請求a.html
——————————> |—— 動態————>CGI程序
browser 返回a.html apche
<——————————非動態————|
二、Servlet的優勢:
(1)能夠訪問數據庫
(2)方便地處理業務邏輯
(3)一個請求只會啓動一個線程(CGI程序是一個請求啓動一個進程),消耗的資源相對少
(4)多個請求能夠共享同一個Servlet實例
(5)servlet能夠在任何符合servlet規範的容器(tomcat/was/...)上運行,方便維護。
三、如何去寫一個servlet?
step1:
寫一個java類實並現Servlet接口或者繼承HttpServlet。
step2:
編譯(依賴servlet-api.jar)
step3:
打包
appName(應用名)
WEB-INF
classes(放servlet字節碼)
lib(好比數據庫驅動)
web.xml(部署描述文件:好比配置servlet-url)
step4:
部署 將第三步目錄結構copy to 服務器特定的目錄。
step5:
啓動服務器
step6:
訪問 http://ip:port/appName/servlet-urlmysql
四、安裝服務器
(1)解壓tomcat
(2)配置環境變量
JAVA_HOME
CATALINA_HOME:tomcat解壓到的目錄
PATH:CATALINA_HOME/bin
(3)啓動tomcat
cd CATALINA_HOME/bin
linux:sh startup.sh
windows:startup.bat
(4)http://localhost:8080
五、服務端寫servlet不用考慮網絡問題
六、web服務器=servlet容器(符合servlet規範的web服務器)
linux
1)、Servlet的運行的基本過程:
http協議是應用層協議 將請求中的數據先解析而後生成對象
web
(1)請求(經過http協議) servlet (2)
——————————————> ————————>HttpServletRequest(對象)
browser 引 (3)
————————>HttpServletResponse(對象)
(7)響應 (4)而後
<—————————————— 擎 ————————> Servlet
調用service (5)處理請求
(6)引擎讀取HttpServletResponse sql
第五步時能夠從request中獲取數據(方便),
也能夠將處理的結果放到response 第四步先看要調用的servlet是否有對應
的實例,若無,則建立實例,如有再也不建立新的實例
數據庫
第二步爲何引擎要將請求中的數據轉化成一個request對象?
由於servlet再也不須要考慮http協議。windows
step1 瀏覽器會將表單中的數據打包(http數據包)
step2 發送
(地址 http:ip:port/appName/pricing(action的值)
step3 服務器將請求地址去掉應用名以前的內容(包括應用名),保留應用名以後的地址
再將該地址與web.xml中的url-pattern做比較,找不到的話顯示404
step4 找到
step5 若是servlet沒有相應的實例則建立實例
step6 調service方法api
2)、Http協議瀏覽器
什麼是http協議?
超文本傳輸協議,用於制訂瀏覽器與web服務器之間數據交互的方式與數據自己的格式。
A.數據交互的方式
瀏覽器發送鏈接請求
服務器接受
瀏覽器將數據打包,發送
服務器處理完畢,數據打包,發送
, 發送完畢,關閉鏈接。
B. 數據包的格式
請求數據包(請求消息)
請求行:
請求方式(get/post)
要訪問的資源路徑(若是是get,包含請求數據)
協議的版本號(1.0,1.1)
若干消息頭(瀏覽器與服務器之間的一些約定):
好比在消息頭中,能夠攜帶cookie。
又好比,在消息頭中,能夠告訴服務器,
當前瀏覽器支持的語言。
實體內容:
若是請求方式是post,則表單中的數據會存放到這兒。
若是請求方式是get,則數據會放到請求行(資源路徑以後)
響應數據包(響應消息)
狀態行:
協議的版本號
狀態碼
404:找不到資源
500:系統內部錯誤
200:正常
狀態碼的描述
若干消息頭:
好比,告訴瀏覽器,以什麼樣的編碼來顯示返回的內容。
實體內容:
返回的處理結果。
練習:
計價
規則 產品的最終價格 = 原始價格 * (1 + 稅率)。
界面:
pricing2.html
表單
原始價格 basePrice
銷售城市 city 先依據城市,找到對應的稅率(if...else)。
3 )、get/post方式:
get方式:
A. 表單默認提交的方式,瀏覽器地址欄直接輸入一個地址,使用連接訪問。
B. 表單中的數據會添加到請求行,放置的數據有限,並且數據會直接在瀏覽器的地址欄顯示,不安全。
C. get方式,通常不適合用於瀏覽器向服務器提交數據。適用於請求某個資源。
post方式:
A.對錶單,設置了method="post"。
B.表單中的數據會添加到實體內容裏,能夠存放大量數據。相對於get方式,會安全一些。(無論哪一種方式,都不是絕對安全的,由於瀏覽器不會對數據進行加密)
C.通常若是有大量的數據須要提交給服務器。
練習:
寫一個ListEmpServlet,會返回一個
表格,表格中的內容是:
id name salary
1 zs 2000
4)、表單的處理
(1)若是得到表單中的數據
String request.getParameter(paramName);
//有多個同名的paramName
//好比 interest=fishing&interest=sleep
String[] request.getParameterValues(paramName);
(2)表單中的中文問題
step1:
對於html文件,添加<meta http-equiv="content-Type"
content="text/html;charset=utf-8">
要注意:該文件保存時所使用的編碼必定也是utf-8
做用是:要求瀏覽器按照指定的編碼來顯示該文檔。
step2:
在servlet中,使用request.setCharacterEncoding("utf-8");
要注意:此處的編碼應該與meta中設置的一致
做用:設置request對象的解碼所採用的編碼。
默認狀況下,request採用iso-8859-1編碼來解碼。
此外,還要使用response.setContentType("text/html;charset=utf-8");
做用有兩個:
1、response中寫入數據時,所使用的編碼
2、生成一個消息頭,要求瀏覽器按指定的編碼來顯示返回的數據。
(3) 數據庫的中文問題(mysql)
對於某些版本的mysql jdbc驅動,須要告訴它,
數據庫當前存放數據採用的編碼是什麼(把URL設置以下)
String url = "jdbc:mysql://localhost:3306/sd1005db2?" +
"useUnicode=true&characterEncoding=utf8";
create database name default character set utf8 指定數據庫的編碼 統一設定成utf8
5)、重定向
服務器向瀏覽器發送一個狀態碼302以及一個地址。
瀏覽器收到該狀態碼以後,會當即向這個地址發送請求。
特色:
重定向的地址是任意的(既能夠是當前服務器上的某個地址,也能夠是其它服務器上的某個地址)
瀏覽器的地址欄的地址會發生變化。
練習 按照servlet02工程的要求實現 學生信息的維護 id name age classname create table t_student( id bigint primary key auto_increment name varchar(50), age int(3), classname varchar(50)); 注意,中文問題