JSP總結二(動作元素)

  • 2019 年 12 月 31 日
  • 筆記

文章目錄

  1. 1. JSP總結二(動作元素)
    1. 1.1.
    2. 1.2.
    3. 1.3.
    4. 1.4. JavaBean的存活範圍
      1. 1.4.1. 在page範圍
      2. 1.4.2. 在request範圍
      3. 1.4.3. 在session範圍內
      4. 1.4.4. 在application範圍內
      5. 1.4.5. 重要的屬性
    5. 1.5. 參考文章

JSP總結二(動作元素)

<jsp:include>

前面介紹了一種指令元素include,那是一種靜態包含JSP文件,這個標籤是動態包含一個JSP頁面,也就是被包含的JSP頁面和原JSP將合併在一起,轉譯為一個Servlet類。這是有一定的局限性的,如變數的定義不能重複。 動態的包含JSP文件即是被包含的JSP和原JSP分別轉譯為一個Servlet類,這就保證了其中的變數可以重複定義了,因為並不是在一個類中了 <jsp:include page="相對的文件路徑"></jsp:include>這種標籤轉譯為Servlet和指令元素include是一樣的

<%--動態導入在編譯的時候是兩個jsp文件各自編譯成一個Servlet文件,因此其中的變數是不可以共享的,在當前頁面中還是可以定義導入頁面定義的變數 --%>  <jsp:include page="form.jsp">      //定義的param可以在form.jsp中使用request.getParameter(String name)取得其中的值      <jsp:param value="陳加兵" name="username"/>      <jsp:param value="123456" name="password"/>  </jsp:include>

<jsp:forward>

這是將請求轉發給另外一個JSP或者Servlet文件處理,這個和RequestDispatcher是一樣的原理,就是Servlet中轉發 //綁定屬性,在login.jsp中可以獲取 request.setAttribute("username","陳加兵"); //當前頁面的請求將會交給login.jsp文件處理 <jsp:forward page='login.jsp'></jsp:forward>

<jsp:useBean>

