JavaBean和表单处理v.ppt
1,第七章 JavaBean与表单处理,2,JSP程序开发模式,单纯的JSP页面编程在单纯的JSP编程模式下,通过应用JSP中的脚本标志,可直接在JSP页面中实现各种功能。这种模式很容易实现。缺点:因为将大部分的Java代码与HTML代码混淆在一起,会给程序的维护和调试带来很多的困难,而且对于整个程序的结构更是无从谈起。单纯的JSP页面编程模式是无法应用到大型、中型甚至小型的JSP Web应用程序开发中。,3,JSP程序开发模式,JSP+JavaBean编程该模式是JSP程序开发经典设计模式之一,适合小型或中型网站的开发。利用JavaBean技术,可以很容易地完成一些业务逻辑上的操作,例如数据库的连接、用户登录与注销等。JavaBean是一个遵循了一定规则的Java类,在程序的开发中,将要进行的业务逻辑封装到这个类中,在JSP页面中通过动作标签来调用这个类,从而执行这个业务逻辑。此时的JSP除了负责部分流程的控制外,大部分用来显示页面,而JavaBean则负责业务逻辑的处理。下面将通过一个流程图说明该模式对客户端的请求进行处理的过程。,4,JSP+JavaBean编程,客户端,带有JSP引擎的Web服务器,用户通过客户端浏览器请求服务器,服务器将最终的结果返回给客户端浏览器进行显示,JSP页面,JavaBean,业务逻辑,数据库,在JavaBean中连接及操作数据库,或实现其他业务逻辑,在JSP页面中调用JavaBean,服务器接收用户请求后调用JSP页,JavaBean将执行的结果返回JSP页面,服务器读取JSP页面中的内容(将页面中的静态与动态内容相结合),5,优点:纯净的JSP页面因为业务逻辑和数据库操作已经从JSP页面中剥离出来,JSP页面中只需嵌入少量的Java代码甚至不使用Java代码。可重用的组件设计良好的JavaBean可以重用,甚至可以作为产品销售,在团队协作的项目中,可重用的JavaBean将会大大减少开发人员的工作量,加快开发进度。方便进行调试复杂的操作都封装在一个或者数个JavaBean中,错误比较容易定位。易维护易扩展系统的升级或者更改往往集中在一组JavaBean中,而不用编辑所有的JSP页面。,6,应用范围Model 1模式的表现逻辑和控制逻辑全部逻辑耦合在页面中,这种处理方式对一些规模很小只有几个简单页面的项目比较适用,7,JSP程序开发模式,JSP+Servlet+JavaBean编程在JSP+JavaBean设计模式的基础上加入Servlet来实现程序中的控制层。在这种模式中,由Servlet来执行业务逻辑并负责程序的流程控制,JavaBean组件实现业务逻辑,充当着模型的角色,JSP用于页面的显示。可以看出这种模式使得程序中的层次关系更明显,各组件的分工也非常明确。下面将通过一个流程图说明该模式对客户端的请求进行处理的过程。,8,JSP程序开发模式,提出这种设计模式主要是因为应用程序中用来完成任务的代码模型(也称为“业务逻辑”)通常是程序中相对稳定的部分,并且会被重复使用,程序与用户进行交互的页面视图,却是经常改变的。如果因需要更新页面而不得不对业务逻辑代码进行改动,或者要在不同的模块中应用到相同的功能而重复地编写业务逻辑代码,不仅降低了整体程序开发的进程,而且会使程序变得难以维护。因此,将业务逻辑代码与外观呈现分离,将会更容易地根据需求的改变来改进程序。,9,JSP程序开发模式,MVC模式MVC(Model-View-Controller,模型视图控制器)是一种程序设计概念,它同时适用于简单的和复杂的程序。使用该模式可将待开发的应用程序分解为3个独立的部分:模型、视图和控制器。,10,JSP+Servlet+JavaBean编程对客户端的请求进行处理的过程,客户端,带有JSP引擎的Web服务器,用户通过客户端浏览器请求服务器,服务器将最终的结果返回给客户端浏览器进行显示,JSP页面,JavaBean,业务逻辑,数据库,在JavaBean中连接及操作数据库,或实现其他业务逻辑,服务器接收用户请求后调用Servlet,Servlet根据用户请求调用JavaBean处理业务,服务器读取JSP页面中的内容(将页面中的静态与动态的内容相结合),请求,响应,Servlet,调用,转发,由Servlet转发请求到JSP页面,JavaBean将结果返回Servlet,在Servlet中将结果保存到请求对象中,11,设计模式为软件设计问题提供标准的解决方案,Model 2 是一种设计模式,MVC 将交互式应用程序组织成三个独立的模块:,应用程序模块,用于表示数据和业务逻辑,数据表示,控制器,用于发送请求和控制应用程序的流程,12,Model 2 体系结构,Model 2 体系结构的各种对象包括:,Model(JavaBean)封装应用程序状态处理业务逻辑通知视图的更新,View(JSP)向控制器发送用户请求显示模型状态接收来自模型的更新,Controller(Servlet)定义应用程序行为映射用户请求到模型选择相应的视图,状态查询,通知更新,请求业务处理,选择视图,13,Model 模型(封装数据)代表了某应用程序的核心功能,负责处理用户的数据,实现业务逻辑。同时,模型还为视图的显示提供数据,并可被多个视图所共享。,模型对象 表示 Web 应用程序的数据元素,用户可与这些数据元素进行交互,14,View 视图(显示数据,收集数据)和用户打交道。主要指与用户交互的界面,即应用程序的外观。它只负责将数据转交给控制器;同时还负责展示模型传递给用户的数据,当后台模型更新数据时,视图也应随之更新。Controller 控制器(改变数据,改变模型的状态)负责接收用户的请求和数据,然后做出判断将请求和数据交到哪一个模型来处理,最后调用视图来显示模型返回的数据。,视图对象 提供模型组件以开发用户界面,控制器对象 充当应用程序视图对象和模型对象之间的中间对象,15,在当今各类JSP网站开发标准中,有两种使用JSP的方式,他们分别被称为模式一和模式二。模式一是JSP+JavaBean的结合模式二是JSP+JavaBeanServlet的结合。这两种模式是当今大中型应用程序的基础,这两种模式中最重要的就是JavaBean的开发,JavaBean用来封装业务逻辑。,16,7.3 剖析JavaBean,什么是组件?独立的模块外界不了解其内部实现外界通过其提供的接口对组件进行访问可以重用目前有代表性的组件技术COM、COM+、JavaBeans、EJB等,17,JavaBean 组件和企业级EJB(Enterprise JavaBean)组件EJB是J2EE的核心技术,它为开发服务器端应用程序组件提供了一个模型,利用这个模型来创建可移植性与分布式企业应用程序服务器或组件。EJB定义了一个用于开发基于组件的企业多重应用程序的标准。EJB是一个用来创建分布式、服务器端以及基于Java的企业应用程序组件的功能强大的组件模型。,18,19,7.3.1 什么是JavaBean,JavaBean是Java的可重用组件技术,实质是一种符合某些命名和设计规范的Java类JavaBean通常封装成为具有特定功能或者处理某个业务(如连接数据库,访问数据库)应用:JSP页面内可以访问JavaBean的对象以及它的方法。在JSP的Web应用中集成JavaBean组件,由JavaBean中处理业务逻辑,然后在JSP中调用,而JSP页面着重网页界面的设计,可以实现业务逻辑和前台显示的部分分离。,20,使用JavaBean的好处:可以使得JSP页面变得清晰;节省软件开发时间(可以直接使用已经测试和可信的已有组件,避免了重复开发);降低系统维护的难度JavaBean的分类可视的JavaBean:传统的JavaBean应用于可视化界面(如java图形界面中使用的按钮、文本框或列表框等等)。非可视化的JavaBean:封装逻辑、封装数据,与JSP搭配使用。,创建一个标准JavaBean的基本语法如下。(1)定义JavaBean类 JavaBean类定义的语法结构如下:public class 类名称/类成员的定义/类方法的定义。/类属性的定义。,如何创建JavaBean,其中需要强调的是,类名称与保存的文件名称必须一致,否则就会出现编译错误。同时,类必须声明为公有类,即public。如:public class CarBean private String maker;.,(2)定义JavaBean类的构造函数JavaBean是Jave类,JavaBean就有自己的构造函数,并 且构造函数的名称必须与JavaBean类的名称一致。构造函数的主要作用是用来初始化,而且构造函数无参数输入,其语法结构如下:public JavaBean类名称()/初始化.例如:public CarBean(),(3)定义JavaBean属性JavaBean是Jave类,那么它不但有自己的构造函数,还有自己的属性。JavaBean属性的定义的语法结构如下:private 数据类型 属性名称;例如:private String maker;,(4)设定JavaBean属性值的方法定义了JavaBean属性之后,还要对其属性值进行设定,其属性值设定的语法结构如下:public void set设定方法名称(数据类型 参数)this.变量=参数;例如:public void setMaker(String maker)this.maker=Benz;值得注意的是:JavaBean属性值的设定方法名称一般以set三个字母开头,后面跟上属性设定方法名称。,(5)读取JavaBean属性值的方法上面讲述了如何设定JavaBean属性值,那么属性值设定好之后,如何读取呢?JavaBean属性值读取的语法结构如下:public void get读取方法名称()return this.变量参数;例如:public void getMaker()return this.maker;,JavaBean的属性简介,1.JavaBean的属性与普通Java类的属性的概念不一样,JavaBean的属性是以方法定义的形式出现的。2.用于对属性赋值的方法称为属性修改器或setter方法,用于读取属性值的方法称为属性访问器或getter方法。3.属性修改器必须以小写的set 前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,nickName属性的修改器名称为setNickName,password属性的修改器名称为setPassword。,4.属性访问器通常以小写的get 前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,nickName属性的访问器名称为getNickName,password属性的访问器名称为getPassword。5.JavaBean的属性名是根据setter方法与getter方法的名称来生成的,setter方法或getter方法中除去前缀“set”和“get”后的部分即为属性名,但属性名的首字母一般要小写。,29,7.3.2 JavaBean的特征,通常一个标准的JavaBean有以下特征(编写规范):一定使用了package语句进行打包JavaBean是一个public类型的类有一个无参数的构造方法属性一般是私有的(即用private修饰)对属性值xxx的获取有相应的getXxx()方法,并且此方法是公有的(即用public修饰)若要获取的属性xxx为boolean类型则可以使用isXxx()方法对属性值xxx的设置有相应的setXxx()方法,并且此方法也是公有的(即用public修饰)需要实现接口。实现了Serializable接口的对象可以转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。,30,UserBean.javapackage jsp.test;public class UserBean private String userName;/用户名private String pwd;/密码private String name;/真实姓名private String gender;/性别private int age;/年龄private String email;/电子邮件private String tel;/固定电话private String mphone;/手机public int getAge()return age;public void setAge(int age)this.age=age;public String getEmail()return email;public void setEmail(String email)this.email=email;public String getGender()return gender;public void setGender(String gender)this.gender=gender;public String getMphone()return mphone;public void setMphone(String mphone)this.mphone=mphone;public String getName()return name;public void setName(String name)this.name=name;,31,public String getPwd()return pwd;public void setPwd(String pwd)this.pwd=pwd;public String getTel()return tel;public void setTel(String tel)this.tel=tel;public String getUserName()return userName;public void setUserName(String userName)this.userName=userName;,32,Eclipse中编写JavaBean,Eclipse 新建Web Project在src文件夹上新建package,如前例中的jsp.test在package上新建类,如前例中的UserBean,33,Eclipse中编写JavaBean,34,35,36,37,38,39,一个JavaBean编写完以后,需要将它编译成“.class”文件,并将此“.class”文件(连同其目录)放到本次应用的WEB-INFclasses目录之下(直接在Apache下使用时)。注意:用Eclipse编写会自动地把.class放到相应的class目录下,使用JavaBean,40,在JSP中使用JavaBean,需要使用以下几个动作元素标签:在网页中创建一个Bean对象标签:用于为Bean对象中的属性赋值标签:用于获取Bean对象中属性的值,41,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的新值:,42,6.3.1 调用JavaBean,该标签用来在JSP页面中创建一个JavaBean实例。语法如下:其中:id指定该JavaBean的实例变量的名称scope指定该Bean变量的有效范围request指在任何执行相同请求的JSP文件中使用Bean,直到页面执行完毕,session指从创建该Bean开始,在相同session下的JSP页面中可以使用该Bean;application指从创建该Bean开始,在相同application下的JSP页面中可以使用该Bean,43,44,比较在同一个页面输出效果一样使用动作元素可以指定作用域;在脚本段的作用域只限定在当前JSP页面。对于多个页面共享Bean情况,如果使用脚本段,每个页面都要实例化一个新的对象,会增加系统开销,45,补充 JavaBean,该标签用来在JSP页面中创建一个JavaBean实例,并指定它的名字及作用范围。语法如下:,46,id属性,id属性代表JavaBean对象的变量名可为同一 Bean 类指定不同的 id 值,例如:,47,class 属性,class 属性JavaBean 的类名Count Bean不属于包Count Bean属于test包,48,class属性分两种情况:如果在scope指定的范围内,该JavaBean对象不存在,则创建这个JavaBean对象,相当于执行以下语句Count id1=new Count();Count id2=new Count();若该JavaBean对象已经存在,则不创建新对象,而是直接获得已存在对象的引用。,49,执行过程,50,访问JavaBean,标签用来获取Bean对象的属性值,并显示在页面上,其语法如下:name指出了要获取哪个bean的属性值,取值与useBean中 id值相同;property指出要获取该bean的哪个属性值注意:在使用之前,必须有由所创建的Bean对象 如果使用来检索的值是空值,那么将会产生NullPointerException例外;如果使用程序段或表达式来检索值,那么在浏览器上出现的是将是null(空值),51,例:还可以使用表达式调用其属性,例如在计算器实例中,下面两种表达式是等价的,52,执行过程,public class LanguageBean private String name;public String getName()return this.name;,mypackage.LanguageBean,Hello,.,beans.jsp,转换成字符串,53,通过Bean提供的setXXX()方法设置 Bean 的简单属性和索引属性,语法如下:其中propertyDetails可为如下之一property=“*”property=“propertyName”property=“propertyName”param“paramNameproperty=“propertyName value propertyValue,54,55,设置JavaBean的属性,设置Bean对象的属性的语法有多种:(1).简单bean属性设置 其中:name指出是在操作哪个bean,property指出对该bean的哪个属性赋值,value用来指定给属性赋的值。例:,56,Eg.一个描述学生的beans,在一个JSP页面中获得一个这样的beans,其有效范围是page。在JSP页面中使用动作标签设置、获取该beans的属性。,57,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 getHeight()return height;public void setHeight(double newHeight)height=newHeight;public double getWeight()return weight;public void setWeight(double newWeight)weight=newWeight;,58,student.jsp,名字是:学号是:/身高是:米体重是:公斤,59,注意:如果将表达式的值设置为beans属性的值,表达式值的类型必须和beans的属性的类型一致。如果将字符串设置为beans的属性的值,这个字符串会自动被转化为beans的属性的类型。,60,(2).将单个属性值和输入参数关联用param代替value表示将一个form表单中传入参数的值赋给bean的某个属性。其中:name指出是在操作哪个bean,property指出对该bean的哪个属性赋值,而param表示传入参数的名字。,61,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.age=age;public String getUserName()return userName;public void setUserName(String userName)this.userName=userName;,Test4.jsp,62,(3)输入参数和bean属性值相同,可以简化 这种用法将form表单中传入参数的值赋给bean的某个属性。要求:form表单中参数的名称要与propertyName一致,63,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 setUserName(String userName)this.userName=userName;,注意:property的属性名、form中参数的名字、Bean中的属性名、方法名要对应,Test2.jsp,64,标签,(4).将bean的所有属性与表单中参数关联在这种用法中,JSP容器会一个个检查传入的参数,如果某个传入参数的名字和bean中某个属性的名字相同,则将该参数的值赋给bean中的属性。使用这种方式可以一次为多个属性赋值,65,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 setUserName(String userName)this.userName=userName;,66,Please enter your username:,public class LanguageBean private String name;public void setName(String name)this.name=name;,beans.html,beans.jsp,mypackage.LanguageBean,执行过程,67,eg.首先建立一个名为具有计算访客人数功能的JavaBean类Counter并且在程序中定义一个名为setCounter的方法用来设置属性值Count,并且定义为取得属性的方法getCounter。,Counter.javapackage bean;public class Counter public Counter()private int Count=0;public void setCounter(int count)Count=count;public int getCounter()return+Count;,68,运行效果,在page范围在request范围在session范围在Application范围,69,使用JavaBean处理表单数据,操纵HTML表单步骤1、写JSP原文件,创建一些HTML的表单并命名。2、在Java文件里写Bean,定义属性,GET或者SET方法来配合已经被你指定好名字的表单。3、回到JSP原文件中,增加标签来创建一个或者调用一个现成的Bean。4、增加标签设置HTML表单中需要SET方法的Bean的属性。5、增加标签设置HTML表单中需要GET方法的Bean的属性。6、如果需要处理更多的用户数据,用request对象。,70,eg1.用户通过form表单提交数据,提交的数据被处理后,再在Jsp文件中显示处理usingGetParameter.html让用户输入个人信息usingGetParameter.jsp将其一一输出eg2.使用Jsp+JavaBean形式处理表单。showInfo.jsp让用户输入个人信息服务器取得这些信息之后,利用show.java这个Javabean中的方法将其一一输出,71,7.5.3 使用GET/POST方法传递参数,第一种 GET 它将表单内容附加URL之后,中间用问号连接,然后传送至指定的程序做处理。第二种 POST,这个方法是将表单内容作为一个数据体而不是URL的一部分传送给服务器的。所以URL中看不到表单的内容。,72,在Form里面,可以使用post也可以使用get。它们都是method的合法取值。区别:这两者传递参数时所用的编码不一定是一样的。对于get方法,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,而post方法,开发人员可以指定。get是从服务器上获取数据,post是向服务器传送数据。get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。get安全性非常低,post安全性较高。,73,根据HTTP协议规范,每个HTTP请求主要包含以下信息,74,请求头格式a)通用头(general-header):Cache-Control:客户端希望服务端如何缓存自己的请求数据,如Cache-Control:no-cache,Cache-Control:max-age=0;Connection:客户端是否希望与服务端之间保持长连接,如Connection:close,Connection:keep-alive;Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;Pragma:包含了客户端一些特殊请求信息,如 Pragma:no-cache 客户端希望代理或应用服务器不应缓存与该请求相关的结果数据;Via:一般用在代理网关向应用服务器发送的请求头中,表明该来自客户端的请求经过了网关代理,格式为:Via:请求协议版本 网关标识 其它信息,如:Via:1.1 webcache_250_:80(squid)b)请求头(request-header):Accept:表明客户同端可接受的请求回应的媒体类型范围列表。星号“*”用于按范围将类型分组,用“*/*”指示可接受全部类型;用“type/*”指示可接受 type类型的所有子类型,如“Accept:image/gif,image/jpeg,*/*”;Accept-Charset:客户端所能识别的字符集编码格式,格式:“Accept-Charset:字符集1:权重,字符集2:权重”,如:“Accept-Charset:iso-8859-5,unicode-1-1;q=0.8”;Accept-Language:客户端所能识别的语言,格式:“Accept-Language:语言1:权重,语言2:权重”,如:”Accept-Language:zh,en;q=0.7”;Host:客户请求的主机域名或主机IP,格式:“Host:域名或IP:端口号”,如:“Host:80“,请求行中若有HTTP/1.1则必须有该请求头;User-Agent:表明用户所使用的浏览器标识,主要用于统计的目的;Referer:指明该请求是从哪个关联连接而来;Accept-Encoding:客户端所能识别的编码压缩格式,如:“Accept-Encoding:gzip,deflate”;If-Modified-Since:该字段与客户端缓存相关,客户端所访问的URL自该指定日期以来在服务端是否被修改过,如果修改过则服务端返回新的修改后的信息,如果未修改过则服务器返回304表明此请求所指URL未曾修改过,如:“If-Modified-Since:Fri,2 Sep 2006 19:37:36 GMT”;If-None-Match:该字段与客户端缓存相关,客户端发送URL请求的同时发送该字段及标识,如果服务端的标识与客户端的标识一致,则返回304表明此URL未修改过,如果不一致则服务端返回完整的数据信息,如:“If-None-Match:0f0a893aad8c61:253,0f0a893aad8c61:252,0f0a893aad8c61:251”;Cookie:为扩展字段,存储于客户端,向同一域名的服务端发送属于该域的cookie,如:“Cookie:MailUserName=whouse”;c)实体头(entity-header):(此类头存在时要求有数据体)Content-Encoding:客户端所能识别的编码压缩格式,如:“Content-Encoding:gzip,deflate”;Content-Length:客户端以POST方法上传数据时数据体部分的内容长度,如:“Content-Length:24”;Content-Type:客户端发送的数据体的内容类型,如:“Content-Type:application/x-www-form-urlencoded”为以普通的POST方法发送的数据;“,则表明数据体由多部分组成,分隔符为“;,75,POST方法,发出POST请求的Html页,User Name:Password:,76,POST方法,POST请求文本,POST/MyWeb/index.jsp HTTP/1.1User-Agent:ICEBrowser 5.31Accept:*/*content-type:application/x-www-form-urlencodedContent-length:30Connection:Keep-Aliveuser=JBuilder&password=Borland,77,GET方法,等价的发出GET请求的Html页,User Name:Password:,78,GET方法 GET/MyWeb/index.jsp?user=JBuilder&password=Borland HTTP/1.1User-Agent:ICEBrowser 5.31Accept:*/*Connection:Keep-Alive,等价的GET请求文本,