网上的解释是:
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可以不指定。