日期:2014-05-16 浏览次数:20467 次
一. 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不能同时存在;它们用来指定实例化的类名称或序列化模板;
如果确信JavaBe