sun(可惜sun已經沒了...)servlet規範中,request、response等有很多方法,很多都跟http協議有關,很多都是顧名思義的。但有些是比較容易混淆的。下面說說request對象中比較常用有容易搞混的方法
1.getServletConfig()與getServletContext().這兩個方法其實區別是比較明顯的.只是需要理解ServletConfig與ServletContext兩個對象.Head First Servlet and Jsp以書中對這兩個方法特別的提醒了一番.ServletConfig是表對web.xml文件中servlet配置的封裝,每一個servlet都持有一個ServletConfig封裝對象.可以通過這個對象讀取servlet配置中的參數和存取servlet屬性等,但要注意的是servlet對象本身並不是線程安全的,當有多個請求同時請求同一個servlet的時候要注意線程安全.而ServletContext是個全局的對象每個web應用只有唯一的一個ServletContext對象,這個對象的作用跟ServletConfig對象很像但是是針對整個應用的,同樣訪問ServletContext對象的時候也需要注意線程安全.
2.getRequestURL() /getRequstURI()/getContextPath()/getServletPaht()/getPathInfo()
說這四個函數之前不得不說servlet mapping,我們知道從客戶端請求到執行一個服務器端的servlet響應請求,這個過程是通過servlet mapping來查找的,容器找到所有的servlet mapping配置中的uri-pattern與當前請求最匹配的一項,然後找到servlet-name,找到servlet名字後,再到servlet配置中找到這個servlet-name對應的servlet-class,然後找到這個servlet對象或實例化並且初始化這個類(如果還未實例化的話),最後執行servlet對象的service方法.
servlet mapping配置中url-pattern一共有三種方式
1.全名稱的方式:
形如:/abc/efg.action
其中.action爲後綴名,後綴名可謂任意形式如.do,.action等,也可以沒有後綴名,這種形式必須以/開頭
2.目錄形式:
形如:/abc/*
這種形式必須以/開頭
3.後綴名形式:
形如:*.action
其中後綴名可爲任意形式.
下面就來講將那幾個方法:
假設一個項目web.xml如下
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
- <display-name>test</display-name>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.htm</welcome-file>
- <welcome-file>index.jsp</welcome-file>
- <welcome-file>default.html</welcome-file>
- <welcome-file>default.htm</welcome-file>
- <welcome-file>default.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>test</servlet-name>
- <servlet-class>kzq.test.ServletTest</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>test</servlet-name>
- <url-pattern>/abc/abc.action</url-pattern>
- </servlet-mapping>
- </web-app>
kzq.test.ServletTest這個類源碼如下:
- package kzq.test;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ServletTest extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- System.out.println("RequestURL: " + req.getRequestURL());
- System.out.println("RequestURI: " + req.getRequestURI());
- System.out.println("ContextPath: " + req.getContextPath());
- System.out.println("ServletPath: " + req.getServletPath());
- System.out.println("PathInfo: " + req.getPathInfo());
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- doGet(req, resp);
- }
- }
客戶端請求爲: http://localhost:8080/test/abc/abc.action
這幾個方法返回的值,都去掉了請求中的查詢字符串,即?號及其後面的值,除了getRequestURL外,其他幾個方法的返回值都是以/開頭的
getRequestURL():返回完整的請求url : http://localhost:8080/test/abc/abc.action
getRequestURI():返回資源請求路徑: /test/abc/abc.action
getContextPath():返回項目上下文名稱,一般來說是/加上項目名稱: /test
getServletPath():返回ContextPath後面的一串值,這個方法跟servlet mapping配置中url-pattern大有關係,如果url-pattern是全名稱形式的話,那麼一旦一個請求匹配上這個url-pattern,那麼這個方法返回url-pattern中的值,如此處的/abc/abc.action,如果是目錄形式的話,則返回url-pattern中去掉*號後及其前面的/後的值,如果是後綴名形式的話則客戶端輸入的是什麼則全盤返回什麼,包括後綴名.
getPathInfo():這個方法跟getServletPath()又有莫大的關係,請求字符串中(去掉查詢字符串後),除去SevletPath後剩下的就是PathInfo了,除去ServletPath後什麼都沒剩下的話就返回null
上面例子中url-pattern爲全名稱形式/abc/abc.action的話返回:
RequestURL: http://localhost:8080/test/abc/abc.action
RequestURI: /test/abc/abc.action
ContextPath: /test
ServletPath: /abc/abc.action
PathInfo: null
url-pattern爲目錄形式/abc/*的話返回:
RequestURL: http://localhost:8080/test/abc/abc.action
RequestURI: /test/abc/abc.action
ContextPath: /test
ServletPath: /abc
PathInfo: /abc.action
url-pattern爲後綴名形式*.action:
RequestURL: http://localhost:8080/test/abc/abc.action
RequestURI: /test/abc/abc.action
ContextPath: /test
ServletPath: /abc/abc.action
PathInfo: null