Servletsic管理方案.ppt_第1頁
Servletsic管理方案.ppt_第2頁
Servletsic管理方案.ppt_第3頁
Servletsic管理方案.ppt_第4頁
Servletsic管理方案.ppt_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、,Servlets 項目部 盧劍宇 ,Servlet基本概念,Servlet,服務(wù)器端的小程序,它是相對于Applet而言的,Applet是客戶端小程序。Servlet和CGI都是運行在Web服務(wù)器上,用來生成Web頁面。 Servlet,是接受來自網(wǎng)絡(luò)的請求(form表單,以及其他的請求),并對不同請求作出不同的響應(yīng)。 Servlet,是基于Http協(xié)議的,是運行在web服務(wù)器中的程序。,Servlet是運行在web容器中,這個web容器可以控制Servlet對象的生命周期,控制請求由Servlet對象處理。 web服務(wù)器,這里的服務(wù)器不是硬件概念,而是軟件,常用的web服務(wù)器有 Tomca

2、t,Jboss等,我們所用到的Tomcat是一個開源的服務(wù)器,Tomcat是一個用java語言編寫的web服務(wù)器,所以需要有相應(yīng)的java運行環(huán)境,也就是JVM,還要配置tomcat的具體路徑。,Servlet環(huán)境配置,JAVA_HOME=/XXX/XXX/(JDK路徑,bin的上一層目錄) CATALINA_HOME=/XXXX/XXX(tomcat的絕對路徑 windows中 X:xxxxxx),Tomcat使用,在啟動Tomcat時,是運行Tomcat的bin目錄下的startup.sh(windows中使用startup.bat) Linux中要顯示后臺的具體信息, 則用catalin

