jsp:useBean 中type、class和beanName

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值