1. 程式人生 > ><jsp:javabean>動作標簽實例

<jsp:javabean>動作標簽實例

== vat class har Coding 通過 ati 其他 chm

<jsp:javabean>動作標簽實例

之後補齊基礎知識

  1. scope屬性
    該屬性指定了所創建Bean實例的存取範圍,省略該屬性時的值為page.<jsp:useBean>標識被執行時,首先會在scope屬性指定的範圍來查找指定的Bean實例,如果該實例已經存在,則引用這個Bean,否則重新創建,並將其存儲在scope屬性指定的範圍內。
    scope屬性可選值如下
    • page:(當前頁面範圍)
      制定了所創建的Bean實例只能夠在當前的JSP文件中使用,包括在通過include指令靜態包含(實際上是一個頁面)的頁面中有效
    • request: (請求範圍[^1] )
      指定了所創建的Bean實例可以在請求範圍內進行存取。在請求被轉發至的目標頁面中可通過request對象的getAttribute("id屬性值")
      方法獲取創建的Bean實例。一個請求的生命周期是 從客戶端向服務器發出一個請求到服務器響應這個請求給用戶後 結束,所以請求結束後,存儲在其中的Bean的實例也就是失效了。
    • session:(一個用戶,多個頁面)
      指定了所創建的Bean實例的有效範圍為session.
      session是當用戶訪問Web應用時,服務器為用戶創建的一個對象,服務器通過session的ID值 來區分其他的用戶。針對某一個用戶而言, 在該範圍中的對象可被多個頁面共享。(購物車應用)
      可以使用session對象的getAttribute("id屬性值")方法獲取存儲在session中的Bean實例,也可以使用session對象的getValue("id屬性值")來獲取,但該方法不建議使用。
    • application:(多個用戶,多個頁面)
      該值指定了所創建的Bean實例的有效範圍從服務器啟動開始到服務器關閉結束。 application對象是在服務器啟動時創建的,它被多個用戶共享。所以訪問該application對象的所有用戶共享存儲於該對象中的Bean實例。 (瀏覽人數)
      可以使用application對象的getAttribute(“id屬性值”)方法獲取在application中的Bean實例

先放上本次實例
本次實例主要解決了 :
如果在session範圍和request範圍都存在名為car的ShopCar實例,而存儲在session範圍內的ShopCar實例是通過<jsp:useBean>標識創建的。那麽代碼中的<jsp:setProperty>標識會為哪個範圍中的ShopCar實例賦值呢?

實例工程架構如下
技術分享圖片
存在一個javaBean,關鍵代碼如下:

package com.bean;

public class ShopCar {
    
    private String name;
    private String maker;
    public ShopCar() {
        name = "noname";
        maker="noplace";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMaker() {
        return maker;
    }
    public void setMaker(String maker) {
        this.maker = maker;
    }
    
}

JavaBean:簡單說,它就是一個Java類,這個類可以重復地使用。

它必須遵循以下規定:

  • 是一個公有類。
  • 具有一個公有的不帶參數構造方法。
  • 每個屬性必須定義一組getXXX()和setXXX()方法, 以便讀取和存儲其屬性值。
  • 符合上述規定的JavaBean,將擁有:事件處理、自省機制、永續儲存等特性。
    參照博主

新建javabean1.jsp 文件:

 <!-- 導入ShopCar類 -->
<%@page import="com.bean.ShopCar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>第一種方法實例化javaBean</h2>
    <%
        ShopCar car = new ShopCar(); //創建一個javaBean ShopCar的實例
        session.setAttribute("car",car); //將創建的JavaBean實例存在session範圍內
        
    %>
    
    <h2>第二種方法實例化javaBean</h2>
    <%-- 這裏的id就是javaBean實例的名字 相當於ShopCar car = new ShopCar() 
    兩種方法作用一致 --%>
    <%--<jsp:useBean id="car" class="com.bean.ShopCar" scope="session"/> --%>
    <jsp:setProperty name="car" property="*"/>
    
    
    
    <%
        ShopCar r_car = new ShopCar();
        request.setAttribute("car", r_car);  //作用域範圍是request
    %>
    <jsp:setProperty name="car" property="name" value="Panax"/>
    <jsp:setProperty name="car" property="maker" value="JiLin"/>
    
    Request範圍內:<br>
    車名: <%=r_car.getName() %>
    地址:<%=r_car.getMaker() %>
    <br>
    Session範圍內:<br>
    車名: <%=car.getName() %>
    地址: <%=car.getMaker() %>
    
</body>
</html>

  • id指的是實例化的對象,class就是Java類。這一行相當於
    ShopCar car = new ShopCar();

  • name是對象,property是屬性,value是屬性的值。

==實驗結果==:
技術分享圖片

從結果得知:
<jsp:setProperty>標識被執行時,會按照page、request、session和application的順序來查找由name屬性指定的Bean實例,並且返回第一個被找到的實例;若任何範圍內不存在這個Bean實例,就會拋出異常
[^1]:客戶端和服務器的一次通信就是一次請求(發送請求或得到相應)

<jsp:javabean>動作標簽實例