Author:huangjyEmail:hjyonline@163.com第十课JavaBeanAuthor:huangjyEmail:hjyonline@163.comDAODAO设计模式Author:huangjyEmail:hjyonline@163.com本课内容组件技术JavaBean概述JSP与JavaBean的结合使用JavaBean访问数据库配置Tomcat以及访问Oracle数据库综合案例——投票系统的实现购物车的javabean实现Author:huangjyEmail:hjyonline@163.com组件技术组件技术在现代软件业中扮演着越来越重要的角色,目前代表性的组件技术有COM、COM+、JavaBean、EJB(EnterpriseJavaBean)和CORBA(CommonObjectRequestBrokerArchitecture,公共对象请求代理结构)。基于组件的软件设计带来以下的优势:(1)组件可重复使用(2)易于替换和升级(3)加快软件开发速度,缩短生产周期Author:huangjyEmail:hjyonline@163.comJavaBean简介JavaBean背景先构建,然后重复使用Author:huangjyEmail:hjyonline@163.com不同JSP构造的应用脚本元素直接调用servlet代码脚本元素间接调用servlet代码(通过实用工具类)beanservlet/JSP的组合(MVC)MVC连同JSP表达式语言定制标签Author:huangjyEmail:hjyonline@163.com背景知识:bean是什么?•遵循某些特定约定的Java类–必须具备一个零参数(空)的构造函数•显式地定义这样一个构造函数或者省略所有的构造函数都能满足这项要求–不应该有公开的实例变量(字段)•希望您早就遵循这项准则,使用存取方法而非允许对字段直接访问–持续性的值应该能够通过getXxx和setXxx方法来访问•如果类有getTitle方法,返回String,我们就说类有一个名为title的String属性•布尔型的属性使用isXxx,而非getXxx–有关bean的更多内容,参见:huangjyEmail:hjyonline@163.com为什么我们应该使用存取方法,不应使用公开字段呢?•bean不能有公开字段•因此,应该将下面的代码publicdoublespeed;•替换为privatedoublespeed;publicdoublegetSpeed(){return(speed);}publicvoidsetSpeed(doublenewSpeed){speed=newSpeed;}•总之,您的所有Java代码都应该遵循这项准则。为什么呢?Author:huangjyEmail:hjyonline@163.com为什么我们应该使用存取方法,不应使用公开字段呢?1)可以对值加以约束publicvoidsetSpeed(doublenewSpeed){if(newSpeed0){sendErrorMessage(...);newSpeed=Math.abs(newSpeed);}speed=newSpeed;–如果类的用户直接访问这些字段,那么每个用户都得负责检查这些约束条件。Author:huangjyEmail:hjyonline@163.com为什么我们应该使用存取方法,不应使用公开字段呢?2)我们可以在不改变接口的情况下修改内部的表达//Nowusingmetricunits(kph,notmph)publicvoidsetSpeed(doublenewSpeed){setSpeedInKPH=convert(newSpeed);}publicvoidsetSpeedInKPH(doublenewSpeed){speedInKPH=newSpeed;}Author:huangjyEmail:hjyonline@163.com使用bean:基本任务•jsp:useBean–在最简单的情况下,这个元素构建一个新的bean。常见的用法如下:jsp:useBeanid=“beanName“class=“bluedot.Test/•jsp:getProperty–这个元素读取并输出bean属性的值。用法如下:jsp:getPropertyname=beanName“property=propertyName/•jsp:setProperty–这个元素修改bean的属性(即调用形如setXxx的方法)。常见的用法如下:jsp:setPropertyname=beanName“……../Author:huangjyEmail:hjyonline@163.com构建bean:jsp:useBean•格式–jsp:useBeanid=nameclass=package.Class/•目的–不需用到显式的Java编程就能够创建Java类的实例(XML兼容的语法)•注意–简单来说:jsp:useBeanid=book1class=“bluedot.Book/可以认为等同于下面的scriptlet%bluedot.Bookbook1=newbluedot.Book();%–但jsp:useBean拥有下面两项额外的优势:•从请求参数中导出对象的值更容易•在页面和servlet间共享对象更容易Author:huangjyEmail:hjyonline@163.com访问bean的属性:jsp:getProperty•格式–jsp:getPropertyname=nameproperty=property/•目的–不需用到显式的Java编程就可以访问bean的属性(即调用getXxx方法)•注意–jsp:getPropertyname=book1property=title/等价于下面的JSP表达式%=book1.getTitle()%Author:huangjyEmail:hjyonline@163.com设置简单的bean属性:jsp:setProperty•格式–jsp:setPropertyname=name“property=property“value=value/•目的–不需用到显式的Java编程就可以设置bean的属性(即调用setXxx方法)•注意–jsp:setPropertyname=book1“property=titlevalue=ServletsandJavaServerPages/等价于下面的scriptlet%book1.setTitle(ServletsandJavaServerPages);%Author:huangjyEmail:hjyonline@163.com示例:StringBeanpackagecom.sinojava;publicclassStringBean{privateStringmessage=Nomessagespecified;publicStringgetMessage(){return(message);}publicvoidsetMessage(Stringmessage){this.message=message;}}•bean安装在常规的Java目录中–…/WEB-INF/classes/directoryMatchingPackageName•bean(和实用工具类)一定要在包中!Author:huangjyEmail:hjyonline@163.com使用StringBean的JSP页面(代码)jsp:useBeanid=stringBean“class=“com.sinojava.StringBean/LIInitialvalue(fromjsp:getProperty):Ijsp:getPropertyname=stringBean“property=message//ILIInitialvalue(fromJSPexpression):I%=stringBean.getMessage()%/ILIjsp:setPropertyname=stringBean“property=messagevalue=Beststringbean:Fortex/Valueaftersettingpropertywithjsp:setProperty:Ijsp:getPropertyname=stringBean“property=message//ILI%stringBean.setMessage(Myfavorite:KentuckyWonder);%Valueaftersettingpropertywithscriptlet:I%=stringBean.getMessage()%/IAuthor:huangjyEmail:hjyonline@163.com实验创建并使用JavaBeanAuthor:huangjyEmail:hjyonline@163.com将单个属性与输入参数关联•jsp:setProperty的param属性可以用来标示:–值应该来自于指定的请求参数–对于所期望的值属于标准类型的属性,应该自动执行类型转换•boolean,Boolean,byte,Byte,char,Character,double,Double,int,Integer,float,Float,long,orLong.如:jsp:useBeanid=entry“class=“SaleEntry“scope=“request”/jsp:setPropertyname=entry“property=itemID“param=itemID/jsp:setPropertyname=entry“property=numItemsparam=numItems/jsp:setPropertyname=entry“property=discountCodeparam=discountCode/Author:huangjyEmail:hjyonline@163.com将所有属性与输入参数关联•使用*作为jsp:setProperty的property属性的–值应该来自于名称与属性名相匹配的请求参数–应该执行简单的自动类型转换jsp:useBeanid=entry“class=“SaleEntry/jsp:setPropertyname=entryproperty=*/•对于生成“表单bean”(属性由表单提交的数据来填充的对象)来说这项功能极为方便。–我们甚至可以用多个表单来完成这个过程,每次提交填充对象的部分数据。Author:huangjyEmail:hjyonline@163.com共享bean•我们可以使用scope属性来指定bean存储的其他位置–依旧需要绑定到_jspService中的局部变量–jsp:useBeanid=…class=…“scope=…/•可以让多个servlet或JSP页面共享数据Author:huangjyEmail:hjyonline@163.comscope属性的取值•page(jsp:useBean…scope=“page”/或jsp:useBean…)–默认值。在处理当前请求的过程中,bean对象都应该存放在PageContext对象中。让同一servlet中的其他方法可以访问该bean。•application(jsp:useBean…scope=application/)–Bean将存储在ServletContext中(通过application变量或调用getServletContext()来访问)。Servlet