這個動作元素是用來搭配JavaBean組件的標準標籤。 JavaBean必須滿足下面的條件:

  • 必須實現Java.io.Serializable介面
  • 沒有公開的(public)類變數
  • 具有無參構造函數(默認的都有)
  • 具有公開的設置方法(setter)與取值方法(getter

下面就是一個JavaBean組件

package com;    import java.io.Serializable;    public class Person implements Serializable {        //這裡的變數的值一定要和表單的中的name屬性的值一樣,否則不能獲取  	private String username;  	private String password;  	private int age;    	public String getUsername() {  		return username;  	}    	public void setUsername(String username) {  		this.username = username;  	}    	public String getPassword() {  		return password;  	}    	public void setPassword(String password) {  		this.password = password;  	}    	public int getAge() {  		return age;  	}    	public void setAge(int age) {  		this.age = age;  	}    	public Boolean Checkout(){  		return "陳加兵".equals(username)&&"123456".equals(password);  	}    }

使用JavaBean的目的是減少Scriptlet的使用。其中搭配<jsp:useBean>來使用這個JavaBean,並且使用<jsp:setProperty><jsp:getProperty>javaBean進行設值與取值 注意javaBean一定要搭配表單使用,因為設值的值其實是隱式的調用request.getParameter(String name)來獲取表單的值 下面是一個登錄的表單(注意這裡的input中的name屬性的值一定要和JavaBean組件類的成員變數的名字一樣)

<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  <title>Insert title here</title>  </head>  <body>    <!--提交給Demo1.jsp處理,下面就實現Demo1.jsp-->  <form action="Demo1.jsp">  	<label>姓名:</label>  	<input type="text" name="username">  	<label>密碼:</label>  	<input type="password" name="password">  	<input type="submit" value="提交">  </form>    </body>  </html>

下面我們寫一個JSP文件設置JavaBean

<%@ page language="java" contentType="text/html; charset=UTF-8"  	pageEncoding="UTF-8"%>  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  <title>Insert title here</title>  </head>  <body>    	<%--使用JavaBean person是Person創建的對象,相當於 Person person=new Person()  		其中class是JavaBean的類所在的路徑(在com包下的Person文件中)  		id就是相當於創建的對象  	--%>  	<jsp:useBean id="person" class="com.Person"></jsp:useBean>    	<%--為username和password設置值,相當於下面的語句  	person.setUsername(request.getParameter("username"));  	person.setPassword(request.getParameter("password"));  	JavaBean中的變數一定要和表單中的值一樣,否則就不能對應,出現錯誤  	其中name就是指定上面的id,即是使用的對象,property就是指定變數  	--%>    	<jsp:setProperty property="uesrname" name="person"/>  	<jsp:setProperty property="password" name="person"/>    	<%--age是另外的變數,並沒有對應著表單的name屬性,因此我們可以單獨的為其設置值,使用value實行即可設置,這裡不必考慮類型,因為在內部會自動轉換成JavaBean中的類型 --%>  	<jsp:setProperty property="age" name="person" value="20"/>    	<%--獲取設置的值,相當於下面的語句:  		person.getUsername();  		person.getPassword();  		person.getAge();  	 --%>  	<h1><jsp:getProperty property="username" name="person" /></h1>  	<h1><jsp:getProperty property="password" name="person" /></h1>  	<h1><jsp:getProperty property="age" name="person" /></h1>    </body>  </html>

其實我們還可以不但可以將表單中的值賦值給變數,還可以使用valueparam自己設置

<%-- 將請求的url中的password的值賦值給username,注意這裡的使用的get的請求的話,提交的時候url會有請求值的  		http://localhost:8080/web2/JSP/Demo1.jsp?username=%E9%99%88%E5%8A%A0%E5%85%B5&password=123456  	 --%>  	<jsp:setProperty property="username" name="person" param="password"/>        <%--age是另外的變數,並沒有對應著表單的name屬性,因此我們可以單獨的為其設置值,使用value實行即可設置,這裡不必考慮類型,因為在內部會自動轉換成JavaBean中的類型 --%>  	<jsp:setProperty property="age" name="person" value="20"/>

JavaBean的存活範圍

Scope屬性決定了javabean對象的存在的範圍。可選值有:

  1. page(默認值)
  2. request
  3. session
  4. application
<jsp:useBean id="person" class="com.anllin.bean.Person" scope="page"></jsp:useBean>

在page範圍

客戶每次請求訪問jsp頁面時,都會創建一個javabean對象。JavaBean對象的有效範圍就是當前的jsp文件中,如果不在當前Jsp中,那麼就不可以使用該JavaBean對象中設置的值 比如使用forward轉發給另外一個JSP文件,那麼此時就會再創建一個JavaBean對象,原來頁面的JavaBean對象並沒有傳過來,也就不能使用其中的值,這個和變數的共享是一個道理的,這個JavaBean對象只能在當前的Jsp文件中調用,不能實現共享

在request範圍

客戶每次請求訪問jsp頁面時,都會創建新的javabean對象。有效範圍為:

  • 客戶請求訪問的當前jsp網頁。
  • 和當前網頁共享一個客戶請求的網頁,即當前jsp網頁中<%@include %>指令以及<forward>標記包含的其他jsp文件,也就是轉發和包含的Jsp文件也是可以共享這個JavaBean對象的,這個和Servlet中的request是一樣的,一旦轉發了,就可以通過setAttribute()設置屬性,那麼在轉發的頁面中就可以訪問這個屬性
  • 當所有共享同一個客戶請求的jsp頁面執行完畢並向客戶端發加響應時,javabean對象結束生命周期。
  • javabean對象作為屬性保存在httpServletRequest對象中,屬性名javabean的id,屬性值為javabean對象,因此可以通過HttpRequest.getAttribute()方法取得javabean對象
    //Demo1.jsp文件  表單請求提交的JSp文件      <%@ page language="java" contentType="text/html; charset=UTF-8"  	pageEncoding="UTF-8"%>      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">      <html>      <head>      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">      <title>Insert title here</title>      </head>      <body>        <%--設置scope屬性為request,這個是必須的,這裡的JavaBean對象為person--%>  	<jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean>    	<jsp:setProperty property="uesrname" name="person"/>  	<jsp:setProperty property="password" name="person"/>    	<jsp:setProperty property="age" name="person" value="20"/>  >  e      <%--轉發請求到Demo2.jsp文件中,那麼就可以在Demo.jsp中共享person對象了--%>      <jsp:forward page="Demo2.jsp"></jsp:forward>    </body>  </html>      //Demo2.jsp          <%@page import="com.Person"%>      <%@ page language="java" contentType="text/html; charset=UTF-8"          pageEncoding="UTF-8"%>      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">      <html>      <head>      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">      <title>Insert title here</title>      </head>      <body>        <%-- 使用JavaBean,這裡的scope是必須的,一定要和Demo1.jsp一樣,id也要一樣 --%>      <jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean>          <%--獲取username的值 --%>      <jsp:getProperty property="username" name="person"/>        <%          //使用HttpServletRequest獲取對象person          Person p=(Person)request.getAttribute("person");          out.println(p.getUsername());  //獲取username的值      %>        </body>      </html>

在session範圍內

  • 我們知道HttpSession是可以在會話期間實現數據共享的,只要是同一個項目中的Jsp文件都是可以共享這個JavaBean對象,但是並不是永久的,因為會話也是有時間限制的,
  • javabean對象作為屬性保存在HttpSession對象中,屬性名為javabean的id,屬性值為javabean對象。除了可以通過javabean的id直接引用javabean對象外,也可以通過HttpSession.getAttribute()方法取得javabean對象
  • 一定要注意在每一個<jsp:useBean>中都要寫上scope="session"

在application範圍內

  • 我們知道ServletContext存在於整個web應用的生命周期,這個不像session,一旦設置的會話時間結束,那麼就不存在了,這個是永遠存在的,只要web程式在繼續
  • javabean對象作為屬性保存在application對象中,屬性名為javabean的id,屬性值為javabean對象,除了可以通過javabean的id直接引用對象外,也可以通過javabean的application.getAttribute()方法取得javabean對象

重要的屬性

其實不僅僅可以對於表單中請求可以轉換為對象的值,上面我們說過了存活範圍,其實只要在這個請求範圍內,並且將對象綁定到響應的屬性上面,那麼就可以在jsp文件中使用改標籤接收其值。 其實一般在表單提交之後,我們會使用Sevlet文件驗證是否密碼和用戶名正確,那麼就不是直接提交給jsp文件,此時就像上面說過的,不影響標籤的使用,只要將JavaBean對象綁定到響應範圍的屬性上,便是可以實現對象的共享,程式碼如下: ServletDemo文件

package com;    import java.io.IOException;  import java.io.PrintWriter;    import javax.servlet.RequestDispatcher;  import javax.servlet.ServletException;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;    public class ServletDemo extends HttpServlet {    	public void doGet(HttpServletRequest request, HttpServletResponse response)  			throws ServletException, IOException {  		//創建對象,並且設置值  			Person person=new Person();  			person.setUsername("陳加兵");  			person.setPassword("123456");    			//將JavaBean對象綁定到request上,相當於存活範圍為request  			//注意這裡的鍵值一定要是和對象的名稱一樣,否則不行  			request.setAttribute("person", person);  			//轉發請求到jsp文件,下面我們就將在jsp文件中使用JavaBean標籤接收  			RequestDispatcher dispatcher=request.getRequestDispatcher("JSP/demo1.jsp");  			dispatcher.forward(request, response);  	}      	public void doPost(HttpServletRequest request, HttpServletResponse response)  			throws ServletException, IOException {    	}      }

demo1.jsp:上面文件轉發過來的,接收JavaBean對象

<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  <title>Insert title here</title>  </head>  <body>    <%-- 使用標籤接收轉發過來的JavaBean對象,scope一定要設置為request,id就是傳過來的對象,一定要和前面的名稱一樣,下面的語句相當於:  	Person person=(Person)request.getAttribute("person");   --%>  <jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean>    <h1><jsp:getProperty property="username" name="person"/></h1>  </body>  </html>

參考文章

http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html