3、a.sh run 代替startup.sh命令。 判斷Tomcat是否啟動成功,可以在瀏覽器的地址欄中使用http:/localhost:8080/或:8080/可以訪問到tomcat的主頁就表示啟動成功。要想停止tomcat服務(wù)器,可使用shutdown.sh(windows中使用shutdown.bat),如果直接關(guān)閉啟動窗口,就會造成8080端口占用錯誤,這時可以再使用shutdown.sh關(guān)閉一下服務(wù)器。,Servlet開發(fā)步驟,編寫servlet源代碼,注意servlet的結(jié)構(gòu)。 編譯servlet,需要servlet-api.jar文件(位于$Tomc

4、atcommonlib目錄下;加入classpath環(huán)境變量中) 部署servlet 編寫配置文件web.xml:其中包括servlet burl與servlet name的映射,以及servlet name 與servlet class name的映射。,構(gòu)造web應(yīng)用程序目錄結(jié)構(gòu)如下: MyWebApp 應(yīng)用程序名 WEB-INF classes lib *.html/*.jsp 配置文件web.xml放在WEB-INF目錄下 servlet類文件放在classes目錄下 將整個應(yīng)用程序目錄拷貝到$Tomcatwebapps目錄下,使用此結(jié)構(gòu)的優(yōu)點,一個Web容器中可以共存多個Web應(yīng)用程

5、序。 Web容器知道該到何處尋找裝入Web應(yīng)用程序所需的類。,web.xml文件的寫法, IpLogServlet tarena.servlet.lc.IpLogServlet filename /getServletConfig().getInitParameter(); c:/iplog.txt 2 /在服務(wù)器啟動的時候就創(chuàng)建該servlet實例, 必須是正數(shù),小的數(shù)先創(chuàng)建 IpLogServlet /要和servlet標(biāo)簽中的相同 /lc/iplog /指定servlet相對于應(yīng)用目錄的虛擬路徑 /xxx/xxx(絕對路徑),xxx(相對路徑) ,測試應(yīng)用,在tomcat服務(wù)器中,訪問應(yīng)

6、用下的資源可以在端口號后加上web應(yīng)用文件夾得名字就可以看到資源 http:/localhost:8080/應(yīng)用文件夾名/url-pattern,靜態(tài)頁面只能放在web應(yīng)用的文件夾下,不能夠放在WEB-INF文件夾下,WEB-INF文件夾中的資源是受保護的,不能夠通過網(wǎng)絡(luò)訪問到。,Servlet的調(diào)用過程,用戶通過瀏覽器向web服務(wù)器發(fā)送請求http:/serverip:port/appname 服務(wù)器為用戶定位資源 靜態(tài)資源:/a.html /a/b.html (這里的路徑是針對web應(yīng)用文件夾目錄)讀文件并把內(nèi)容發(fā)送到客戶端。 動態(tài)資源:解析web.xml定位Servlet類的名字。 裝載

7、類(WEB-INF/classes | WEB-INF/lib/*.jar) 創(chuàng)建該對象的實例 Servlet ser=(Servlet)(Class.forName(“servle的類名).newInstance(); /我們寫的Servlet一定要實現(xiàn)Servlet接口或者繼承實現(xiàn)了Servlet接口的類 ser.service(request,response);,用Servlet處理表單數(shù)據(jù),FORM元素的屬性 action: 用來指定要處理FORM數(shù)據(jù)的Servlet的URL method: 指定數(shù)據(jù)傳送給HTTP服務(wù)器的方法 解析請求 getParameterNames:可以獲得一

8、個迭代器Enumeration,通過這個迭代器,來獲得form表單中參數(shù)的名字。 getParameter: 返回表單中參數(shù)名(區(qū)分大小寫)對應(yīng)的值(沒有這樣的參數(shù),返回null; 沒有任何值,返回空String);多參數(shù)同名時,只取一個。 getParametervalues: 返回表單中參數(shù)名(區(qū)分大小寫)對應(yīng)的字符串?dāng)?shù)組(沒有這樣的參數(shù),返回null;只有一個值,返回值為單一元素組);,get ,init方法實例,覆蓋init(ServletConfig conf)方法時,應(yīng)該總是在首行調(diào)用super.init(); 或者直接覆蓋init(); init方法接受ServletConfig

9、作為參數(shù), 用以下方法獲得參數(shù)值: getInitParameter: 返回指定參數(shù)名稱對應(yīng)的值,如果參數(shù)不存在,返回null; getInitParameterNames: 返回所有初始化參數(shù)的名字 ;,service方法,每當(dāng)服務(wù)器接收到對Servlet的請求時,服務(wù)器就會產(chǎn)生一個新線程, 并調(diào)用service。service方法檢查HTTP請求類型,并相應(yīng)地調(diào)用doGet、doPost、doPut、doDelete。 被container調(diào)用去響應(yīng)(ServletResponse)來自客戶端的請求(ServletRequest);,Servlets的多線程安全,多線程占用資源少,處理速度

10、快,提高了效率。 一些編碼建議: 對變量和方法定義適當(dāng)?shù)脑L問方式, 例如單純?nèi)≈挡僮鞑粫卸嗑€程安全問題; 同步化所有訪問重要數(shù)據(jù)的實例變量; 多線程下,如果操作的是一個變量,且兼有讀寫操作,就要考慮加上同步,但同步不能亂加,否則會造成死鎖問題。,并發(fā)需要注意的,并發(fā)的環(huán)境:資源處于一個并發(fā)的環(huán)境 共享資源:多個線程共享一個臨界資源 全面同步:如有n個變量訪問同一個資源,這n個變量都得同步。即多個鎖一把鑰匙,鑰匙放在一個共享區(qū)域內(nèi) sychronized(this):粗粒度的鎖。是將所有的路都加鎖; sychronized(object o1):細粒度的鎖。只對對象中的變量加鎖。效率較前面的高

11、,但是較難控制。 讀寫需要互斥。 sychronized(this):this不能是基本數(shù)據(jù)類型,必須是Object.不鎖對象的引用,而是對象的內(nèi)存空間。 servlet中需要同步的:成員變量、文件、靜態(tài)變量、數(shù)據(jù)庫連接,destroy方法,服務(wù)器決定刪除已經(jīng)加載的Servlet實例之前將調(diào)用Servlet的destroy方法; 該方法允許Servlet: 關(guān)閉數(shù)據(jù)庫連接; 中止后臺線程; 將Cookie程序清單或訪問計數(shù)寫到磁盤以及執(zhí)行其他類似的收尾工作。,在Servlet終止時處理Service線程,在destroy()方法中:如有服務(wù)(通過一個同步化的實例方法取得當(dāng)前線程數(shù)大于0),則置

12、關(guān)閉狀態(tài)為false(通過一個同步化的實例方法實現(xiàn))。然后循環(huán)等待服務(wù)線程數(shù)為0,則置關(guān)閉狀態(tài)為true. 在Service()方法中: 如見關(guān)閉狀態(tài)為true,便不執(zhí)行具體邏輯方法,直接退出。,HTTP servlet類的基本結(jié)構(gòu),繼承HttpServlet 實現(xiàn)至少一個service方法,如:doGet(.)和doPost(.) service方法有兩個參數(shù),HttpServletRequest 和 HttpServletResponse: HttpServletRequest代表經(jīng)過容器加工的用戶的請求 HttpServletResponse代表需要容器進一步加工的對用戶的響應(yīng) 我們寫的

13、servlet需要引入javax.servlet.* 和 javax.servlet.http.* 兩個命名空間,servlet繼承關(guān)系,servlet主要數(shù)據(jù)結(jié)構(gòu): Servlet 接口:主要定義了servlet的生命周期方法 ServletConfig接口:為servlet提供了使用容器服務(wù)的若干重要對象和方法。 ServletContext接口:是Servlet的上下文對象,這個對象是在服務(wù)器啟動時創(chuàng)建的,為servlet提供了使用容器服務(wù)的若干重要方法。 GenericServlet抽象類:為servlet提供了一般的實現(xiàn)(包括實現(xiàn)了servlet和ServletConfig兩個接口)

14、,保存了容器通過init方法傳遞給servlet的一個ServletConfig類型的重要對象。 HttpServlet抽象類:為處理http請求的servlet提供了一般實現(xiàn),主要是定義和實現(xiàn)了若干service方法。 繼承關(guān)系:GenericServlet繼承了Servlet和ServletConfig接口;HttpServlet繼承了GenericServlet;我們寫的servlet繼承了HttpServlet,Servlet訪問DB(一個servlet完成整個功能),獲取client端信息 調(diào)用相應(yīng)的處理方法 連接數(shù)據(jù)庫,操作信息數(shù)據(jù) 返回給client端相應(yīng)的結(jié)果頁面,util,b

15、iz,entity,view,controller,model,將一個servlet按功能細分,將一個完成所有功能的servlet分解成多個,分別完成自己的功能,即形成了mvc。,MVC框架 (組件的各司其職),Model,模型層(封裝數(shù)據(jù) ),這一層一般是進行數(shù)據(jù)庫訪問,并且封裝對象,這一層中也存放在訪問數(shù)據(jù)庫取出信息封裝成對象的類,也就是實體類的信息,可以使用JDBC或者Hibernate實現(xiàn)這一層的功能。 Ctrl,控制層(改變數(shù)據(jù),改變模型的狀態(tài) ),用來相應(yīng)請求和調(diào)用寫好的相應(yīng)的訪問數(shù)據(jù)庫的方法,這一層是用來控制請求的響應(yīng)的,現(xiàn)在我們是使用Servlet來實現(xiàn)這一層,不過一般是會用開

16、源的MVC框架來實現(xiàn)這層,例如struts,或者是Spring的MVC框架。 View,表現(xiàn)層(顯示數(shù)據(jù)和收集數(shù)據(jù)),收集數(shù)據(jù)的一般是form表單,不過要保證數(shù)據(jù)的正確性要是用JavaScript驗證信息,以后我們會學(xué)到的JSP(java server page)就是用來表現(xiàn)、顯示數(shù)據(jù)的。,Servlet之間的怎么互相調(diào)用,在上述基礎(chǔ)上需要解決servlet之間的調(diào)用:可以利用servletContext解決每一個servlet都可能和上下文交互,則每個servlet中都應(yīng)該保存一個servletContext對象,去訪問整個應(yīng)用的上下文, 步驟如下: getServletContext():

17、application application.getRequestDispatcher(“/res/students/list”):dispatcher dispatcher.forward(request,response) 每個JVM中的每一個應(yīng)用程序里都存在一個上下文 servletContext在servletConfig的對象中; ServletContext.getRequestDispatcher(String path):返回一個RequestDispatcher 通過RequestDispatcher的forward()或include()方法傳送請求。,如何在一個serv

18、let中調(diào)用另外一個servlet:,ServletContext類的getRequestDispatcher(String path)方法獲得一個RequestDispatcher對象,并且跳轉(zhuǎn)到指定的Servlet,getRequestDispatcher(String path)方法中的參數(shù)就是path,就是指定跳轉(zhuǎn)的Servlet的url-pattern。 RequestDispatcher類的forward(ServletRequest request, ServletResponse response) 方法,可以把請求對象轉(zhuǎn)發(fā)給其他的Servlet。,在多個servlet中傳遞信

19、息:,HttpServletRequest對象中的方法setAttribute(String name,Object o),可以使用HttpServletRequest對象來攜帶信息,并且可以通過getAttribute(String name)方法來獲得攜帶的信息,這兩個方法類似于map中的存取方法,setAttribute方法給數(shù)據(jù)加上標(biāo)識,getAttribute方法則是通過這個標(biāo)識來獲取數(shù)據(jù),可以使用這一對方法的前提就是要保證是同一個請求對象(HttpServletRequest),轉(zhuǎn)發(fā)請求至新的資源,request dispatcher的二種傳送請求方式 Forward: 將請求從一

20、個servlet傳到服務(wù)器上的其他資源(servlet、JSP、HTML); Include: 將靜態(tài)或動態(tài)內(nèi)容包含在當(dāng)前servlet中; 獲得request dispatcher的二種方式: ServletRequest.getRequestDispatcher() / 相對路徑 ServletContext.getRequestDispatcher() / 絕對路徑 Response.sendRedirect(/servapp/state/login);/要寫絕對路徑,產(chǎn)生新的請求, Forward(req,resp);/在當(dāng)前路徑基礎(chǔ)上跳轉(zhuǎn) 兩個頁面之間跳轉(zhuǎn)的時侯如果需要數(shù)據(jù)傳遞,則只

21、能用forward();因為sendRedirect()會產(chǎn)生一個新的請求。,servlet中使用數(shù)據(jù)源訪問數(shù)據(jù)庫,在服務(wù)器中配置數(shù)據(jù)源(使用admin管理界面) 再servlet中使用JNDI語法獲取數(shù)據(jù)源 Context context = new InitalContext(); DataSource ds =(DataSource) context.lookup(java:comp/env/+dsName); Connection con = ds.getConnection(); 新建一個配置文件myapp.xml(假設(shè)web應(yīng)用程序名稱為:myapp),將xml文件的頭部和一對標(biāo)簽

22、寫入該文件,將server.xml中有關(guān)數(shù)據(jù)源配置的標(biāo)簽內(nèi)容拷貝到myapp.xml中的標(biāo)簽之間。server.xml位于$tomcatconf文件夾下,myapp.xml放在$tomcatconfcatalinalocalhost文件夾下。,數(shù)據(jù)源配置Server.xml,會話管理,為什么要使用session? 一般來講,從同一客戶打開瀏覽器連接到服務(wù)再到客戶關(guān)閉瀏覽器可稱為一次會話(中間瀏覽器可以打開多個窗口) 通信協(xié)議分為有狀態(tài)和無狀態(tài)兩種。Http協(xié)議是一種無狀態(tài)協(xié)議。一個客戶向服務(wù)器發(fā)出請求然后服務(wù)器返回響應(yīng),連接就被關(guān)閉了。在服務(wù)器端不保留連接的有關(guān)信息因此當(dāng)下一次連接建立時,服務(wù)

23、器已沒有以前連接的信息了,無法判斷這一次連接和以前的連接是不是屬于同一客戶發(fā)出的。在實際應(yīng)用中,客戶進行一個事務(wù)性的操作可能需要對服務(wù)器進行好幾次連接,這時維護前幾次連接的狀態(tài)就非常重要。 服務(wù)器必須能夠區(qū)分不同的客戶,而且還要有為每一個客戶存儲數(shù)據(jù)的方法。,session實現(xiàn)的三種方法,Cookie URL Rewriting 隱藏表單域,使用java servlet API進行會話管理(session),java servlet API 主要提供了兩個與會話相關(guān)的類和接口:Cookie和HttpSession,Cookie,控制機制: Browser-request- Web server

24、 Web server-request+info- Browser Browser-request+info- Web server(客戶端帶信息來再次訪問其標(biāo)志的資源),詳細解釋 Cookie是一小塊可以嵌入到Http請求和相應(yīng)中的數(shù)據(jù)。它在服務(wù)器端產(chǎn)生,并作為響應(yīng)頭域的一部分返回用戶。瀏覽器收到包含Cookie的響應(yīng)后,會把Cookie的內(nèi)容用key-value對的形式寫入到一個客戶端專門存放Cookie的文本文件中(c:/documents and setting/$user/Cookies)。瀏覽器會把Cookie及隨后產(chǎn)生的請求發(fā)給相同的服務(wù)器,服務(wù)器可以再次讀取Cookie中存放的

25、數(shù)據(jù)。 Cookie可以進行有效期的設(shè)置,過期的Cookie不會發(fā)送給服務(wù)器。,Cookie的用法: 獲取Cookies:Cookie all = request.getCookies(); 獲取Cookies名字:Cookiei.getName(); 獲取Cookies的值:Cookiei.getValue(); 為Cookies設(shè)置新值:Cookiei.setValue(); 設(shè)置Cookie保存的最大期限:Cookiei.setMaxAge (intexpiry);毫秒,以cookie實現(xiàn)的session的流程:,Browser訪問 Web server- Web server分給用戶一個jsessionId并返回給用戶保存在本地,同時將jsessionId保存在session中-用戶再次訪問本W(wǎng)eb server時帶著jsessionId來訪問- Web server根據(jù)用戶傳過來的jsessionId跟session中的jsessionId比較,如果有相同的,就將這個jsessionId對應(yīng)的session返回給用戶,這樣用戶可以看到上一次的訪問信息。,HttpSession,javax.servlet.http.HttpSession接口封裝了HTTP會話的細節(jié),該會話與一段時間

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論