第四章JavaBean技术与Web数据库操作课件.ppt
Java Web 网络软件开发安徽工程大学 计算机与信息学院安徽工程大学 计算机与信息学院第四章 JavaBean技术与Web数据库操作 主要内容主要内容一、一、JavaBeanJavaBean组件技术组件技术二、二、JSPJSP内置标记内置标记三、三、JSPJSP自定义标记自定义标记四、四、Java Web Java Web 数据库操作数据库操作五、五、JSP+JavaBeanJSP+JavaBean项目项目新闻发布系统新闻发布系统一、一、JavaBeanJavaBean组件技术组件技术JSPJSP页面中,页面中,JavaJava语言与各种脚本语言参杂在一起。语言与各种脚本语言参杂在一起。FFJavaJava语言用来实现逻辑语言用来实现逻辑FF其它脚本语言用来展现内容其它脚本语言用来展现内容不适合在不适合在JSPJSP页面中实现复杂逻辑!页面中实现复杂逻辑!一般的做法是在一般的做法是在JSPJSP页面中展现内容,而把逻辑实现的部分做为一页面中展现内容,而把逻辑实现的部分做为一个单独的个单独的JavaJava类,在类,在JSPJSP页面中使用页面中使用JavaJava类的功能。类的功能。1.JSP1.JSP中调用类中调用类 (1 1)JSPJSP调用内部类调用内部类通过通过 定义内部类(定义内部类(什么是内部类?什么是内部类?)FF程序程序10-110-1:classinjsp.jspclassinjsp.jspJSPJSP调用内部类很不常用。调用内部类很不常用。(2 2)JSPJSP调用外部类调用外部类普通的普通的JavaJava类(外部类)可以被类(外部类)可以被JSPJSP页面自由使用!页面自由使用!外部类可以被外部类可以被JSPJSP使用,也可以被其它使用,也可以被其它JavaJava系统使用系统使用FF重用性好、扩展性好、便于调试。重用性好、扩展性好、便于调试。FF程序程序10-210-2、10-310-3:Student.javaStudent.java、useClass.jspuseClass.jsp实际应用中,实际应用中,JavaBeanJavaBean组件做为具有特定设计规范的外部类得到非组件做为具有特定设计规范的外部类得到非常广泛的使用。常广泛的使用。2.JavaBean2.JavaBean组件组件 (1 1)什么是)什么是JavaBeanJavaBeanJavaBeanJavaBean是满足是满足BeanBean设计规范的普通设计规范的普通JavaJava类类FFJavaBeanJavaBean类必须有一个不带任何参数的类必须有一个不带任何参数的publicpublic型构造函数型构造函数FF私有成员变量和对应的私有成员变量和对应的setXxx()setXxx()方法和方法和getXxx()getXxx()方法方法其中其中xxxxxx是属性名(与私有成员变量名没有必然联系,但建议把是属性名(与私有成员变量名没有必然联系,但建议把xxxxxx作为变量名)。作为变量名)。getXxx()getXxx()方法是方法是publicpublic类型的类型的FF对于布尔型属性,可以采用对于布尔型属性,可以采用is is代替代替getgetJavaBeanJavaBean组件在组件在JSPJSP中可以通过标签来操作。中可以通过标签来操作。BeanBean设计规范是为设计规范是为了满足标签操作需要!了满足标签操作需要!(2 2)JavaBeanJavaBean标签标签jsp:useBean ”/FFFFFF使用标记操作使用标记操作JavaBeanJavaBean组件语法更简单,功能更强大!组件语法更简单,功能更强大!FF举例:通过举例:通过JavaBeanJavaBean组件设置和访问组件设置和访问PersonPerson对象的姓名对象的姓名指定或新建一个bean实例obj(3 3)FormForm和和 JavaBean JavaBean组件的交互组件的交互表单信息的提交是非常基本的应用,利用表单信息的提交是非常基本的应用,利用JavaBeanJavaBean组件接收组件接收formform提提交的数据语法比较简洁。交的数据语法比较简洁。核心思想:将核心思想:将formform映射为一个映射为一个JavaBeanJavaBean组件,组件,formform中的各个控件中的各个控件按按照名称自动关联照名称自动关联到到JavaBeanJavaBean中的各个属性!中的各个属性!jsp:setProperty name=/举例:举例:FF登录页面登录页面 login.jsp login.jsp 文本框控件文本框控件name=“username”name=“username”、密码框控件、密码框控件name=“password”name=“password”FFJavaBeanJavaBean类类 login.java login.javaFF登录处理页面登录处理页面 success.jsp success.jsp,显示用户名密码。,显示用户名密码。(4 4)JavaBeanJavaBean组件的生命周期组件的生命周期声明引用型变量obj指定范围内查找key为“obj”的Bean对象新建Bean对象objBean对象赋值于objobj对象超过使用范围则被删除找到未找到JavaBeanJavaBean四种不同范围的生命周期四种不同范围的生命周期pagepagerequestrequestsessionsessionapplicationapplication举例:举例:10-910-9、10-1010-10FFCounter.javaCounter.javaFFpageDemo.jsppageDemo.jsp二、二、JSPJSP内置标记内置标记 标记名称标记名称标记作用标记作用指定范围获取指定范围获取BeanBean组件,没有就创建组件,没有就创建设置设置BeanBean组件的属性值组件的属性值获取获取BeanBean组件的属性值组件的属性值动态页面包含动态页面包含页面跳转,页面跳转,requestrequest和和responseresponse保持不变保持不变嵌入组件,用于在浏览器中显示一个对象嵌入组件,用于在浏览器中显示一个对象三、三、JSPJSP自定义标记自定义标记JSPJSP内置标记语法简单、功能强大,但是数量有限内置标记语法简单、功能强大,但是数量有限自定义标记提供了扩展新标记的机制自定义标记提供了扩展新标记的机制FF创建自定义标签类,实现标签功能创建自定义标签类,实现标签功能FF配置标记库描述文件配置标记库描述文件(*.tld)(*.tld),描述标签名及其对应的自定义标签类,描述标签名及其对应的自定义标签类FF把标签库描述文件注册到把标签库描述文件注册到 web.xml web.xml一个简单的例子一个简单的例子font span Welcome to AHPU!Welcome to AHPU! 标签库的简单部署标签库的简单部署将将classclass文件按包结构打包成文件按包结构打包成jarjar文件(文件(zipzip压缩文件改扩展名为压缩文件改扩展名为jarjar),),jarjar文件复制到文件复制到 WEB-INF/lib WEB-INF/lib 中。中。不配置不配置web-xml,web-xml,使用的使用写相对路径就行了使用的使用写相对路径就行了 四、四、Java Web Java Web 数据库操作数据库操作一、一、MySQLMySQL数据库基础数据库基础二、二、JDBCJDBC操作数据库操作数据库三、三、JDBCJDBC连接池连接池(一)(一)MySQLMySQL数据库基础数据库基础 1 1、概述、概述MySQLMySQL是瑞典的是瑞典的MySQL ABMySQL AB公司开发的一个小型关系型数据库管理公司开发的一个小型关系型数据库管理系统,(系统,(MySQL ABMySQL AB公司公司20082008年年1 1月月1616号被号被SunSun公司收购公司收购 )MySQLMySQL优点优点FF体积小、速度快、开放源代码、免费体积小、速度快、开放源代码、免费FF使用使用C/C+C/C+编写,保证源代码的可移植性编写,保证源代码的可移植性FF可以处理拥有上千万条记录的大型数据库可以处理拥有上千万条记录的大型数据库2 MySQL2 MySQL的使用的使用使用使用 MySQL6.0 MySQL6.0绿色版绿色版+navicat 8.0+navicat 8.0设计数据库设计数据库newsdbnewsdb,有一张表,有一张表newsnewsFFid id 自动编号?数字?字符串?自动编号?数字?字符串?FFtitle title 字符串?字符串?FFkeyword keyword 字符串?字符串?FFauthor author 字符串?字符串?FFtime time 日期时间日期时间FFcontent content 文本类型(或者备注类型?文本类型(或者备注类型?1000010000字以内?)字以内?)(二)(二)JDBCJDBC操作数据库操作数据库 JDBCJDBC(Java DataBase ConnectivityJava DataBase Connectivity)FFJDBCJDBC接口规范(即应用程序员需要熟练掌握的接口规范(即应用程序员需要熟练掌握的JDBC APIJDBC API)FF符合符合JDBCJDBC接口规范的接口规范的JDBCJDBC驱动程序驱动程序(*.jar(*.jar文件文件)JDBCJDBC操作数据库的一般过程操作数据库的一般过程1 1、把、把JDBCJDBC驱动添加到驱动添加到webweb应用程序中应用程序中把驱动程序(把驱动程序(*.jar*.jar文件)添加到文件)添加到WEBWEB-INFINF文件夹的文件夹的liblib子文件夹中子文件夹中2 2、指定、指定JDBCJDBC驱动名驱动名Class.forName(“com.mysql.jdbc.Driver”)Class.forName(“com.mysql.jdbc.Driver”)3 3、根据数据库、根据数据库urlurl、用户名、密码建立数据库连接对象、用户名、密码建立数据库连接对象String url=String url=“jdbc:mysql:/“jdbc:mysql:/localhostlocalhost:3306/:3306/newsdbnewsdb?useUnicode=true&char?useUnicode=true&characterEncoding=GBK”;acterEncoding=GBK”;Connection connect=Connection connect=DriverManager.DriverManager.getConnectiongetConnection(url,username,password);(url,username,password);JDBCJDBC操作数据库的一般过程操作数据库的一般过程4 4、基于数据库连接对象创建数据库操作对象(、基于数据库连接对象创建数据库操作对象(StatementStatement对象、对象、PreparedStatementPreparedStatement对象)对象)Statement stmt=connect.createStatement()Statement stmt=connect.createStatement()5 5、利用、利用statementstatement对象操作数据库对象操作数据库FFexecuteQuery(sql)executeQuery(sql)查询性的数据库操作查询性的数据库操作FFexecuteUpdate(sql)executeUpdate(sql)更新性的数据库操作更新性的数据库操作JDBCJDBC操作数据库的一般过程操作数据库的一般过程Class.forName(Class.forName(driverdriver););Connection connect=Connection connect=DriverManager.getConnection(DriverManager.getConnection(urlurl,usernameusername,passwordpassword););Statement stmt=connect.createStatement();Statement stmt=connect.createStatement();ResultSet rs=stmt.executeQuery(sql);ResultSet rs=stmt.executeQuery(sql);/sql/sql为数据库查询语句为数据库查询语句(三)(三)JDBCJDBC操作操作MySQLMySQL数据库数据库(四)(四)JDBCJDBC访问访问accessaccess数据库数据库1 1、把、把accessaccess文件设置为文件设置为ODBCODBC(Open Database ConnectivityOpen Database Connectivity)数据源,通过数据源,通过JDBC-ODBCJDBC-ODBC桥访问桥访问ODBCODBC数据源,很少用。数据源,很少用。2 2、通过、通过JDBC-ODBCJDBC-ODBC驱动直接访问驱动直接访问accessaccess文件,因为比较方便,文件,因为比较方便,所以在小型系统中很常用。所以在小型系统中很常用。driver=“sun.jdbc.odbc.JdbcOdbcDriver”driver=“sun.jdbc.odbc.JdbcOdbcDriver”url=“jdbc:odbc:DRIVER=Microsoft Access Driver(*.mdb);DBQ=c:mydata.mdb”url=“jdbc:odbc:DRIVER=Microsoft Access Driver(*.mdb);DBQ=c:mydata.mdb”绝对路径很不方便!绝对路径很不方便!JDBCJDBC通过相对路径访问通过相对路径访问accessaccess数据库数据库driverdriver=sun.jdbc.odbc.JdbcOdbcDriver;=sun.jdbc.odbc.JdbcOdbcDriver;dbnamedbname=“databasenews.mdb”=“databasenews.mdb”filepathfilepath=application.getRealPath(=application.getRealPath(dbnamedbname););/得到绝对路径得到绝对路径filepathfilepath=filepathfilepath.replaceAll(“”,“”);.replaceAll(“”,“”);/java/java中用中用“”“”表示表示“”“”urlurl=jdbc:odbc:DRIVER=Microsoft Access Driver(*.mdb);DBQ=+=jdbc:odbc:DRIVER=Microsoft Access Driver(*.mdb);DBQ=+filepathfilepath;三、连接池三、连接池单连接单连接FF每次访问数据库都创建新的连接,访问完再关闭连接,每次访问数据库都创建新的连接,访问完再关闭连接,效率低下效率低下连接池连接池FF数据库连接池负责分配、管理和释放数据库连接,它数据库连接池负责分配、管理和释放数据库连接,它允许重复使用允许重复使用现有的数据库连接现有的数据库连接。FF应用程序请求连接时,连接池为该请求分配连接,用完后再放回到应用程序请求连接时,连接池为该请求分配连接,用完后再放回到连接池中。连接池中。FF连接池中的空闲连接对象数量低于下限时,连接池自动追加一定数连接池中的空闲连接对象数量低于下限时,连接池自动追加一定数量的连接对象,数量高于上限时,连接池将释放一定数量的连接量的连接对象,数量高于上限时,连接池将释放一定数量的连接Tomcat Tomcat 连接池配置及应用连接池配置及应用1 1、配置、配置Tomcat Tomcat 连接池连接池FF 配置配置TomcatTomcat服务器的服务器的confcontext.xmlconfcontext.xml文件文件2 2、配置应用程序数据源、配置应用程序数据源FF配置应用程序的配置应用程序的web.xmlweb.xml3 3、添加数据库驱动、添加数据库驱动4 4、编写测试代码访问数据库、编写测试代码访问数据库1 1、配置、配置Tomcat mysqlTomcat mysql连接池连接池往往TomcatTomcat服务器的服务器的confcontext.xmlconfcontext.xml文件的根标签内添加:文件的根标签内添加:Resource=jdbc:mysql:/localhost:3306/newsdb?autoReconnect=true/ResourceResource标签的其它属性标签的其它属性Resource/2 2、配置应用程序数据源、配置应用程序数据源在应用程序的在应用程序的web.xmlweb.xml文件根标签内添加以下内容:文件根标签内添加以下内容:DB Connection DB Connection jdbc/mysqljdbc/mysql javax.sql.DataSourcejavax.sql.DataSource ContainerContainer3 3、添加数据库驱动、添加数据库驱动mysql jdbcmysql jdbc驱动包复制到应用程序的驱动包复制到应用程序的WEB-INF/libWEB-INF/lib或者,复制到或者,复制到TomcatTomcat的的liblib目录下目录下4.4.测试代码:测试代码:JSPJSP页面中添加下面页面中添加下面javajava程序段程序段%五、五、JSP+JavaBeanJSP+JavaBean项目项目新闻发布系统新闻发布系统模块连接图模块连接图浏览模块浏览模块default.jspdefault.jsp后台维护后台维护主页面主页面manage.jspmanage.jsp添加页面添加页面addnews.jspaddnews.jsp删除模块删除模块deleteop.jspdeleteop.jsp添加到数据库添加到数据库addnewsop.jspaddnewsop.jsp编辑模块编辑模块editnews.jspeditnews.jsp显示详细新闻显示详细新闻view.jspview.jsp添加到数据库添加到数据库savenewsop.jspsavenewsop.jsp新闻发布系统新闻发布系统模块连接图模块连接图浏览模块浏览模块default.jspdefault.jsp后台维护后台维护主页面主页面manage.jspmanage.jsp添加页面添加页面addnews.jspaddnews.jsp删除模块删除模块deleteop.jspdeleteop.jsp添加到数据库添加到数据库addnewsop.jspaddnewsop.jsp编辑模块编辑模块editnews.jspeditnews.jsp显示详细新闻显示详细新闻view.jspview.jsp添加到数据库添加到数据库savenewsop.jspsavenewsop.jsp数据库分析数据库分析简单设计,只需一张表简单设计,只需一张表newsnews设计设计accessaccess数据库数据库news.mdbnews.mdb,有一张表,有一张表newsnewsFFid id 自动编号自动编号FFtitle title 文本类型文本类型FFkeyword keyword 文本类型文本类型FFtime time 日期时间日期时间FFauthor author 文本类型文本类型 FFcontent content 文本类型文本类型数据库表查询数据库表查询查询表中所有记录查询表中所有记录select *from news order by id ascselect *from news order by id asc查询表中特定的记录查询表中特定的记录select *from news where id=2011040112345601select *from news where id=2011040112345601数据库表更新数据库表更新修改记录修改记录update update newsnews set title=set title=titlexxxtitlexxx,author=,author=authorxxxauthorxxx,.,.where id=where id=idxxxidxxx 增加记录增加记录insert into insert into newsnews values(values(idxxxidxxx,titlexxxtitlexxx,keywordxxxkeywordxxx,now()now(),.),.)删除记录删除记录delete fromdelete from news news where id=where id=idxxxidxxx 当前时间信息输入到数据库当前时间信息输入到数据库 java.util.Date now=java.util.Date now=newnew java.util.Date();java.util.Date();SimpleDateFormat dateformat=SimpleDateFormat dateformat=newnew SimpleDateFormat(yyyy-SimpleDateFormat(yyyy-MM-dd HH:mm:ss);MM-dd HH:mm:ss);String time=dateformat.format(now);String time=dateformat.format(now);/符合时间格式要求的字符串直接使用于符合时间格式要求的字符串直接使用于sqlsql语句。语句。编码转换编码转换Java webJava web开发中,中文处理常常需要做编码转换。如开发中,中文处理常常需要做编码转换。如“ISO8859-1”“ISO8859-1”转为转为“UTF-8”“UTF-8”特殊字符处理特殊字符处理在在java webjava web开发中,某些字符需要特殊处理开发中,某些字符需要特殊处理FF、单引号、双引号、单引号、双引号FF换行符、空格、大于号、小于号等换行符、空格、大于号、小于号等特殊字符特殊字符(查看:查看:ISO Latin-1ISO Latin-1字符集字符集)<<®®注册商标注册商标&& 空格空格©©copyrightcopyright™™商标商标""´´“自动产生自动产生idid由当前系统时间产生十六位由当前系统时间产生十六位idid2011020112345601 2011020112345601 FF即即20112011年年2 2月月1 1日日12:34:56,12:34:56,最后两位为自动递增序列最后两位为自动递增序列六、六、HibernateHibernate框架框架采用面向对象思想开发相对独立的数据库操作模块,能提高代码的采用面向对象思想开发相对独立的数据库操作模块,能提高代码的复用复用HibernateHibernate是一个开源的对象关系映射框架,它对是一个开源的对象关系映射框架,它对JDBCJDBC进行了轻量进行了轻量级的对象封装,使得级的对象封装,使得JavaJava程序员可以很方便地使用对象编程思维来程序员可以很方便地使用对象编程思维来操纵数据库。操纵数据库。HibernateHibernate体系结构体系结构HibernateHibernate简单应用实例简单应用实例1 1、MyEclipseMyEclipse中配置数据库连接中配置数据库连接2 2、建一个、建一个WebWeb项目并添加项目并添加hibernatehibernate框架支持框架支持3 3、利用、利用hibernatehibernate反向工程生成实体类、反向工程生成实体类、DAODAO类和映射文件类和映射文件4 4、编写数据库访问测试代码、编写数据库访问测试代码1 1、MyEclipseMyEclipse中配置数据库连接中配置数据库连接打开打开MyEclipse Database ExplorerMyEclipse Database Explorer视图:视图:Window Window Open Open Perspective Perspective MyEclipse Database ExplorerMyEclipse Database ExplorerDBDB浏览器内右击,右键菜单上选择浏览器内右击,右键菜单上选择newnew,输入相关信息。这些信息,输入相关信息。这些信息生成配置文件时有用。生成配置文件时有用。2 2、建一个、建一个WebWeb项目并添加项目并添加hibernatehibernate框架支持框架支持右击项目文件夹,右键菜单上选择右击项目文件夹,右键菜单上选择 MyEclipse MyEclipse Add Hibernate Add Hibernate CapabilitesCapabilites,一路配置(或默认)并,一路配置(或默认)并nextnext3 3、利用、利用hibernatehibernate反向工程生成实体类、反向工程生成实体类、DAODAO类和映射文件类和映射文件打开打开MyEclipse Database ExplorerMyEclipse Database Explorer视图:视图:Window Window Open Open Perspective Perspective MyEclipse Database ExplorerMyEclipse Database Explorer从数据库浏览器中选中的数据库表(可以选择多个表),右键菜单从数据库浏览器中选中的数据库表(可以选择多个表),右键菜单上选择上选择Hibernate Reverse EngineeringHibernate Reverse Engineering,弹出设置菜单,适当配置,弹出设置菜单,适当配置(或者默认)并一路(或者默认)并一路nextnextHibernateHibernate对象的三种状态对象的三种状态三个方法:三个方法:attachDirty,attachClean,merge attachDirty,attachClean,merge mergemerge:将传入的:将传入的detacheddetached状态的对象的属性复制到持久化对象中,状态的对象的属性复制到持久化对象中,并返回该持久化对象并返回该持久化对象 。如果该。如果该sessionsession中没有关联的持久化对象,中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作为持久对象返加载一个,如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持回,传入对象依然保持detacheddetached状态。状态。attachDirtyattachDirty:将传入的对象持久化并保存。如果对象未保存:将传入的对象持久化并保存。如果对象未保存(TransientTransient状态),调用状态),调用savesave方法保存。如果对象已保存方法保存。如果对象已保存(DetachedDetached状态),调用状态),调用updateupdate方法将对象与方法将对象与SessionSession重新关联。重新关联。attachCleanattachClean:将传入的对象状态设置为:将传入的对象状态设置为TransientTransient状态。状态。4 4、测试代码、测试代码 增加记录增加记录NewsDAO dao=NewsDAO dao=newnew NewsDAO();NewsDAO();News a=News a=newnew News();News();a.setId(id);a.setId(id);。Session s=dao.getSession();Session s=dao.getSession();Transaction trans=s.beginTransaction();Transaction trans=s.beginTransaction();dao.attachDirty(a);dao.attachDirty(a);/或者或者dao.save(a)dao.save(a)mit();mit();修改记录修改记录NewsDAO dao=NewsDAO dao=newnew NewsDAO();NewsDAO();Session s=dao.getSession();Session s=dao.getSession();Transaction trans=s.beginTransaction();Transaction trans=s.beginTransaction();a=dao.findById(a=dao.findById(20120427165638112012042716563811););/或者或者News a=(News)s.get(News.News a=(News)s.get(News.classclass,2012042716563811);,2012042716563811);a.setTitle(a.setTitle(修改后的标题修改后的标题 ););dao.attachDirty(a)dao.attachDirty(a)/或者或者s.update(a)s.update(a)或者或者dao.save(a)dao.save(a)mit();mit();删除记录删除记录NewsDAO dao=NewsDAO dao=newnew NewsDAO();NewsDAO();Session s=dao.getSession();Session s=dao.getSession();List list=dao.findByAuthor(List list=dao.findByAuthor(张三张三 ););Transaction trans=s.beginTransaction();Transaction trans=s.beginTransaction();forfor(News a:list)(News a:list)dao.delete(a);dao.delete(a);mit();mit();