1.常見軟件架構(gòu).
C/S: 客戶端 服務(wù)器 安全性較好,但是升級需要升級兩端
B/S: 瀏覽器 服務(wù)器 安全性較差, 但是升級時 只需要升級服務(wù)器端(我們今后就是開發(fā)這個架構(gòu)的)
2.資源分類:
靜態(tài)資源: 無論訪問多少次 內(nèi)容都不會發(fā)生變化. html .css .js .
動態(tài)資源: 訪問結(jié)果會發(fā)生變化. servlet,jsp . jsp就是servlet. php,asp.
3.常見服務(wù)器: tomcat
4.tomcat 會以下配置:
1.修改tomcat端口號
2.會配置虛擬目錄
3.會配置虛擬主機(jī)(了解)
5.HTTP協(xié)議
就是規(guī)范了 瀏覽器和服務(wù)器之間通信的規(guī)范(格式)
請求
請求首行
請求頭
請求空行
請求正文(只有post提交時正文才有內(nèi)容)
響應(yīng)
響應(yīng)首行
響應(yīng)頭
響應(yīng)空行
響應(yīng)正文
常見狀態(tài)碼:
HTTP/1.1 200 OK
200: 成功
404: 訪問的資源未找到
500: 服務(wù)器內(nèi)部錯誤(通常是開發(fā)人員的錯)
302: 重定向(兩次請求)
304: 緩存機(jī)制.
---------------------------------------------------------------------------------------------------------------------------------------
servlet ==> server applet
兩個動態(tài)資源之一(servlet,jsp).
是javaweb中 servlet技術(shù)中三大組件之一.
*servlet
*filter
*listener
如何來寫一個servlet呢?
找到servlet接口 去實(shí)現(xiàn),那么你這個類就是servlet.
實(shí)現(xiàn)servlet的方式:
*實(shí)現(xiàn)servlet接口
*繼承GenericServlet
*繼承HTTServlet
servlet中的生命周期方法:
1.init方法: servlet被創(chuàng)建之后會調(diào)用該方法. 但是在服務(wù)器運(yùn)行期間,一個servlet 只存在一個實(shí)例.所以通常來講,init方法只被調(diào)用一次(第一次訪問時).
作用: 可以在init方法中做一些資源初始化動作.例如: 建立數(shù)據(jù)庫連接.....
2.service方法: servlet真正處理請求,并返回響應(yīng)的方法. 其中提供兩個對象,servletRequest(封裝了請求信息,明天講) ,servletResponse(使用他可以添加響應(yīng)信息,明天講)
3.destory方法: 是在服務(wù)器關(guān)閉,要銷毀servlet之前,會調(diào)用該方法. 如果servlet中有一些資源需要釋放.那么在destory中操作.
以上3個方法就是servlet的生命周期方法.
servlet中的另外兩個方法:
4.getServletInfo : 沒用的方法,當(dāng)它不存在
5.getServletConfig方法: 獲得servletConfig對象
ServletConfig對象是干嘛的?
<servlet>
<servlet-name>CServlet</servlet-name>
<servlet-class>cn.itcast.servlet.generic.CServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>tom</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>CServlet</servlet-name>
<url-pattern>/CServlet</url-pattern>
</servlet-mapping>
4個方法:
getServletName ==> 返回web.xml中配置的servlet-name
getInitParameter(key); ==> 根據(jù)key獲得 init-param中配置的值
getInitParameterNames() ==> 返回一個類似于迭代器的枚舉,返回配置文件中所有init-param的key
getServletContext ==> 返回一個servletContext對象,這個對象下午講.
//優(yōu)化 ==> GennericServlet中的優(yōu)化
以前獲得ServletName需要這么調(diào)用 ==> this.getServletConfig().getServletName()==>優(yōu)化后 我想這么調(diào) ==> this.getServletName();
==>讓我們的servlet當(dāng)中含有該方法就可以==> 可以自己在servlet中去定義getServletName()方法,但是麻煩 ==> 直接讓我們的servlet實(shí)現(xiàn)servletConfig接口
==>config接口中的4個方法都有了.==> 怎么實(shí)現(xiàn)?直接使用init方法中傳遞過來的servletConfig的實(shí)現(xiàn)類來實(shí)現(xiàn)就可以 ==> init方法中我們要接受傳過來的servletConfig的實(shí)現(xiàn)類
==> 別人繼承我們GenericServlet的時候 不能再重寫init方法了. 我們就自己定一個空參的init方法.==> 別人如果想要初始化的動作,重寫我們給他準(zhǔn)備的無參init方法即可.
//===================================================================================================================================================
復(fù)習(xí)如何開發(fā)一個servlet
1.創(chuàng)建一個類,實(shí)現(xiàn)servlet接口
2.手動編譯這個類,將這個類放到WEB-INF/classes目錄下.(現(xiàn)在MyEclipse幫我們做了)
3.在web.xml中配置這個servlet,如下:
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>cn.itcast.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
4.把這個web項(xiàng)目部署到服務(wù)器(tomcat)上去.
servlet在服務(wù)器中的運(yùn)行流程(自己看圖)
//===============================================================================================================================================
HTTPServlet
1.幫我們把reqeust對象和response對象 進(jìn)行強(qiáng)轉(zhuǎn). ==> HTTPServletRequest HTTPServletResponse
2.根據(jù)請求方式不同調(diào)用不同的方法例如 POST ==> doPost 方法 GET ==> doGet方法
以后我們開發(fā) 全都繼承HTTPServlet就可以.
//-----------------------------------------------------------------------------------------------------------------------------------------------
Servlet中的一些細(xì)節(jié)
1.關(guān)于Servlet的線程安全問題
因?yàn)橐粋€servlet的實(shí)例在服務(wù)器中只存在一份. ==> 當(dāng)有多個請求訪問時,servlet線程將不安全.
如何規(guī)避線程安全問題呢? ===> 我們接受線程的信息時,將信息保存在方法的變量中,不要使用成員變量保存.
2.關(guān)于servlet中路徑配置問題
<!--
路徑配置分為兩種情況
路徑匹配
/DServlet ==> http://localhost:8080/Day10/DServlet
/ABC/DServlet ==> http://localhost:8080/Day10/ABC/DServlet
/ABC/BCD/DServlet ==> http://localhost:8080/Day10/ABC/BCD/DServlet
/ABC/* ==> http://localhost:8080/Day10/ABC/asdlkajsdlkjalsd
/ ==> 匹配所有路徑 http://localhost:8080/Day10/2139009123j/asd2klnasd
匹配優(yōu)先級: 路徑匹配中 ,匹配的范圍越廣,優(yōu)先級越低.
后綴名匹配
*.do ==> http://localhost:8080/Day10/213oiajsdoijoad.do
*.action ==> http://localhost:8080/Day10/lnasdljasdlkasljdasd.action
*.abc ==> http://localhost:8080/Day10/1039i09ixc0kasd.abc
這種路徑匹配在現(xiàn)在學(xué)習(xí)階段接觸不到. 在學(xué)到Filter 和struts2 的時候就用到了.
!!!!!!!注意: 以上兩種匹配方式不能同時使用
例如下面是絕對錯誤的:
/DServlet/*.do ==> 凡事路徑配置中以"/"開頭那么就說明含有路徑匹配.這種時候再使用*.do 這種后綴名匹配絕對報(bào)錯.
-->
3.(拓展)關(guān)于tomcat中web.xml的信息
1> defaultServlet 配置的路徑是 "/" ==> 所有跟我的路徑匹配不上的路徑都會走default.default主要干兩件事 1.找靜態(tài)資源 2.找不到靜態(tài)資源報(bào)錯.
2>session相關(guān)的配置 ==> 30 ==> 學(xué)session的時候就知道了
3>將所有MIME類型 都列舉出來了.
4>welcome list file ==> 默認(rèn)的歡迎資源.
4.我們知道servlet默認(rèn)創(chuàng)建實(shí)例的時機(jī)是什么時候? ==> 第一次請求該servlet時創(chuàng)建. ==> 如果我們這個servlet創(chuàng)建需要的時間比較久.我們想讓servlet隨著服務(wù)器的啟動而啟動
那么我們可以這樣做:
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>cn.itcast.servlet.AServlet</servlet-class>
<!-- 在啟動服務(wù)器時加載的意思
配置了該配置,那么這個servlet就會在服務(wù)器啟動時創(chuàng)建實(shí)例.
這個配置中填寫的內(nèi)容是整數(shù) 最小可以填0.
數(shù)字越小 啟動優(yōu)先級越高. 所以0 表示優(yōu)先級高.
如果兩個數(shù)字大小相同,優(yōu)先級按照配置順序,誰先配置 誰先創(chuàng)建.
-->
<load-on-startup></load-on-startup>
</servlet>
//------------------------------------------------------------------------------------------------------------------------------------------------------------
ServletContext對象
介紹
1.這個對象代表著咱們的整個項(xiàng)目.==> 這個對象在一個項(xiàng)目中只存在一個實(shí)例.
2.啟動項(xiàng)目的時候會自動創(chuàng)建. 關(guān)閉服務(wù)器的時候會銷毀該實(shí)例.
3.該對象如何獲取呢? ==> servletConfig 中 有一個方法叫做 getServletContext方法 來獲得.
功能
一:可以獲得項(xiàng)目中的一些配置(web.xml)
getInitParameter(String name) 根據(jù)鍵獲得值
getInitParameterNames() 獲得所有鍵
上面這兩個方法名字與servletConfig中的一模一樣.但是獲得的配置信息是
<context-param>
<param-name>userName</param-name>
<param-value>tom</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</context-param>
二:作為我們servlet技術(shù)中 三大域?qū)ο笾? 如果包含jsp的話,其實(shí)有4大域 page域.
application ==> servletContext
session
request
域?qū)ο笊婕暗?個方法
getAttribute(key) 根據(jù)鍵獲得值
setAttribute(key,value) 往application域中的map 存放一個鍵值對
removeAttribute(key) 從application域中的map 刪除一個鍵值對
getAttributeNames(); 從application域中的map 獲得所有的鍵
三:可以獲取項(xiàng)目中的資源.(例如獲得項(xiàng)目中存放學(xué)生的stu.xml)
//想對WEB-INF/Demo.xml進(jìn)行操作.我們要先讀取出該文件
//如何來讀取呢?
//File file = new File("E:/代碼/Workspaces0808/Day10-servlet/WebRoot/WEB-INF/demo.xml");
//上面獲得demo.xml填寫的路徑顯然是不對的.獲得的是工程下的而我們要獲得最終部署到服務(wù)器上的.
//File file = new File("E:/apache-tomcat-6.0.35/webapps/Day10-servlet/WEB-INF/demo.xml");
//上面這種獲得方式就對了.但是 如果把項(xiàng)目再部署到其他地方,那上面這個寫死的路徑就無效了.
//這樣類似獲得外部資源的例子很多,所以servletContext對象給出了解決辦法.
//getRealPath("/") ==> 獲得絕對路徑 ,根據(jù)參數(shù)中的相對路徑獲得. "/"相對于WebRoot
//getResourceAsStream("/"); ==>直接獲得 想要找的資源的流 . 參數(shù)還是填相對路徑,同上
例子:
String path = getServletContext().getRealPath("/WEB-INF/demo.xml");
System.out.println(path);
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/demo.xml");
System.out.println(is);
//---------------------------------------------------------------------------------------------------------------------------------------
使用Class和ClassLoader 獲得項(xiàng)目中的資源路徑
//web-inf下的
String path1 = getServletContext().getRealPath("/WEB-INF/demo.xml");
//lib下的
String path2 = getServletContext().getRealPath("/WEB-INF/lib/demo.xml");
//src下的
String path3 = getServletContext().getRealPath("/WEB-INF/classes/demo.xml");
//cn.itcast.servlet.servlet_context包下的
String path4 = getServletContext().getRealPath("/WEB-INF/classes/cn/itcast/servlet/servlet_context/demo.xml");
//其實(shí)上面例子中path3 和 path4 這兩種方式 有些麻煩
//在介紹一種獲得資源的方式,是對.class ==> Class 和 classLoader的應(yīng)用
InputStream is = this.getClass().getResourceAsStream("demo.xml"); // 如果不加"/"==> 相對的是類的當(dāng)前(包)目錄
InputStream is2 = this.getClass().getResourceAsStream("/demo.xml");//如果加了"/" ==> "/"就代表classes目錄(src)
//在說下classLoader 下也有方法 classLoader 就是類的加載器. ==> 專門來讀取class文件的輸入流
//也提供了讀取其他文件的方法.(使用classLoader不要讀取較大的文件)
// this.getClass().getClassLoader() ==> 獲得類的加載器
InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("/demo.xml");// 不論加不加"/",都相對于 classes目錄,跟class中加"/" 的相對路徑是一樣的.
//使用class或classLoader 也可以獲得文件的絕對路徑
URL url = this.getClass().getResource("demo.xml");
System.out.println(url.getPath());
作業(yè):
寫一個servlet, 實(shí)現(xiàn)訪問次數(shù)統(tǒng)計(jì)的功能.
例如:第一次訪問這個servlet時, 給用戶顯示您是第一訪問
第2次訪問時顯示 您是第2次訪問 ........以此類推.
其他servlet也要參與統(tǒng)計(jì).(servletContext 中 域的應(yīng)用)
當(dāng)前文章:動態(tài)頁面servlet
分享鏈接:http://www.rwnh.cn/article20/cpgpjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、企業(yè)網(wǎng)站制作、品牌網(wǎng)站建設(shè)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)