if (ref == null || ref == "" || !ref.startsWith("http://localhost"))
{
response.sendRedirect(request.getContextPath() + "/homePage.html");}
else
{
this.getServletContext().getRequestDispatcher("/WEB-INF/fengjie.html").forward(request, response);}3.獲取請求參數getParameter(name) --- String 通過name獲得值getParameterValues(name) --- String[ ] 通過name獲得多值 checkboxgetParameterNames --- Enumeration<String> 獲得所有請求參數名稱組成的枚舉getParameterMap --- Map<String,String[ ]> 獲取所有請求參數的組成的Map集合,注意,其中的鍵為String,值為String[]獲取請求參數時亂碼問題:瀏覽器發送的請求參數使用什么編碼呢?當初瀏覽器打開網頁時使用什么編碼,發送就用什么編碼。服務器端獲取到發過來的請求參數默認使用ISO8859-1進行解碼操作,中文一定有亂碼問題
對于Post方式提交的數據,可以設置request.setCharacterEncoding("gb2312");來明確指定獲取請求參數時使用編碼。但是此種方式只對Post方式提交有效。
對于Get方式提交的數據,就只能手動解決亂碼:String newName = new String(name.getBytes("ISO8859-1"),"gb2312");此種方法對Post方式同樣有效。
在tomcat的server.xml中可以配置http連接器的URIEncoding可以指定服務器在獲取請求參數時默認使用的編碼,從而一勞永逸的決絕獲取請求參數時的亂碼問題。也可以指定useBodyEncodingForURI參數,令request.setCharacterEncoding也對GET方式的請求起作用,但是這倆屬性都不推薦使用,因為發布環境往往不允許修改此屬性。4.利用請求域傳遞對象生命周期:在service方法調用之前由服務器創建,傳入service方法。整個請求結束,request生命結束。作用范圍:整個請求鏈。作用:在整個請求鏈中共享數據,最常用的:在Servlet中處理好的數據要交給jsp顯示,此時參數就可以放置在Request域中帶過去。5.request實現請求轉發ServletContext可以實現請求轉發,request也可以。在forward之前輸入到response緩沖區中的數據,如果已經被發送到了客戶端,forward將失敗,拋出異常在forward之前輸入到response緩沖區中的數據,但是還沒有發送到客戶端,forward可以執行,但是緩沖區將被清空,之前的數據丟失。注意丟失的只是請求體中的內容,頭內容仍然有效。在一個Servlet中進行多次forward也是不行的,因為第一次forward結束,response已經被提交了,沒有機會再forward了總之,一條原則,一次請求只能有一次響應,響應提交走后,就再沒有機會輸出數據給瀏覽器了。6.RequestDispatcher進行include操作forward沒有辦法將多個servlet的輸出組成一個輸出,因此RequestDispatcher提供了include方法,可以將多個Servlet的輸出組成一個輸出返回個瀏覽器request.getRequestDispatcher("/servlet/Demo17Servlet").include(request, response);response.getWriter().write("from Demo16");request.getRequestDispatcher("/servlet/Demo18Servlet").include(request, response);常用在頁面的固定部分單獨寫入一個文件,在多個頁面中include進來簡化代碼量。四、URL編碼1.由于HTTP協議規定URL路徑中只能存在ASCII碼中的字符,所以如果URL中存在中文或特殊字符需要進行URL編碼。2.編碼原理:將空格轉換為加號(+) 對0-9,a-z,A-Z之間的字符保持不變 對于所有其他的字符,用這個字符的當前字符集編碼在內存中的十六進制格式表示,并在每個字節前加上一個百分號(%)。如字符“+”用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每個中文字符在內存中占兩個字節,字符“中”用%D6%D0表示,字符“國”用%B9%FA表示調對于空格也可以直接使用其十六進制編碼方式,即用%20表示,而不是將它轉換成加號(+) 說明:如果確信URL串的特殊字符沒有引起使用上的岐義或沖突你也可以對這些字符不進行編碼,而是直接傳遞給服務器。例如,http://www.it315.org/dealregister.html?name=中國&passWord=123 如果URL串中的特殊字符可能會產生岐義或沖突,則必須對這些特殊字符進行URL編碼。例如,服務器會將不編碼的“中+國”當作“中國”處理。還例如,當name參數值為“中&國”時,如果不對其中的“&”編碼,URL字符串將有如下形式:http://www.it315.org/dealregister.html?name=中&國&password=123,應編碼為:http://www.it315.org/dealregister.html?name=中%26國&password=123 http://www.it315.org/example/index.html#section2可改寫成http://www.it315.org/example%2Findex.html%23section2 3.在java中進行URL編碼和解碼URLencoder.encode("xxxx","utf-8");URLDecoder.decode(str,"utf-8");五、請求重定向和請求轉發的區別 1.區別RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。 如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對于服務器的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對于當前WEB應用程序的根目錄。 調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。 RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。 2.應用場景(參照圖想)減少服務器壓力當需要更新地址欄時用請求重定向,如注冊成功后跳轉到主頁。當需要刷新更新操作時用請求重定向,如購物車付款的操作。常用地址的寫法: 絕對路徑:以/開頭的路徑就叫做絕對路徑,絕對路徑在相對于的路徑上直接拼接得到最終的路徑 相對路徑:不以/開頭的路徑就叫做相對路徑,相對路徑基于當前所在的路徑計算的到最終的路徑 硬盤路徑:以盤符開頭的路徑就叫做硬盤路徑.是哪個路徑就是哪個路徑.沒有相對于誰的問題 虛擬路徑: --寫虛擬路徑時都使用絕對路徑 如果路徑是給瀏覽器用的,這個路徑相對于虛擬主機,所以需要寫上web應用的名稱 如果路徑是個服務器用的,這個路徑相對于web應用,所以可以省寫web應用的名稱 <a href="/Day04/....."> <form action="/Day04/..."> <img src="/Day04/...."> response.setHeader("Location","/Day04/...."); response.setHeader("refresh","3;url=/Day04/..."); response.sendRedirect("/Day04/..."); request.getRequestDispathce("/index.jsp").forward(); request.getRequestDispathce("/index.jsp").include(); 真實路徑: --寫真實路徑時都使用相對路徑 根據原理,具體問題具體分析 servletContext.getRealPath("config.PRoperties");//--給一個相對于web應用目錄的路徑 classLoader.getResource("../../config.properties");//--給一個相對于類加載目錄的路徑 File file = new File("config.properties");//--相對于程序的啟動目錄 new InputStream("config.properties");//--相對于程序的啟動目錄新聞熱點
疑難解答