1. 程式人生 > >Servlet中request、response、ServletContext 及其常用方法

Servlet中request、response、ServletContext 及其常用方法

request物件的類是HttpServletRequest


request的常見方法:

request.getRequestURL(): 瀏覽器發出請求時的完整URL,包括協議 主機名 埠(如果有)
request.getRequestURI(): 瀏覽器發出請求的資源名部分,去掉了協議和主機名
request.getQueryString(): 請求行中的引數部分,只能顯示以get方式發出的引數,post方式的看不到
request.getRemoteAddr(): 瀏覽器所處於的客戶機的IP地址
request.getRemoteHost(): 瀏覽器所處於的客戶機的主機名
request.getRemotePort(): 瀏覽器所處於的客戶機使用的網路埠
request.getLocalAddr(): 伺服器的IP地址
request.getLocalName(): 伺服器的主機名
request.getMethod(): 得到客戶機請求方式一般是GET或者POST

獲取引數:

request.getParameter(): 是常見的方法,用於獲取單值的引數
request.getParameterValues(): 用於獲取具有多值的引數,比如註冊時候提交的多選框,可以是多選的。
request.getParameterMap(): 用於遍歷所有的引數,並返回Map型別。

獲取頭資訊:

request.getHeader() 獲取瀏覽器傳遞過來的頭資訊。 
比如getHeader("user-agent") 可以獲取瀏覽器的基本資料,這樣就能判斷是firefox、IE、chrome、或者是safari瀏覽器
request.getHeaderNames() 獲取瀏覽器所有的頭資訊名稱,根據頭資訊名稱就能遍歷出所有的頭資訊

頭資訊:

host: 主機地址
user-agent: 瀏覽器基本資料
accept: 表示瀏覽器接受的資料型別
accept-language: 表示瀏覽器接受的語言
accept-encoding: 表示瀏覽器接受的壓縮方式,是壓縮方式,並非編碼
connection: 是否保持連線
cache-control: 快取時限

使用URL的GET方法傳遞資料

跳轉地址?引數名1=引數值1&引數名2=引數值2  
例如:http://localhost:8080/TomcatTest/HelloForm?name=333ddd333&id=12
因為傳參的編碼不支援中文,引數值是中文會亂碼
可以通過一下方法處理中文問題:
String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");


response是HttpServletResponse的例項,用於提供給瀏覽器的響應資訊


設定響應內容

PrintWriter pw= response.getWriter();
通過response.getWriter(); 獲取一個PrintWriter 物件
可以使用println(),append(),write(),format()等等方法設定返回給瀏覽器的html內容。

設定響應格式

response.setContentType("text/html");
"text/html" 是即格式 ,在request獲取頭資訊 中對應的request.getHeader("accept"). 
"text/html" 是存在的,表示瀏覽器可以識別這種格式,如果換一個其他的格式, 比如 "text/lol" ,瀏覽器不能識別,那麼開啟此servlet就會彈出一個下載的對話方塊。
這樣的手段也就常常用於實現下載功能


設定不使用快取

使用快取可以加快頁面的載入,降低服務端的負擔。但是也可能看到過時的資訊,可以通過如下手段通知瀏覽器不要使用快取
response.setDateHeader("Expires",0 );
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");

ServletContext 物件
WEB容器在啟動時,它會為每個Web應用程式都建立一個對應的ServletContext,它代表當前Web應用。並且它被所有客戶端共享。
WEB應用中的所有Servlet共享同一個ServletContext物件
ServletContext中的屬性的生命週期從建立開始,到伺服器關閉而結束

ServletContext sc = this.getServletContext()方法獲得其物件的引用
新增屬性:setAttribute(String name, Object obj);
得到值:getAttribute(String name),這個方法返回Object
刪除屬性:removeAttribute(String name)
讀取到一個檔案的全路徑:getRealPath(String path) 其中path必須是/開頭,代表當前web應用程式的根目錄
獲取資源流,即把資源以輸入流的方式獲取:getResourceAsStream(String path)
返回的一個代表某個資源的URL物件:getResource(String parh)
獲取指定目錄下所有資源路徑:getResourcePaths(String path)

例如獲取/WEB-INF下所有資源的路徑:


程式碼:
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);


結果:
[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml]

如果資源不在Web應用的根目錄,通過ServletContext是讀不到的,必須要使用類載入器去讀取
比如在src下的com.gavin包下,此時類載入器要加上包的路徑,如下:
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/gavin/dbinfo.properties")

獲得初始化引數:
我們可以使用一個或多個<init-param>標籤為servlet配置一些初始化引數,然後我們通過ServletConfig物件獲取這些引數
假如有如下的MyServlet,它的配置為:


<servlet>
  
    <servlet-name>MyServlet</servlet-name>
  
    <servlet-class>com.gavin.servlet.MyServlet</servlet-class>
  
    <init-param>
  
        <param-name>encoding</param-name>
  
        <param-value>utf-8</param-value>
  
    </init-param>
  
</servlet>
可以看到它配置了一個初始化引數:encoding=utf-8,那麼我們在MyServlet的原始碼中需要這樣去得到這個引數:


String encoding = this.getServletConfig().getInitParameter("encoding");