HttpServletRequest

一、request獲取客戶機信息html

		//1.獲取客戶端請求的完整URL
		String url = request.getRequestURL().toString();
		System.out.println(url);
		//2.獲取客戶端請求的資源部分的名稱
		String uri = request.getRequestURI();
		System.out.println(uri);
		//3.獲取請求行中參數部分  (即url地址?後面部分)
		String qStr = request.getQueryString();
		System.out.println(qStr);
		//4.獲取請求客戶端的ip地址
		String ip = request.getRemoteAddr();
		System.out.println(ip);
		//5.獲取客戶機的請求方式
		String method = request.getMethod();
		System.out.println(method);
		//6.獲取當前web應用的名稱
		String name = request.getContextPath();
		System.out.println(name);
		
		response.sendRedirect(request.getContextPath()+"/index.jsp");





二、request獲取請求頭信息 —— 防盜鏈java


		// 獲取請求 是 哪一個頁面連接過來的 能夠用來作防盜鏈
		String ref = request.getHeader("Referer");
		//若是  連接過來頁面是空 或者不是本地站點,則重定向到本站首頁。
		if (ref == null || "".equals(ref)
				|| !ref.startsWith("http://localhost")) {
			response.sendRedirect(request.getContextPath() + "/index.html");
			return;
		}
		System.out.println(ref);

		
		// 獲取全部請求頭
		Enumeration<String> enumeration = request.getHeaderNames();
		while (enumeration.hasMoreElements()) {
			String name = enumeration.nextElement();
			String value = request.getHeader(name);
			System.out.println(name + ":" + value);
		}





三、request獲取請求參數(參數亂碼)web


		// --通知服務器以什麼編碼解碼http請求中的實體內容,因此這行代碼只能解決post提交的亂碼
		// 此處明確指定utf-8  是由於服務器通知瀏覽器使用utf-8解析,是服務器控制的  
		// request.setCharacterEncoding("utf-8");

		// 對於get提交只能手動解決請求參數中的亂碼
		String username = request.getParameter("username");
		username = new String(username.getBytes("iso8859-1"), "utf-8");
		System.out.println(username);

		
		
		
		// getParameter(name) --- String 經過name得到值
		// getParameterValues --- String[ ] 經過name得到多值 checkbox
		// getParameterNames --- Enumeration<String> 得到全部name
		// getParameterMap --- Map<String,String[ ]> key :name value: 多值
		Enumeration<String> enumeration = request.getParameterNames();
		while (enumeration.hasMoreElements()) {
			String name = enumeration.nextElement();
			String value = request.getParameter(name);
			System.out.println(name + ":" + value);
		}



四、利用請求域傳遞對象
        
        做用範圍:整個請求鏈上
        生命週期:當服務器收到一個請求,建立出表明請求的request對象,request開始.當請求結束,服務器銷燬表明請求的request對象,request域結束.
        做用:在整個請求鏈範圍內共享數據,一般咱們在Servlet中處理好的數據會存入request域後請求轉發到jsp頁面來進行展現
        
        setAttribute
        getAttribute
        removeAttribute
瀏覽器




五、實現請求轉發和請求包含服務器


A、請求轉發:jsp

            this.getServletContext().getRequestDispatcher("").forward(request,response);
            request.getRequestDispatcher("").forward(request,response);
            
~請求轉發是但願將請求交給另一個資源執行,因此應該保證只有最後真正要執行的資源纔可以輸出數據,因此:
佈局

     *請求轉發時,若是已經有數據被寫入到了response的緩衝區,可是這些數據尚未被髮送到客戶端,則請求轉發時,這些數據將會被清空.可是清空的只是響應中的實體內容部分,頭信息並不會被清空.post

      *而請求轉發時已經有數據被打給了瀏覽器,那麼再進行請求轉發,不能成功,會拋出異常,緣由是響應已經結束了,再轉發交給其餘人沒意義了this

     *在最終輸出數據的Servlet執行完成後,response實體內容中的數據將會被設置爲已提交的狀態,再往裏寫數據也不會起做用編碼

                                 -------使用以上三條,就保證了最終只有一個Servlet可以向瀏覽器輸出數據,因此                                     *一個Servlet裏兩次請求轉發也是不能夠的,一次請求交給兩人處理天然也是不行.                         B、請求包含:將兩個資源的輸出進行合併後輸出             this.getServletContext().getRequestDispatcher("").include(request,response);             request.getRequestDispatcher("").include(request,response);                          *被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,若是它裏面存在這樣的語句,這些語句的執行結果將被忽略             *常被用來進行頁面佈局 C、三種資源處理方式的區別             請求重定向                 response.sendRedirect();             請求轉發                 request.getRequestDispatcher().forward();             請求包含                 request.getRequestDispatcher().include();                                               請求重定向和請求轉發的區別:                 請求重定向地址欄會發生變化.請求轉發地址欄不發生變化.                 請求重定向兩次請求兩次響應.請求轉發一次請求一次響應.                                  若是須要在資源跳轉時利用request域傳遞域屬性則必須使用請求轉發                 若是但願資源跳轉後修改用戶的地址欄則使用請求重定向                 若是使用請求轉發也能夠重定向也能夠,則優先使用請求轉發,減小瀏覽器對服務器的訪問次數減輕服務器的壓力.

相關文章
相關標籤/搜索