按着Sun公司的定义,Javabean是一个可重复使用的软件组件。实际上Javabean是一种Java类,通过封装属性和方法成为一种具有某种功能或处理某个业务的对象,简称bean。
一个基本的JSP页面由普通的HTML标记和Java程序片组成。如果大量的程序片和HTML大量掺杂在一起,就显得页面混杂,不易维护。JSP页面应当将数据的处理过程指派给一个或几个bean来完成,只需在JSP页面中调用bean即可。
1编写Javabean
Javabean分为可视组件和非可视组件。在JSP中主要是使用非可视组件。对于非可视组件,不必去设计它的外观,主要关心它的属性和方法。
编写Javabean就是编写一个Java的类,所以只要学会写类就能编写一个Javabean,这个类创建的一个对象称为一个Javabean,简称bean。为了能让使用这个bean的应用程序构建工具知道这个bean的属性和方法,只需在类的方法命名上遵守以下规则:
如果类的成员变量名字是xxx,那么为了获取或更改成员变量的值,即获取或更改属性,类中必须提供两个方法:
getXxx(),用来获取属性xxx。
setXxx(),用来修改属性xxx。
也就是方法的名字用get或set为前缀,后缀是将成员变量名字的首字母大写的字符序列。
对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用is代替上面的get和set。
类中声明的方法的访问属性都必须是public的。
类中声明的构造方法必须是public、无参数的。
创建bean的类必须带有包名,使用package语句给类起一个包名。如:package tom.jiafei
那么为了能够让Tomcat服务器能找到字节码,字节码文件必须保存在特定的目录中。在当前web服务目录下建立子目录结构:\WEB-INF\classes然后在classes下建立如下子目录结构tom\jiafei,然后将编译好的字节码文件放入其中。为了让Tomcat服务器启用上述WEB-INF\classes必须重新启动Tomcat服务器。
2创建与使用bean
在使用bean的JSP页面中,首先必须有相应的import指令,如:
<%@ page import="tom.jiafei.*" %>
然后在JSP页面中再使用JSP动作标记useBean,来加载使用bean。useBean标记的语法格式:
<jsp:useBean id="bean的名字" class="创建beans的字节码" scope="bean有效范围"/>
或
<jsp:useBean id="bean的名字" class="创建beans的类" scope="bean有效范围">
</jsp>
例:
<jsp:useBean id="circle" class="tom.jiafei.circle" scope="page"/>
需要注意,其中的"创建beans的类"要带有包名。
useBean标签中scope取值的不同情况:
scope取值为page
JSP引擎分配给每个JSP页面的bean互补相同。就是说,尽管每个JSP页面的bean的功能相同,但它们占有不同的内存空间。该bean的有效范围是当前页面,当客户离开这个页面,JSP引擎取消分配的bean,即释放bean所占有的内存空间。
注意不同用户的scope取值是page的bean也是不相同的,一个用户对自己bean的属性的改变,不会影响到另一个用户。
scope取值session
此时bean的有效范围是客户的会话期间。就是说,如果客户在某个Web服务目录多个页面中相互连接,每个页面都含有一个useBean标签,而且各个页面的useBean标签中ID的值相同、scope的值都是session,那么客户在这些页面得到的bean是相同的一个(占有相同的内存空间)。如果客户在某个页面更改了这个bean的属性,其他页面的这个bean的属性也将发生同样的变化。
注意,不同用户的scope取值是session的bean是互不相同的,当两个客户同时访问一个JSP页面时,一个用户对自己的bean的属性的改变,不会影响到另一个用户。
scope取值request
此时bean的有效范围是request期间。客户在网站的访问的期间可能请求过多个页面,如果这些页面含有scope取值是request的useBean标签,那么每个页面分配的bean也是互不相同的,JSP引擎对请求响应之后,取消分配给JSP页面的这个bean。
注意,不同用户的scope取值是request的bean是互不相同的,当两个客户同时请求一个JSP页面时,一个用户对自己bean的属性的改变,不会影响到另一个用户。
scope取值application
JSP引擎为Web服务目录下的所有的JSP页面分配一个共享的bean,不同用户的scope取值是application的bean也都是相同的一个。当多个客户同时访问一个JSP页面时,任何一个用户对自己bean的属性的改变,都会影响到其他用户。
3获取和修改bean的属性
获取或修改bean的属性还可以使用动作标记getProperty、setProperty。bean就是一个遵守一定规范的类做创建的对象,当JSP页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法。
getProperty动作标记
使用该标记之前必须使用usBean动作标记获得相应的bean。getProperty动作标记的语法格式:
<jsp:getProperty name="bean的名字" property="bean的属性"/>
或
<jsp:getProperty name="bean的名字" property="bean的属性"/>
</jsp:getProperty>
setProperty动作标记
使用该标记之前,必须使用useBean标记得到一个可操作的bean。setProperty动作标记的语法格式:
<jsp:setProperty name="bean的名字" property="bean的属性" value="<%=expression%>"/>
或
<jsp:setProperty name="bean的名字" property="bean的属性" value=字符串/>
如果将表达式的值设置为bean属性的值,表达式的类型必须和bean的属性的类型一致。如果将字符串设置为bean的属性值,这个字符串会自动被转化为bean的属性的类型。
通过HTTP表单的参数来设置bean的相应属性的值
如果需要明确bean的某个属性设置为表单中的对应的参数值。需如下使用setProperty标记:
<jsp:setProperty name="bean的名字" property="属性名" param="参数名"/>
属性名和参数名相同,参数名就是表单中某个元素的名字,属性名就是bean的某个属性的名字。
<jsp:setProperty name="bean的名字" property="*"/>
改标记不同具指定beans属性的值将对应表单中哪个参数指定的值,系统会自动根据名字进行相应的匹配。
注意,当使用HTTP表单设置bean的属性值时,只有提交了表单,该标记才会被执行。
4解决“软件包 javax.servlet 不存在”错误的方法:
1. 搜索servlet-api.jar
所在文件夹:C:\Tomcat 5.5\common\lib
2. 将环境变量CLASSPATH的值设置为:
.;C:\Tomcat 5.5\common\lib\servlet-api.jar
3.原来除了设置classpath以及servlet-api.jar的区别外,还有一点!!!
把COMMON/LIB下的SERVLET-API.JAR 拷贝到JDK\jre\lib\ext下
附加:
JavaBeans的属性
JavaBeans的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是同一个概念,在程序中具体体现就是类中的变量。JavaBeans的设计中,按照属性的不同作用细分为4类:Simple属性、Index属性、Bound属性与Constrained属性。
Simple属性
一个Simple类型的属性表示一个伴随有一对getXXX()、setXXX()方法的变量。属性的名称和该属性相关的getXXX()、setXXX()方法相对应。
Indexed属性
一个Indexed类型的JavaBeans属性表示一个数组值。使用与该属性相对应的setXXX()和getXXX()放可以存取数组中某个元素的数值。同时,我们也可以使用另两个同名方法一次设置或取得整个数组的值(即属性的值)。
public class JavaBean2
{
int[] dataSet={1,2,3,4,5,6};
public void JavaBean2(){
}
public void setDataSet(int[] x){
dataSet=x;
}
public void setDataSet(int index,int x){
dataSet[index]=x;
}
public int[] getDataSet(){
return dataSet;
}
public int getDataSet(int x){
return dataSet[x];
}}
Bound属性
一个Bound类型的JavaBean组件的属性具有这样的特性:当该中属性的值发生变化,必须通知其它JavaBeans组件的对象,每次JavaBeans组件对象的属性值改变时,这种属性就引发一个PropertyChange事件(在java程序中,事件也被看作是一个对象)。这个事件中封装了发生属性改变事件的属性名、属性的原值、属性变化后的新值。这个事件将被传递到其它的JavaBeans组件中,至于接受事件的JavaBean组件对象应该作什么动作由其自己定义。
import java.beans.*;
public class JavaBean3{
String ourString="Hello";
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
public void setString(String newString){
String oldString=ourString;
ourString=newString;
changes.firePropertyChange("ourString",oldString,newString);
}
public String getString(){
return ourString;
}
public void addPropertyChangeListener(PropertyChangeListener l){
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}}
PropertyChangeSupport类型的对象changes主要用于向监听者对象发送信息(当JavaBean对象已经发生了属性改变的事件)。changes对象的firePropertyChange()方法,通知监听者队列的所有事件监听对象。
Contrained属性
JavaBeans组件的Constrained类型的属性具有这样的性质:当这个属性的值将要发生变化但还没有发生变化的时候,与这个属性已经机那里了某种监听关系的其它Java对象可以否决属性值的改变。此Constrained类型的属性的事件监听者对象将会通过抛出PropertyVetoException异常事件来阻止该属性值的改变。
import java.beans.*;
public class JavaBean4{
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
private VetoableChangeSupport vetos=new VetoableChangeSupport(this);
int outPriceInCents;
public void setPriceInCents(int newPriceInCents)throws PropertyVetoException{
int oldPriceInCents=ourPriceInCents;
vetos.fireVetoableChange("priceInCents",new Integer(oldPriceInCents),new Integer(newPriceInCents));
ourPriceInCents=newPriceInCents;
changes.firePropertyChange("priceInCents",new Integer(oldPriceInCents),new Integer(newPriceInCents));
}
public void addVetoableChangeListener(VetoableChangeListener l){
vetos.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l){
vetos.removeVetoableChangeListener(l);
}
public void addPropertyChangeListener(PropertyChangeListener l){
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}}
VetoableChangeSupport类型的对象vetos主要用于通知事件否决对象,某个JavaBean对象的属性值将要发生变化,让它们投票决定是否允许这个事件的发生。
一个基本的JSP页面由普通的HTML标记和Java程序片组成。如果大量的程序片和HTML大量掺杂在一起,就显得页面混杂,不易维护。JSP页面应当将数据的处理过程指派给一个或几个bean来完成,只需在JSP页面中调用bean即可。
1编写Javabean
Javabean分为可视组件和非可视组件。在JSP中主要是使用非可视组件。对于非可视组件,不必去设计它的外观,主要关心它的属性和方法。
编写Javabean就是编写一个Java的类,所以只要学会写类就能编写一个Javabean,这个类创建的一个对象称为一个Javabean,简称bean。为了能让使用这个bean的应用程序构建工具知道这个bean的属性和方法,只需在类的方法命名上遵守以下规则:
如果类的成员变量名字是xxx,那么为了获取或更改成员变量的值,即获取或更改属性,类中必须提供两个方法:
getXxx(),用来获取属性xxx。
setXxx(),用来修改属性xxx。
也就是方法的名字用get或set为前缀,后缀是将成员变量名字的首字母大写的字符序列。
对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用is代替上面的get和set。
类中声明的方法的访问属性都必须是public的。
类中声明的构造方法必须是public、无参数的。
创建bean的类必须带有包名,使用package语句给类起一个包名。如:package tom.jiafei
那么为了能够让Tomcat服务器能找到字节码,字节码文件必须保存在特定的目录中。在当前web服务目录下建立子目录结构:\WEB-INF\classes然后在classes下建立如下子目录结构tom\jiafei,然后将编译好的字节码文件放入其中。为了让Tomcat服务器启用上述WEB-INF\classes必须重新启动Tomcat服务器。
2创建与使用bean
在使用bean的JSP页面中,首先必须有相应的import指令,如:
<%@ page import="tom.jiafei.*" %>
然后在JSP页面中再使用JSP动作标记useBean,来加载使用bean。useBean标记的语法格式:
<jsp:useBean id="bean的名字" class="创建beans的字节码" scope="bean有效范围"/>
或
<jsp:useBean id="bean的名字" class="创建beans的类" scope="bean有效范围">
</jsp>
例:
<jsp:useBean id="circle" class="tom.jiafei.circle" scope="page"/>
需要注意,其中的"创建beans的类"要带有包名。
useBean标签中scope取值的不同情况:
scope取值为page
JSP引擎分配给每个JSP页面的bean互补相同。就是说,尽管每个JSP页面的bean的功能相同,但它们占有不同的内存空间。该bean的有效范围是当前页面,当客户离开这个页面,JSP引擎取消分配的bean,即释放bean所占有的内存空间。
注意不同用户的scope取值是page的bean也是不相同的,一个用户对自己bean的属性的改变,不会影响到另一个用户。
scope取值session
此时bean的有效范围是客户的会话期间。就是说,如果客户在某个Web服务目录多个页面中相互连接,每个页面都含有一个useBean标签,而且各个页面的useBean标签中ID的值相同、scope的值都是session,那么客户在这些页面得到的bean是相同的一个(占有相同的内存空间)。如果客户在某个页面更改了这个bean的属性,其他页面的这个bean的属性也将发生同样的变化。
注意,不同用户的scope取值是session的bean是互不相同的,当两个客户同时访问一个JSP页面时,一个用户对自己的bean的属性的改变,不会影响到另一个用户。
scope取值request
此时bean的有效范围是request期间。客户在网站的访问的期间可能请求过多个页面,如果这些页面含有scope取值是request的useBean标签,那么每个页面分配的bean也是互不相同的,JSP引擎对请求响应之后,取消分配给JSP页面的这个bean。
注意,不同用户的scope取值是request的bean是互不相同的,当两个客户同时请求一个JSP页面时,一个用户对自己bean的属性的改变,不会影响到另一个用户。
scope取值application
JSP引擎为Web服务目录下的所有的JSP页面分配一个共享的bean,不同用户的scope取值是application的bean也都是相同的一个。当多个客户同时访问一个JSP页面时,任何一个用户对自己bean的属性的改变,都会影响到其他用户。
3获取和修改bean的属性
获取或修改bean的属性还可以使用动作标记getProperty、setProperty。bean就是一个遵守一定规范的类做创建的对象,当JSP页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法。
getProperty动作标记
使用该标记之前必须使用usBean动作标记获得相应的bean。getProperty动作标记的语法格式:
<jsp:getProperty name="bean的名字" property="bean的属性"/>
或
<jsp:getProperty name="bean的名字" property="bean的属性"/>
</jsp:getProperty>
setProperty动作标记
使用该标记之前,必须使用useBean标记得到一个可操作的bean。setProperty动作标记的语法格式:
<jsp:setProperty name="bean的名字" property="bean的属性" value="<%=expression%>"/>
或
<jsp:setProperty name="bean的名字" property="bean的属性" value=字符串/>
如果将表达式的值设置为bean属性的值,表达式的类型必须和bean的属性的类型一致。如果将字符串设置为bean的属性值,这个字符串会自动被转化为bean的属性的类型。
通过HTTP表单的参数来设置bean的相应属性的值
如果需要明确bean的某个属性设置为表单中的对应的参数值。需如下使用setProperty标记:
<jsp:setProperty name="bean的名字" property="属性名" param="参数名"/>
属性名和参数名相同,参数名就是表单中某个元素的名字,属性名就是bean的某个属性的名字。
<jsp:setProperty name="bean的名字" property="*"/>
改标记不同具指定beans属性的值将对应表单中哪个参数指定的值,系统会自动根据名字进行相应的匹配。
注意,当使用HTTP表单设置bean的属性值时,只有提交了表单,该标记才会被执行。
4解决“软件包 javax.servlet 不存在”错误的方法:
1. 搜索servlet-api.jar
所在文件夹:C:\Tomcat 5.5\common\lib
2. 将环境变量CLASSPATH的值设置为:
.;C:\Tomcat 5.5\common\lib\servlet-api.jar
3.原来除了设置classpath以及servlet-api.jar的区别外,还有一点!!!
把COMMON/LIB下的SERVLET-API.JAR 拷贝到JDK\jre\lib\ext下
附加:
JavaBeans的属性
JavaBeans的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是同一个概念,在程序中具体体现就是类中的变量。JavaBeans的设计中,按照属性的不同作用细分为4类:Simple属性、Index属性、Bound属性与Constrained属性。
Simple属性
一个Simple类型的属性表示一个伴随有一对getXXX()、setXXX()方法的变量。属性的名称和该属性相关的getXXX()、setXXX()方法相对应。
Indexed属性
一个Indexed类型的JavaBeans属性表示一个数组值。使用与该属性相对应的setXXX()和getXXX()放可以存取数组中某个元素的数值。同时,我们也可以使用另两个同名方法一次设置或取得整个数组的值(即属性的值)。
public class JavaBean2
{
int[] dataSet={1,2,3,4,5,6};
public void JavaBean2(){
}
public void setDataSet(int[] x){
dataSet=x;
}
public void setDataSet(int index,int x){
dataSet[index]=x;
}
public int[] getDataSet(){
return dataSet;
}
public int getDataSet(int x){
return dataSet[x];
}}
Bound属性
一个Bound类型的JavaBean组件的属性具有这样的特性:当该中属性的值发生变化,必须通知其它JavaBeans组件的对象,每次JavaBeans组件对象的属性值改变时,这种属性就引发一个PropertyChange事件(在java程序中,事件也被看作是一个对象)。这个事件中封装了发生属性改变事件的属性名、属性的原值、属性变化后的新值。这个事件将被传递到其它的JavaBeans组件中,至于接受事件的JavaBean组件对象应该作什么动作由其自己定义。
import java.beans.*;
public class JavaBean3{
String ourString="Hello";
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
public void setString(String newString){
String oldString=ourString;
ourString=newString;
changes.firePropertyChange("ourString",oldString,newString);
}
public String getString(){
return ourString;
}
public void addPropertyChangeListener(PropertyChangeListener l){
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}}
PropertyChangeSupport类型的对象changes主要用于向监听者对象发送信息(当JavaBean对象已经发生了属性改变的事件)。changes对象的firePropertyChange()方法,通知监听者队列的所有事件监听对象。
Contrained属性
JavaBeans组件的Constrained类型的属性具有这样的性质:当这个属性的值将要发生变化但还没有发生变化的时候,与这个属性已经机那里了某种监听关系的其它Java对象可以否决属性值的改变。此Constrained类型的属性的事件监听者对象将会通过抛出PropertyVetoException异常事件来阻止该属性值的改变。
import java.beans.*;
public class JavaBean4{
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
private VetoableChangeSupport vetos=new VetoableChangeSupport(this);
int outPriceInCents;
public void setPriceInCents(int newPriceInCents)throws PropertyVetoException{
int oldPriceInCents=ourPriceInCents;
vetos.fireVetoableChange("priceInCents",new Integer(oldPriceInCents),new Integer(newPriceInCents));
ourPriceInCents=newPriceInCents;
changes.firePropertyChange("priceInCents",new Integer(oldPriceInCents),new Integer(newPriceInCents));
}
public void addVetoableChangeListener(VetoableChangeListener l){
vetos.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l){
vetos.removeVetoableChangeListener(l);
}
public void addPropertyChangeListener(PropertyChangeListener l){
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}}
VetoableChangeSupport类型的对象vetos主要用于通知事件否决对象,某个JavaBean对象的属性值将要发生变化,让它们投票决定是否允许这个事件的发生。