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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、atcommonlib目錄下;加入classpath環(huán)境變量中) 部署servlet 編寫(xiě)配置文件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類(lèi)文件放在classes目錄下 將整個(gè)應(yīng)用程序目錄拷貝到$Tomcatwebapps目錄下,使用此結(jié)構(gòu)的優(yōu)點(diǎn),一個(gè)Web容器中可以共存多個(gè)Web應(yīng)用程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論