1. 程式人生 > >JSP常用的幾個內建物件

JSP常用的幾個內建物件

JSP內建物件的含義是可以直接在JSP頁面中使用的物件,使用前不需要宣告它,。可以不加宣告和建立就可以在JSP頁面指令碼(Java程式片和Java表示式)中使用的成員變數。常用的JSP的幾個內建物件為request、response、session。

一.request物件

使用者每訪問一個頁面,就會產生一個HTTP請求。這些請求中一般包含了請求所需的引數值或者資訊,如果將request物件看作是客戶請求的一個例項,那麼這個例項就包含了客戶請求的所有資料。因此,可以通過request來獲取客戶端和服務端的資訊,如IP地址、傳遞引數名和引數值、應用系統名,伺服器主機名等。

                                                     request物件的常用的方法

方法 描述
getParameter() 該方法是取得請求中指定的引數值,返回String型別值
getParameterValues() 該方法是將同名稱的引數一次性地讀入到String型別的陣列中
getParameterNames() 獲取引數名稱,它返回的是列舉型別
getMethod() 獲取客戶提交資訊的方式,是post還是get
getServletPath() 獲取JSP頁面檔案的目錄
getHeader() 獲取HTTP標頭檔案中指定值,例如:accept、user-agent、content-type、content-length等
getRemoteAddr() 獲取客戶的IP地址
getServerName() 獲取伺服器的名稱
getServerPort() 獲取伺服器埠
getHeaders() 獲取標題資訊

 

  1. 使用request物件接收請求引數

request物件有兩種方法獲得請求引數值,一個是getParameter(),另一個是getParameterValues()。

前端如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
  <form action="demo1_controller.jsp"  method="post">
        <div>
            <input type="text" name="uname">
        </div>
        <div>
            <input type="password" name="upsw">
        </div>
       <div>
               <input type="radio" name="sex" value="1" checked="checked" >男
               <input type="radio" name="sex" value="0" >女
      </div>
        <div>
               <input type="checkbox" name="km" value="0" />數學
               <input type="checkbox" name="km" value="1" />語文
                <input type="checkbox" name="km" value="2" />外語
        </div>
        <div>
              <select name="address">
              <option value="0" selected="selected">南京</option>
               <option value="1">北京</option>
                <option value="2">上海</option>
              
              </select>
        </div>
        <div>
        <input type="submit" value="提交檢視">
        </div>
  </form>
  </body>
</html>

使用getParameter獲得請求中指定引數值和使用getParameterValues獲得陣列

如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>

  </head>
  
  <body>
     <%
          //單值使用getParameter方法獲取使用者資料
          String c_name=request.getParameter("uname");
          
          String c_upsw=request.getParameter("upsw"); 
          String c_sex=request.getParameter("sex");
          //多值使用getParameterValues方法獲取使用者資料,返回值是個字串陣列
          String[] c_km=request.getParameterValues("km");
          String c_address=request.getParameter("address");
          
          if(c_sex.trim().equals("0")){
                c_sex="女";
          }else{
                c_sex="男";
          }
         for(int i=0;i<c_km.length;i++){
              if(c_km[i].trim().equals("0")){
              c_km[i]="數學";
              }else if(c_km[i].trim().equals("1")){
              c_km[i]="語文";
              }else if(c_km[i].trim().equals("2")){
              c_km[i]="外語";
              }
  }
        if(c_address.trim().equals("0")){
        c_address="南京";
        }else if(c_address.trim().equals("1")){
           c_address="北京";
     }else if(c_address.trim().equals("2")){
     c_address="上海";
     }
     //字串緩衝類,通常適用於N多次連線操作,比如輸入流操作,
     StringBuffer sb=new StringBuffer();
     sb.append("使用者名稱"+c_name+",密碼"+c_upsw+",性別"+c_sex);
     for(int i=0;i<c_km.length;i++){
     if(i==0){
     sb.append(",所選科目:"+c_km[i]);
     
     }else{
     sb.append("、"+c_km[i]);
     }
     }
     sb.append(",地址是:"+c_address);
     out.print(sb.toString());
     out.print("<br/>");
     out.print("專案名:"+request.getContextPath()+"<br>");
     out.print("URL:"+request.getRequestURI()+"<br>");
     out.print("ip:"+request.getServerName()+"<br>");
     out.print("埠:"+request.getServerPort()+"<br>");
     out.print("伺服器路徑:"+request.getServletPath()+"<br>");
     
     //請求轉發
     //設定請求編碼
     request.setCharacterEncoding("utf-8");
     //設定請求引數
     request.setAttribute("param1", sb.append(""));
     //獲取Disptcher類
     RequestDispatcher disptcher= request.getRequestDispatcher("demo1_result.jsp");
     //執行轉發
     disptcher.forward(request, response);
     
    
      %>

  </body>
