Tomcat服务器实现简单的javaWeb与JDBC试验

第一篇正经技术博客——简单的实现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

发布了11 篇原创文章 · 获赞 6 · 访问量 1615

猜你喜欢

转载自blog.csdn.net/qq_41119146/article/details/103401069