现在的位置: 首页 > 综合 > 正文

jsp:useBean 中type、class和beanName

2012年09月03日 ⁄ 综合 ⁄ 共 1332字 ⁄ 字号 评论关闭

网上的解释是:
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时,它只是查找指定的范围中是否存在,在不存在时又没使用classbeanName 指定type就会抛出异常,因此在使用type时就需要注意这点。

并且class与beanName 必须指定package (即使引入了包),而type可以不指定。

抱歉!评论已关闭.