《jsp使用JavaBean分离表示与实现.ppt》由会员分享,可在线阅读,更多相关《jsp使用JavaBean分离表示与实现.ppt(78页珍藏版)》请在三一办公上搜索。
1、1,第6章 使用JavaBean分离表示与实现,Company Logo,2,在当今各类JSP网站开发标准中,有两种使用JSP的方式,他们分别被称为模式一和模式二。模式一是JSP+JavaBean的结合模式二是JSP+JavaBeanServlet的结合。这两种模式是当今大中型应用程序的基础,这两种模式中最重要的就是JavaBean的开发,JavaBean用来封装业务逻辑。,Company Logo,3,6.1 剖析JavaBean,什么是组件?独立的模块外界不了解其内部实现外界通过其提供的接口对组件进行访问可以重用目前有代表性的组件技术COM、COM+、JavaBeans、EJB等,Comp
2、any Logo,4,JavaBean 组件和企业级EJB(Enterprise JavaBean)组件EJB是J2EE的核心技术,它为开发服务器端应用程序组件提供了一个模型,利用这个模型来创建可移植性与分布式企业应用程序服务器或组件。EJB定义了一个用于开发基于组件的企业多重应用程序的标准。EJB是一个用来创建分布式、服务器端以及基于Java的企业应用程序组件的功能强大的组件模型。,Company Logo,5,6.1.1 什么是JavaBean,JavaBean是Java的可重用组件技术,实质是一种符合某些命名和设计规范的Java类JavaBean通常封装成为具有特定功能或者处理某个业务(
3、如连接数据库,访问数据库)应用:JSP页面内可以访问JavaBean的对象以及它的方法。在JSP的Web应用中集成JavaBean组件,由JavaBean中处理业务逻辑,然后在JSP中调用,而JSP页面着重网页界面的设计,可以实现业务逻辑和前台显示的部分分离。,Company Logo,6,JavaBean简介,使用JavaBean的好处:可以使得JSP页面变得清晰;节省软件开发时间(可以直接使用已经测试和可信的已有组件,避免了重复开发);降低系统维护的难度JavaBean的分类可视的JavaBean:传统的JavaBean应用于可视化界面(如java图形界面中使用的按钮、文本框或列表框等等)
4、。非可视化的JavaBean:封装逻辑、封装数据,与JSP搭配使用。,Company Logo,7,6.1.2 JavaBean的特征,通常一个标准的JavaBean有以下特征(编写规范):一定使用了package语句进行打包JavaBean是一个public类型的类有一个无参数的构造方法属性一般是私有的(即用private修饰)对属性值xxx的获取有相应的getXxx()方法,并且此方法是公有的(即用public修饰)若要获取的属性xxx为boolean类型则可以使用isXxx()方法对属性值xxx的设置有相应的setXxx()方法,并且此方法也是公有的(即用public修饰),Compan
5、y Logo,8,创建一个标准JavaBean的基本语法如下。(1)定义JavaBean类 JavaBean类定义的语法结构如下:package 包名;public class 类名 构造方法();属性(Property);方法(Method);分析:编写JavaBeans就是编写一个Java的类,这个类创建的一个对象称作一个beans。,Company Logo,9,注意:类名称与保存的文件名称必须一致,否则就会出现编译错误。类必须声明为公有类,即public。如:public class CarBean private String maker;.,Company Logo,10,(2)定
6、义JavaBean类的构造函数JavaBean是Jave类,JavaBean就有自己的构造函数,并且构造函数的名称必须与JavaBean类的名称一致。构造函数的主要作用是用来初始化,而且构造函数无参数输入,其语法结构如下:public JavaBean类名称/初始化.例如:public CarBean,Company Logo,11,(3)定义JavaBean属性JavaBean是Java类,那么它不但有自己的构造函数,还有自己的属性。JavaBean属性的定义的语法结构如下:private 数据类型 属性名称;例如:private String maker;,Company Logo,12,
7、JavaBean的属性简介1.JavaBean的属性与普通Java类的属性的概念不一样,JavaBean的属性是以方法定义的形式出现的。2.用于对属性赋值的方法称为属性修改器或setter方法,用于读取属性值的方法称为属性访问器或getter方法。3.属性修改器必须以小写的set 前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,nickName属性的修改器名称为setNickName,password属性的修改器名称为setPassword。,Company Logo,13,4.属性访问器通常以小写的get 前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,nickNam
8、e属性的访问器名称为getNickName,password属性的访问器名称为getPassword。5.JavaBean的属性名是根据setter方法与getter方法的名称来生成的,setter方法或getter方法中除去前缀“set”和“get”后的部分即为属性名,但属性名的首字母必须小写。6。属性分类:只读/读写/只写,简单/复杂,Company Logo,14,(4)设定JavaBean属性值的方法定义了JavaBean属性之后,还要对其属性值进行设定,其属性值设定的语法结构如下:public void set设定方法名称(数据类型 参数)this.变量=参数;例如:public v
9、oid setMaker(String maker)this.maker=maker;注意:JavaBean属性值的设定方法名称一般以set三个字母开头,后面跟上属性设定方法名称。,Company Logo,15,(5)读取JavaBean属性值的方法JavaBean属性值读取的语法结构如下:public 数据类型 get读取方法名称()return this.变量;例如:public String getMaker()return this.maker;,Company Logo,16,package bean;public class SimpleBean()private String
10、name;private int number;public SimpleBean()public void setName(String name)this.name=name;public void setNumber(int number)this.number=number;public String getName()return name;public int getNumber()return number;编写JavaBean时,需要将其放入某个包中,这样才能被JSP页面访问到,Company Logo,17,package MyBean;public class FisrtJ
11、avaBean private String firstProperty=“*”;public FirstJavaBean()public String getFirstProperty()return firstProperty;public void setProperty(String value)firstProperty=value;,JavaBean。,私有属性,构造函数,Company Logo,18,Eg.fbean.jsp:调用FirstJavaBean,Company Logo,19,6.2 开发部署JavaBean,6.2.1 开发JavaBean例 完成一个二元数学运算
12、。6.2.2 在Web服务器上部署JavaBean,Company Logo,20,直接在tomcat下部署如下图所示,Company Logo,21,JavaBean存放,在JavaBean的应用中:首先创建一个满足JavaBean规范的程序,并将其编译成一个class字节码文件,为了让JSP文件访问到JavaBean,需要考虑怎么存放JavaBean编译产生的字节码文件,假设在tomcat下已建立一个myweb的站点应用,那么我们在myweb站点中各文件保存位置如下:myweb*.jsp-JSP文件保存在站点下mywebWEB-INF-在myweb站点中建有WEB-INF文件夹mywebW
13、EB-INFclasses-该文件夹下面就是存放所有编译出来的class文件mywebWEB-INFlib-这个目录下存放所有jar文件,Company Logo,22,JavaBean本身就是满足JavaBean设计规范的java程序,因此我们在文本编辑器中编辑java程序,通过JDK环境中将它编译成有效的class或jar文件,并按前文所述保存到相应文件夹中,就成为可供JSP文件调用调用的JavaBean文件。现在编写JSP文件,其中包含动作标签,JSP网页通过该标签创建一个JavaBean对象,从而可以利用该JavaBean对象实现操作。注意:如果修改和重新编译了JavaBean程序,则
14、需要关闭和重新启动JSWDK的Web服务器以后修改的结果才会有效。如果仅仅修改JSP文件,则不用重新启动JSWDK的Web服务器。,Company Logo,23,calculate.jsp执行,Company Logo,24,输入3/0之后的执行结果如图,Company Logo,25,calculate.jsp先由调用SimpleCalculator类,使用设置JavaBean的属性:,Company Logo,26,6.3 在JSP中使用JavaBean,需要使用以下几个动作元素标签:在网页中创建一个Bean对象标签:用于为Bean对象中的属性赋值标签:用于获取Bean对象中属性的值,C
15、ompany Logo,27,SampleBean.javapackage bean;public class SampleBean private String sample=Hello,World;public void setSample(String s)if(s!=null)sample=s;public String getSample()return sample;,Test1.jsp属性sample的初始值:属性sample的新值:,Company Logo,28,6.3.1 调用JavaBean,该标签用来在JSP页面中创建一个JavaBean实例,并指定它的名字及作用范围。
16、语法如下:创建了“package.class”类的一个对象,对象的名字是“beanname”scope的值指定了该对象的作用范围,可能的取值有4个:page、request、session、application例:,Company Logo,29,因此与下面的脚本段等价,Company Logo,30,6.3.2 访问JavaBean,标签用来获取Bean对象的属性值,并显示在页面上,其语法如下:name指出了要获取哪个bean的属性值,取值与useBean中 id值相同;property指出要获取该bean的哪个属性值例:还可以使用表达式调用其属性,例如在计算器实例中,下面两种表达式是等价
17、的第二种方式比较灵活。在6.2节计算器实例中,属性值参与运算,只能用第二种方式。,Company Logo,31,package ch06a;import java.io.*;public class Circle2 double radius=1;double circleArea=0;double circleLength=0;public double getRadius()return radius;public void setRadius(double newRadius)radius=newRadius;public double getCircleArea()circleAre
18、a=Math.PI*radius*radius;return circleArea;public double getCircleLength()circleLength=2.0*Math.PI*radius;return circleLength;,Circle2.java,用Circle2类创建一个名字是apple的beans,在JSP页面中使用useBean标签。并使用getProperty获取apple的各个属性的值。把Circle2.java编译生成的字节码Circle2.class文件拷贝到JSP引擎的classes文件下,Company Logo,32,beansGetprope
19、rty.jsp:,圆的半径是:圆的面积是:圆的周长是:,Company Logo,33,图 获取beans的属性值,Company Logo,34,6.3.3 设置JavaBean的属性,标签用来设置Bean对象的属性。其语法有多种:(1).简单bean属性设置 用来为bean的属性赋值其中name指出是在操作哪个bean,property指出对该bean的哪个属性赋值,value用来指定给属性赋的值。例:,Company Logo,35,Eg.一个描述学生的beans,在一个JSP页面中获得一个这样的beans,其有效范围是page。在JSP页面中使用动作标签设置、获取该beans的属性。,
20、Company Logo,36,Student.java:创建beans的源文件,public class Student String name=null;long number;double height,weight;public String getName()return name;public void setName(String newName)name=newName;public long getNumber()return number;public void setNumber(long newNumber)number=newNumber;,public double
21、 getHeight()return height;public void setHeight(double newHeight)height=newHeight;public double getWeight()return weight;public void setWeight(double newWeight)weight=newWeight;,Company Logo,37,student.jsp,名字是:学号是:/身高是:米体重是:公斤,Company Logo,38,注意:如果将表达式的值设置为beans属性的值,表达式值的类型必须和beans的属性的类型一致。如果将字符串设置为
22、beans的属性的值,这个字符串会自动被转化为beans的属性的类型。Java语言将字符串转化为其它数值类型的方法如下:转化到int:Integer.parseInt(Sting s),转化到long:Long.parseInt(Sting s),转化到float:Float.parseInt(Sting s),转化到double:Double.parseInt(Sting s),这些方法都可能发生NumberFormatException异常,例如,当试图将字符串:“ab23”转化为int型数据时就发生了NumberFormatException。,Company Logo,39,(2).将
23、单个属性值和输入参数关联用param代替value表示将一个form表单中传入参数的值赋给bean的某个属性。其中:name指出是在操作哪个bean,property指出对该bean的哪个属性赋值,而param表示传入参数的名字。,Company Logo,40,test2.html姓名:年龄:,TestBean.javapackage bean;public class TestBean private String userName;private int age;public int getAge()return age;public void setAge(int age)this.a
24、ge=age;public String getUserName()return userName;public void setUserName(String userName)this.userName=userName;,Test4.jsp,Company Logo,41,通过表单来指定beans的属性值。由于客户可能提交汉语的姓名,所以我们将TestBean.java文件中的getUserName()方法做以下改进:,public String getUserName()()try byte b=userName.getBytes(ISO-8859-1);userName=new St
25、ring(b);return userName;catch(Exception e)return userName;,Company Logo,42,(3)输入参数和bean属性值相同,可以简化 这种用法将form表单中传入参数的值赋给bean的某个属性。要求:form表单中参数的名称要与propertyName一致,Company Logo,43,test1.html姓名:年龄:,TestBean.javapackage bean;public class TestBean private String userName;private int age;public int getAge()
26、return age;public void setAge(int age)this.age=age;public String getUserName()return userName;public void setUserName(String userName)this.userName=userName;,注意:property的属性名、form中参数的名字、Bean中的属性名、方法名要对应,Test2.jsp,Company Logo,44,标签,(4).将bean的所有属性与表单中参数关联在这种用法中,JSP容器会一个个检查传入的参数,如果某个传入参数的名字和bean中某个属性的名
27、字相同,则将该参数的值赋给bean中的属性。使用这种方式可以一次为多个属性赋值,Company Logo,45,Test3.jsp,test1.html姓名:年龄:,TestBean.javapackage bean;public class TestBean private String userName;private int age;public int getAge()return age;public void setAge(int age)this.age=age;public String getUserName()return userName;public void setU
28、serName(String userName)this.userName=userName;,Company Logo,46,设置属性值的方式是直接在脚本段中显示调用Bean的方法,例如以下两种表达式是等效的:/,Company Logo,47,6.3.4 类型自动转换规则,使用设置Bean属性值时,它的value属性值都是字符串类型,系统会根据Bean中对应的属性类型进行转换。,Company Logo,48,统计在线用户数,6.4 使用JavaBean的计数器实例,Company Logo,49,总结 JavaBean,该标签用来在JSP页面中创建一个JavaBean实例,并指定它的名字
29、及作用范围。语法如下:,Company Logo,50,id属性,id属性代表JavaBean对象的变量名可为同一 Bean 类指定不同的 id 值,例如:,Company Logo,51,class 属性,class 属性JavaBean 的类名Count Bean不属于包Count Bean属于test包,Company Logo,52,type属性,type属性指定引用此对象的变量的类型。它可以为一个JavaBean类的父类、由它实现的接口或者为JavaBean类本身。默认为class属性的值。,Company Logo,53,class属性和type属性的区别,type属性不会创建对象
30、,只是表示对象引用。class属性分两种情况:如果在scope指定的范围内,该JavaBean对象不存在,则创建这个JavaBean对象,相当于执行以下语句Count id1=new Count();Count id2=new Count();若该JavaBean对象已经存在,则不创建新对象,而是直接获得已存在对象的引用。,Company Logo,54,关于的type的疑问以下两个jsp:usebean哪个对?答:第一个对,第二错。第一个没有class啊?答:不一定需要,如果bean已经创建了第二个怎么错了?答:beanName一定要配合type使用语法为:类型规格是class,beanNa
31、me,type三种属性的组合。,Company Logo,55,scope 属性,scope 属性表明JavaBean对象存在的范围,可为如下几个值:page(默认)requestsessionApplication以上作用范围使越来越大。,Company Logo,56,request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward以及filter)。举个简单的例子:jsp1.jsp jsp2.jsp,Company Logo,57,运行jsp1.jsp可以正常显示数据,因为作用范围是request,相当于调用了re
32、quest.setAttribute()方法,jsp2页通过request.getAttribute来获得这个bean.如果把request改为page,就会抛出NullPointerExceptioin.一个请求可以跨好几个JSP(include和forword)和Servlet(如filter).不过这里有一个需要注意的就是区别 和.如果上面的改为,即使scope为page也是正确的,是编译时包含,是运行时包含.前者就相当于宏,编译时替代,后者相当于函数,运行时返回.,Company Logo,58,page 作用域,客户每次请求访问JSP页面时,都会创建一个新的JavaBean对象。Ja
33、vaBean对象的有效范围仅是客户请求访问的当前页面。JavaBean对象在下列情况下会结束生命期:客户请求访问的当前页面执行完毕并向客户端发回响应。客户请求访问的当前页面通过标记将请求转发到另一个文件。,Company Logo,59,request 作用域,客户每次请求访问JSP页面时,都会创建一个新的JavaBean对象。JavaBean对象的有效范围是:客户请求访问的当前JSP网页和当前JSP网页共享同一个客户请求的页面,即当前JSP网页中指令以及标记包含的其它JSP文件当所有共享同一个客户请求的JSP页面执行完毕并向客户端发回响应时,JavaBean对象结束生命期。,Company
34、Logo,60,session 作用域,只有当不同客户请求访问JSP页面时,才会创建一个新的JavaBean对象。JavaBean对象的有效范围是同一个Session中的所有JSP文件。JavaBean 对象被创建后,存在于整个Session 的生命周期内。,Company Logo,61,application 作用域,在整个Web应用中只会创建一个JavaBean对象。JavaBean对象的有效范围是Web应用中的所有JSP文件。JavaBean 对象被创建后,存在于整个Web应用的生命周期内。,Company Logo,62,下面看看具体的scope四个值的含义:Page:保存在page
35、Context对象中,有page范围的JavaBean实例只能在当前创建这个JavaBean的JSP文件中进行操作,这个实例只有在请求返回给客户端后或者转移到另外的JSP页面后才会释放掉。page范围的JavaBean常用于进行一次性操作的JavaBean,这样的Bean用的最多,比如大部分表单提交,Bean的一些计算处理等都可以使用page范围的JavaBean,Company Logo,63,Request有request范围的JavaBean实例可以在处理请求所有JSP页面中都存在,这个对象只有在请求全部处理完毕后才会被释放掉,request范围的JavaBean常用于共享同一次请求的J
36、SP页面中,比如判断用户登录功能,如果用户名密码合法就可以forward到一个合法页面中,否则就forward到一个出错页面,当然转移后的页面仍然能够得到用户的输入。,Company Logo,64,SessionJavaBean对象是保存在session范围的JavaBean实例的生存周期是整个session,只有当session过期后才能释放掉,这样常用于共享同一session的JSP页面,比如购物车一般就是放在session中的或者登陆后的用户信息等也可以在session中,注意%page标签中不要设置session=false,否则在这个JSP页面中session将不会起作用,幸好JS
37、P默认session=true,所以可以不必管它了。,Company Logo,65,application-JavaBean对象保存在application对象中,有application范围的JavaBean对象的生存周期是整个application。这就意味着这样的JavaBean的生存周期是整个应用程序,当web Server停掉才会消失掉。这样的常用于共享同一application的JSP程序中,比如程序中一些经常用到配置东西如数据库连接URL,全局的计数器或者是聊天室中人员信息等。,Company Logo,66,执行过程,Company Logo,67,通过Bean提供的setX
38、XX()方法设置 Bean 的简单属性和索引属性,语法如下:其中propertyDetails可为如下之一property=“*”property=“propertyName”property=“propertyName”param“paramNameproperty=“propertyName value propertyValue,Company Logo,68,标记,property=“*”设置Bean的所有属性,要求Bean属性的名字和类型必须与request对象中参数相匹配由于form传递的数据类型都是String,JSP会自动将参数转换成Bean属性对应的类型若没有Bean属性对应
39、的request参数值或参数值为空,则相应的Bean属性不会设置任何值,Company Logo,69,标记,property=“propertyName”设置Bean指定的属性,要求Bean属性的名字和类型必须与request对象中参数相匹配由于form传递的数据类型都是String,JSP会自动将参数转换成Bean属性对应的类型若没有Bean属性对应的request参数值或参数值为空,则相应的Bean属性不会设置任何值,Company Logo,70,标记,property=“propertyName”param“paramName当Bean属性的名字和request参数的名字不同时使用该
40、方法进行设置由于form传递的数据类型都是String,JSP会自动将参数转换成Bean属性对应的类型若request参数值为空,则相应的Bean属性不会设置任何值,Company Logo,71,标记,property=“propertyName value propertyValue使用指定值而不是request参数来设置Bean属性value可为字符串或表达式。若是字符串,会自动转换成Bean属性对应的类型;若是表达式,则必须和Bean属性的类型一致若value为空,则相应的Bean属性不会设置任何值,Company Logo,72,Please enter your username:
41、,public class LanguageBean private String name;public void setName(String name)this.name=name;,beans.html,beans.jsp,mypackage.LanguageBean,执行过程,Company Logo,73,Company Logo,74,标记,访问 Bean 属性的值,并将此值转换成字符串,插入到输出结果中。语法如下:,Company Logo,75,执行过程,public class LanguageBean private String name;public String g
42、etName()return this.name;,mypackage.LanguageBean,Hello,.,beans.jsp,转换成字符串,Company Logo,76,Company Logo,77,Jsp中访问JavaBean语法,使用page指令导入 JavaBean 类:%page import=包名.类名%使用标签声明JavaBean对象:注意:要给出完整的(包名.类名),否则报ClassNotFoundException 例:上面的代码相当于:CountBean bean=new CountBean();session.setAttribute(bean,bean);注意:如果在scope指定范围内,该JavaBean已存在,则不会生成新的JavaBean对象,而是直接获得已经存在的 JavaBean 对象的引用.,Company Logo,78,练习,3.编写volunteer.jsp,接收volunteer.html中提交的数据,使用创建bean.Volunteer的对象,使用为其属性赋值,使用显示用户注册信息,如图:,