回麻雀苑主页 到麻雀苑-搜狐博客
4-5动态网页数据写入数据库
作者:老麻雀
2006-11-5 10:04:05
将动态网页的数据写入数据库
前面几节着重介绍了连接数据库的知识和相应操作,所引用的范例中,也只是介绍了连接部分的代码。从本节开始,后面几节都是介绍不同访问方式的代码。本节主要介绍数据库数据的写入代码。
在JSP动态网页中,因为连接不同数据库,使用不同的JDBC,连接部分的代码有所不同。而访问部分的代码,基本一样。所以后面的代码范例,一律都使用Access数据库进行介绍。如果读者使用其他数据库体验本书的范例,只要将代码中连接部分进行修改,调试后都可以运行。
一、 范例的演示和代码清单
本节演示数据库写入操作的范例,仍然是上一节的动态网页ch4-31.jsp。由于演示前提、演示步骤、代码清单和上一节完全相同,这里不再重复叙述。而是直接进行代码分析,本节着重分析网页代码的整体结构,以及写操作代码的具体构成。
二、动态网页的代码分析
Ch4-31.jsp是从表单获得数据,然后连接数据库,再将获得的数据写入数据库的动态网页。代码的结构分为如下几个部分:
第一部分: 调用java.sql专用包(第9行)。
9) <%@page contentType="text/html;charset=gb2312" import="java.sql.*" %>
代码中import="java.sql.*",是将java.sql专用包调入。因为后面的代码要使用SQL语句,所有调用SQL语句的专用类,都在这个包中。因此凡是连接访问数据库的动态网页,在页命令设置的代码行中,都必须有import="java.sql.*"一项。
第二部分: 从表单获得数据(第11-17行)。
11) String clas =new String(request.getParameter("clas"));
12) String na =new String(request.getParameter("na"));
13) String name =new String(request.getParameter("name"));
14) String sex =new String(request.getParameter("sex"));
15) String password=new String(request.getParameter("pass"));
16) String password2=new String(request.getParameter("repass"));
17) String email =new String(request.getParameter("email"));
这几行代码,和前几章中获得数据的代码有所不同。它是将获得的数据,强行转化为字符串型的对象。这样做主要为了保证后面代码使用数据时,绝对是字符串类型。如果仍然使用原来所学的代码,一般情况下,网页都可正常运行。以第11行为例,可以仍然写成如下格式:
11) String clas = request.getParameter("clas");
第三部分: 定义字符串变量,分别用于承载JDBC驱动、连接数据库url参数的内容、要运行的SQL语句内容(第19-20行)。
19) String DBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
20) String ConnStr="jdbc:odbc:ch4";
21) String sql="insert into st (班级,学号,姓名,性别,密码,email) values (""+clas+"",""+na+"",""+name+"",""+sex+"",""+password+"",""+email+"")";
第19行,定义字符串变量DBDriver,同时赋值的内容为JDBC-ODBC桥的驱动。这是为第24行的运行提供准备。
第20行,定义字符串变量ConnStr ,同时赋值的内容为Access数据库的数据源,其中ch4就是配置数据源时,输入的数据源名称。它是为第33行的运行提供准备。
第21行,定义字符串变量sql ,同时赋值的内容为,将获得的数据写入数据库的SQL语句。
注意:这个变量是由若干个字符串和若干个变量组合而成,其中构成元素的含义如下:
> st:被写入数据的表名;
> (班级,学号,姓名,性别,密码,email):表中的字段名;
> (""+clas+"",""+na+"",""+name+"",""+sex+"",""+password+"",""+email+""):对应表中每个字段,要写入的数据;它是由六个JSP变量组合而成。
如果各个JSP变量获得的数据clas是“04011”,na是“33”,name是“张三”,sex是“男”,password是“123”,email是“zhang@ccc.com”,那么第21行的语句的实际形态如下:
String sql="insert into st (班级,学号,姓名,性别,密码,email) values ("04011","33","张三","男","123","zhang@ccc,com")";
这样就可以看出sql变量的内容是一个标准的SQL插入语句,正因为被写入的数据是由变量传递过来的,因此第21行的语句,要由若干个字符串和若干个变量组合而成。读者自己编制写入数据库的代码时,要特别注意相关的格式(这是出错率较高的语句)。
这行代码是为第35行的运行提供准备。
第四部分: 加载JDBC-ODBC桥驱动。(第22-30行)
22) try
23) {
24) Class.forName(DBDriver);
25) }
26) catch(java.lang.ClassNotFoundException e)
27) {
28) System.err.println("database:"+e.getMessage());
29) out.println("驱动未能加载");
30) }
这几行代码中,进行驱动加载的只是第24行:
24) Class.forName(DBDriver);
其中Class.forName( )是加载驱动语句的关键字,()括弧中的内容是被加载的驱动程序。()括弧中的DBDriver,是前面在第19行代码定义的变量,它被赋值JDBC-ODBC桥的驱动“sun.jdbc.odbc.JdbcOdbcDriver”。
其余的各行代码(第22-23行,25-30行),使用了异常的抛出和捕捉机制,如果加载的驱动出现问题,可以在第26-29行捕捉到,并输出提示信息“驱动未能加载”。读者编制自己第动态网页时,同样的代码编制熟练后,可以只保留第24行代码,将其余的代码行省略。
第五部分: 连接Access数据库;(第33行)
33) Connection conn=DriverManager.getConnection(ConnStr,"","");
这行代码的含义是,使用DriverManager的getConnection方法创建与数据源的连接。语句中后面()括弧中有三个参数(url,user,pwd),url是前面第20行定义变量时准备好的内容,user是访问数据源的用户名,pwd访问数据源的密码。这里的用户名和密码为空值,因为在配置数据源时,没有定义具体的用户名和密码。其中的conn是被创建的连接对象名称,对象名,读者可以使用任何字母自由命名。这个对象属于JDBC的Connection类。
第六部分: 运行SQL语句,将数据写入数据库;(第34-35行)
34) Statement stmt=conn.createStatement();
35) stmt.executeUpdate(sql);
第34行,为执行SQL语句,准备好一个Statement对象,创建Statement对象使用Connection接口的CreateStatement()。其中stmt是对象的名称,对象名,读者可以使用任何字母自由命名。
第35行,使用Statement的executeUpdate方法,运行SQL写操作语句。()括弧中是对象的参数,该参数就是前面第21行代码中定义的变量sql,变量的内容是插入数据记录的SQL语句。Statement对象还有一个executeQuery方法,用于运行SQL读操作语句,将在下一节查询数据库的范例代码中看到如何使用。
其他部分:
第31行、32行、39-44行使用了异常的抛出和捕捉机制,如果连接数据库、运行SQL语句出现错误,将被40-44行的语句捕捉到异常,并输出提示“数据未能写入”。
第36行,显示输出信息“数据写入成功,信息存储完成”。由于这一行代码位于连接数据库、运行SQL语句的代码之后,因此都没有异常产生的情况下,才能被运行。
第37-38行,将前面创建的两个对象关闭,用于节约计算机宝贵的内存资源。没有这两行代码,不影响动态网页的正常运行,但将降低计算机的使用效率。
JSP动态网页连接访问Access数据库,写入数据的操作,首先要解决连接问题,然后才是解决访问问题。读者仿照范例编制自己的动态网页时,解决连接问题,先要创建需要的数据库和表,然后配置数据源。解决访问问题,主要是只要注意代码的正确性。代码中特别需要注意的几点是,
1. 代码中的数据源名称和实际配置数据源的名称要一致;
2. 代码中的表名和创建的表名要一致;
3. 代码中SQL语句涉及的表中字段名要和创建的表中实际的字段吻合;
4. 代码中SQL语句涉及的写入数据,由若干变量构成,这些变量必须是前面获得HTML表单数据的变量。同时还有注意排列顺序,要和对应的字段排列顺序一致。
首次编制自己的动态网页代码,出现错误是必然的。调试时,可以先把对应范例第35行的代码注释掉,如果能够正常运行,错误出在和第35行有联系的第21行。
如果出现提示“驱动未能加载”参考上一节连接数据库出错的解决办法。
如果出现提示“数据未能写入”问题大多时数据源配置的问题,或者是代码中第20行中数据源的名称错了。
如果出现其他的错误,则要根据屏幕提示,查找相关的原因。
如果屏幕没有提示,网页也不能正常运行。要将动态网页中,所有相关连接访问数据库的代码全部注释掉,运行网页。然后依据逻辑关系,逐渐将加载驱动的代码、连接数据库的代码、运行SQL语句的代码依次放开,可以查找到错误出现的位置。
发文时请务必注意: 一、遵守国家相关法律规定,如 《北京地区互联网站电子公告服务倡议书》, 《全国人大常委会关于维护互联网安全的决定》 及中华人民共和国其他各项有关法律法规。一旦违犯法律法规,您将承担一切因您的行为而直接或间接导致的民事或刑事法律责任,本站工作人员有义务配合相关部门,提供必要的技术资料(如IP地址等)。 二、自觉遵守爱国、守法、自律、真实、文明的原则,严禁发表有人身攻击倾向、有造谣生事嫌疑的言论,严禁发表虚假广告、色情、网络传销性质的内容,本站管理人员有权删除违反规定的内容或取消违规网友的发文权限甚至删除其ID。 |