Servlet(自己实现的Servlet)细节
Java中無狀態(tài)的對象就是指某種沒用任何屬性的僅僅由方法組成的對象。
*無狀態(tài):無狀態(tài)方法的好處之一,就是在各種環(huán)境下,都可以安全調(diào)用。衡量一個方法
是否有狀態(tài)的,就看它是否改動了其他東西。
*有狀態(tài):有狀態(tài)的Java對象的狀態(tài)用屬性來表示,有屬性,也就是有對象的變量,就表
示是有狀態(tài)的,有狀態(tài)就是線程不安全的。
關(guān)于線程安全:
1)常量始終是線程安全的,因為只存在讀操作。
2)每次調(diào)用方法前都新建一個實例是線程安全的,因為不會訪問共享的資源。
3)局部變量是線程安全的。因為每執(zhí)行一個方法,都會在獨立的空間創(chuàng)建局部變量,它
不是共享資源,局部變量包括方法的參數(shù)變量和方法內(nèi)變量。
?
*不要在Servlet中創(chuàng)建成員!創(chuàng)建局部變量即可!(初級的人)
1 XXServlet extends HttpServlet{//不要在這些地方創(chuàng)建成員(方法和屬性) 2 doGet(){ 3 String str="xxx";//局部變量 4 ... 5 } 6 }
?
*可以創(chuàng)建無狀態(tài)成員!(入門了的人)
1 public User{ 2 //里面無屬性,只有方法 3 public void fun(){ 4 System.out.println("hahahaha"); 5 } 6 }?
1 public XXServlet extends HttpServlet{ 2 //類的成員 3 private User user;//該引用類中只存在方法,即無狀態(tài)的成員 4 5 doGet(){...} 6 }?
*可以創(chuàng)建有狀態(tài)的成員,但狀態(tài)必須為只讀的!(熟練之后的人)
1 public User{//只有讀的方法,沒用寫的方法 2 private String name; 3 private int age; 4 5 public String getName(){ 6 return this.name; 7 } 8 public int getAge(){ 9 return this.age; 10 } 11 }1.Servlet與線程安全
因為一個類型的Servlet只有一個實例對象,那么就有可能會出現(xiàn)一個Servlet同時處理多個請求,那么Servlet “不是線程安全的” 。這說明Servlet的工作效率很高,但是存在線程安全問題!
所以我們不應(yīng)該在Servlet中隨便創(chuàng)建成員變量,因為可能會存在一個線程對這個成員變量進行寫操作,另一個線程對這個成員變量進行讀操作。
2.讓服務(wù)器在啟動時就創(chuàng)建Servlet
默認情況下,服務(wù)器會在某個Servlet第一次收到請求時創(chuàng)建它。也可以在web.xml中對Servlet進行配置,使服務(wù)器啟動時就創(chuàng)建Servlet。
1 <servlet> 2 <servlet-name>FServlet</servlet-name> 3 <servlet-class>one.servlet.FServlet</servlet-class> 4 <load-on-startup>0</load-on-startup> 5 </servlet> 6 7 <servlet-mapping> 8 <servlet-name>FServlet</servlet-name> 9 <url-pattern>/FServlet</url-pattern> 10 </servlet-mapping>在<servlet>中配置<load-on-startup>,其中給出一個一個非負整數(shù)!是servlet的創(chuàng)建順序(從小到大)。
3.<url-pattern>? -->url的模式(我自己的理解)
<url-pattern>是<servlet-mapping>的子元素,用來指定Servlet的訪問路徑,即URL。它必須是以 “/”開頭!!!
1)可以在<servlet-mapping>中給出多個<url-pattern>,例如:
1 <servlet-mapping> 2 <servlet-name>AServlet</servlet-name> 3 <url-mapping>/AServlet</url-mapping> 4 <url-mapping>/BServlet</url-mapping> 5 </servlet-mapping>那么這說明一個Servlet綁定了兩個URL,無論訪問/AServlet還是/BServlet,訪問的都是AServlet。
?
2)還可以在<url-pattern>中使用通配符,所謂通配符就是星號 “*” ,星號可以匹配任何URL前綴或后綴,使用通配符可以命名一個Servlet綁定一組URL,例如:
##<url-pattern>/servlet/*<url-pattern> : /servlet/a,/servlet/b,都能匹配/servlet/*綁定的Servlet;(路徑匹配)
##<url-pattern>*.do<url-pattern> : /abc/def/ghi.do? , /a.do ,都匹配*.do;(擴展名匹配)
##<url-pattern>/*</url-pattern> : 匹配所有URL;
請注意,通配符要么為前綴,要么為后綴,不能出現(xiàn)在URL中間的位置,也不能只有通配符。
?通配符是一種模糊匹配URL的方式,如果存在更具體的<url-pattern>,那么訪問路徑會去匹配具體的<url-pattern>。
?
4.web.xml文件的繼承(了解)
每個完整的JavaWeb應(yīng)用中都需要有web.xml,但我們不知道所有的web.xml文件都有一個公同的父文件,它在Tomcat的config/web.xml路徑。
1 <servlet> 2 <servlet-name>default</servlet-name>//它的優(yōu)先級最低,如果一個請求沒有人處理,那么它來處理!它顯示404。 3 <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 4 <init-param> 5 <param-name>debug</param-name> 6 <param-value>0</param-value> 7 </init-param> 8 <init-param> 9 <param-name>listings</param-name> 10 <param-value>false</param-value> 11 </init-param> 12 <load-on-startup>1</load-on-startup> 13 </servlet> 14 //------------------------------------------------------------ 15 16 <servlet-mapping> 17 <servlet-name>default</servlet-name> 18 <url-pattern>/</url-pattern> 19 </servlet-mapping> 20 //什么情況下會訪問DefaultServlet?? 21 //當訪問路徑不存在時,會執(zhí)行該Servlet!其實我們在訪問index.html時也是在執(zhí)行這個Servlet。?
?
1 <servlet> 2 <servlet-name>jsp</servlet-name> 3 <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 4 <init-param> 5 <param-name>fork</param-name> 6 <param-value>false</param-value> 7 </init-param> 8 <init-param> 9 <param-name>xpoweredBy</param-name> 10 <param-value>false</param-value> 11 </init-param> 12 <load-on-startup>3</load-on-startup> 13 </servlet> 14 //========================================= 15 16 <servlet-mapping> 17 <servlet-name>jsp</servlet-name> 18 <url-pattern>*.jsp</url-pattern> 19 <url-pattern>*.jspx</url-pattern> 20 </servlet-mapping> 21 //可以通過擴展名.jsp或.jspx來訪問JspServlet例如:請求http://localhost:8080/XJS_Servlet1/index.jsp? ,然后是請求的一個JspServlet,這個JspServlet把動態(tài)資源轉(zhuǎn)換成靜態(tài)資源,然后通過response響應(yīng)------得到的是一個html頁面。
?
5.Servlet與反射
就是在<servlet-class>全類名</servlet-class> 利用反射得到該類(Servlet)的信息,創(chuàng)建該類的實例以及其他信息 --->是Tomcat來完成的
轉(zhuǎn)載于:https://www.cnblogs.com/xjs1874704478/p/10761299.html
總結(jié)
以上是生活随笔為你收集整理的Servlet(自己实现的Servlet)细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习/梯度下降算法
- 下一篇: 一 Struts2 开发流程