網上的解釋是:
class="package.class"
使用new關鍵字以及class構造器從一個class中樣本一個bean.這個class不能是抽象的,必須有一個公用的,沒有參數的構造器.這個package的名字區別大小寫。
type="package.class"
如果這個Bean已經在指定的範圍中存在,那麼寫這個Bean一個新的資料庫類型 。如果你沒有使用class或beanName指定type,Bean將不會被樣本.package和class的名字,區分大小寫.
beanName="{package.class | <%= expression %>}" type="package.class"
使用java.beans.Beans.instantiate方法來從一個class或連續模版中樣本一個Bean,同時指定Bean的類型。beanName可以是package和class也可以是運算式,它的值會傳給Beans.instantiate.tupe的值可以和Bean相同。
經實驗後,我的理解:
下面兩種寫法的意義是相同的:
<%
//check session to see if there's a cart in it;
Cart cart = (Cart)session.getAttribute("cart");
if(cart==null){
cart = new Cart();
session.setAttribute("cart",cart);
}
%>
第一種:
<jsp:useBean id="cart" class="com.shopping.user.Cart" scope="session"></jsp:useBean>
第二種:
<jsp:useBean id="cart" type="com.shopping.user.Cart" scope="session"></jsp:useBean>
假如:當前cart!=null兩者視乎沒什麼區別,若使用session.setAttribute("cart",null);設定後,在訪問包含有<jsp:useBean id="cart" type="com.shopping.user.Cart" scope="session"></jsp:useBean>--- jsp action語句的頁面時就會拋出異常(org.apache.jasper.JasperException: bean cart not found within scope)。而使用<jsp:useBean
id="cart" class="com.shopping.user.Cart" scope="session"></jsp:useBean>不會拋異常,那麼第二種寫法,應是與第一種寫法意義是相同的。//為什麼相同
也就是說使用class時,它是先判斷拿不拿得到執行個體的bean,若拿不到就使用new關鍵字執行個體化一個,而使用的是type時,它只是尋找指定的範圍中是否存在,在不存在時又沒使用class,beanName 指定type,就會拋出異常,因此在使用type時就需要注意這點。
並且class與beanName 必須指定package (即使引入了包),而type可以不指定。