




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1章JavaWeb開發(fā)基礎(chǔ)本章內(nèi)容HTML基礎(chǔ)知識HTTP請求與響應(yīng)Tomcat簡介1.1
HTML簡介網(wǎng)頁超文本超媒體網(wǎng)站域名(主機)web服務(wù)器網(wǎng)頁集合互聯(lián)網(wǎng)1.1HTML簡介瀏覽器中顯示的網(wǎng)頁是HTML代碼被瀏覽器解析渲染后的結(jié)果。1.1HTML簡介HTML是一種用來描述網(wǎng)頁的超文本標記語言;超文本是指頁面內(nèi)可以包含圖片、鏈接、程序等非文字元素。HTML標簽,是由尖括號包圍的關(guān)鍵詞組成,一般成對出現(xiàn),如<html>和</html>1.1.1HTML結(jié)構(gòu)HTML文檔的基本結(jié)構(gòu)包括頭部和主體部分。頭部提供關(guān)于網(wǎng)頁的信息,使用<head></head>標簽表示頭部信息的開始和結(jié)尾。主體部分提供網(wǎng)頁的具體內(nèi)容,使用<body>和</body>標簽進行標記。1.1.1HTML結(jié)構(gòu)1<html>2<head>3<title>firsthtml</title>4</head>5<body>6welcometoHTML7</body>8</html>html_first.html1.1.2
HTML常用標簽—基本標簽(1)注釋
注釋標簽的格式為:<!--注釋內(nèi)容-->(2)標題標題是一段文字內(nèi)容的核心,通常用加強的效果來表示。HTML通過<h1>~<h6>等標簽進行定義。1<html>2<head>3<title>secondhtml</title>4</head>5<body>6<h1>網(wǎng)頁內(nèi)容標題1</h1>7<h2>網(wǎng)頁內(nèi)容標題2</h2>8<h3>網(wǎng)頁內(nèi)容標題3</h3>9<h4>網(wǎng)頁內(nèi)容標題4</h4>10<h5>網(wǎng)頁內(nèi)容標題5</h5>11<h6>網(wǎng)頁內(nèi)容標題6</h6>12</body>13</html>1.1.2
HTML常用標簽—基本標簽html_second.html1.1.2
HTML常用標簽—基本標簽(3)換行瀏覽器瀏覽一個網(wǎng)頁時,瀏覽器只有在HTML文件中遇到換行或分段的標簽時,才會進行換行或分段的操作。HTML分段通過<p>元素定義,有一個開始標簽<p>,以及一個結(jié)束標簽</p>1<html>2<head>3<title>Thirdhtml</title>4</head>5<body>6<p>這是第一段</p>7<hr/>8<p>歡迎9<br/>使用HTML分段和換行標簽10</p>11</body>12</html>html_third.html1.1.2
HTML常用標簽—基本標簽(4)樣式HTML的style屬性提供了一種改變所有HTML元素樣式的通用方法。background-color屬性為元素設(shè)置背景顏色font-family屬性設(shè)置了文本字體系列color屬性設(shè)置了文本字體顏色font-size屬性設(shè)置文本字體大小text-align屬性設(shè)置了元素中文本水平對齊方式。1.1.2
HTML常用標簽—基本標簽(5)超鏈接點擊超鏈接跳轉(zhuǎn)到新文檔或當前文檔中的某個位置當鼠標指針移動到超鏈接時,箭頭會變?yōu)槭中虷TML使用<a>標簽在HTML中創(chuàng)建鏈接,使用href屬性表明鏈接所指向的目標URL地址。1.1.2
HTML常用標簽—基本標簽1<html>2<head>3<title>唐詩宋詞</title>4</head>5<bodystyle="background-color:green">6<h1style="text-align:left">絕句二首</h1>7<h2style="background-color:red">杜甫</h2>89<pstyle="background-color:yellow;font-family:arial;color:red;font-size:20px;">10絕句·遲日江山麗</p>11<pstyle="background-color:green;font-family:arial;color:red;font-size:20px;">12遲日江山麗13<br/>春風花草香14<br/>泥融飛燕子15<br/>沙暖睡鴛鴦16</p>17<ahref="">百度搜索</a>18</body>19</html>1.1.2
HTML常用標簽—基本標簽html_fourth.html(6)圖片
使用圖片標簽,不僅可以把一幅圖片加入到網(wǎng)頁中,還可以設(shè)置圖片的尺寸、布局等屬性。圖片標簽的格式如下:1<img src="圖片文件名"2alt="簡單說明"3width="圖片寬度"height="圖片高度"4border="邊框?qū)挾?5/>
1.1.2
HTML常用標簽—基本標簽HTML使用<table>標簽定義表格,每個表格有若干行(<tr>標簽定義),每行被分割為若干單元格(由<td>標簽定義)。數(shù)據(jù)單元格可以包含文本、圖片、列表、段落、表單、水平線、表格等。1.1.2
HTML常用標簽—表格序
號標
簽描
述1<table>定義表格2<caption>定義表格標題3<th>定義表格的表頭4<tr>定義表格的行5<td>定義表格單元格6<thead>定義表格的頁眉7<tbody>定義表格的主體8<tfoot>定義表格的頁腳9<col>定義用于表格列的屬性10<colgroup>定義表格列的組1.1.2
HTML常用標簽—表格1.1.2
HTML常用標簽—表格HTML表單用于搜集不同類型的用戶輸入當用戶填好表單所需信息并將表單提交后,服務(wù)器就可以得到表單中的信息并進行處理。HTML表單通過<form>元素進行定義。1.1.2
HTML常用標簽—表單序號元素描
述1accept-charset規(guī)定表單中使用的字符集(默認:頁面字符集)2action規(guī)定向何處提交表單的URL地址(提交頁面)3autocomplete規(guī)定瀏覽器是否自動完成表單(默認:開啟)4enctype規(guī)定被提交數(shù)據(jù)的編碼(默認:url-encoded)5method規(guī)定提交表單時所用的HTTP方法(默認:GET)6name規(guī)定識別表單的名稱7novalidate規(guī)定瀏覽器不驗證表單8target規(guī)定action屬性中地址的目標1.1.2
HTML常用標簽—表單序
號元
素描
述1<form>定義HTML表單2<input>表單中的輸入域。該元素根據(jù)不同的type屬性,可以變換為多種形態(tài)3<select>定義下拉列表4<textarea>文本域,用于定義多行輸入字段5<button>定義可單擊的按鈕
表1.3表單常用元素1.1.2
HTML常用標簽—表單text:單行文本框<inputtype=“text”/>textarea:多行文本框<textarea></textarea>radio:單選按鈕<inputtype=“radio”/>checkbox:復(fù)選按鈕<inputtype=“checkbox”/>Select:下拉選框<select><option></option></select>1.1.2
HTML常用標簽—表單file:文件上傳<inputtype=“file”/>hidden:隱藏域<inputtype=“hidden”/>Submit:提交按鈕<inputtype=“submit”/>Reset:重置按鈕<inputtype=“reset”/>Button:按鈕<inputtype=“button”/>1.1.2
HTML常用標簽—表單1.1.2
HTML常用標簽—表單1.2HTML請求與響應(yīng)HTTP協(xié)議:TCP/IP協(xié)議集中的一個應(yīng)用層協(xié)議,是WEB瀏覽器與WEB服務(wù)器之間一問一答的交互過程必須遵循的規(guī)則。HTTP是hypertexttransferprotocol(超文本傳輸協(xié)議)的簡寫,用于定義Web瀏覽器與Web服務(wù)器之間交換數(shù)據(jù)的過程以及數(shù)據(jù)本身的格式。1.2.1HTTP請求報文格式HTTP請求由請求行、消息報頭、請求正文組成。其中,消息頭和實體內(nèi)容都是可選的,消息頭和實體內(nèi)容之間要用空行隔開。舉例:GET/books/java.htmlHTTP/1.1Accept:*/*Accept-Language:en-usConnection:Keep-AliveHost:localhostReferer:http://localhost/links.aspUser-Agent:Mozilla/4.0Accept-Encoding:gzip,deflate
請求行
一個空行
多個消息頭方法名具體含義GET請求獲取Request-URI所標識的資源POST在Request-URI所標識的資源后附加新的數(shù)據(jù)HEAD請求獲取由Request-URI所標識的資源的響應(yīng)消息報頭PUT請求服務(wù)器存儲一個資源,并用Request-URI作為其標識DELETE請求服務(wù)器刪除Request-URI所標識的資源TRACE請求服務(wù)器回復(fù)收到的請求信息,主要用于測試或診斷CONNECT保留將來使用表1.4 HTTP的請求方法1.2.1HTTP請求報文格式—請求行請求行:說明請求類型、要訪問的資源以及所使用的HTTP版本請求報頭是緊接在請求行之后的部分,用來說明服務(wù)器要使用的附加信息。Host請求報頭域主要用于指定被請求資源的Internet主機和端口號Accept請求報頭域用于指定客戶端接受哪些類型的信息。Accept-Charset請求報頭域用于指定客戶端接受的字符集1.2.1HTTP請求報文格式—請求報頭Accept-Encoding用于指定可接受的內(nèi)容編碼Accept-Language用于指定一種自然語言Authorization請求報頭域用于證明客戶端有權(quán)查看某個資源User-Agent請求報頭域允許客戶端將它的操作系統(tǒng)、瀏覽器及其他屬性告訴服務(wù)器1.2.1HTTP請求報文格式—請求報頭第三部分是一個空行,請求報頭結(jié)束后,必須添加一個空行。第四部分是請求正文,正文中的數(shù)據(jù)按照“key=value”的格式設(shè)置,多個參數(shù)之間使用“&”進行分隔。1.2.1HTTP請求報文格式—請求正文1.2.2HTTP響應(yīng)報文格式HTTP響應(yīng)由三部分組成:狀態(tài)行、響應(yīng)報頭和響應(yīng)正文舉例:HTTP/1.1200OKServer:Microsoft-IIS/5.0Date:Thu,13Jul200005:46:53GMTContent-Length:2291Content-Type:text/htmlCache-control:private<HTML><BODY>……
狀態(tài)行
一個空行
多個消息頭
實體內(nèi)容1.2.2HTTP響應(yīng)報文格式—狀態(tài)行響應(yīng)狀態(tài)碼表示服務(wù)器對請求的各種不同處理結(jié)果和狀態(tài)狀態(tài)碼狀態(tài)說明狀態(tài)碼含義200OK
客戶端請求成功400BadRequest
客戶端請求有語法錯誤,不能被服務(wù)器所理解401Unauthorized
請求未經(jīng)授權(quán),必須和WWW-Authenticate報頭域一起使用403Forbidden
服務(wù)器收到請求,但是拒絕提供服務(wù)404NotFound
請求資源不存在,例如輸入了錯誤的URL500InternalServerError
服務(wù)器發(fā)生不可預(yù)期的錯誤503ServerUnavailable
服務(wù)器當前不能處理客戶端的請求,一段時間后可能恢復(fù)正常表1.5 常用響應(yīng)狀態(tài)碼及其說明響應(yīng)報頭,說明客戶端要使用的一些附加信息。Date表示生成響應(yīng)的日期和時間。Content-Type指定了響應(yīng)正文的MIME類型。Content-Length說明了響應(yīng)正文的長度。Last-Modifield指明資源最終修改的時間。1.2.2HTTP響應(yīng)報文格式—響應(yīng)報頭第三部分是一個空行,響應(yīng)報頭后面的這個空行也是必需的。第四部分是響應(yīng)正文,服務(wù)器返回給客戶端的文本信息,是符合HTML語法的字符串。1.2.2HTTP響應(yīng)報文格式—響應(yīng)正文1.2.3URL通過HTTP請求的資源由統(tǒng)一資源標示符(URL)來標識。URL是一種特殊類型的統(tǒng)一資源定位符,用于確定網(wǎng)絡(luò)中具體資源的位置。1.2.3URL服務(wù)協(xié)議://服務(wù)器ip地址(域名)訪問資源所在路徑http協(xié)議ftp協(xié)議jdbc協(xié)議等等存放資源的服務(wù)器所使用的域名或者ip地址:端口號/一個服務(wù)器上可能開啟了多個服務(wù),端口號指代這個服務(wù)器上的哪個服務(wù)是指我們所請求的資源在服務(wù)器上的具體位置,通常是由“目錄/子目錄/網(wǎng)頁名稱”來構(gòu)成1.2.4簡單的Web服務(wù)器使用ServerSocket來發(fā)布一個Web服務(wù)讓瀏覽器通過HTTP來連接這個Web服務(wù)Web服務(wù)接收瀏覽器發(fā)送過來的HTTP請求,并對HTTP請求進行解析,封裝到Request對象中。1.2.4簡單的Web服務(wù)器定義Request類定義HttpServer類定義Response類定義請求處理類RequestProcess1.2.4簡單的Web服務(wù)器圖1.12瀏覽器請求HttpServer圖1.13查看HttpServer的響應(yīng)結(jié)果客戶機與web服務(wù)器建立TCP連接瀏覽器通過該連接發(fā)送http請求服務(wù)器對接收到的請求解析,并處理生成http響應(yīng)消息通過tcp連接發(fā)回給客戶端的瀏覽器瀏覽器進行渲染顯示1.3Tomcat1.3Tomcat發(fā)布Web服務(wù)、等待客戶端連接、對HTTP請求解析處理、HTTP響應(yīng)內(nèi)容返回給瀏覽器的業(yè)務(wù)邏輯都是一致的人們設(shè)計開發(fā)一個Web服務(wù)系統(tǒng)Tomcat,以提供公共的Web服務(wù)由于Tomcat技術(shù)先進、性能穩(wěn)定,而且免費,因而深受Java愛好者的喜愛,1.3.1Tomcat的安裝與配置JDK、Tomcat下載/technetwork/java/javase/archive-139210.html//安裝JDK、Tomcattomcat需要JDK的支持,但Tomcat本身并不自帶JDK,所以需要JDK的支持配置classpath、path、[可選JAVA_HOME]Tomcat啟動配置配置JAVA_HOME=jdk的安裝路徑配置CATALINA_HOME=tomcat的安裝路徑1.3.1Tomcat的安裝與配置圖1.14下載Tomcat圖1.15下載JDK1.3.1Tomcat的安裝與配置圖1.16設(shè)置JAVA_HOME環(huán)境變量圖1.17設(shè)置安裝根路徑1.3.1Tomcat的安裝與配置圖1.18設(shè)置CATALINA_HOME環(huán)境變量圖1.19Tomcat安裝目錄1.3.2Tomcat的使用存放啟動和關(guān)閉Tomcat的腳本文件存放Tomcat服務(wù)器的各種配置文件存放Tomcat服務(wù)器和所有web應(yīng)用程序需要訪問的jar文件存放Tomcat的日志文件存放Tomcat運行時產(chǎn)生的臨時文件當發(fā)布web應(yīng)用程序時,通常把web應(yīng)用程序的目錄及文件放到這個目錄下Tomcat將JSP生成的Servlet源文件和字節(jié)碼文件放到這個目錄下圖1.20Tomcat的目錄結(jié)構(gòu)1.3.2Tomcat的使用圖1.21雙擊“startup.bat”文件圖1.22Tomcat啟動效果雙擊“bin”目錄下的“startup.bat”文件(見圖1.21),可以啟動Tomcat。1.3.2Tomcat的使用啟動tomcat通過bin/startup.bat命令運行Tomcat服務(wù)器打開瀏覽器輸入:http://locathost:8080、 :80801.3.2Tomcat使用關(guān)閉Tomcat雙擊bin目錄下的shutdown.bat文件關(guān)閉Tomcat服務(wù)器1.3.2Tomcat使用Tomcat使用catalina.bat啟動startrunstop1.3.2Tomcat服務(wù)器簡介配置Tomcat的端口號打開conf目錄下的server.xml文件修改端口號修改端口1.3.3MyEclipse配置Tomcat圖1.26選擇“Preferences”命令圖1.27Tomcat配置窗口1.3.3MyEclipse配置Tomcat圖1.28查看配置的Tomcat圖1.29Tomcat啟動日志第2章Servlet編程本章內(nèi)容創(chuàng)建Servletweb.xml配置文件Servlet獲取請求參數(shù)Servlet實現(xiàn)登錄功能請求參數(shù)為空的問題復(fù)選框提交參數(shù)GET請求與POST請求本章內(nèi)容中文亂碼問題Servlet跳轉(zhuǎn)Servlet生命周期ServletContextServletConfig2.1創(chuàng)建ServleServlet是JavaWeb應(yīng)用中的核心組件,也是學(xué)習JavaWeb開發(fā)的重點與難點。掌握Servlet是進行JavaWeb開發(fā)的基礎(chǔ),如果沒有充分理解Servlet及其相關(guān)知識,將無法寫出高效的JavaWeb應(yīng)用程序。2.1創(chuàng)建Servle
1)新建WebProject項目2.1創(chuàng)建Servle
2)輸入項目名稱2.1創(chuàng)建Servle
3)WebProject項目結(jié)構(gòu)2.1創(chuàng)建Servle
4)新建Servlet
2.1創(chuàng)建Servle
5)CreateanewServlet對話框2.1創(chuàng)建Servle
6)CreateanewServlet對話框2.1創(chuàng)建Servle
7)MyEclipse生成的Servlet代碼2.1創(chuàng)建Servle
8)MyServlet類中的方法2.1創(chuàng)建Servle
定義一個最簡單的Servlet
1publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)2throwsServletException,IOException{3PrintWriterout=response.getWriter();4out.println("HelloServlet!");5out.close();6}2.1創(chuàng)建Servle
9)發(fā)布項目servlet_first
2.1創(chuàng)建Servle
10)ProjectDeployments對話框2.1創(chuàng)建Servle
11)NewDeployments對話框2.1創(chuàng)建Servle
12)選擇Tomcat服務(wù)器2.1創(chuàng)建Servle
13)設(shè)置后的發(fā)布對話框2.1創(chuàng)建Servle
14)啟動Tomcat服務(wù)器2.1創(chuàng)建Servle
訪問Servlethttp://localhost:8080/servlet_first/servlet/MyServlet2.1創(chuàng)建Servle
15)MyServlet的運行結(jié)果2.2
web.xml配置文件通過MyEclipse創(chuàng)建Servlet,除了生成與Servlet相關(guān)的Java代碼文件,還會在項目目錄WebRoot/WEB-INF下的web.xml文件中添加該Servlet的配置信息。開發(fā)JavaWeb除了要編寫Java代碼,還要維護相應(yīng)的XML配置文件,這些XML配置文件是保障JavaWeb應(yīng)用正確運行的前提,也是學(xué)習JavaWeb開發(fā)時的重點和難點。2.2
web.xml配置文件對于學(xué)習Servlet的初學(xué)者而言,所犯的常見錯誤大都出現(xiàn)在web.xml配置文件中。雖然可以借助MyEclipse在web.xml中生成配置,但也要學(xué)會手工修改web.xml文件,因為熟練配置web.xml是學(xué)會JavaWeb開發(fā)的標志之一。2.2
web.xml配置文件1<servlet>2<servlet-name>MyServlet</servlet-name>3<servlet-class>servlet.MyServlet</servlet-class>4</servlet>5<servlet-mapping>6<servlet-name>MyServlet</servlet-name>7<url-pattern>/servlet/MyServlet</url-pattern>8</servlet-mapping>2.2
web.xml配置文件2.3Servlet獲取請求參數(shù)通過URL向服務(wù)器提交參數(shù)http://localhost:8080/servlet_first/servlet/MyServlet?username=zhanghttp://localhost:8080/servlet_first/servlet/MyServlet?username=zhang&password=123452.3Servlet獲取請求參數(shù)在doGet()方法中可借助request來獲取請求參數(shù)publicStringgetParameter(Stringname)getParameter()方法根據(jù)請求參數(shù)名返回請求參數(shù)值,方法的參數(shù)name指定了欲獲取的參數(shù)名,而返回值即為對應(yīng)的參數(shù)值2.3Servlet獲取請求參數(shù)1publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{2Stringusername=request.getParameter("username"); 3PrintWriterout=response.getWriter();4out.println("username="+username);5out.close();6}2.4Servlet實現(xiàn)登錄功能LoginServlet類的doGet()方法的核心代碼Stringusername=request.getParameter("username");Stringpassword=request.getParameter("password"); PrintWriterout=response.getWriter();if(username.equals("zhang")&&password.equals("12345")){out.println("LoginSuccess!");}else{out.println("LoginError!");}out.println("username="+username);out.println("password="+password);out.close();2.4Servlet實現(xiàn)登錄功能訪問該Servlet的URL
http://localhost:8080/servlet_first/servlet/LoginServlet?username=zhang&password=123452.4Servlet實現(xiàn)登錄功能登錄頁面login.html2.4Servlet實現(xiàn)登錄功能登錄頁面login.html核心代碼<formaction="servlet/LoginServlet">Username:<inputtype="text"name="username"><br>Password:<inputtype="text"name="password"><br><inputtype="submit"name="Submit"><br></form>2.5請求參數(shù)為空的問題Web應(yīng)用面對著各式各樣的用戶。用戶常會有意或無意地輸入非法參數(shù),如果Web應(yīng)用處理不當,就會引起異常及安全問題。因此需要處理最為常見的參數(shù)為空的問題。參數(shù)值為null參數(shù)值為""2.5請求參數(shù)為空的問題以下兩種URL訪問LoginServlet,則會在瀏覽器頁面和Tomcat控制臺同時觸發(fā)空指針異常NullPointerExceptionhttp://localhost:8080/servlet_first/servlet/LoginServlethttp://localhost:8080/servlet_first/servlet/LoginServlet?Username=zhang&password=123452.5請求參數(shù)為空的問題2.5請求參數(shù)為空的問題第1個URL中未指定username的參數(shù)值,第2個URL中指定了錯誤的username參數(shù)值(即“Username”中的首字母U不應(yīng)該大寫),這兩者都會造成username的值為null,所以username.equals(“zhang”)語句就觸發(fā)了“NullPointerException”。為了使程序更健壯,就需要加入對參數(shù)值是否為null的判斷。2.5請求參數(shù)為空的問題參數(shù)值為””以下URL訪問LoginServlet,輸出結(jié)果是什么?http://localhost:8080/servlet_first/servlet/LoginServlet?username=&password=2.5請求參數(shù)為空的問題if(username==null||username.equals("")){out.println("username="+username); out.close(); return;}if(password==null||password.equals("")){ out.println("password="+password); out.close(); return;}2.6復(fù)選框提交參數(shù)在HTML頁面中,文本框、單選按鈕等組件所表示的請求參數(shù)都是單個值,而復(fù)選框、列表框等組件所表示的請求參數(shù)則是數(shù)組類型。2.6復(fù)選框提交參數(shù)<formaction="servlet/CheckboxServlet">Basketball:<inputtype="checkbox"name="balls"value="basketball"><br>Volleyball:<inputtype="checkbox"name="balls"value="volleyball"><br>Footall:<inputtype="checkbox"name="balls"value="football"><br><inputtype="submit"name="Submit"><br></form>2.6復(fù)選框提交參數(shù)因為3個復(fù)選框表達的是同一組請求參數(shù),所以它們的name屬性都是一樣的(即都是“balls”),此時請求參數(shù)balls的值就是數(shù)組類型的。HttpServletRequest下的getParameter()方法只能處理單個值,因此為了接收數(shù)組類型的參數(shù),就需要調(diào)用HttpServletRequest下的getParameterValues()方法。String[]getParameterValues(Stringname)2.6復(fù)選框提交參數(shù)
String[]balls=request.getParameterValues("balls"); PrintWriterout=response.getWriter();if(balls==null){//沒有選擇3個復(fù)選框中的任何一個,則balls為nullout.println("balls=null");out.close();return;}for(Stringball:balls){out.println("balls="+ball);}out.close();2.7GET請求與POST請求構(gòu)建一個Servlet的關(guān)鍵就是繼承HttpServlet類并重寫其中的doGet()和doPost()方法。GET方式會將請求參數(shù)顯示在瀏覽器地址欄中,而POST方式則不會。這是因為GET方式的請求參數(shù)是放在HTTP請求報文的報頭,而POST方式的請求參數(shù)是放在HTTP請求報文的正文。如果請求參數(shù)中攜帶有安全性、敏感性信息(如密碼),則應(yīng)該使用POST方式;而GET方式十分便于調(diào)試程序。2.7GET請求與POST請求值為post時,其以POST方式提交,Servlet會調(diào)用doPost()方法來處理請求。值為get或者屬性未設(shè)置時(如login.html中的<form>標簽),則以GET方式提交,Servlet會調(diào)用doGet()方法來處理請求。<formaction="servlet/LoginServlet"method="post">Username:<inputtype=“text”
name="username"><br>Password:<inputtype="text"name="password"><br><inputtype="submit"name="Submit"><br></form>2.7GET請求與POST請求單擊“提交”按鈕后,兩種方式在瀏覽器地址欄中生成的URL也不同GET方式:http://localhost:8080/servlet_first/servlet/LoginServlet?username=zhang&password=12345POST方式:http://localhost:8080/servlet_first/servlet/LoginServlet2.8中文亂碼問題Servlet輸出亂碼out.println("登錄成功!")在PrintWriterout=response.getWriter()語句之前加入代碼response.setCharacterEncoding("gbk");2.8中文亂碼問題POST參數(shù)亂碼在username文本框中輸入中文字符“張三”在Stringusername=request.getParameter("username")語句之前加入代碼request.setCharacterEncoding("gbk");2.8中文亂碼問題GET參數(shù)亂碼http://localhost:8080/servlet_first/servlet/LoginServlet?username=張三&password=12345”除在引用request對象前要加入request.setCharacterEncoding("gbk");還需在Tomcat服務(wù)器的conf目錄下server.xml文件的<Connector>標簽中增加useBodyEncodingForURI屬性,并設(shè)置其值為true2.9Servlet跳轉(zhuǎn)對于比較復(fù)雜的業(yè)務(wù)功能,經(jīng)常需要多個Servlet配合實現(xiàn),這時就需要從一個Servlet跳轉(zhuǎn)到另外一個Servlet,Servlet間的跳轉(zhuǎn)方式可分為轉(zhuǎn)發(fā)(forward)和重定向(redirect)兩種2.9Servlet跳轉(zhuǎn)
Servlet間的轉(zhuǎn)發(fā)通過使用HttpServletRequest的getRequestDispatcher()方法可獲取RequestDispatcher對象RequestDispatchergetRequestDispatcher(Stringpath)getRequestDispatcher()方法的參數(shù)path指明了要轉(zhuǎn)發(fā)到的目標Servlet的URL路徑,其返回值為RequestDispatcher類型的對象。2.9Servlet跳轉(zhuǎn)
Servlet間的轉(zhuǎn)發(fā)getRequestDispatcher()方法只是獲取了RequestDispatcher對象,并未執(zhí)行真正的轉(zhuǎn)發(fā),執(zhí)行轉(zhuǎn)發(fā)操作還需要調(diào)用RequestDispatcher的forward()方法voidforward(ServletRequestrequest,ServletResponseresponse)forward()方法的聲明與doGet()方法和doPost()方法類似,在轉(zhuǎn)發(fā)時,其將request和response作為參數(shù)傳遞到下一個Servlet,以便其做進一步的處理。2.9Servlet跳轉(zhuǎn)
轉(zhuǎn)發(fā)時傳遞對象Servlet轉(zhuǎn)發(fā)時傳遞對象需要利用HttpServletRequest對象來傳遞數(shù)據(jù),需調(diào)用的HttpServletRequest的方法的聲明如下:voidsetAttribute(Stringname,Objectobject)ObjectgetAttribute(Stringname)。2.9Servlet跳轉(zhuǎn)
轉(zhuǎn)發(fā)時傳遞對象方法setAttribute()的參數(shù)name指定了放入request的對象的“名字”,此處name的類型是String,用戶可任意命名,但要注意將來要按同樣名字來取對象;參數(shù)object則為真正要放入的需被傳遞的對象。request.setAttribute("u",username);方法getAttribute()按參數(shù)name指定的“名字”,到request中取出之前由方法setAttribute()放入的對象。Stringusername=(String)request.getAttribute("u");2.9Servlet跳轉(zhuǎn)
轉(zhuǎn)發(fā)時傳遞對象在使用forward()方法執(zhí)行轉(zhuǎn)發(fā)時,該方法把request作為參數(shù)傳遞到了下一個Servlet,因為轉(zhuǎn)發(fā)前后的兩個Servlet引用的是同一個request對象,所以就可借助request來傳遞數(shù)據(jù)。2.9Servlet跳轉(zhuǎn)
重定向Servlet之間的重定向是通過javax.servlet.http.HttpServletResponse對象的sendRedirect()方法實現(xiàn)publicvoidsendRedirect(Stringlocation)throwsIOException重定向時傳遞參數(shù)response.sendRedirect(path+"?username="+username+"&password="+password);2.9Servlet跳轉(zhuǎn)
轉(zhuǎn)發(fā)與重定向轉(zhuǎn)發(fā)與重定向之間最重要的區(qū)別在于Servlet跳轉(zhuǎn)中瀏覽器所發(fā)出的請求次數(shù)。在Servlet的跳轉(zhuǎn)過程中,無論Servlet出現(xiàn)了多少次的轉(zhuǎn)發(fā),瀏覽器僅僅只發(fā)送了一次HTTP請求,只接收到最后一個Servlet傳回的響應(yīng)。重定向在跳轉(zhuǎn)至另一個Servlet之前,必須先對瀏覽器傳回響應(yīng),瀏覽器會根據(jù)響應(yīng)報文中的重定向路徑發(fā)出一個全新的請求以接受重新的處理,所以重定向過程一共需要發(fā)出兩次HTTP請求。2.9Servlet跳轉(zhuǎn)
轉(zhuǎn)發(fā)與重定向由于在轉(zhuǎn)發(fā)之后,瀏覽器中URL仍然指向初始頁面,此時如果刷新瀏覽器,初始頁面將會被再次調(diào)用。如果不想這樣的情況發(fā)生(如付款或轉(zhuǎn)賬頁面),可選擇重定向。轉(zhuǎn)發(fā)只能在一個Web項目內(nèi)的資源之間跳轉(zhuǎn)。重定向可跳轉(zhuǎn)至當前Web項目以外的其他資源。2.10Servlet生命周期Servlet的生命周期指的是一個Servlet對象何時被創(chuàng)建、何時被訪問、何時被銷毀。一個Servlet對象在首次被訪問時創(chuàng)建;之后不管用戶多少次訪問該Servlet,調(diào)用的仍是同一對象,即Servlet在Web應(yīng)用中是單例的。一個Servlet對象被創(chuàng)建后,直到項目重新發(fā)布或Tomcat服務(wù)器停機,該對象才會被銷毀。2.11ServletContext接口ServletContext位于javax.servlet包下,其封裝了一個Web應(yīng)用運行時的上下文,也就是Web應(yīng)用運行時所涉及的環(huán)境信息。一個Web應(yīng)用程序(即MyEclipse下的一個Web項目)下僅有一個ServletContext對象,因此通過ServletContext可實現(xiàn)跨用戶的數(shù)據(jù)共享,具體需調(diào)用的ServletContext方法如下,其與HttpServletContext的屬性方法的聲明完全一致。voidsetAttribute(Stringname,Objectobject)ObjectgetAttribute(Stringname)2.12ServletConfigServletConfig接口位于javax.servlet包下,其封裝了Servlet在web.xml文件中的配置信息每個Servlet對象都有一個僅屬于自己的ServletConfig對象。調(diào)用ServletConfig的getInitParameter()方法可讀取到web.xml配置文件中<init-param>標簽中的用戶自定義參數(shù)StringgetInitParameter(Stringname)小結(jié)Servlet是學(xué)習JavaWeb開發(fā)的重點與難點,這里的Servlet不僅指HttpServlet,還包括HttpServletRequest、HttpServletResponse、RequestDispatcher、ServletContext與ServletConfig等,除了要掌握這些接口的常用方法外,還要熟悉它們之間的繼承及引用關(guān)系,這對理解與掌握Servlet也是非常重要的。小結(jié)第3章Cookie與Session
本章內(nèi)容
基于Servlet的簡單Web應(yīng)用
Cookie的含義和用法
Session的含義和用法
Session的工作原理個人信息模塊的實現(xiàn)基于MVC的購物車3.1使用Servlet編寫簡單Web應(yīng)用使用Servlet開發(fā)一個模擬登錄的Web應(yīng)用主要功能登錄個人信息的完善和查詢3.1使用Servlet編寫簡單Web應(yīng)用3.1.1Web應(yīng)用功能說明3.1.2登錄模塊的實現(xiàn)3.1.1Web應(yīng)用功能說明圖3.1登錄頁面圖3.2個人信息首頁用戶可通過圖3.1所示的登錄頁面填寫用戶名和密碼進行登錄操作,如果用戶名和密碼都不為空,則判定該登錄有效,顯示如圖3.2所示的個人信息應(yīng)用首頁,該首頁不僅顯示了當前用戶的個人信息的頁面鏈接,以及完善個人信息的頁面鏈接,還顯示了當前的登錄用戶名,以及登錄時間信息3.1.1Web應(yīng)用功能說明當點擊“查看個人信息”鏈接時,系統(tǒng)應(yīng)顯示當前登錄用戶完善后的個人信息。如果該用戶從來沒有點擊“完善個人信息”鏈接,則需要對信息進行完善,此時系統(tǒng)會直接跳轉(zhuǎn)至“完善個人信息”頁面,如圖3.3和圖3.4所示。圖3.3完善個人信息1圖3.4完善個人信息23.1.1Web應(yīng)用功能說明如果當前用戶已經(jīng)完善過個人信息,則直接顯示完善后的用戶信息,如圖3.5所示。圖3.5查看個人信息詳情3.1.2登錄模塊的實現(xiàn)工程結(jié)構(gòu)如圖3.6圖3.6LoginDemo工程結(jié)構(gòu)1.“.zzti.entity”包中包含User和PersonalInfo兩個實體類,分別用來存儲用戶的登錄信息和當前登錄用戶的具體個人信息2.“.zzti.servlet.view”包中存放展現(xiàn)給用戶的5個頁面,包括登錄頁面、Web應(yīng)用首頁、個人信息完善表單1、個人信息完善表單2、個人信息詳情頁面。3.“.zzti.servlet”包中包含兩個Servlet,“LoginServlet”的主要功能是對來自登錄頁面中的表單參數(shù)進行校驗和存儲,“PersonalInfoProcess”的主要功能是接收來自個人信息完善表單中的數(shù)據(jù),對完善后的個人信息進行封裝和存儲。3.1.2登錄模塊的實現(xiàn)本章的登錄頁面根據(jù)用戶提交的參數(shù)正確與否來產(chǎn)生不同的響應(yīng),如果用戶名密碼都不為空,則跳轉(zhuǎn)到圖3.2;否則,跳轉(zhuǎn)到,如圖3.7所示的登錄頁面,并提示錯誤信息。圖3.7登錄異常響應(yīng)結(jié)果頁面登錄模塊示例源碼:loginDemo(ch3-1)3.1.2登錄模塊的實現(xiàn)“.zzti.entity.User”用戶實體類3.1.2登錄模塊的實現(xiàn)“.zzti.entity.PersonalInfo”代碼3.1.2登錄模塊的實現(xiàn)“.zzti.servlet.view.LoginPageView”代碼如下:1@WebServlet("/servlet/LoginPageView")2publicclassLoginPageViewextendsHttpServlet{3publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)4 throwsServletException,IOException{5 request.setCharacterEncoding("utf-8");6 response.setContentType("text/html;charset=utf-8");7 PrintWriterout=response.getWriter();8 out.println("<!DOCTYPEHTML>");9 out.println("<HTML>");10 out.println("<HEAD><TITLE>登錄頁面</TITLE></HEAD>");11 out.println("<BODY>");12 Objecterror=request.getAttribute("error");13 if(error!=null){14 out.println("請重新登錄:<fontcolor='red'>"+error+"</font><br>");15 }16 Stringbody="<formaction='LoginServlet'method='post'>"+17 "username:<inputtype='text'name='username'/><br/>"+18 "password:<inputtype='password'name='password'/><br/>"+19 "<inputtype='submit'value='登錄'/></form>";20 out.println(body);21 out.println("</BODY>");22 out.println("</HTML>");23 out.flush();24 out.close();25 }26 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)27 throwsServletException,IOException{28 doGet(request,response);29 }30}3.1.2登錄模塊的實現(xiàn)“.zzti.servlet.LoginServlet”代碼如下:1@WebServlet("/servlet/LoginServlet")2publicclassLoginServletextendsHttpServlet{3publicStringcheckLogin(Useruser){4 StringerrorInfo=null;5 if(user.getUsername()==null||"".equals(user.getUsername().trim())6 ||user.getPassword()==null||"".equals(user.getPassword().trim())){7 errorInfo="用戶名或者密碼不能為空";8 }9 returnerrorInfo;10 }11 publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)12 throwsServletException,IOException{13 doPost(request,response);14 }15 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)16 throwsServletException,IOException{17 request.setCharacterEncoding("utf-8");18 Stringusername=request.getParameter("username");19 Stringpassword=request.getParameter("password");20 Useruser=newUser(username,password,newDate());21 Stringerror=checkLogin(user);22 StringtargetPath="IndexView";23 if(error==null){24 //登錄成功,對登錄信息進行保存25
request.setAttribute("username",user);26 }else{27 //登錄失敗,返回登錄頁面,并將錯誤信息帶回28 targetPath="LoginPageView";29 request.setAttribute("error",error);30 }31 request.getRequestDispatcher(targetPath).forward(request,response);32 }33}3.1.2登錄模塊的實現(xiàn)“.zzti.servlet.view.IndexView”代碼如下:1@WebServlet("/servlet/IndexView")2publicclassIndexViewextendsHttpServlet{3publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)4 throwsServletException,IOException{5 ObjectloginTag=request.getAttribute("user");6 if(loginTag==null){ 7 response.sendRedirect("LoginPageView?error="+8 URLEncoder.encode("尚未登錄","gbk"));9 return;10 }11 Useruser=(User)loginTag;12 response.setContentType("text/html;charset=gbk");13 PrintWriterout=response.getWriter();14 out.println("<!DOCTYPEHTML>");15 out.println("<HTML>");16 out.println("<HEAD><TITLE>Web應(yīng)用首頁</TITLE></HEAD>");17 out.println("<BODY>");18 out.println("當前登錄的用戶是:"+user.getUsername());19 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");20 out.println("<br>登錄時間:"+sdf.format(user.getLoginTime()));21 out.println("<br><ahref='IndexView'>進入首頁</a>");22 out.println("<br><ahref='PersonalInfoView'>查看個人信息</a>");23 out.println("<br><ahref='PersonalPage1'>完善個人信息</a>");24 out.println("</BODY>");25 out.println("</HTML>");26 out.flush();27 out.close();28 }29 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)30 throwsServletException,IOException{31 doGet(request,response);32 }33}3.1.2登錄模塊的實現(xiàn)假如在圖3.2所示的頁面中,單擊“進入首頁”的超級鏈接在該次對Web首頁的請求中,將因為無法獲得登錄者信息而跳轉(zhuǎn)至登錄頁面,如圖3.8所示。圖3.8跳轉(zhuǎn)至登錄頁面圖3.2個人信息首頁3.2CookieHTTP是一種無狀態(tài)協(xié)議,即每次服務(wù)端接收到客戶端的請求時,都是一個全新的請求,服務(wù)器并不知道客戶端的歷史請求記錄.如何解決上述問題?CookieSession3.2Cookie3.2.1Cookie簡介3.2.2Cookie在登錄中的應(yīng)用3.2.3Cookie詳解3.2.1Cookie簡介Cookie實際上是服務(wù)器在客戶端瀏覽器上存儲的小段文本,并通過每一個請求發(fā)送至同一個服務(wù)器。Web服務(wù)器用HTTP報頭向客戶端發(fā)送Cookie,客戶端瀏覽器解析這些Cookie并將它們保存為一個本地文件。服務(wù)器set-cookieuser=admin;Expires=Wen,12-Apr-201704:38-55GMT②③保存Cookie文件④讀取Cookie文件⑤cookieuser=admin客戶端user=admin&pw=123456&login=auto3.2.1Cookie簡介在JavaEE中,使用“javax.servlet.http.Cookie”類來代表一個Cookie。Cookie對象可以看作是一個key-value對,key和value都是String類型:publicCookie(Stringname,Stringvalue)3.2.1Cookie簡介客戶端瀏覽器接收到Cookie并進行存儲,在后續(xù)的請求中會自動添加這個Cookie信息,服務(wù)端需要借助于“javax.servlet.http.HttpServletResponse”的addCookie()方法來獲取客戶端傳遞來的Cookie信息,最終實現(xiàn)信息共享。publicvoidaddCookie(Cookiecookie)3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在3.1.2節(jié)中的會話問題中,服務(wù)器端可以創(chuàng)建Cookie對象,將用戶的登錄信息保存在該Cookie對象中,然后通過HTTP響應(yīng)消息寫回到客戶端。之后,客戶端的每次請求都將會帶上該登錄信息,從而解決會話狀態(tài)保持問題。將Cookie對象通過HTTP響應(yīng)消息寫回客戶端時,首先修改“.zzti.servlet.LoginServlet”類的doPost()方法,當用戶登錄系統(tǒng)后,將用戶的登錄信息通過HTTP響應(yīng)消息寫回客戶端,修改后的LoginServlet中doPost方法的核心代碼(完整代碼參考P83)如下:7Stringerror=checkLogin(user);8 StringtargetPath="IndexView";9 if(error==null){10 Cookiecookie1=newCookie("username",user.getUsername());11 Cookiecookie2=newCookie("loginTime",user.getLoginTime());12 response.addCookie(cookie1);13 response.addCookie(cookie2);14 }cookie保存會話登錄模塊示例源碼:loginDemo(ch3-2)3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在“javax.servlet.http.HttpServletRequest”中提供了getCookies()方法,該方法可以獲取HTTP請求所發(fā)送的所有Cookie信息,因為客戶端發(fā)送的Cookie可以是0到多個,所以getCookies方法返回的是Cookie數(shù)組。在工程中添加類“.zzti.util.CookieUtil”來完成對Cookie的訪問,具體代碼如下。 /** *從cookie數(shù)組中查詢鍵值為key的Cookie對象 *@paramcookies *@paramkey *@return */ publicstaticCookiegetCookie(Cookie[]cookies,Stringkey){ if(cookies!=null){ for(Cookiecookie:cookies){ if(key!=null&&key.equals(cookie.getName())){ returncookie; } } } returnnull; }3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在“javax.servlet.http.HttpServletRequest”中提供了getCookies()方法,該方法可以獲取HTTP請求所發(fā)送的所有Cookie信息,因為客戶端發(fā)送的Cookie可以是0到多個,所以getCookies方法返回的是Cookie數(shù)組。在工程中添加類“.zzti.util.CookieUtil”來完成對Cookie的訪問,具體代碼如下。/** *從cookie數(shù)組中查詢鍵值為key的Cookie的value值 *@paramkey *@paramcookies *@return */ publicstaticStringgetValue(Stringkey,Cookie[]cookies){ if(cookies!=null){ for(Cookiecookie:cookies){ if(key!=null&&key.equals(cookie.getName())){ returncookie.getValue(); } } } returnnull; }3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:改寫“.zzti.servlet.IndexView”類的doPost方法,增加登錄判斷的相關(guān)代碼,具體實現(xiàn)如下。publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)2 throwsServletException,IOException{3request.setCharacterEncoding("gbk");4 Cookie[]cookies=request.getCookies();5 if(CookieUtil.getValue("username",cookies)==null){ 6 response.sendRedirect("LoginPageView?error="+URLEncoder.7 encode("尚未登錄","utf-8"));8 return;9 }10 Stringusername=CookieUtil.getValue("username",cookies);11 StringloginTime=CookieUtil.getValue("logintime",cookies);12 response.setContentType("text/html;charset=utf-8");13 PrintWriterout=response.getWriter();14 out.println("<!DOCTYPEHTML>");15 out.println("<HTML>");16 out.println("<HEAD><TITLE>We
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 零庫存供貨合同協(xié)議書
- 承攬合同轉(zhuǎn)讓協(xié)議書范本
- 平臺商家合同協(xié)議書
- 化妝團隊合作合同協(xié)議書
- 仔豬營養(yǎng)性貧血的癥狀和防治措施
- 酒店旅游行業(yè)智能化服務(wù)升級方案
- 裝修合同意向協(xié)議書范本
- 人類進化遺傳學(xué)的前沿研究綜述
- 工裝裝修合同保修協(xié)議書
- 解除勞動合同協(xié)議書休假
- 《寧靜住宅評價標準》
- 科目一考試英文題
- 2025新人教版七年級下冊英語Unit7知識點梳理及語法講義(教師版)
- 臨時活動咖啡機租賃合同
- 都江堰課件教學(xué)課件
- 《純電動汽車動力電池溫度管理系統(tǒng)優(yōu)化研究》
- 《吉他自學(xué)入門教程》課件
- 【MOOC】電磁場-山東大學(xué) 中國大學(xué)慕課MOOC答案
- 辦公用品、易耗品供貨服務(wù)方案
- 2024-2020年上海高考英語作文試題匯編 (解讀及范文)
- 小學(xué)數(shù)學(xué)跨學(xué)科學(xué)習的實踐挑戰(zhàn)及突破策略
評論
0/150
提交評論