Jsp內置對象
- request對象
客戶端的請求信息被封裝在request對象中,通過它才能瞭解到客戶的需求,然後做出響應。它是HttpServletRequest類的實例。request對象具有請求域,即完成客戶端的請求之前,該對象一直有效。常用方法如下:
- String getParameter(String name) 返回name指定參數的參數值
- String[] getParameterValues(String name) 返回包含參數name的所有值的數組
- void setAttribute(String, Object) 存儲此請求中的屬性
- Object getAttribute(String name) 返回指定屬性的屬性值
- String getContentType() 得到請求體的MIME類型
- String getProtocol() 返回請求用的協議類型及版本號
- String getServerName() 返回接收請求的服務器主機名
--
用戶註冊表單
<body>
<h1>用戶註冊</h1>
<hr>
<form name="regForm" action="request.jsp" method="post"">
<table>
<tr>
<td>用戶名</td>
<td><input type="text" name="username"> </td>
</tr>
<tr>
<td>
<input type="checkbox" name="favorite" value="read"> 讀書
<input type="checkbox" name="favorite" value="music"> 音樂
<input type="checkbox" name="favorite" value="movie"> 電影
<input type="checkbox" name="favorite" value="internet"> 上網
</td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="提交"> </td>
</tr>
</table>
</form>
</body>
request.jsp
<body>
<h1>request內置對象</h1>
<%
request.setCharacterEncoding("utf-8"); //解決中文亂碼
%>
用戶名:<%= request.getParameter("username") %><br>
愛好:<%
String[] favor = request.getParameterValues("favorite");
for(int i=0; i<favor.length; i++){
out.println(favor[i]+" ");
}
%><br>
請求體的MIME類型:<%= request.getContentType() %><br>
協議類型及版本號:<%= request.getProtocol() %><br>
服務器主機名:<%= request.getServerName() %><br>
服務器端口號:<%= request.getServerPort() %><br>
請求客戶端的IP地址:<%= request.getRemoteAddr() %><br>
請求的真實路徑:<%= request.getRealPath("request.jsp") %><br>
</body>
- response對象
response對象包含了響應客戶請求的有關信息,但在Jsp中很少直接用到它。它是HttpServletResponse類的實例。response對象具有頁面作用域,即訪問一個頁面時,該頁面內的response對象只能對這次訪問有效,其它頁面的response對象對當前頁面無效
常用方法如下:
1. String getCharacterEncoding() 返回響應用的是何種字符編碼
2. void setContentType(String type) 設置響應的MIME類型
3. PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象
4. sendRedirect(java.lang.String.location) 重新定向客戶端的請求
- 請求轉發與請求重定向
請求重定性
客戶端行爲,response.sendRedirect(),從本質上講等同於兩次請求,第一次請求對象不會保存,地址欄的URL地址會改變。
轉發請求
服務器行爲,request.getRequestDispatcher().forward(req,resp)是一次請求,轉發後請求對象會保存,地址欄的URL地址不會改變。
例如:
login.jsp
response.jsp
<%
response.setContentType("text/html;charset=utf-8");
out.println("<h1>response內置對象<h1>");
//請求重定向
//response.sendRedirect("request.jsp");
//請求轉發
//request.getRequestDispatcher("request.jsp").forward(request, response);
%>
request.jsp
- session
session表示客戶端與服務器的一次會話
Web中的session指的是用戶在遊覽某個網站時,從進入網站到遊覽器關閉所經過的這段時間,也就是用戶遊覽這個網站所花費的時間從上述定義中可以看到,session實際上是一個特定的時間概念
- session對象
session對象是一個Jsp內置對象。
session對象在第一個Jsp頁面被裝載時自動創建,完成會話期管理。
從一個客戶打開遊覽器並連接服務器開始,到客戶關閉遊覽器離開這個服務結束,被稱爲一個會話。
當一個客戶訪問一個服務器時,可能會在服務器的幾個頁面之間切換,服務器應當通過某種辦法知道這是一個客戶,就需要session對象。
session對象是HttpSession類的實例。session對象常用方法
- long getCreationTime() 返回Session創建時間
- String getId() 返回session創建時Jsp引擎爲它設置的唯一ID號
- void setAttribute(String name, Object value) 使用指定名稱將對象綁定到此會話
- Object getAttribute(String name) 返回與此會話中的指定名稱綁定在一起的對象,如果沒有對象綁定在該名稱下,則返回null。
- String[] getValueNames() 返回一個包含此session中所有可用屬性的數組
- void setMaxInactiveInterval(int max) 設置session最大生存期限(單位秒)
- int getMaxInactiveInterval() 返回兩次請求間隔多長時間此session被取消(單位秒)
--
例如
session_page01.jsp
<h1> session 內置對象</h1> <% SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); session.setAttribute("username", "Jack"); session.setAttribute("password", "11111"); //設置當前session最大生存期限單位是秒 session.setMaxInactiveInterval(5); %> session創建時間<%=sdf.format(session.getCreationTime()) %> <br> session的ID編號<%=session.getId() %> <br> 從session中獲取用戶名:<%=session.getAttribute("username") %> <br> <a href="session_page02.jsp">跳轉到session_page02</a> <br>
session_page02.jsp
<h1>session內置對象</h1> session的ID編號<%= session.getId() %> <br> 從session中獲取用戶名:<%=session.getAttribute("username") %> <br> session中保存的屬性有:<% String names[] = session.getValueNames(); for(int i=0; i<names.length; i++){ out.println(names[i] + " "); } %><br>
- session生命週期
創建
當客戶端第一次訪問某個Jsp或者Servlet時候,服務器會爲當前會話創建一個sessionId,每次客戶端向服務器發送請求時,都會將此sessionId攜帶過去,服務端會對此sessionId進行校驗。
活動
- 某次會話當中通過超鏈接打開的新頁面屬於同一次會話
- 只要當前會話頁面沒有全部關閉,重新打開新的遊覽器窗口訪問同一項目資源時屬於同一次會話。
- 除非本次會話的所有頁面都關閉後再重新訪問某個Jsp或者Servlet將會創建新的會話。
- 注意原有會話還存在,只是這個舊的sessionId仍然存在於服務器,只不過再也沒有客戶端會攜帶它然後交於服務器校驗。
銷燬
- 調用session.invalidate()方法
- session過期(Tomcat默認超時時間爲30分鐘)
- 服務器重新啓動
- 實現用戶登錄(不帶數據庫的)
用戶名admin,密碼admin,登錄成功使用服務器內部轉發到login_success.jsp頁面,並且提示登錄成功的用戶名。如果登錄失敗,則請求重定向到login_failure.jsp頁面。
login.jsp
<body> <h1>用戶登錄</h1> <hr> <form action="dologin.jsp" name="loginForm" method="post"> <table> <tr> <td>用戶名:</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>密碼:</td> <td><input type="password"" name="password"></td> </tr> <tr> <td colspan="2"><input type="submit" value="登錄"> </td> </tr> </table> </form> </body>
dologin.jsp
<% String userName = request.getParameter("userName"); String password = request.getParameter("password"); if("admin".equals(userName) && "admin".equals(password)){ session.setAttribute("user", "admin"); //服務器內部轉發 request.getRequestDispatcher("login_success.jsp").forward(request, response); }else{ //請求重定向 response.sendRedirect("login_fail.jsp"); } %>
login_success.jsp
<body> <% String user = ""; if(session.getAttribute("user") != null){ user = session.getAttribute("user").toString(); } %> <h1>歡迎<font color="red"><%= user %> </font>登陸成功</h1> </body>
login_fail.jsp
<body> <h1>登陸失敗,請檢查</h1> <a href="login.jsp">返回</a> </body>