<jsp:useBean>元素使用详解

一. JSP动作元素useBean语法:

    <jsp:useBean 
        id="beanInstanceName" 
        scope="page | request | session | application" 
        { 
            class="package.class" | 
            type="package.class" | 
            class="package.class" type="package.class" | 
            beanName="{package.class | <%= expression %>}"
type="package.class" 
        } 
  </jsp:useBean> 
       

二. JSP动作元素useBean使用示例:

<jsp:useBean id="cart" scope="session" class="session.Carts" /> 
<jsp:setProperty name="cart" property="*" /> 

<jsp:useBean id="checking" scope="session" class="bank.Checking" > 
<jsp:setProperty name="checking" property="balance" value="0.0" /> 
</jsp:useBean>

 

上面两种使用方式都可以,但是两种还是有差别的。

第一种的话,不管在session里面是否存在了Bean的实例,下面的<jsp:setProperty name="cart" property="*" /> 都会被

执行的

第二种的话,如果在session里面存在了Bean的实例,中间的<jsp:setProperty name="checking" property="balance" value="0.0" /> 是不会被执行的,意思就是说,中间的语句只有在Bean第一次被实例化的时候才会调用

三. <jsp:useBean>元素各属性解析
        
1. class="package.class" 

        必须是严格的package.class,即不能指定其父类
        
2. type="package.class" 

 

    可以指定其父类或接口的类型,譬如我是想实例化ArrayList,但是type我可以填List

 

3.class="package.class" type="package.class" 

  先创建一个type的实例,赋值null,然后在scope内查找这个实例,如果找不到则new一个


4. beanName="{package.class | <%= expression %>}" type="package.class" 

先创建一个type的实例,赋值null,然后在scope内查找这个实例,如果找不到则通过instantiate()方法

实例化一个类


四. JSP动作元素useBean使用剖析: 

对于<jsp:useBean>执行步骤的理解,我们可以通过阅读JSP转化成的Servlet源码
完成。以下给出二段示意代码, 可参阅之前步骤进行深化理解:

1) 通过beanName指定要实例化的JavaBean类名:

JSP源码 :
------------------------------------
-------
<jsp:useBean id="u" type="bean.User" beanName="bean.User"/>

JSP转译成Servlet的源码 :
------------------------------------
-------
      bean.User u = null;
      synchronized (_jspx_page_context) {
        u = (bean.User) _jspx_page_context.getAttribute("u",
PageContext.PAGE_SCOPE);
        if (u == null){
          try {
            u = (bean.User)
java.beans.Beans.instantiate(this.getClass().getClassLoader(),
"bean.User");
          } catch (ClassNotFoundException exc) {
            throw new InstantiationException(exc.getMessage());
          } catch (Exception exc) {
            throw new ServletException("Cannot create bean of class " +
"bean.User", exc);
          }
          _jspx_page_context.setAttribute("u", u,
PageContext.PAGE_SCOPE);
        }
      }

2) 通过class指定要实例化的JavaBean类名:

JSP源码 :
------------------------------------
-------
<jsp:useBean id="u" type="bean.User" class="bean.User"/>

JSP转译成Servlet的源码 :
------------------------------------
-------
      bean.User u = null;
      synchronized (_jspx_page_context) {
        u = (bean.User) _jspx_page_context.getAttribute("u",
PageContext.PAGE_SCOPE);
        if (u == null){
          u = new bean.User();
          _jspx_page_context.setAttribute("u", u,
PageContext.PAGE_SCOPE);
        }
      }

五. 注意几点: 

1) class或beanName不能同时存在;它们用来指定实例化的类名称或序列化模板;
如果确信JavaBean对象已存在,class和beanName属性均可无须指定, 可只须指定
type属性。
2) class可以省去type独自存在,beanName必须和type一起使用;
3) class指定的是类名,beanName指定的是类名或序列化模板的名称;
4) class指定的类名必须包含public、无参的构造方法;在对象已实例化时,
beanName指定的名称可以为其接口、父类;

5) 如果JavaBean对象已存在,<jsp:useBean>只是用来定位JavaBean,则只需使用
type属性即可,class和beanName这时舍去不影响使用。
6) class或beanName指定的类名必须包括包名称,type可以省去包名,通过<%
@page import=""%>指定所属包亦可。
7) class通过new创建JavaBean对象;beanName通过
java.beans.Beans.instantiate初始化JavaBean对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值