1. 程式人生 > 資訊 >“大嘴”馬斯克屢遭批評,但模糊的法規難以阻止其“開拓”市場

“大嘴”馬斯克屢遭批評,但模糊的法規難以阻止其“開拓”市場

//在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(獲取表單中的資料)

  1. //通過key獲得value代表的一維陣列中的首元素

String getParameter(String name)
  1. //通過key獲得該一維陣列中的所有值

String getParamterValues(String name)
  1. //獲取整個map集合

Map getParemterMap()
  1. //獲取map集合中所有的key

Enumeration getParemterNames()

常用方法2

  1. //獲取上下文路徑,即webapp的根路徑

String getContextPath()
  1. //獲取瀏覽器的請求方式

String getMethod()
  1. //獲取URI

String getRequestURI()
  1. //獲取URL

StringBuffer getRequestURL()
  1. //獲取servlet path,即url-pattern

String getServletPath()
  1. //獲得客戶端的IP地址,即訪問者的IP

String getRemoteAddr()

常用方法3

  1. //在request範圍內儲存資料

void setAttribute(String name,Object o)
  1. //從request範圍內取出資料

Object getAttribute(String name)
  1. //移除request範圍中的資料

void removeAttribute(String name)

//ServletContext和HttpServletRequest介面中都有以上3個方法,區別只在於作用範圍不一樣。一個是應用範圍的,一個是請求範圍,ServletContext可以跨使用者傳遞資料,ServletReqest不能跨使用者,但可以跨Servlet

//getAttribute()方法只能取出setAttribute()存進去的資料;getParameter(String name)取出的是表單中的資料

常用方法4(跳轉)

  1. //獲得請求轉發器

RequestDispatcher getRquestDispatcher(String path)
  1. //呼叫轉發器的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是由伺服器建立的,而非瀏覽器

常用方法

  1. //在java中建立Cookie

Cookie c=new Cookie(String name,String value)

  1. //繫結傳送給伺服器的路徑

c.setPath(String path)

//path為相對路徑,如:/myweb/xxx,參照路徑為web伺服器的根路徑,即http://localhost:8080/

//不繫結,預設情況下,若<url-pattern>為:myweb/a/b,則會預設與a/繫結,只要有這個路徑,就會把Cookie傳送給伺服器

  1. //設定Cookie的有效時長

c.setMaxAge(60*60)        //1小時有效

//Cookie的有效時長=0 :直接刪除,相當於時間到了,失效

//Cookie的有效時長>0 :不會被儲存

//Cookie的有效時長<0 :儲存在瀏覽器的硬碟檔案中

//若沒有設定有效時長,則Cookie會被存在瀏覽器的快取中,該瀏覽器一關閉,Cookie就失效

  1. //將Cookie物件傳給瀏覽器

response.addCookie(c)

  1. //伺服器中獲取瀏覽器提交的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

  1. //獲取當前會話的Session物件

HttpSession s=request.getSession();

  1. //向Session物件中儲存資料

s.setAttribure(String name,Object value);

  1. //從會話範圍中取出資料

Object o = s.getAttribute(String name);

  1. //刪除會話範圍中的資料

void removeAttribute(String name)

  1. //銷燬Session物件

void invalidate()

常用方法2

  1. //獲取當前Session物件,獲取不到,就新建一個Session物件

HttpSession s=request.getSession();

  1. //獲取當前Session物件,獲取不到,就新建一個Session物件

HttpSession s=request.getSession(true);

  1. //獲取當前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介面的實現類

//一次請求可以淺顯的理解為:在瀏覽器地址上輸入一個網址,查詢,但中間不能發生重定向,即查詢結果出來之後,瀏覽器位址列的地址不能改變,可視為一次請求