jsp為用戶提供了9個內置對象,該內置對象由容器進行實例化,用戶直接使用即可; 1 四種屬性範圍 所謂的屬性保存範圍:指一個設置的對象可以在幾個頁面中保存可以繼續使用; 屬性操作方法: public void setAttribute(String name, Object obj) 設置屬性的名稱 ...
jsp為用戶提供了9個內置對象,該內置對象由容器進行實例化,用戶直接使用即可;
1 四種屬性範圍
所謂的屬性保存範圍:指一個設置的對象可以在幾個頁面中保存可以繼續使用;
屬性操作方法:
public void setAttribute(String name, Object obj) 設置屬性的名稱及內容;
public Object getAttribute(String name) 根據屬性名稱取得屬性;
public void removeAttribute(String name) 根據屬性名稱刪除屬性;
四種屬性範圍:
page(pageContext ,習慣於將這種範圍稱為page範圍): 只在一個頁面中保存屬性,跳轉之後無效;
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <!-- 導入java.util包 --> <html> <head><title>設置和取得page範圍的屬性</title></head> <body> <% // 設置page屬性範圍,此屬性只在當前的JSP頁面中起作用 pageContext.setAttribute("name","bugshi") ; pageContext.setAttribute("birthday",new Date()) ; %> <% // 從page屬性範圍中取出屬性,並執行向下轉型操作 String username = (String)pageContext.getAttribute("name") ; Date userbirthday = (Date)pageContext.getAttribute("birthday") ; %> <h2>姓名:<%=username%></h2> <!-- 輸出取得的屬性內容 --> <h2>生日:<%=userbirthday%></h2> <!-- 輸出取得的屬性內容 --> </body> </html>
request : 只在一次請求中保存,伺服器跳轉後依然有效;
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <!-- 導入java.util包 --> <html> <head><title>設置requset屬性的範圍</title></head> <body> <% // 設置request屬性範圍,此屬性只在伺服器跳轉中起作用 request.setAttribute("name","bugshi") ; request.setAttribute("birthday",new Date()) ; %> <jsp:forward page="request_demo02.jsp"/> </body> </html>
request_demo02.jsp :
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <!-- 導入java.util包 --> <html> <head><title>取出request屬性的範圍</title></head> <body> <% // 從request屬性範圍中取出屬性,並執行向下轉型操作 String username = (String)request.getAttribute("name") ; Date userbirthday = (Date)request.getAttribute("birthday") ; %> <h2>姓名:<%=username%></h2> <!-- 輸出取得的屬性內容 --> <h2>生日:<%=userbirthday%></h2> <!-- 輸出取得的屬性內容 --> </body> </html>
使用超鏈接取得屬性
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <!-- 導入java.util包 --> <html> <head><title>www.mldnjava.cn,MLDN高端Java培訓</title></head> <body> <% // 設置request屬性範圍,此屬性只在伺服器跳轉中起作用 request.setAttribute("name","李興華") ; request.setAttribute("birthday",new Date()) ; %> <!-- 通過超鏈接跳轉之後,地址欄改變,屬於客戶端跳轉 --> <a href="request_demo02.jsp">通過超鏈接取得屬性</a> </body> </html>
request屬性範圍理解:
request表示客戶端的請求,正常情況下,一次請求伺服器只給一次回應;
如果是伺服器跳轉,地址欄沒有改變,則相當於回應了一次;
如果是地址欄變了,表示發送了第二次請求,則第一次請求的內容消失了,所以無法取得;
session:在一次會話中保存,無論如何跳轉(客戶端或服務端)都可以使用,但新開瀏覽器無法使用;
每一個新的瀏覽器連接上伺服器都是一個新的Session Id;
application:整個伺服器上保存,所有用戶都可以使用;
application範圍的屬性設置過多會影響伺服器的性能;
application範圍的屬性無論打開多少個瀏覽器都可以訪問到,如果伺服器重啟,則之前設置的全部屬性將消失。
深入page屬性範圍
設置屬性的方法:
public void setAttribute(String name,Object value,int scope) 設置屬性並保存範圍;
int scope:此變數可指定一個屬性的保存範圍;
在javax.servlet.jsp.pageContext類中,同樣存在4個表示屬性範圍的整形變數,通過這些整形變數在指定scope的內容;
public static final int PAGE_SCOPE 表示page屬性範圍,預設; public static final int REQUEST_SCOPE 表示request屬性範圍; public static final int SESSION_SCOPE 表示session屬性範圍; public static final int APPLICATION_SCOPE 表示application屬性範圍; eg: 表示request屬性範圍<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head><title>request屬性範圍</title></head> <body> <% // 設置屬性 pageContext.setAttribute("name","bugshi",PageContext.REQUEST_SCOPE) ; pageContext.setAttribute("birthday",new Date(),PageContext.REQUEST_SCOPE) ; %> <jsp:forward page="request_demo02.jsp"/> </body> </html>
pageContext對象可以設置任意範圍的屬性,而其它操作也只是對這一功能的在包裝而已;
但一般習慣於使用pageContext對象設置保存在一頁範圍的屬性,而很少使用pageContext設置其它範圍的屬性;
2 內置對象
2.1 request對象:使用最多的一個對象
作用:接收客戶端發送而來的請求信息,如請求的參數,發送的頭信息;
request是javax.servlet.http.HttpServletRequest介面的實例化對象,表示此對象應用在http協議上;
介面定義:public interface HttpServletRequest extends ServletRequest;
查詢request對象的方法除了要查詢HttpServletReques介面,也要查詢ServletRequest介面;
request內置對象常用方法:
亂碼解決:
瀏覽器的預設編碼為UTF-8,此時刻通過setCharacterEncoding()方法設置統計的編碼即可;
eg: setCharacterEncoding("GBK");
接收請求參數:
單一的參數都是使用getParameter()接收(如文本框,單選按鈕,密碼框,隱藏框);
一組參數要使用getParameterValues()接收(覆選框);
表單上的提交方式 get 和post:
get提交時,提交的內容會顯示在地址欄之後;與地址重寫的格式一樣,信息長度有限制,一般在大小為4~5KB的數據;
post提交時,提交的內容不會顯示在地址欄的後面;表單中有一些大文本或圖片數據時,則只能使用post方式提交;
getParameterNames()
此方法返回所有請求參數的名稱,返回值類型為Enumeration;
此介面實例需要使用hasMoreElements()方法判斷是否有內容及使用nextElement()方法取出內容;
request_demo03.html:多種類型的表單頁面,數據提交至request_demo03.jsp;
<html> <head><title>顯示多種類型的表單頁面</title></head> <body> <form action="request_demo03.jsp" method="post"> 姓名: <input type="text" name="uname"><br> 性別: <input type="radio" name="sex" value="男" CHECKED>男 <input type="radio" name="sex" value="女">女<br> 城市: <select name="city"> <option value="北京">北京</option> <option value="天津">天津</option> <option value="洛陽">洛陽</option> </select><br> 興趣: <input type="checkbox" name="**inst" value="唱歌">唱歌 <input type="checkbox" name="**inst" value="跳舞">跳舞 <input type="checkbox" name="**inst" value="游泳">游泳 <input type="checkbox" name="**inst" value="看書">看書 <input type="checkbox" name="**inst" value="旅游">旅游<br> 自我介紹:<textarea cols="30" rows="3" name="note"></textarea><br> <input type="hidden" name="uid" value="1"> <input type="submit" value="提交"> <input type="reset" value="重置"> </form> </body> </html>
request_demo03.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head><title>接收參數信息界面</title></head> <body> <% request.setCharacterEncoding("GBK") ;// 設置的是統一編碼 Enumeration enu = request.getParameterNames() ; %> <table border="1"> <tr> <td>參數名稱</td> <td>參數內容</td> </tr> <% while(enu.hasMoreElements()){ String paramName = (String) enu.nextElement() ; %> <tr> <td><%=paramName%></td> <td> <% if(paramName.startsWith("**")){ // 是以**開頭 String paramValue[] = request.getParameterValues(paramName) ; for(int x=0;x<paramValue.length;x++){ %> <%=paramValue[x]%>、 <% } } else { String paramValue = request.getParameter(paramName) ; %> <%=paramValue%> <% } %> </td> </tr> <% } %> </table> </body> </html>
顯示全部的頭信息
請求和響應的同時也包含一些其它的信息(如客戶端的IP,Cookie,語言等),這些額外的信息就是頭信息;
request內置對象的getHeaderNames()方法取得頭信息的名稱;
getHeader()方法取出每一個頭信息的內容;
request_demo04.jsp:取出頭信息的名稱及內容
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head><title>取出頭信息的名稱及內容</title></head> <body> <% Enumeration enu = request.getHeaderNames() ; // 取得全部的頭信息 while(enu.hasMoreElements()){ String headerName = (String) enu.nextElement() ; String headerValue = request.getHeader(headerName) ; %> <h5><%=headerName%> --> <%=headerValue%></h5> <% } %> </table> </body> </html>
其它操作
request取得客戶端的IP地址,訪問的路徑信息,提交的方式;
request_demo05.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head><title>request取得其它信息</title></head> <body> <% String method = request.getMethod() ; String ip = request.getRemoteAddr() ; String path = request.getServletPath() ; String contextPath = request.getContextPath() ; %> <h3>請求方式:<%=method%></h3> <h3>IP地址:<%=ip%></h3> <h3>訪問路徑:<%=path%></h3> <h3>上下文名稱:<%=contextPath%></h3> </table> </body> </html>
當伺服器端需要到請求客戶端的相關信息時就會使用request對象來完成;
2.2 response對象
作用:對客戶端的請求進行回應,將Web伺服器處理後的結果發回給客戶端;
response對象屬於javax.servlet.http.HttpServletResponse介面的實例;
介面定義:public interface HttpServletResponse extends ServletResponse;
response常用方法:
設置頭信息
response_demo01,jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>設置定時刷新的頭信息</title></head> <body> <%! // 定義全局變數 int count = 0 ; %> <% response.setHeader("refresh","2") ; // 頁面2秒一刷新 %> <h3>已經訪問了<%=count++%>次!</h3> </body> </html>
response_demo02.jsp:3秒後跳轉至其它頁面
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>3秒後跳轉其它頁面</title></head>