Servlet中的幾個重要的對象(轉)
講解四大類,ServletConfig對象,ServletContext對象、request對象,response對象
ServletConfig對象
獲取途徑:getServletConfig();
功能:上面大概提及了一下,能得到四個東西,
getServletName(); //獲取servlet的名稱,也就是我們在web.xml中配置的servlet-name
getServletContext(); //獲取ServletContext對象,該對象的作用看下面講解
getInitParameter(String); //獲取在servlet中初始化參數的值。這裏註意與全局初始化參數的區分。這個獲取的只是在該servlet下的初始化參數
getInitParameterNames(); //獲取在Servlet中所有初始化參數的名字,也就是key值,可以通過key值,來找到各個初始化參數的value值。註意返回的是枚舉類型
註意:在上面我們所分析的源碼過程中,我們就知道,其實可以不用先獲得ServletConfig,然後在獲取其各種參數,可以直接使用其方法,比如上面我們用的ServletConfig().getServletName();可以直接寫成getServletName();而不用在先獲取ServletConfig();了,原因就是在GenericServlet中,已經幫我們獲取了這些數據,我們只需要直接拿就行。
ServletContext對象
獲取途徑:getServletContext(); 、getServletConfig().getServletContext(); //這兩種獲取方式的區別就跟上面的解釋一樣,第一種是直接拿,在GenericServlet中已經幫我們用getServletConfig().getServletContext();拿到了ServletContext。我們只需要直接獲取就行了,第二種就相當於我們自己在獲取一遍,兩種讀是一樣的。
功能:tomcat為每個web項目都創建一個ServletContext實例,tomcat在啟動時創建,服務器關閉時銷毀,在一個web項目中共享數據,管理web項目資源,為整個web配置公共信息等,通俗點講,就是一個web項目,就存在一個ServletContext實例,每個Servlet讀可以訪問到它。
1、web項目中共享數據,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)
setAttribute(String name, Object obj) 在web項目範圍內存放內容,以便讓在web項目中所有的servlet讀能訪問到
getAttribute(String name) 通過指定名稱獲得內容
removeAttribute(String name) 通過指定名稱移除內容
2、整個web項目初始化參數 //這個就是全局初始化參數,每個Servlet中都能獲取到該初始化值
getInitPatameter(String name) //通過指定名稱獲取初始化值
getInitParameterNames() //獲得枚舉類型
web.xml 配置 整個web項目的初始化
3、獲取web項目資源
3.1獲取web項目下指定資源的路徑:getServletContext().getRealPath("/WEB-INF/web.xml")
3.2獲取web項目下指定資源的內容,返回的是字節輸入流。InputStream getResourceAsStream(java.lang.String path)
前提知識:需要了解流。不知道的可以去看看IO流總結的文章
輸出內容截圖一部分
4、getResourcePaths(java.lang.String path) 指定路徑下的所有內容。
5還有很多別的方法,暫時用到的就這幾個了,以後需要在用的,就查看源碼,看API。
request對象
我們知道,request就是將請求文本封裝而成的對象,所以通過request能獲得請求文本中的所有內容,請求頭、請求體、請求行 。
1、請求行內容的獲取。
2請求頭的獲取
隨便百度一個東西,然後查看的請求頭,包括以下這些內容,稍作了解。
String getHeader(java.lang.String name) 獲得指定頭內容String【】
long getDateHeader(java.lang.String name) 獲得指定頭內容Date
int getIntHeader(java.lang.String name) 獲得指定頭內容int
Enumeration getHeaders(java.lang.String name) 獲得指定名稱所有內容
3請求體的獲取 -- 請求參數的獲取
分兩種,一種get請求,一種post請求
get請求參數:http://localhost:8080/test01/MyServlet?username=jack&password=1234
post請求參數: <form method="post"><input type="text" name="username">
String request.getParameter(String) 獲得指定名稱,一個請求參數值。
String[] request.getParameterValues(String) 獲得指定名稱,所有請求參數值。例如:checkbox、select等
Map<String , String[]> request.getParameterMap() 獲得所有的請求參數
4請求轉發
request.getRequestDispatcher(String path).forward(request,response); //path:轉發後跳轉的頁面,這裏不管用不用"/"開頭,都是以web項目根開始,因為這是請求轉發,請求轉發只局限與在同一個web項目下使用,所以這裏一直都是從web項目根下開始的,
web項目根:
開發:G:\Workspaces\test01\WebRoot\..
運行時:D:\java\tomcat\apache-tomcat-7.0.53\webapps\test01\..
web站點根:
運行時:D:\java\tomcat\apache-tomcat-7.0.53\webapps\..
從這裏可以看出,web項目根就是從該web項目名開始,所以我們請求轉發時,只需要接著項目名後面需要訪問的路徑寫就行了,
特點:瀏覽器中url不會改變,也就是瀏覽器不知道服務器做了什麽,是服務器幫我們跳轉頁面的,並且在轉發後的頁面,能夠繼續使用原先的request,因為是原先的request,所以request域中的屬性都可以繼續獲取到。
response對象
常用的一個方法:response.setHeader(java.lang.String name, java.lang.String value) 設置指定的頭,一般常用。
例如:設置每隔3秒就自動刷新一次,
response.setHeader("Refresh",3);
這樣可以看到現在時間的秒數,會發現每隔三秒就會自動刷新一次頁面。
這個最重要的一個就是重定向,其他的一些操作都被封裝到response對象中了,重點講解重定向
重定向(頁面跳轉)
方式一:手動方案
response.setStatus(302); //狀態碼302就代表重定向
response.setHeader("location","http://www.baidu.com");
方式二:使用封裝好的,通過response.sendRedirect("http://www.baidu.com");
特點:服務器告訴瀏覽器要跳轉的頁面,是瀏覽器主動去跳轉的頁面,瀏覽器知道,也瀏覽器的地址欄中url會變,是瀏覽器重新發起一個請求到另外一個頁面,所以request是重新發起的,跟請求轉發不一樣。
註意:response.sendRedirect(path); //
第一種:response.sendRedirect("/test01/MyServlet01"); //使用了"/"開頭,說明是從web站點根開始,所以需要寫test01/MyServlet01
第二種:response.sendRedirect("MyServlet01"); //沒有使用"/"開頭,說明是從web項目根開始,那麽就無需寫test01了。
重定向沒有任何局限,可以重定向web項目內的任何路徑,也可以訪問別的web項目中的路徑,並且這裏就用"/"區分開來,如果使用了"/"開頭,就說明我要重新開始定位了,不訪問剛才的web項目,自己寫項目名,如果沒有使用"/"開始,那麽就知道是訪問剛才那個web項目下的servlet,就可以省略項目名了。就是這樣來區別。
Servlet中的幾個重要的對象(轉)