</html>

執行結果如下所示:


在URL引數傳遞時,在頁面地址後使用“?”連線請求引數,引數由“=”相連線表示引數名和引數值,一個請求攜帶多個引數用“&”連線。

 2.get和post區別

在form中,有個非常重要的屬性method。method有兩個值,分別是get和post。

get:以明文的方式通過URL提交資料,資料在URL中可以看到。提交的資料最多不超過2KB。安全性較低但效率比post方式高。適合提交資料量不大,安全性不高的資料。如:搜尋、查詢等功能。

post:將使用者提交的資訊封裝在HTML HEADER內。適合提交資料量大,安全性高的使用者資訊。比如:註冊、修改、上傳等功能。

3.請求亂碼問題的處理

1.在接收請求的頁面中規定請求字元編碼的程式碼,如下所示:

//設定請求編碼
 request.setCharacterEncoding("utf-8");

2.第二種方法是在取得引數值後,通過轉碼的方式將引數值轉為合適的字符集,如下所示:
 

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8")
String city=new String(request.getParameter("city").getBytes("ISO-8859-1"),"utf-8");

3.通過編寫一個Servlet過濾器來解決中文亂碼問題,並可以通過配置過濾器解決所有請求處理字符集的問題,請求處理頁面就不用關心字符集的處理了。第三種方法可以有效的防止上述的問題且移植性強。

  二.response物件

當用戶訪問一個頁面時,就產生一個HTTP請求,伺服器做出響應時呼叫的是response響應包。response響應包實現的是介面javax.servlet.http.HttpServletResponse。

                                                           reponse常用的方法

方法 說明
addHeader(String arg0,String arg1) 向頁面種新增頭和對應的值
addCookie(Cookie arg0) 新增Cookie資訊
sendRedirect(String arg0) 實現頁面重定向
setStatus(int arg0) 設定頁面的響應狀態碼
setContentType(String arg0) 設定頁面的MIME型別和字符集
setCharacterEncoding(arg0) 設定頁面響應的編碼型別

1.設定頭資訊

設定頭資訊包括設定頁面返回的MIME型別、返回的字符集、頁面中的meta等資訊。其中設定MIME型別和返回的字符集尤為重要,因為它關係到頁面的顯示是否會出現亂碼,有兩種方法設定MIME型別和返回的字符集,分別如下:

response.setContentType(String type);//其中type的值為“text/html;charset=utf-8",當然可以為其他的MIME型別和字符集。

用page指令。基本固定格式是:

<%@ page contentType="text/html;charset=utf-8" language="java" %>

setContentType的用法

setContentType.jsp用來設定MIME型別和字符集,MIME設定為"text/html",字符集設定為"UTF-8",其原始碼如下:

<%
response.setContentType("text/html;charset=UTF-8"); //設定字符集和MIME型別
String str=new String("這是測試例子".getBytes("ISO-8859-1"),"utf-8");
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <title>setContentType.jsp</title>


  </head>
  
  <body>
  <p>這裡是一段中文字元</p>
  </br>
  <%=str %>
  </body>
</html>

執行結果如下所示:

從執行結果可以看出,指令碼中經過轉碼的文字顯示正常,而在HTML中的字是亂碼。

使用page指令設定字符集,在寫法和處理上都相對簡單些,HTML中的中文字不需要轉碼,而且指令碼中的中文字也不需要轉碼。

用page指令設定頁面字符集 

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String str="這是測試例子";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <title>setContentType.jsp</title>


  </head>
  
  <body>
  <p>這裡是一段中文字元</p>
  </br>
  <%=str %>
  </body>
</html>

執行結果如下所示:

JSP中頁面設定字符集會破壞JSP容器自身的頁面編碼處理,所以不建議設定。但可以在Servlet中設定。用page指令設定字符集相對簡單,所以在開發中一般採用這種模式 

