JSP和JavaBean



JSP和JavaBean

JavaBean组件本质上就是一个类,只不过这个类需要遵循一些编码的约定。在JSP页面中,既可以像使用普通类一样实例化JavaBean类的对象,调用它的方法,还可以利用JSP技术中提供的动作元素来访问JavaBean。
一个标准的JavaBean组件具有以下几个特性:
(1)它是一个公开的(public)类
(2)它有一个默认的构造方法,也就是不带参数的构造方法(在实例化JavaBean对象时,需要调用默认的构造方法)。
(3)它提供setXXX()方法和getXXX()方法来让外部程序设置和获取JavaBean的属性。如setName(),getName()方法等
在JSP中可以像使用普通类一样访问JavaBean,在脚本元素中实例化类的对象,调用对象的方法。
<jsp:useBean>动作用于实例化JavaBean,或者定位一个已经存在的JavaBean实例,并把实例的引用赋给一个变量。
<jsp:useBean id=”cart” scope=”session” class=”org.sunxin.lesson.jsp.bookstore.CartBean”/>
id用于标识JavaBean实例的名字,同时,该名字也是声明脚本变量的名字,并被初始化为JavaBean实例的引用。
scope指定一个范围,在这个范围内,JavaBean实例的引用是可用的,实际上也是指定JavaBean实例的生命周期。可能的取值有:page、request、session和application,默认的是page
class指定JavaBean对象的完整的限定类名
beanName指定Bean的名字。该名字被提供给java.beans.Beans类的instantiate()方法,来实例化一个JavaBean。
type指定定义的脚本变量的类型。
<jsp:useBean>动作行为:
(1)JSP容器在<jsp:useBean>元素指定的范围中查找指定id的JavaBean对象。
(2)如果找到对应的对象,并且在元素中指定了type属性,那么JSP容器会试图把找到的对象转换为指定的type。
(3)如果没有在指定的范围中找到对象,并且在元素中没有指定了class或者beanName属性,则会抛出异常。
(4)如果没有在指定的范围内找到对象,并且在元素中指定了class属性,则利用这个类创建一个新的对象,将这个对象的引用赋值给由属性id所指定的名字的变量,并将这个对象保存到属性scope指定的范围中。
(5)如果没有在指定的范围内找到对象,并且在元素中执行了beanName属性,则用beanName作为参数调用java.beans.Beans类中的instantiate()方法。如果这个方法执行成功了,则把这个新创建的对象的引用赋值给由属性id所指定的名字的变量,并将这个对象保存到属性scope指定的范围中。
<jsp:setProperty>
<jsp:setProperty>动作和<jsp:useBean>一起使用,用了设置JavaBean的简单属性和索引属性。<jsp:setProperty>动作使用Bean中的setXXX()方法,在Bean中设置一个或多个属性值。在JSP中,经常使用<jsp:setProperty>动作元素将客户端提交的数据保存到JavaBean的属性中。
<jsp:setProperty name=”beanName” prop_expr/>
name,Bean实例的名字,它必须是已经在<jsp:useBean>元素中通过id属性定义的名字。Bean的实例必须包含可写(具有setXXX()方法)的属性。
property被设置的属性的名字,如果property属性的值是“*”,标签就会在请求对象中查找索引的请求参数,看是否有参数的名字和Bean属性的名字相同,如果找到匹配的参数和属性,就会按照正确的类型(自动进行类型转换)将参数的值设置为属性的值,如果一个参数的值为空(“”),对应的属性的值不会被修改。
param指定请求对象中参数的名字。在设置Bean的属性时,如果请求参数的名字和Bean属性的名字不同,可以用param来指定参数的名字。如果没有使用param,那么就认为请求参数的名字和Bean属性的名字相同。在<jsp:setProperty>元素中,不能同时出现param和value属性。
value指定要赋给Bean属性的值,可以用一个请求时属性表达式作为value属性的值。
<jsp:getProperty>动作用来访问一个Bean的属性,并把属性的值转化成一个String,然后发送到输出流中,如果属性是一个对象,将调用该对象的toString()方法。
<jsp:getProperty name=”name” property=”propertyName”/>
在编写JavaBean的时候,必须为JavaBean指定一个包名,否则JSP将无法调用JavaBean;