1. 程式人生 > >jsp之javaweb在學習

jsp之javaweb在學習

Jsp內建物件

  • request物件

客戶端的請求資訊被封裝在request物件中,通過它才能瞭解到客戶的需求,然後做出響應。它是HttpServletRequest類的例項。request物件具有請求域,即完成客戶端的請求之前,該物件一直有效。常用方法如下:

  1. String getParameter(String name) 返回name指定引數的引數值
  2. String[] getParameterValues(String name) 返回包含引數name的所有值的陣列
  3. void setAttribute(String, Object) 儲存此請求中的屬性
  4. Object getAttribute(String name) 返回指定屬性的屬性值
  5. String getContentType() 得到請求體的MIME型別
  6. String getProtocol() 返回請求用的協議型別及版本號
  7. 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物件常用方法

  1. long getCreationTime() 返回Session建立時間
  2. String getId() 返回session建立時Jsp引擎為它設定的唯一ID號
  3. void setAttribute(String name, Object value) 使用指定名稱將物件繫結到此會話
  4. Object getAttribute(String name) 返回與此會話中的指定名稱繫結在一起的物件,如果沒有物件繫結在該名稱下,則返回null。
  5. String[] getValueNames() 返回一個包含此session中所有可用屬性的陣列
  6. void setMaxInactiveInterval(int max) 設定session最大生存期限(單位秒)
  7. 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仍然存在於伺服器,只不過再也沒有客戶端會攜帶它然後交於伺服器校驗。

銷燬

  1. 呼叫session.invalidate()方法
  2. session過期(Tomcat預設超時時間為30分鐘)
  3. 伺服器重新啟動
  • 實現使用者登入(不帶資料庫的)

使用者名稱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>