設定頭meta資訊是指HTML頁面中存在於<head></head>之間的資訊。例如:

(1)<meta http-equiv="pragma" content="no-cache">:設定禁止瀏覽器從本地機的快取中呼叫頁面內容,設定後離開網頁就不能從Cache中再呼叫。

(2)<meta http-equiv="cache-control" content="no-cache">:請求和響應遵循的快取機制策略。

(3)<meta http-equiv="expires" content="0">:用於設定網頁的到期時間,一旦過期則必須到伺服器上重新呼叫。

(4)<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">:向搜尋引擎說明網頁的關鍵字。

(5)<meta http-equiv="description" content="This is my page">:向搜尋引擎說明網頁的主要內容。

頁面請求重定向和請求轉發的區別

請求重定向:客戶端行為,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求物件不會儲存,位址列的URL地址會改變。

請求轉發:伺服器行為,request.getRequestDispatcher().forward(request,response);是一次請求,轉發後請求物件會儲存,位址列的URL地址不會改變。

三.Session物件

在web開發中,session物件同樣佔據著極其重要的位置,在開發中它是一個非常重要的物件,可以用來判斷是否是同一使用者,還可以用來記錄客戶的連線資訊等。HTTP協議是一種無狀態的協議(即不儲存連線狀態的協議),每次使用者請求在接收到伺服器的響應後,連線就關閉了,伺服器端與客戶端的連線就被斷開。因此,當用戶的瀏覽器沒關閉,這個時候又發起請求,那麼網站就應該識別出該使用者的情況。這種情況下,session物件就起到了關鍵作用。

                                                   session相關概念

名稱 說明
會話 當用戶開啟瀏覽器連線到一個Web應用時或者某個介面,當關閉瀏覽器這個過程稱為一個會話。其實一開啟一個瀏覽器就意味著打開了一個會話物件
session物件生命週期 當用戶訪問某個頁面到關閉瀏覽器,這段時間稱之為session物件的生命週期。也可以說是會話開始到結束這段時間稱為session物件的生命週期
session物件與執行緒 一個使用者一個執行緒,這樣保證了多個使用者單擊同一頁面時的session物件唯一性
session物件與Cookie物件 session物件與Cookie物件是一 一對應關係。JSP引擎會將建立好的session物件存放在對應的Cookie中

 

                                                         session物件常用方法

方法 說明
void setAttribute(String arg0,String arg1) 將引數名和引數值存放在session中
Object getAttribute(String arg0)  通過arg0中的引數獲取引數值
Enumeration getAttribteName() 一個使用者一個執行緒,這樣保證了多個使用者單擊同一頁面時的session物件唯一性
String getID() 獲取session物件的ID值
void removeAttribute(String arg0) 移除指定中的引數
long getCreateTime() 獲取物件建立的時間,返回結果是long型的毫秒數
int getMaxInactiveInterval() 獲取session物件的有效時間
void setMaxInactiveInterval() 設定session物件的有效時間
Boolean isNew() 用於判斷是否是一個新客戶
void invalidate() 使session物件不合法即失效

程式碼如下所示:

session_save.jsp

<%@page import="com.stujy.UserInfo"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>




</head>

<body>
	<%
		session.setAttribute("param1", "這是session的資料!");
		UserInfo ui = new UserInfo();
		ui.setNc("暱稱");
		session.setAttribute("ui", ui);
		//response.sendRedirect("session_test.jsp");
	%>
	<button onclick="tiaozhuan()">跳轉</button>
	<script type="text/javascript">
		function tiaozhuan() {
			location.href = "session_test.jsp";
		}
	</script>
</body>
</html>

執行如下所示:

 當點選跳轉按鈕會跳轉至session_test.jsp頁面

session_test.jsp: 

<%@page import="com.stujy.UserInfo"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	
%>

<html>
<head>


</head>

<body>
	<%
		 String param1=(String)session.getAttribute("param1");
		 UserInfo ui=(UserInfo)session.getAttribute("ui"); //
		 out.print(param1+"</br>");
		 out.print(ui.getNc());
	%>

</body>
</html>

執行結果如下所示:

session預設在伺服器上的儲存時間為30分鐘,當客戶端停止操作30分鐘後,session中儲存的資訊會自動失效。此時呼叫getAttribute()等方法將出現異常。