`
daibalusu
  • 浏览: 344965 次
文章分类
社区版块
存档分类
最新评论

jsp useBean元素使用全解

 
阅读更多

【前言】抬头仰望活在网络上的各位牛人们,是他们让我学习到很多新的东西,也让我明白了学无止境

【原文】

http://turingbook.group.javaeye.com/group/blog/577256

http://www.wang48.com/jishubaodianview/?jsd_id=201

jsp:useBean动作用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。

一. 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"
}
{
/> |
> other elements </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>

这些代码的含义是:“创建一个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变量上,当该javabean不存在时,就执行蓝色的body部分;当该javabean已经创建时,就不执行蓝色的body部分”。此时,jsp:useBean动作只有在不存在同样id和scope的Bean时才创建新的对象实例,同时,获得现有Bean的引用就变得很有必要。

获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进行,也可以在Scriptlet中利用id属性所命名的对象变量,通过调用该对象的方法显式地修改其属性。这使我们想起,当我们说“某个Bean有一个类型为X的属性foo”时,就意味着“这个类有一个返回值类型为X的getFoo方法,还有一个setFoo方法以X类型的值为参数”。



三. JSP动作元素useBean执行步骤:

<jsp:useBean>元素用来定位或初始化一个JavaBeans组件。(注解,这个标签有两个作用)。<jsp:useBean>首先会尝试定位Bean实例,如果其不存在,则会依据class名称(class属性指定)或序列化模板(beanName属性指定)进行实例化。

进行定位或初始化Bean对象时,<jsp:useBean>按照以下步骤执行。

步骤1: 尝试在scope属性指定的作用域使用你指定的名称(id属性值)定位Bean对象;(注解,由scope和id共同决定)
步骤2: 使用你指定的名称(id属性值)定义一个引用类型变量;
步骤3: 假如找到Bean对象,将其引用给步骤2定义的变量。假如你指定类型(type属性),赋予该Bean对象该类型;
步骤4: 假如没找到,则实例化一个新的Bean对象,并将其引用给步骤2定义的变量。假如该类名(由beanName属性指定的类名)代表的是一个序列化模板(serialized template),该Bean对象由java.beans.Beans.instantiate初始化;
步骤5: 假如<jsp:useBean>此次是实例化Bean对象而不是定位Bean对象,且它有体标记(body tags)或元素(位于<jsp:useBean>和</jsp:useBean>之间的内容,则执行该体标记。

<jsp:useBean>和</jsp:useBean>之间经常包含<jsp:setProperty>,用来设置该Bean的属性值。正如步骤5所描述的,该元素仅在<jsp:useBean>实例化Bean对象时处理。假如Bean对象早已存在,<jsp:useBean>是定位到它,则体标记毫无用处。

我们可以使用<jsp:useBean>元素来定位或实例化一个JavaBean对象,但不能是
EJB。对于EJB,我们可以通过创建自定义标记来直接调用彧采用其它方式。

四. <jsp:useBean>元素各属性解析:

1. id="beanInstanceName"

一个用来标识你指定作用域的变量。可以在JSP文件的表达式或脚本小应
用程序中使用该变量名称。

该名称大小写敏感,必须符合JSP页面中脚本语言的命名规则。假如你使
用的是Java语言,则该名称遵守的是Java命名规范。假如该Bean对象已由
其它<jsp:useBean>元素创建,则该值必须和实例化该Bean对象
的<jsp:useBean>元素id属性值一致,才能实现定位到该Bean对象。

2. scope="page | request | session | application"

Bean对象存在的作用范围,默认值为 page. 不同作用域解释如下:(注解,访问范围由小到大)


1) page: 你可以在<jsp:useBean>元素所在JSP页面或其静态包含页面使
用该JavaBean对象,直到该页面发送响应回客户端或跳转(forwards)至其
它页面。

2) request: 你可以在处理同一个请求的任意一个页面使用该JavaBean对
象,直到该页面发送响应回客户端或产生新的请求。你可以使用request
对象访问该JavaBean对象,示例:
request.getAttribute(beanInstanceName).

3) session: 你可以在同一次会话的任意一个页面使用该JavaBean对象,该
JavaBean对象在整个会话期间一直存在。

使用<jsp:useBean/>创建JavaBean对象的页面的<%@page %>指令元

素的session属性值必须设置为true;

4) application: 你可以在创建该JavaBean对象的同一个应用的任意一个页面
使用该JavaBean对象,该JavaBean对象在整个应用期间一直存在。应用中任

意一个页面均可使用它。

3. class="package.class"


从一个class实例化Bean对象,使用new关键字调用class的构造方法完
成。
该 class 必须不能是抽象必须有一个 public、无参的构造器。包名和
类名称大小写敏感。

4. type="package.class"

用来指定该Bean对象的数据类型,假如既没有指定 class 或 beanBean, 没
有Bean对象能被实例化。包和类名称大小写敏感。它必须是Bean类的名字、超

类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。

5. class="package.class" type="package.class"


使用class属性指定的类实例化JavaBean对象,并声明其数据类型为type
属性指定的类型;type属性值可和class属性值同,或为其超类、接口。

class属性中所指定类名称必须不能为抽象的,必须包含有public,无参的
构造方法。class和type属性所指定的包名,类名均大小写敏感。

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

使用java.beans.Beans.instantiate方法实例化beanName属性指定的类或序列
化模板对应的Bean对象,赋予JavaBean对象type属性指定的数据类型。
Beans.instantiate方法会检查beanName属性指定的名称是类名称还是序列化模板
的名称。假如该JavaBean对象已被序列化,则Beans.instantiate使用类加载器读
取序列化的内容,更多信息可参考JavaBeans.

beanName属性值要么是一个完整类名,要么是一个可以转化为完整类名的表达式。
用来传给Beans.instantiate方法。type属性值可和beanName属性值同,或为其超
类、接口。

beanName和type属性所指定的包名,类名均大小写敏感。

五. 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); //注解,这个是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(); //注解,这个直接用new创建bean
_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对象。

8) jsp:useBean并非总是意味着创建一个新的Bean实例。

分享到:
评论

相关推荐

    jsp事例jsp usebean session

    jsp设计事例jsp usebean session

    JSP useBean连接 Access 数据库,不使用数据源

    JSP useBean连接 Access 数据库,不使用数据源

    JavaWeb开发技术-JSP动作元素.pptx

    在JSP页面和文档中使用写入文本的模板 在JSP页面中,为了把其他资源的输出内容插入到当前JSP页面的输出内容中,JSP技术提供了&lt;jsp:include&gt;动作元素。其语法格式为: &lt;jsp:include page="relativeURL" flush="true|...

    JSP+UseBean网上购书系统

    这是一个我自己用JSP+USEBEAN写的系统,

    jsp+servlet+usebean实现MVC

    jsp+servlet+usebean实现MVC

    JSP之访问JavaBean的一个简单例子

    JSP之访问JavaBean的一个简单例子 使用useBean,jsp:setProperty,jsp:getProperty使用的一个简单例子 博客参考地址:https://blog.csdn.net/qq_36631076/article/details/79693890

    jsp标准动作

    详细介绍了jsp标准动作各个标记及其属性的使用方法。

    usebean.jsp

    usebean.jsp

    jsp中文乱码问题jsp中文乱码问题详解

    对常见中文乱码问题进行了详细介绍和解释,希望能给大家以帮助。

    JSP 动作元素

    JSP 动作元素 与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。 利用JSP动作可以动态地插入文件、...jsp:useBean 寻找或者实例化一个JavaBean。 jsp:setProperty 设置Jav

    JSP程序设计与案例实战

    exception)、JavaBean组件、JSP标准动作(&lt;jsp:forward&gt;,&lt;jsp:param&gt;,&lt;jsp:setProperty&gt;,&lt;jsp:plugin&gt;,&lt;jsp:include&gt;,&lt;jsp:useBean&gt;,&lt;jsp:getProperty&gt;)、JSP中使用数据库(JDBC常用API)、JSTL的配置步骤、核心...

    JAVA/JSP 题库

    JAVA程序员JSP开发员面试必备的宝典。面向职场的高级宝典。

    JSP 程序设计从入门到精通 PDF 教程

     1.3.1 JSP页面中的元素 14  1.3.2 JSP语法概要 15  1.3.3关于模板文本(静态HTML) 16  1.4 运行第一个Jsp程序 16  1. 5本章小结 20  第2章Jsp 基础学习 20  2.1 JSP基本语法 20  2.1.1 JSP 语法之...

    JSP期末考试试题及答案

    1)在JSP中,要定义一个方法,需要用到以下()元素。(选择一项) a) &lt;%= %&gt; b) c) ! %&gt; d) 2)JSP页面经过编译之后,将创建一个()。(选择一项) a) applet b) servlet c) ...

    JSP期末大作业

    1)在JSP中,要定义一个方法,需要用到以下()元素。(选择一项) a) &lt;%= %&gt; b) c) ! %&gt; d) 2)JSP页面经过编译之后,将创建一个()。(选择一项) a) applet b) servlet c) application d) exe文件 3)当JSP...

    学习servlet,jsp,usebean,数据库封装的不错方法

    未完成的个人留言板,喜欢的接下去吧。本来是展示给最爱的师父的,可惜错过了,无限的遗憾,期待未完待续的结局 ,赫赫

    学生管理系,jsp+javabean编写,功能强大

    学生管理系,jsp+javabean编写,功能强大

    JSP系列视屏教程

    &lt;jsp:useBean id="userInfo" class="com.renxiang.model.UserInfo" scope="page"&gt;&lt;/jsp:useBean&gt; &lt;jsp:setProperty property="*" name="userInfo"/&gt; 其中表单对象的Name要和bean对象的属性名称相同,而且,实验表明...

    JSP 内部培训教程

    四、JSP腳本元素 6 JSP聲明 6 JSP表達式 6 JSP腳本小程序 6 五、JSP動作 7 &lt;jsp:forward&gt; 7 &lt;jsp:plugin&gt; 8 &lt;jsp:useBean&gt; 8 &lt;jsp:getProperty&gt; 10 &lt;jsp:setProperty&gt; 11 六、JSP內建對象 12 out輸出數據 12 request...

Global site tag (gtag.js) - Google Analytics