“大嘴”馬斯克屢遭批評,但模糊的法規難以阻止其“開拓”市場
//在idea中修改了Servlet中的程式碼之後,需重啟伺服器,輸出的才是修改之後的結果;不重啟,輸入相同的網址,結果依然是修改之前的
//通過網址,即url-pattern訪問其對應的Servlet實現類,伺服器會自動呼叫該實現類的service方法,不會呼叫執行其他的,若當前Servlet沒有service()方法,則執行其父類的service()方法
ServletConfig介面
<servlet>
<servlet-name>SomeServlet</servlet-name>
<servlet-class>com.dh.SomeServlet</servlet-class>
<load-on-startup>2</load-on-startup>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
......
</servlet>
//該介面封裝的就是web.xml配置檔案中的以上部分,該介面的物件就可對<servlet>標籤中的元素進行操作
ServletContext介面
<web-app>
<context-param>
<param-name>name</param-name>
<param-value>pz</param-value>
</context-param>
</web-app>
//一個webapp中只能有一個ServletContext物件,該物件在伺服器啟動階段被例項化,在伺服器關閉時被銷燬,所有的Servlet物件共享一個ServletCongtext物件,其可以實現跨使用者傳遞資料。該物件中的資料不建議修改,可能有執行緒安全問題。以上部分就是該物件儲存的資料在web.xml檔案中的展示
HttpServletRequest介面
//HttpServletRequst介面的物件封裝的是HTTP的請求協議(包含請求行,請求報頭,空白行,請求主體)中的全部資訊;
//一般其變數名為request。HttpServletRequest物件代表一次請求,一次請求對應一個request物件,一百個請求代表一百個request物件。
//request物件中的資料是以Map集合的方式儲存的,Map<String,String[]>,其value值是一個一維陣列。
//ServletRequest是其父介面
常用方法1(獲取表單中的資料)
-
//通過key獲得value代表的一維陣列中的首元素
String getParameter(String name)
-
//通過key獲得該一維陣列中的所有值
String getParamterValues(String name)
-
//獲取整個map集合
Map getParemterMap()
-
//獲取map集合中所有的key
Enumeration getParemterNames()
常用方法2
-
//獲取上下文路徑,即webapp的根路徑
String getContextPath()
-
//獲取瀏覽器的請求方式
String getMethod()
-
//獲取URI
String getRequestURI()
-
//獲取URL
StringBuffer getRequestURL()
-
//獲取servlet path,即url-pattern
String getServletPath()
-
//獲得客戶端的IP地址,即訪問者的IP
String getRemoteAddr()
常用方法3
-
//在request範圍內儲存資料
void setAttribute(String name,Object o)
-
//從request範圍內取出資料
Object getAttribute(String name)
-
//移除request範圍中的資料
void removeAttribute(String name)
//ServletContext和HttpServletRequest介面中都有以上3個方法,區別只在於作用範圍不一樣。一個是應用範圍的,一個是請求範圍,ServletContext可以跨使用者傳遞資料,ServletReqest不能跨使用者,但可以跨Servlet
//getAttribute()方法只能取出setAttribute()存進去的資料;getParameter(String name)取出的是表單中的資料
常用方法4(跳轉)
-
//獲得請求轉發器
RequestDispatcher getRquestDispatcher(String path)
-
//呼叫轉發器的forward方法
轉發器物件.forward(request,response)
-
//重定向(位址列會發生改變)
response.sendRedirect(request.getContextPath() + String path)
//路徑要比forward多一個應用名
//從一個Servlet重定向到另一個Servlet是以get請求的方式,後面一個Servlet必須重寫doGet方法才可以,若是重寫doPost方法,則系統報錯
解決字元在傳遞過程中的亂碼問題
//以上是兩種方式:一種是專門針對post請求的,一種是萬能的,那種請求都可以;而專門針對get請求的需要修改
Tomcat/conf/sever.xml檔案,以上不展示
Cookie
//Cookie是用來儲存會話狀態,儲存在瀏覽器中的
//但Cookie是由伺服器建立的,而非瀏覽器
常用方法
-
//在java中建立Cookie
Cookie c=new Cookie(String name,String value)
-
//繫結傳送給伺服器的路徑
c.setPath(String path)
//path為相對路徑,如:/myweb/xxx,參照路徑為web伺服器的根路徑,即http://localhost:8080/
//不繫結,預設情況下,若<url-pattern>為:myweb/a/b,則會預設與a/繫結,只要有這個路徑,就會把Cookie傳送給伺服器
-
//設定Cookie的有效時長
c.setMaxAge(60*60) //1小時有效
//Cookie的有效時長=0 :直接刪除,相當於時間到了,失效
//Cookie的有效時長>0 :不會被儲存
//Cookie的有效時長<0 :儲存在瀏覽器的硬碟檔案中
//若沒有設定有效時長,則Cookie會被存在瀏覽器的快取中,該瀏覽器一關閉,Cookie就失效
-
//將Cookie物件傳給瀏覽器
response.addCookie(c)
-
//伺服器中獲取瀏覽器提交的Cookie
Cookie[] cookies=request.getCookie()
//當Cookies的值為null時,證明瀏覽器沒有提交Cookie
HttpSession介面
Session原理
1.開啟瀏覽器,在瀏覽器上傳送第一次請求給伺服器
2.伺服器會建立一個session物件,該物件代表一次會話
3.同時會生成該session物件對應的Cookie物件,並且Cookie物件的name為 JSESSIONID,value是32位長度的字串(全球唯一性)
4.伺服器會建立一個session列表(底層是Map集合),Map集合的key是Cookie的value,Map的value是session物件,將兩者繫結在一起
5.最後伺服器再將完整的Cookie傳送給瀏覽器
6.瀏覽器將Cookie儲存在快取中(除非設定Cookie的有效時長,才能將其儲存在瀏覽器的硬碟中)
7.瀏覽器不關閉,該Cookie不會消失
8.當再次傳送請求時,會自動提交快取中的Cookie
9.伺服器接收到Cookie,驗證到該Cookie的name為JSESSIONID,則知道這個Cookie是來找session物件的,然後獲取該Cookie的value值
10.通過Cookie的value值去session列表中檢索對應的session物件
常用方法1
-
//獲取當前會話的Session物件
HttpSession s=request.getSession();
-
//向Session物件中儲存資料
s.setAttribure(String name,Object value);
-
//從會話範圍中取出資料
Object o = s.getAttribute(String name);
-
//刪除會話範圍中的資料
void removeAttribute(String name)
-
//銷燬Session物件
void invalidate()
常用方法2
-
//獲取當前Session物件,獲取不到,就新建一個Session物件
HttpSession s=request.getSession();
-
//獲取當前Session物件,獲取不到,就新建一個Session物件
HttpSession s=request.getSession(true);
-
//獲取當前Session物件,獲取不到,則返回null
HttpSession s=request.getSession(false);
設定Session物件的超時時間
//在web.xml檔案中配置,預設是30分鐘
<web-app>
<session-config>
<session-timeout>120</session-timeout>
</session-config>
</web-app>
//以上設定的是120分鐘,若在120分鐘內,沒有使用者再訪問該Session物件,則銷燬回收該物件;若期間有使用者訪問該物件,則重新開始計時,再等120分鐘,若還有訪問,就再重新計時,以此類推
三個範圍物件
-
ServletContext application 應用範圍
-
HttpSession session 會話範圍
-
HttpServletRequest request 請求範圍
//application完成跨會話傳遞資料;可以淺顯認為應用範圍即只要不關閉重啟伺服器,就再同一個應用中
//session完成跨請求共享資料,但這些請求必須在同一個會話中;淺顯的可以認為只要不關閉瀏覽器,就再同一個會話當中;不同瀏覽器是不同的會話。但本質上一次會話是從Session物件從建立,到最終超時銷燬的過程
//request完成跨Servlet共享資料。但這些Servlet必須在同一個請求中(轉發:forward)。跨Servlet實際上就是跨Servlet介面的實現類
//一次請求可以淺顯的理解為:在瀏覽器地址上輸入一個網址,查詢,但中間不能發生重定向,即查詢結果出來之後,瀏覽器位址列的地址不能改變,可視為一次請求