第一篇正经技术博客——简单的实现javaWeb和数据库连接JDBC(SQLServer)
使用Tomcat作为Web服务器和Servlet容器,使用SQL Server作为数据库服务器,从浏览器端发起对Servlet的调用,完成对数据库的简单操作。
(继续使用实验四中创建的students数据库和其中的scores表)
使用Tomcat作为Web服务器和Servlet容器,使用SQL Server/MySQL作为数据服务器,从浏览器端发起对Servlet的调用,完成如下任务:
(1)向scores表中插入新的记录,表示录入新学生信息;
(注意:学号为主键,插入学号相同的学生要提示错误;如果学号由数据库自动生成除外)
(2)批量录入成绩,即:在一个界面上列出所有学生信息,在同一个界面上成绩还可以重新录入;
录入部分或者全部学生成绩后,提交,将所有成绩写入scores表。
(没有录入的成绩,可以暂定为0写入scores表)
使用的静态html页面和动态Servlet的个数没有限制。
一、编写jsp文件实现静态页面
1.主页
主要用到html语法,写上标题并在主体写上超链接,来跳转至后台的Servlet对象或是其他静态页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<center><h1>欢迎来到学生信息管理系统</h1></center>
<hr>
<center><a href="searchStudent">查询所有学生</a></center>
<center><a href="addStudent.jsp">录入学生</a></center>
<center><a href="insertMulStudent">批量录入学生信息</a></center>
</body>
</html>
2.查询页面
通过前边的主页,查询超链接跳转至searchStudent Servlet对象,该对象实现对数据库的查询,并将结果集添加至request中,跳转至search.jsp来显示查询的结果。
search.jsp中实现了查询结果的显示。用html写好一个表格,然后在jsp文件中通过java代码的嵌套(jsp页面可以嵌入java代码就能很方便地实现前后端的通信)通过request.getAttribute("list");
方法获取里面的数据库查询结果,并通过foreach循环将数据逐个输出。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.List"%>
<%@ page import="servlet.scores"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>查询数据库</title>
</head>
<body>
<table align="center" width="450" border="1">
<tr align="center" colspan="5">
<center><h2>所有学生信息</h2></center>
</tr>
<tr align="center">
<td><b>学号</b></td>
<td><b>姓名</b></td>
<td><b>性别</b></td>
<td><b>分数</b></td>
</tr>
<%
//获取学生信息
List<scores> list=(List<scores>)request.getAttribute("list");
if(list==null||list.size()<1){
out.print("没有数据!");
}
else{
for(scores score:list){
%>
<tr align="center">
<td><%=score.getSno()%></td>
<td><%=score.getName()%></td>
<td><%=score.getSex()%></td>
<td><%=score.getScore()%></td>
</tr>
<%
}
}
%>
</table>
<br><br><br>
<center><a href="index.jsp">返回首页</a></center>
</body>
</html>
3.插入页面
通过主页的超链接跳转至此addStudent.jsp,在此页面进行成绩的录入,并通过表单将输入的信息传至insertStudent Servlet对象,在Servlet对象将数据更新至数据库。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>录入学生信息</title>
</head>
<body>
<form action="insertStudent" method="post">
<table align="center" width="450">
<tr>
<td align="center" colspan="2">
<h1>添加学生信息</h1>
<hr>
</td>
</tr>
<tr>
<td align="right">学号:</td>
<td><input type="text" name="sno"></td>
</tr>
<tr>
<td align="right">姓名:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td align="right">性别:</td>
<td><input type="radio" name="sex" value="男" checked="checked">男
<td><input type="radio" name="sex" value="女">女
</td>
</tr>
<tr>
<td align="right">分数:</td>
<td><input type="text" name="score"></td>
</tr>
<tr>
<td align="right" colspan="2">
<input type="submit" value="添加">
</td>
</tr>
</table>
</form>
</body>
</html>
4.批量操作的jsp页面
在批量操作页面,先将数据库中的信息输出,在此基础上可对分数进行批量修改操作。此jsp页面要引入java的集合和自定义的scores类,使jsp中的java代码能够正常运行。类似于前边的查询,获取request中的结果集,输出至列表,但是将最后一列分数设为文本域,以便进行编辑,当此页面信息被提交后即可转到saveStudent的Servlet对象,将信息更新至数据库。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.List"%>
<%@ page import="servlet.scores"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>批量录入</title>
</head>
<body>
<form action="saveStudent" method="post">
<table align="center" width="450" border="1">
<tr align="center" colspan="5">
<center><h2>所有学生信息</h2></center>
</tr>
<tr align="center">
<td><b>学号</b></td>
<td><b>姓名</b></td>
<td><b>性别</b></td>
<td><b>分数</b></td>
</tr>
<%
//获取学生信息
List<scores> list=(List<scores>)request.getAttribute("list");
if(list==null||list.size()<1){
out.print("没有数据!");
}
else{
for(scores score:list){
%>
<tr align="center">
<td><%=score.getSno()%></td>
<td><%=score.getName()%></td>
<td><%=score.getSex()%></td>
<td>
<input type="hidden" name="sno" value="<%=score.getSno()%>">
<input type="text" name="score" value="<%=score.getScore()%>">
</td>
</tr>
<%
}
}
%>
<tr>
<td align="center" colspan="4">
<input type="submit" value="录入成绩">
</td>
</tr>
</table>
<br><br><br>
<center><a href="index.jsp">返回首页</a></center>
</form>
</body>
</html>
二、处理前端表单的后端Servlet对象
Servlet对象是指HTTPServlet对象,是运行在web服务器或者应用服务器上的主要封装了对HTTP请求的处理,且它的运行需要Servlet容器的支持。
此处我们需要安装Tomcat来作为web服务器和Servlet容器,在每次要运行程序时,都要先启动Tomcat服务器来执行。
1.查询的servlet对象
在此对象中,重写了doGet方法来进行具体的数据库查询。先连接数据库(在此之前需要将JDBC的jar包添加至Referenced Library
中),然后根据查询的SQL语句获得结果集对象,将结果集添加至ArrayList
集合,并添加至request,使得要跳转的界面可以收到查询结果信息。结尾要关闭数据库连接。最后跳转至serch.jsp。
package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class searchStudent
*/
@WebServlet("/searchStudent")
public class searchStudent extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public searchStudent() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
//加载数据库驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//通过DriverManager获取数据连接
String url="jdbc:sqlserver://localhost:1433;DatabaseName=students";
String user="sa";
String password="123456789";
conn=DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功!");
stmt=conn.createStatement();
String sqlSearch="SELECT * from scores";
rs=stmt.executeQuery(sqlSearch);
List<scores> list=new ArrayList<scores>();
while(rs.next()) {
scores score=new scores();
score.setSno(rs.getInt("sno"));
score.setName(rs.getString("name"));
score.setSex(rs.getString("sex"));
score.setScore(rs.getFloat("score"));
list.add(score);
}
request.setAttribute("list",list);
rs.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
request.getRequestDispatcher("search.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.添加信息的Servlet对象
在添加信息的Servlet对象中,获取request中的信息,添加至数据库。先通过request.getParameter("sno")
方法获得学生信息。再通过preparedStatement对象,将从request中获取的数据用含参数的SQL语句,添加至数据库。
因为需要经常连接数据库进行操作,所以就顺势写了个jdbc类,写了一个getCon
方法来建立与数据库之间的连接。但是并没有关闭,需要在每次用完后关闭连接。
package servlet;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class jdbc {
public static Connection getCon() {
Connection conn=null;//记得关闭呦
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url="jdbc:sqlserver://localhost:1433;DatabaseName=students";
String name="sa";
String password="123456789";
conn=DriverManager.getConnection(url, name, password);
System.out.println("数据库连接成功!(录入学生信息)");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class insertStudent
*/
@WebServlet("/insertStudent")
public class insertStudent extends HttpServlet {
Connection conn=null;
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public insertStudent() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
conn=jdbc.getCon();
int flag=0;
float score1=0;
request.setCharacterEncoding("UTF-8");
int sno1=Integer.parseInt(request.getParameter("sno"));
String name1=request.getParameter("name");
String sex1=request.getParameter("sex");
String sScore=request.getParameter("score");
if(sScore=="")
score1=0;
else score1=Float.parseFloat(sScore);
if(conn!=null) {
String sqlInsert="INSERT INTO scores(sno,name,sex,score) VALUES(?,?,?,?)";
try {
PreparedStatement pstmt=conn.prepareStatement(sqlInsert);
pstmt.setInt(1, sno1);
pstmt.setString(2, name1);
pstmt.setString(3, sex1);
pstmt.setFloat(4, score1);
flag=Check(sno1);
if(flag==1) {
request.getRequestDispatcher("checkError.html").forward(request, response);
}
else{
pstmt.executeUpdate();
System.out.println("添加成功!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println( "数据库连接错误!");
e.printStackTrace();
}finally
{
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
}
//跳转到成功页面
if(flag!=1)
request.getRequestDispatcher("insertSuccess.html").forward(request, response);
}
private int Check(int sno1) throws SQLException {
// TODO Auto-generated method stub
Connection con=jdbc.getCon();
ResultSet rs=null;
String sqlCheck="SELECT sno from scores where sno=?";
try {
PreparedStatement ps=con.prepareStatement(sqlCheck);
ps.setInt(1, sno1);
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(rs.next())
return 1;
else
return 0;
}
}
3.批量处理数据的Servlet对象(综合操作)
先把数据库中的数据输出,然后在jsp页面编辑并提交,再从jsp提交的表单中获得修改的信息的数组,最后更新至数据库。
用类似于查询的方法,将结果输出(通过之前的MulStudent.jsp
界面)。与查询类似,不再赘述。
编辑完后提交至saveStudent
方法,在此方法中将数据从request中获取下来,具体需要使用request.getParameterValues("sno")
方法获得名字同为sno的数据的集合,返回类型为String数组类型,所以需要在使用时再转换为需要的类型。
比如在此处,我用到的学号(sno)为整形,就需要用Integer.parseInt(snoSet[i])
方法将每一个数据都转换为整形。
将处理好的数据通过带参数的preparedStatement对象的pstmt.executeUpdate();
方法,将数据更新至数据库。
package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class insertMulStudent
*/
@WebServlet("/insertMulStudent")
public class insertMulStudent extends HttpServlet {
private static final long serialVersionUID = 1L;
Connection conn=null;
/**
* @see HttpServlet#HttpServlet()
*/
public insertMulStudent() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
conn=jdbc.getCon();
Statement stmt=null;
ResultSet rs=null;
try {
stmt=conn.createStatement();
String sqlSearch="SELECT * from scores";
rs=stmt.executeQuery(sqlSearch);
List<scores> list=new ArrayList<scores>();
while(rs.next()) {
scores score=new scores();
score.setSno(rs.getInt("sno"));
score.setName(rs.getString("name"));
score.setSex(rs.getString("sex"));
score.setScore(rs.getFloat("score"));
//System.out.println(score.getName()+" "+score.getSex());
list.add(score);
}
request.setAttribute("list",list);
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
request.getRequestDispatcher("MulStudent.jsp").forward(request, response);
}
}
package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class saveStudent
*/
@WebServlet("/saveStudent")
public class saveStudent extends HttpServlet {
private static final long serialVersionUID = 1L;
Connection conn=null;
/**
* @see HttpServlet#HttpServlet()
*/
public saveStudent() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String[] snoSet=request.getParameterValues("sno");
String[] scoreSet=request.getParameterValues("score");
//录入数据到数据库
for(int i=0;i<snoSet.length;i++){
if(scoreSet[i]=="")
scoreSet[i]="0";
}
conn=jdbc.getCon();
String sqlSave="UPDATE scores SET score=? WHERE sno=?";
try {
PreparedStatement pstmt=conn.prepareStatement(sqlSave);
for(int i=0;i<snoSet.length;i++) {
pstmt.setFloat(1, Float.parseFloat(scoreSet[i]));
pstmt.setInt(2, Integer.parseInt(snoSet[i]));
pstmt.executeUpdate();
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("录入成功!");
//跳转
request.getRequestDispatcher("saveSuccess.html").forward(request, response);
}
}
三、运行截图
1.主页
2.查询
3.录入成绩
4.批量操作
修改部分成绩,点击录入
再次查询后的结果
第一次写博客,也比较仓促。Markdown用的还不都熟练,文字也表达的不是很到位,只想着这次试验费了九牛二虎之力,得把它记录下来。这次所做的试验内容其实远不止这点,eclipse中Tomcat的安装和调试也是费了很大力,也包括需要将jdbc的jar包导入对应的Library下。等时间充裕了就重装系统,从新开始把每个步骤都记录下来。这次先到这里。未完,待续…
2019/10/04 21:12