实验目的和要求
1.掌握JSP与数据库的连接技术——JDBC
2.掌握JSP数据库编程技术。
3.独立完成实验,根据实验内容书写实验报告书。
实验内容
利用数据库建立一个同学录,然后通过JDBC编写一系列基于Web方式的JSP程序,来对同学录的数据库进行添加、查询等功能,要求在网页上显示出来。
1.建立数据库
建立名为students的access数据库,在库中建立schoolmate表,字段包括:
2. 创建数据源名
打开数据源(ODBC);添加Microsoft Access Driver(*.mdb)数据源驱动程序。数据源名称:students;更改默认数据库,选择students。
3.运行所编写的应用程序
启动eclipse,建立项目exp5,将编写的程序放入该项目的WebContent下,右键点击WebContent,选择“刷新”。打开要运行的页面,在程序的任意位置单击右键,选择“运行方式”/“在服务器上运行”,单击“在服务器上运行” 对话框的“完成”,即可看到运行结果。
主要仪器设备
计算机、Windows操作系统、JDK、myEclipse和tomcat环境
实验记录
代码一show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.sql.*" %>
<html>
<head>
<title>首页</title>
<script>
function change(id){
alert("是否确认删除");
window.location.href = "delete.jsp?stuId="+id;
}
</script>
</head>
<body>
<h1 align="center">同学录</h1>
<form action="query.jsp" method="post">
<div align="center">
输入id或姓名进行查询:
<input type="text" name="name1">
<input type="submit" value="查询">
</div>
</form>
<form action="addstudent.jsp">
<div align="center">
添加学生:
<input type="submit" value="添加">
</div>
</form>
<%
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connection = DriverManager.getConnection("jdbc:odbc:students","root","111111");
String sql = "select * from schoolmate";
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
//利用out方法输出前端代码
out.println("<table align=\"center\" border=\"2px\">\n" +
" <tr>\n" +
" <th>id</th><th>姓名</th><th>生日</th><th>手机号</th><th>邮箱</th><th>地址</th><th>备注</th><th>操作</th>\n" +
" </tr>");
//遍历结果集
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Date birthday = resultSet.getDate("birthday");
String phone = resultSet.getString("phone");
String email = resultSet.getString("email");
String address = resultSet.getString("address");
String other = resultSet.getString("other");
out.println( "<tr>\n" +
" <td>"+id+"</td><td>"+name+"</td><td>"+birthday.toString()+"</td><td>"+phone+"</td><td>"+email+"</td><td>"+address+"</td><td>"+other+"</td>" +
"<td><form action=\"delete.jsp\"><input type=\"button\" value=\"删除\" onclick=\"change("+id+")\"></form></td>\n" +
" </td>");
}
out.println("</table>");
}
catch (SQLException sqlException){
out.println("<h3>加载失败</h3>");
throw new RuntimeException(sqlException);
}
//关闭数据源
out.close();
statement.close();
resultSet.close();
connection.close();
%>
</body>
</html>
代码二addstudents,jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.sql.*" %>
<html>
<head>
<title>add1</title>
<a href="index.jsp" >返回主界面</a>
</head>
<body>
<form action="add.jsp" method="post">
<h3 align="center">请输入信息:</h3>
<table align="center">
<tr>
<td>学号:</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<tr>
<td>姓名:</td>
<td><input type="text" name="name2"></td>
</tr>
<tr>
<td>生日:</td>
<td><input type="text" name="birthday"></td>
</tr>
<tr>
<td>电话:</td>
<td><input type="text" name="phone"></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="text" name="email"></td>
</tr>
<tr>
<td>地址:</td>
<td><input type="text" name="address"></td>
</tr>
<tr>
<td>备注:</td>
<td><input type="text" name="other"></td>
</tr>
<tr>
<td>
<input type="submit" value="确认添加">
</td>
<td>
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>
代码三add,jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.sql.*" %>
<html>
<head>
<title>添加</title>
</head>
<body>
<%
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name2");
String id = request.getParameter("id");
String birthday = request.getParameter("birthday");
Date b = Date.valueOf(birthday);
String phone = request.getParameter("phone");
String email = request.getParameter("email");
String address = request.getParameter("address");
String other = request.getParameter("other");
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connection = DriverManager.getConnection("jdbc:odbc:students","root","111111");
String sql = "insert into schoolmate(id,name,birthday,phone,email,address,other) values(?,?,?,?,?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,id);
preparedStatement.setString(2,name);
preparedStatement.setDate(3,b);
preparedStatement.setString(4,phone);
preparedStatement.setString(5,email);
preparedStatement.setString(6,address);
preparedStatement.setString(7,other);
preparedStatement.executeUpdate();
preparedStatement.close();
connection.close();
response.sendRedirect("show.jsp");
}catch (SQLException sqlException){
out.println(sqlException);
// throw new RuntimeException(sqlException);
}
%>
</body>
</html>
代码四delete,jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.sql.*" %>
<html>
<head>
<title>删除</title>
</head>
<body>
<%
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("utf-8");
//获取路径中的id参数
String stuId = request.getParameter("stuId");
int id = Integer.parseInt(stuId);
Connection connection = null;
Statement statement = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connection = DriverManager.getConnection("jdbc:odbc:students","root","111111");
String sql = "delete from schoolmate where id="+id;
statement = connection.createStatement();
statement.executeUpdate(sql);
}catch (SQLException sqlException){
out.println("<h3>加载失败</h3>");
throw new RuntimeException(sqlException);
}
//out.close();不能提前关闭out,否则下面的重定向不能实现
statement.close();
connection.close();
response.sendRedirect("index.jsp");
%>
</body>
</html>
代码五query,jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.sql.*" %>
<html>
<head>
<title>查询</title>
<a href="show.jsp">返回同学录界面</a>
<h3 align=center>查询结果为:</h3>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
//获取用户名,方便之后查询
String name1 = request.getParameter("name1");
String id1 = request.getParameter("name1");
Connection connection;
PreparedStatement preparedStatement;
ResultSet resultSet;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connection = DriverManager.getConnection("jdbc:odbc:students","root","111111");
String sql = "select * from schoolmate where name like ?";
preparedStatement = connection.prepareStatement(sql);
int n = 0;
preparedStatement.setString(1, "%"+name1+"%");
resultSet = preparedStatement.executeQuery();
out.println("<table align=\"center\" border=\"2px\">\n" +
" <tr>\n" +
" <th>id</th><th>姓名</th><th>生日</th><th>手机号</th><th>邮箱</th><th>地址</th><th>备注</th>\n" +
" </tr>");
while (resultSet.next()) {
if(name1 == null || name1.length() == 0)
break;
n++;
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Date birthday = resultSet.getDate("birthday");
String phone = resultSet.getString("phone");
String email = resultSet.getString("email");
String address = resultSet.getString("address");
String other = resultSet.getString("other");
out.println( "<tr>\n" +
" <td>"+id+"</td><td>"+name+"</td><td>"+birthday.toString()+"</td><td>"+phone+"</td><td>"+email+"</td><td>"+address+"</td><td>"+other+"</td>\n" +
" </tr>");
}
/* preparedStatement.close(); */
/* resultSet.close(); */
String sql1 = "select * from schoolmate where id like ?";
preparedStatement = connection.prepareStatement(sql1);
preparedStatement.setString(1,id1);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
n++;
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Date birthday = resultSet.getDate("birthday");
String phone = resultSet.getString("phone");
String email = resultSet.getString("email");
String address = resultSet.getString("address");
String other = resultSet.getString("other");
out.println( "<tr>\n" +
" <td>"+id+"</td><td>"+name+"</td><td>"+birthday.toString()+"</td><td>"+phone+"</td><td>"+email+"</td><td>"+address+"</td><td>"+other+"</td>\n" +
" </td>");
}
out.println("</table>");
if (n==0){
out.println("<h1 align=center>没有这个人</h1>");
}
}catch (SQLException sqlException){
out.println("<h1 align=center>加载失败</h1>");
throw new RuntimeException(sqlException);
}
out.close();
preparedStatement.close();
resultSet.close();
connection.close();
%>
</body>
</html>
遇到的问题和解决方法
- JDK8无法识别类sun.Jdbc.Odbc.Jdbc.OdbcDriver类的问题,导致Jdbc.Odbc桥无法实现——安装了JDK6和Tomcat6,修改了运行的环境变量
- 搭载了JDK6后Tomcat8和JDK6无法兼容的问题,导致Tomcat8无法运行jsp文件——下载了Tomcat6
- 同时配置好环境后,eclipse中的server由于依然是Tomcat8还要重新在eclipse上配置Tomcat6
- 由于端口占用,导致Tomcat无法启动
- Access数据库无法用SQL Server以及Navicat连接,配置好数据源后,下载Microsoft Access数据库进行连接,创建schoolmate表
- 运行后发现查询中文结果在jsp页面上输出乱码——查询数据库的编码方式未UTF-8,修改jsp代码的pageEncode和Charset编码统一为UTF-8,也添加request.setContentType(“UTF-8”)和解决post请求乱码的问题代码:request。setCharacterEncoding(“UTF-8”)
心得体会
Java应用程序不直接和底层数据库打交道,而是在程序中调用JDK提供的通用的JDBC API。具体数据库驱动程序一般由数据库厂商提供API:java.sql.DriverManager类:驱动程序管理器类,提供了对于多种不同的数据库的驱动程序的管理功能纵某种数据库时,需要将该数据库驱动程序注册到或者说加载到内存中,注册到DriverManager将来在数据库连接和操纵的过程中,DriverManager会自动的调用底层的数据库驱动程序
java.sql.Driver接口:所有的数据库驱动程序类都必须实现Driver接口。它提供了自动加载本驱动程序类到DriverManager的功能
java.sql.Connection接口:表示到一个特定数据库的连接。只有连接成功,获取了一个Connection对象之后才能进行下一步操作
java.sql.Statement接口:提供了真正执行SQL语句的功能
java.sql.ResultSet接口:它得到的是一个集合,里面返回的是多条记录,可以对它进行遍历
JDBC编程步骤:1)加载驱动程序。即向系统注册所需的JDBC驱动程序
2)建立到指定数据库的连接
3)提交数据库查询
4)取得查询结果。。程序运行结束前,还应关闭已经建立的数据库连接,释放所占用的资源
JDBC驱动程序管理器并不直接操纵数据库驱动程序,而是调用JDBC—ODBC桥驱动程序操纵ODBC驱动程序,进而连接各类型数据库.它的好处就是Java应用程序不需要关心底层用的是哪一种数据库,它所操纵的就是ODBC数据源,而不需要程序来干预由Windows操纵系统进行维护和管理的ODBC数据源的内部的实现
步骤: 1)创建ODBC数据源。即把要连接的目标数据库封装成一个ODBC数据源
2)在程序中连接并操作ODBC数据源
完整版javaweb实验报告