jsp之javaweb在學習
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>