Servlet&JSP的那些事儿(十三)

这一篇我们讨论javabean。在上一篇Servlet&JSP的那些事儿(十二)中,我们编写了一个简单的留言板,不过在这个小项目中存在一些问题。比如,我们在jsp页面中包含了大量的java代码,对于这种小项目还好操作,但是对于大项目,如果页面编辑人员一不小心,删除了一些java代码,就会出现错误。而java程序员又会面对大量的html代码,也会对开发有影响。为了分离页面中的html代码和java代码,javabean就应运而生。它将显示逻辑和业务逻辑分离,使得前台和后台开发人员可以着重于自己的工作。jsp中,负责完成业务逻辑的java类,就叫做javabean。

JavaBean

其实它本质上就是一个java类,只不过遵循了一些编码约定而已。在jsp页面中,可以像使用普通类一样实例化一个javabean类的对象。当然,也可以利用jsp中的动作元素来访问javabean。一个标准的javabean有以下几个特性:

1)它是一个public类
2)它有一个默认构造方法,也即不带参数的构造方法。
3)它提供setXXX()和getXXX()方法来让外部程序设置或获取javabean的属性。
4)它实现Serializable或Externalizable接口,以支持序列化。

javabean有四种属性:简单属性(simple property)、索引属性(indexed property)、绑定属性(bound property)和约束属性(constrained property)。简单属性就是接受单个值的属性,索引属性就是获取和设置数组时使用的属性,绑定属性和约束属性主要用于图形化界面编程。

在Jsp中使用JavaBean

在jsp中可以像使用普通类一样访问javabean。jsp提供了3个动作元素<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>来访问javabean。

<jsp:useBean>用于实例化javabean,或者定位一个已存在的javabean实例,并把实例的引用赋给一个变量。其语法如下:

<jsp:useBean id="name" scope="page|request|session|application" typeSpec/>

其中,typeSepc定义如下:

class="classname"|
class="classname" type="typename"|
type="typename" beanName="classname"
<jsp:useBean>各属性的含义如下:

1)id用于标识javabean实例的名字,也是声明脚本变量的名字,并被初始化为javabean实例的引用。遵照java变量命名的规范。
2)scope指定一个范围,在这个范围以内,javabean实例的引用是可用的。默认为page
3)class用于指定javabean对象的完整的限定类名
4)beanName用于指定bean的名字。该名字被提供给java.beans.Beans类的instantiate()方法,来实例化一个javabean。
5)type指定定义的脚本变量的类型,可以使bean类本身,或它的父类,或由javabean类实现的接口。

其执行过程为:jsp容器在<jsp:useBean>元素指定的范围内查找指定id的javabean对象,如果找到,且指定了type属性,那jsp容器会试图把该对象转换为指定的type,如果失败,则抛出一个ClassCastException异常。如果没有找到指定的javabean对象,则抛出一个InstantiationException异常。如果没找到该对象,但是元素中指定了class属性,则利用该类创建一个新的对象,并将这个对象的引用赋给由属性id指定的名字的变量,并将该对象保存到属性scope指定的范围中。如果没找到该对象,但元素中指定了beanName属性,则调用Beans类的instantiate()方法。如果方法执行成功,将新创建的对象的引用赋给由属性id指定的名字的变量,并将该对象保存到属性scope指定的范围中。

<jsp:setProperty>和<jsp:useBean>一起使用,用来设置javabean的简单属性和索引属性。其语法如下:

<jsp:setProperty name="beanname" prop_expr />
其中,prop_expr定义如下:

property="*"|
property="propertyname"|
property="propertyname" param="parametername"|
property="propertyname" value="propertyvalue"

<jsp:setProperty>各属性的含义如下:

1)name,javabean实例的名字,它必须是已在<jsp:useBean>元素中通过id属性定义的名字。
2)property,被设置的属性的名字。如果值为"*",标签就会在请求对象中查找所有的请求参数,看是否有参数的名字和bean属性的名字相同,如果找到,则匹配。
3)param,指定请求对象中参数的名字。如果请求参数的名字和bean属性名字不同,可以用param来指定参数的名字。
4)value,指定要赋给javabean属性的值。不能和param同时出现。

<jsp:getProperty>

它用来访问一个javabean属性,并把属性的值转化成一个String,然后发送到输出流中。如果属性是一个对象,将调用该对象的toString()方法。其语法如下:

<jsp:getProperty name="beanname" property="propertyname" />

各属性的含义如下:

1)name,javabean实例的名字,从这个实例中可以得到属性。
2)property,要得到的属性的名字。

两种模型

使用jsp开发web应用程序时,有两种架构模型可以选择,成为模型1和模型2。下面分别介绍这两种模型。

模型1

这种模型使用jsp+javabean来将页面显示和业务逻辑处理分开,jsp实现页面的显示,javabean实现业务逻辑。在这种模型中,jsp页面独自响应请求并将处理结果返回给用户,所有的数据通过javabean来处理,jsp实现页面的显示。

这种模型虽然实现了页面显示和业务逻辑的分离,但是在jsp页面中仍然要编写流程控制和调用javabean代码,当需要处理的业务逻辑非常复杂时,会使得程序非常复杂。这种模型不能满足大型应用的需要,但对于小型应用,因为这种模型简单,所以可以很好的满足需求。

模型2

模型1中,会在jsp页面中嵌入流程控制代码和部分逻辑处理代码,如果将这部分代码提取出来,变成一个单独的角色(控制器),这样的web结构就成为模型2。模型2符合MVC夹头模式。MVC模型我们在Servlet&JSP的那些事儿(二)也有所提及。在模型2中,控制器的角色由servlet实现,视图的角色由jsp页面来实现,模型的角色由javabean来实现。servlet接受请求,负责实例化javabean对象对业务逻辑进行处理,并未jsp页面准备承载了数据的javabean对象,然后将请求分发给适当的jsp页面来产生响应。作为模型的javabean主要有两类,一类用于封装业务逻辑,一类用于承载数据。

转载请注明出处:http://blog.csdn.net/iAm333

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值