1、第六课 Java Web 开发技术 王俐之 北京师范大学信息科学与技术学院 wanglizhi@ 主要内容 Java数据库连接(JDBC) JavaBean 实现 MVC开发模式 JDBC JDBC (Java DataBase Connectivity)是用于执行SQL语句的Java应用程序接口,由一组用Java语言编写的类与接口组成。 JDBC是一种规范,它让各数据库厂商为Java程序员提供标准的数据库访问类和接口,这样就使得独立于DBMS的Java应用程序的开发工具和产品成为可能。 JDBC JDBC的工作就是负责在Web中操作数据库,而不必进入具体的数据库管理系
2、统中。JDBC的用途可以归纳为以下三项: 与数据库建立连接; 向数据库管理系统发送SQL语句; 操作数据库,处理数据库返回的结果。 JDBC应用程序接口 JDBC被描述成为一组抽象的Java接口: java.sql.DriverManager:处理驱动的调入并且对产生新的数据库连接提供支持。 java.sql.Connection:代表对特定数据库的连接。 java.sql.Statement:代表一个特定容器,对一个特定数据库执行SQL语句。 java.sql.ResultSet:控制对一个特定语句的行数据存取。 java.sql.PreparedStatement:用于
3、执行预编译的SQL语句。 数据库连接 1、加载驱动程序: 根据采用的后台数据库选择和加载相应的驱动程序: (1)调用方法Class.forName 最常用的加载驱动程序方法,目前Web设计多采用此方法,其语法格式为: Class.forName(“驱动程序类”).newInstance(); 例如:Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”). newInstance(); 数据库连接 (2)通过registerDriver方法注册 这种方法通过调用DriverManager类的registe
4、rDriver方法实现的,其语法格式为:DriverManager.registerDriver(new 驱动程序类()); 如:DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver ()); 数据库连接 2、建立连接 驱动程序加载后,由java.sql.DriverManager类继续负责与数据库建立连接,调用getConnection()方法建立连接。 Connection 连接名=DriverManager.getConnection(URL,”userid”,”passw
5、ord”); userid和password分别为:数据库的用户名和密码。 数据库连接 2、建立连接 JDBC中的URL提供了一种标示数据库的方法,标准语法如下: jdbc:<子协议>:<子名称> <子协议>:表示驱动程序名或数据库连接机制。 <子名称>:一种标识数据库的方法,依据不同的子协议而变化。例如: jdbc:microsoft:sqlserver://127.0.0.1:1443;DatabaseName=pubs 表示“microsoft”子协议,子名称为sqlserver://127.0.0.1:1443;DatabaseName=pubs 数据库是Micro
6、soft公司的SQL Server数据库,地址在本机的1443号端口,数据库名称为pubs。 JDBC和JDBC/ODBC解决方案 JDBC的使用 装载驱动程序 装载驱动程序只需要非常简单的一行代码。如果想要使用JDBC/ODBC桥驱动程序,可以用下列代码装载它: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 建立连接 第二步就是用适当的Driver类与DBMS建立一个连接。下列代码是一般的做法: Connection con = DriverManager.getConnection(url, "Login", "Passwor
7、d"); JDBC的使用(2) 查询数据库 为了下面的演示,我们使用Microsoft Access编辑刚刚建立的数据源javadb.使用设计向导创建一个名为student的表接着输入一些测试数据。 编写JDBC程序一般步骤 ①加载驱动程序 Class.forName(driverClass); ②获得jdbc 连接 Connection con = DriverManager.getConnection(url); ③创建Statement对象 Statement stmt = con.createStatement(); ④得到查询结果集或者执行update
8、等操作 ResultSet rs = stmt.executeQuery("select * from student"); ⑤关闭数据库连接 try { con.close(); } catch (Exception e) { } JDBC示例代码 public class JDBCDemo { public static void main(String[] args) { String driverClass = "sun.jdbc.odbc.JdbcOdbcDriver"; String url = "jdbc:odbc:javad
9、b"; String[] columnNames = new String[]{"studentno", "lastname", "firstname", "gender", "birthday"}; String[] displayNames = new String[]{"学号", "姓", "名", "性别", "生日"}; try { //①加载驱动程序 Class.forName(driverClass); } catch (ClassNotFoundException e) { //驱动程序加载不成功,打印错误信息并退出 Sy
10、stem.out.println("Can not find driver " + driverClass); System.exit(-1); } Connection con; JDBC示例代码(2) try { //②获得jdbc 连接 con = DriverManager.getConnection(url); //③创建Statement对象 Statement stmt = con.createStatement(); //④得到查询结果集 ResultSet rs = stmt.executeQuery("select * fr
11、om student"); //打印表头 for (int i = 0; i < displayNames.length; i++) { System.out.print(displayNames[i] + "\t"); } System.out.println(); //列印结果集 while (rs.next()) { for (int i = 0; i < columnNames.length; i++) { System.out.print(rs.getString(columnNames[i]) + "\t"); } System.o
12、ut.println(); } stmt.close(); JDBC示例代码(3) } catch (SQLException sqe) { sqe.printStackTrace(); } finally { //⑤关闭数据库连接 try { con.close(); } catch (Exception e) { } } } } JavaBean JavaBean概述 JSP与JavaBean的结合 JavaBean的生命周期 使用JavaBean访问数据库 JavaBean案例 17 1、JavaB
13、ean简介 JavaBean组件本质上就是一个按照标准格式编写的Java类,只不过这个类要遵循一些编码的约定。在JSP中,既可以像使用普通类一样实例化JavaBean类的对象,调用它的方法,也可以利用技术中提供的动作元素来访问JavaBean。 JavaBean概述 18 1、JavaBean简介 通常而言,一个标准的JavaBean应该有以下几项特性: (1)JavaBean是一个公开的(Public)类; (2)JavaBean类必须是拥有一个零参数的(默认)构造函数; (3)设置或获取JavaBean属性时,必须使用getXXX()方法或set
14、XXX()方法。 6.1 javaBean概述 19 2、JavaBean属性的命名 给每一个属性添加get和set方法 ,其中属性名字的第一个字母大写,然后在名字前面相应地加上“get”和“set”。如果一个属性只有get方法或只有set方法,那么这个属性就是一个只读或只定的属性。如: Public String getName() Public void setName(String name) 6.1 javaBean概述 20 3、JavaBean示例:TeacherInfo.java public class TeacherInfo{ pri
15、vate String teacherId,teacherName; //get方法 public String getTeacherId() { return this.teacherId; } public String getTeacherName() { return this.teacherName; } //set 方法 public void setTeacherId(String s) {this.teacherId=s;} public void setTeacherName (String s) {this.teacherName=s;} }
16、
6.1 javaBean概述
21
要想在JSP 程序中使用JavaBean 组件,我们可以应用
17、 class = "className" scope = "page|request|session|application" type = "tyepName" />
id 属性用来设定JavaBeans 的名称,利用id 可以识别在同一个JSP 程序中使用的不同的JavaBeans 组件实例;
class 属性指定JSP 引擎查找JavaBeans 代码的路径,一般是这个JavaBean 所对应的Java 类名;
scope 属性用于指定JavaBeans 实例对象的生命周期,亦即这个JavaBean 的有效作用范围,scope 的值可能是page、request、session 18、以及application,
type 属性主要用来控制所要声明的变量的类型是实际BeanJava类型的超类,或是JavaBean实现的接口。
6.2 Jsp与javaBean结合
23
2、简单JavaBean属性的设置: 22、输入参数缺少时不采取任何动作;
(2)自动类型转换并不能像手动类型转换那样能够防止不合法的值;
(3)JavaBean属性的名称和请求参数大小写敏感。
6.2 Jsp与javaBean结合
27
对于JSP而言,JavaBean 组件不仅可以封装许多信息而且还可以将一些数据处理的逻辑隐藏到JavaBean 的内部。除此之外我们还可以设定JavaBean 的Scope属性,使得JavaBean 组件对于不同的任务具有不同的生命周期和不同的使用范围。
6.3 JavaBean的生命周期
28
1、Page范围的JavaBean
使用 23、aBean的范围设为Page,则表示将JavaBean放在PageContext对象中,即这个JavaBean的生命周期只在一个页面中,你只能在本网页内部去存取利用它。如果程序涉及到其他页面时,些时jsp容器会自动释放其内存,结束其生命周期。
如果没有指定JavaBean的scope时,则Container范围的默认值为Page。
6.3 JavaBean的生命周期
29
1、Page范围的JavaBean
使用 24、一个页面中,你只能在本网页内部去存取利用它。如果程序涉及到其他页面时,些时jsp容器会自动释放其内存,结束其生命周期。
如果没有指定JavaBean的scope时,则Container范围的默认值为Page。
6.3 JavaBean的生命周期
30
2、Request范围的JavaBean
使用 25、ude或是forward的网页,亦可以存取到原来网页所产生的JavaBean。
6.3 JavaBean的生命周期
31
3、Session范围的JavaBean
如果一个JavaBean 的Scope 属性值为session 那么这个JavaBean 组件的生命周期作用范围就和JSP 的Session 对象的生命周期作用范围一样,也就是说这一类型的JavaBeans 组件的生命周期就是某个会话过程所经历的时间。
6.3 JavaBean的生命周期
32
4、application范围的JavaBean
如果JavaBeans 的Scope 属性被指定为applica 26、tion, 也就是说这个JavaBean 组件具有Application生命周期,它的生命周期和JSP 的Application对象同步,作用范围也和Aplication 对象一样。
使用这种类型的JavaBean组件可以在多个用户之间共享全局信息。
具体来说,如果某个JSP 程序使用 27、根据条件创建JavaBean
如果我们创建JavaBean组件时,需要执行一些特殊语句,这些语句只需在JavaBean创建时执行,如JavaBean初始化的一些设置,那么我们也可以使用如下形式来实现:
28、问数据库时, 使用这种结构可使JSP页面中只需要嵌入少量的Java代码甚至不使用Java代码, 可重用对数据库进行处理的JavaBean, 方便调试。
并且将对数据库的操作封装在JavaBean中,使得数据库的地址、登录用户名和密码等信息都封装在应用程序中, 用户JSP页面中没有任何对数据库操作进行访问的源代码, 从而提高了应用程序的安全性.
6.4 使用JavaBean访问数据库
35
1、用JavaBean封装数据库访问
加载驱动程序;
如:调用Class.forName()方法来载入一个JDBC驱动程序
建立数据库连接 ;
我们可以通过DriverM 29、anager类的getConnection()方法来建立一个数据库连接
数据操作
与建立数据库连接后,就可以利用这个连接对象的createStatement()方法来创建SQL 语句对象Stat进行数据操作
关闭数据库
因为数据库连接是系统宝贵资源,因此在数据库操作完毕后应及时地释放数据库连接
2、 在JSP页面中使用JavaBean组件进行数据库操作
6.4 使用JavaBean访问数据库
36
MVC设计模式
1、MVC设计模式
什么是设计模式
MVC设计模式
2 、JSP Model1和JSP Model2
JSP Model1
JSP Mod 30、el2
1、 MVC设计模式
1.1 什么是设计模式
设计模式(Design pattern)是对于某些常见问题抽象提炼出来的解决方案。
软件设计模式使人们可以更加简单方便的复用以往成功的软件设计经验和体系结构,将已经被证实为有效的软件技术用设计模式进行表述也将会使新来的开发者更加容易理解其原来的设计思路,减少沟通成本和误解。
1 、MVC设计模式
1.2 MVC设计模式
(1)MVC设计思想
MVC是把一个应用的输入、处理、输出流程按照模型、视图、控制的方式进行分离,这样应用被分为三个层:模型层、视图层、控制层。
模型层(Model):负责表达和访问商业数据,执行 31、业务逻辑和操作。
视图层(View):把表示模型数据及逻辑关系和状态的信息及特定形式展示给用户。
控制层(Control):定义了抽象的业务逻辑,用于控制业务流程。
1 、MVC设计模式
(2) MVC的实现
图 8.1 GUI程序中的MVC
1 、 MVC设计模式
(2) MVC的实现
图 8.2 web应用中的MVC
2、 JSP Model1和JSP Model2
2.1 JSP Model1
对于小型的web应用程序,我们可以直接使用JSP来编写动态网页,网页中的动态内容通过插入一些JSP中脚本代码来实现,这种方式写程序最为简单、快捷。
这样做也使得 32、我们的JSP页面中大量混合了HTML和JAVA代码,应用程序变得难以读懂和维护。
在页面中加入Java Bean在一定程度上可以解决这种问题,我们可以使用Java Bean将复杂的商务逻辑封装进来,这种方法我们称之为JSP Model1。
图 8.3 JSP Model1结构图
2 、JSP Model1和JSP Model2
2.1 JSP Model1
2、 JSP Model1和JSP Model2
2.2 JSP Model2
在JSP Model1设计模式中,JSP页面还是必须调用一定的业务逻辑,而且JSP页面还承担起控制页面流向的重要角色,所以在JSP Model1中将不可能消除页面中存在的程序代码。
为了解决JSP Model1存在的上述问题,我们引入了MVC体系,也就是我们所说的JSP Model2。
图 8.4 JSP Model2结构图
2 、JSP Model1和JSP Model2
2.2 JSP Model2






