资源描述
第五章在JSP JSP 页面中使用页面中使用JavaBeanJavaBean 第五章第五章JSP编程编程JavaBean和和JSP的结合的结合5.2 Java Bean原理与应用原理与应用5.15.1.1 什么是什么是JavaBean5.1.2 JavaBean的简单例子的简单例子5.1 Java Bean原理与应用原理与应用背景背景:1.1.复用:编一次代码,用在多个地方复用:编一次代码,用在多个地方n网页计数器,几乎所有的网站都会用到,每次都网页计数器,几乎所有的网站都会用到,每次都copycopy这部分代码么?这部分代码么?复用?复用?n数据库的连接,几乎所有网页都会用到数据库的连接,几乎所有网页都会用到复用?复用?n分页显示数据分页显示数据(图书浏览,在线购物很多地方都会用到图书浏览,在线购物很多地方都会用到)复用?复用?2.2.分离:分离:JSPJSP中提供内置对象方便中提供内置对象方便JSPJSP的开发控制,页面显示和业务逻辑混杂在一起的开发控制,页面显示和业务逻辑混杂在一起分离比较清晰分离比较清晰nJavaBeanJavaBean直译就是咖啡豆。因为直译就是咖啡豆。因为javajava程序是由一个类程序是由一个类共同协作完成的,每一个类就是一个程序基本单元,共同协作完成的,每一个类就是一个程序基本单元,就像一颗颗的咖啡豆。就像一颗颗的咖啡豆。n广义的广义的Java BeanJava Bean就是就是JavaJava类。类。n狭义的狭义的Java beanJava bean是必须满足一些基本要求的是必须满足一些基本要求的JavaJava类:如各类:如各种种setter/gettersetter/getter函数等。函数等。5.1.1什么是什么是JavaBeanJavaBean其实就是一个其实就是一个java类,但要满足以下条件类,但要满足以下条件1.必须有一个无参构造函数必须有一个无参构造函数此构造函数在使用实例化JavaBean 类时调用,若JavaBean 类内没有任何构造函数,则系统会自动生成一个没有任何参数的构造函数。2.JavaBean 内的属性都应定义为私有的内的属性都应定义为私有的3.定义属性定义属性xxx的存取函数的存取函数getXxx(),用来获取属性,用来获取属性xxx。setXxx(),用来修改属性,用来修改属性xxx.需要注意的是,变量的第一个字母是小写的,但方法名内的第一个字母必须大写,此为必须遵守的约定,方法为public的 对于对于booleanboolean类型的成员变量,允许使用类型的成员变量,允许使用isis代替上面的代替上面的getget和和setset 例:例:JavaBeanStudent类类nwebweb项目名:项目名:JavaBeanStudyJavaBeanStudyn包名:包名:com.jspcom.jspn类:类:Student.javaStudent.java向向Javabean类文件中手工添加成员变量类文件中手工添加成员变量package com.jsp;public class Student private long classno;private String name;private int age;private boolean sex;private String major;自动加入自动加入set/getset/get方法方法在代码编辑区在代码编辑区右键右键重构重构封装字段封装字段n则则netbeansnetbeans自动为数据成员生成自动为数据成员生成get/setget/set方法方法package com.jsp;public class Student private long classno;private String name;private int age;private boolean sex;private String major;public Student()public String getName()return name;public void setName(String name)this.name=name;public int getAge()return age;public void setAge(int age)this.age=age;public boolean isSex()return sex;/boolean变量的变量的get函数是函数是isXXX public void setSex(boolean sex)this.sex=sex;public String getMajor()return major;public void setMajor(String major)this.major=major;public long getClassno()return classno;public void setClassno(long classno)this.classno=classno;public static void main(String args)System.out.println(test JavaBean!);Student a=new Student();a.setAge(27);a.setClassno(1001);a.setName(mike);a.setSex(true);a.setMajor(computer);System.out.println(the name is+a.getName();System.out.println(the major is+a.getMajor();if(a.isSex()System.out.println(it is male);else System.out.println(it is female);/手工添加手工添加main,以测试,以测试bean从上面看出:其实JavaBean就是一个java类5.2JavaBean和和JSP的结合的结合5.2.1JSP页面中与页面中与JavaBean有关的标记有有关的标记有3个个1.2.3.1)n声明声明JavaBeanJavaBean的对象实例的对象实例,具有唯一,具有唯一idid,及其作用域,及其作用域nJSPJSP页面通过页面通过idid来来识别识别JavaBeanJavaBean并可通过id.method类似的语句来操作JavaBeann例例:在应用程序作用域中,声明了类型:在应用程序作用域中,声明了类型 StudentStudent、idid为为s1s1的的 beanbean:id:对象实例的名称:对象实例的名称 class:JavaBean的完整类名的完整类名 scope:声明声明JavaBean的生存范围的生存范围pagerequestSessionapplicationStudent s1=new Student()相当于相当于属性 说明 缺省值 idid 用来标识对象实例的名称用来标识对象实例的名称(与大小写有关与大小写有关)没有缺省值没有缺省值 scopescope 引引 用用 有有 效效 的的 范范 围围。可可 能能 的的 值值 有有“pagepage”、“requestrequest”、“session“session”和和“application”application”。后面将会解释这些值的含义后面将会解释这些值的含义 “pagepage”classclass 完全限定的完全限定的类类的名称的名称 没有缺省值没有缺省值 typetype 这这个个可可选选的的属属性性定定义义了了要要创创建建的的脚脚本本变变量量的的类类型型,并并且且遵遵循循标标准准的的JavaJava类类型型转转换换规规则则。该该类类型型可可以以为为一一个个beanbean类类的的父父类类、由由它它实实现现的的接接口口或或者者为为beanbean类类本本身身。就就像像任任何何的的类类型型转转换换操操作作一一样样,如如果果该该对对象象不不是是正正确确的的类类型型,则则会会在在请请求求时时抛抛出出一一个个java.lang.ClassCastExceptionjava.lang.ClassCastException异常异常 classclass属性的值属性的值2)n用来访问JavaBean的属性n访问属性的值,并且把该值转换为 String,然后输出到客户的输出流当中 前面声明的前面声明的useBean的对象的对象s1 获得获得s1的属性:的属性:id:对象实例的名称:对象实例的名称在在useBean中定义的中定义的property:学生类:学生类Student中的中的学生姓名属性学生姓名属性nameProperty=“*”搜索所有属性,搜索所有属性,相当于相当于属性 说明 namename beanbean实例实例的名称,它必须已经被的名称,它必须已经被 标记进行标记进行了定义。注意在了定义。注意在 中的名字必须与中的名字必须与 标记中的名字一样标记中的名字一样 propertyproperty 正正在在被被设设置置值值的的beanbean属属性性的的名名字字,如如果果propertyproperty属属性性有有值值“*”,标标记记就就会会在在请请求求对对象象中中浏浏览览所所有有的的参参数数去去寻寻找找所所匹匹配配的的请请求求参参数数的的名名称称,并并且且在在beanbean中中输输入入属属性性名名称称和和类类型型。请请求求中中的的值值被被赋赋给给每每个个所所匹匹配配的的 beanbean属属性性,除除非非请请求参数有值,否则,不会改变求参数有值,否则,不会改变 beanbean的属性的属性 例:例:public class Student private String name;public String getName(String name)return this.name;Student.java-JavaBeanHello,.UseJavaBeans.jsp转换成字符串动作是相应于动作,用来访问bean的属性。它访问属性的值,并且把该值转换为 String,然后输出到客户的输出流当中。3)n设置设置JavaBeanJavaBean属性的三种方法属性的三种方法1.用jsp动作标记 2.直接调用JavaBean对象的方法s1.setClassno(“56789”);3.利用request对象传递来的参数来设置JavaBean属性。例:设定例:设定Student组件的组件的classno属性属性 id:对象实例的名称:对象实例的名称在在useBean中定义的中定义的property:Student中的学号中的学号Property=“*”搜索所有属性,搜索所有属性,Jsp脚本中:脚本中:或或s1.setClassno(“56789”);相当于相当于value:属性值,:属性值,学号为学号为56789标准标记与在前面部分中介绍的 动作一起被使用,来设置bean的属性值。Please enter your username:或或 直接赋值直接赋值public class Student private String name;public void setName(String name)this.name=name;input.htmlUseJavaBeans.jspStudent.java-JavaBean例例5-3将网页输入的学生信息传递给将网页输入的学生信息传递给JavaBean由request对象传递来的参数更正:更正:P133n在在P133 input.html中中将将param.jsp改为改为UseJavaBean.jsp 倒数倒数第第5行加入行加入 是否男生是否男生n将将P134 param.jsp程序名程序名改改为为UseJavaBean.jsp在在后面加入后面加入 在在程序的倒数第程序的倒数第3行加入:行加入:是否男生是否男生 input.html UseJavaBean.jsp 使用使用javaBean-Student 姓名姓名 年龄年龄 专业专业 是否男生是否男生 UseJavaBean.jsp【法1】用标记将request传递来的参数数据传递给JavaBean声明avaBean的实例对象【法2】用对象方法将request传递来的参数传递给JavaBean【法1】标记获得javaBean属性【法2】直接用对象方法获得JavaBean的属性5.2.2 JavaBean的的Score属性属性 JavaBean的生存期的生存期n每个JavaBean都有一个生存范围,Bean只在它定义的范围里才能使用,在它的活动范围外将无法访问到它。n利用Scope属性来声明JavaBean的生存范围。1.Page(缺省)2.request3.Session4.applicationPage(Bean的缺省使用范围)nScope值为page的Bean能在包含“”元素的JSP文件及此文件中的所有静态包含文件中使用,n直到页面执行完毕向客户端发回响应或转到另一个文件为止。request:作用于任何相同请求的JSP文件中,直到页面执行完毕向客户端发回响应或在此这之前已通过某种方式(如重定向、链接等方式)转到另一个文件为止。还可通过使用request对象访问bean,如:request.getAttribute(beanName)。session:n从创建Bean开始,就能在任何使用相同session的JSP文件中使用这个Bean。这个Bean存在于整个session生存周期内,任何分享此session的JSP文件都能使用同一Bean。在session的生存周期内,对此bean属性的任何改动,都会影响到在此session内的任意page、任意request对此bean的调用。前提是必须在创建此Bean的文件里事先用page指令指定了session=true。application:n作用于整个application的生存周期内,从创建Bean开始,就能在任何使用相同application的JSP文件中使用Bean。这个Bean存在于整个application生存周期内,任何在分享此application的JSP文件都能使用同一Bean。在application周期内,对此bean属性的任何改动,都会影响到此application内另一page、另一request及另一session里对此bean的调用。1)JSP变量例变量例4-5:网页访问计数器:网页访问计数器JSP与与JavaBean结合的简单例子结合的简单例子思想:思想:n网页计数器网页计数器JavaBeanJavaBean的形式封装实现的形式封装实现n动态网页动态网页counter.jspcounter.jsp来引用来引用JavaBeanJavaBean实现网页实现网页计数。计数。程序程序56:counter.javapackage com.jsp;public class Counter/初始化初始化JavaBean的成员变量的成员变量int count=0;/Class构造器构造器public Counter()/属性属性count的的Get方法方法public int getCount()/获取计数器的值,每一次请求都将计数器加获取计数器的值,每一次请求都将计数器加1count+;return this.count;/属性属性Count的的Set方法方法public void setCount(int count)this.count=count;程序程序57:Counter.jsp网页计数器网页计数器当前页面访问次数:当前页面访问次数:不停刷新页面,计数累加javaBean的作用范围是appication,直到web服务器关闭、重启为止思考:多个网页计数器的异同思考:多个网页计数器的异同已经学过多个网页计数器,实现技术不同已经学过多个网页计数器,实现技术不同1.1.利用利用JSPJSP变量实现变量实现 P89P892.2.利用利用ApplicationApplication内置对象实现的内置对象实现的 P118P1183.3.利用利用JavaBeanJavaBean实现的实现的P137P137购物车购物车用用javabean实现实现n表示层表示层:ProductCatalog.jspProductCatalog.jsp 选择购物的页面选择购物的页面carts.jspcarts.jsp :购物处理:购物处理接收ProductCatalog的订货信息,调用javaBean 之购物车cart,(声明JavaBean的对象cart时,已经声明其生存范围为session,所以在所有使用cart的页面均声明DisplayCart.jspDisplayCart.jsp:显示购物车内的订单,并可以修改购物数量显示购物车内的订单,并可以修改购物数量 声明 取出cart中保存的订单信息,显示,并可以修改n业务逻辑层业务逻辑层Cart.javaCart.java:用用javabeanjavabean实现的购物车实现的购物车OrderItem.javaOrderItem.java 订货单条目类订货单条目类Product.javaProduct.java 产品类产品类CartCart-items-items:HashMapHashMap :Cart()Cart()addItems(IntegeraddItems(Integer productIDproductID,OrderItemOrderItem product)product)updateCart(IntegerupdateCart(Integer productIDproductID,OrderItemOrderItem product)product)getTotalPricegetTotalPrice()():doubledoublegetItemsgetItems()():HashMapHashMapInteger,setItems(HashMapsetItems(HashMapInteger,item itemOrderItemOrderItem-productIDproductID:intint-quantityquantity:intint-price-price:doubledoubleproductproduct-productIDproductID:intint-productNamproductName e:StringString-priceprice:doubledouble
展开阅读全文