只使用Servlet写学生表(不推荐,仅学习尝试写)
1.在目录web.WEB-INF.lib包下引入mysql驱动
2.配置web.xml文件
因为只使用了Servlet的技术,所以在web。xml文件中需要配置各个类的信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<!--学生列表-->
<servlet>
<servlet-name>StudentList</servlet-name>
<servlet-class>MysqlConnect.StudentList</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentList</servlet-name>
<url-pattern>/mc/list</url-pattern>
</servlet-mapping>
<!--学生详情-->
<servlet>
<servlet-name>StudentDetail</servlet-name>
<servlet-class>MysqlConnect.StudentDetail</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentDetail</servlet-name>
<url-pattern>/mc/detail</url-pattern>
</servlet-mapping>
<!--修改学生信息的展示-->
<servlet>
<servlet-name>StudentAlterShow</servlet-name>
<servlet-class>MysqlConnect.StudentAlterShow</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentAlterShow</servlet-name>
<url-pattern>/mc/altershow</url-pattern>
</servlet-mapping>
<!--修改学生信息-->
<servlet>
<servlet-name>StudentAlter</servlet-name>
<servlet-class>MysqlConnect.StudentAlter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentAlter</servlet-name>
<url-pattern>/mc/alter</url-pattern>
</servlet-mapping>
<!--删除学生信息-->
<servlet>
<servlet-name>StudentDelete</servlet-name>
<servlet-class>MysqlConnect.StudentDelete</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentDelete</servlet-name>
<url-pattern>/mc/delete</url-pattern>
</servlet-mapping>
<!--新增学生信息-->
<servlet>
<servlet-name>StudentInsert</servlet-name>
<servlet-class>MysqlConnect.StudentInsert</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentInsert</servlet-name>
<url-pattern>/mc/insert</url-pattern>
</servlet-mapping>
</web-app>
3.编写各个html文件
先在html文件中写好要进行的程序流程,然后再Java文件中对html文件进行嵌入,采用拼串的形式最后输出在页面当中
(1)index.html(欢迎页面,默认)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎页面</title>
</head>
<body>
<h1>欢迎使用班级系统</h1>
<hr>
<a href="/oa/mc/list">查看学生列表</a>
</body>
</html>
(2)学生表展示的list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生表展示</title>
<script type='text/javascript'>
function del (no) {
var ok = window.confirm ( '亲,删了不可恢复哦! ');
if (ok) {
alert ('正在删除数据,请稍后...' );
document.location.href = '/oa/mc/delete?no=' + no;
};
}
}</script>
</head>
<body>
<h3 align="center">学生信息操作</h3>
<hr>
<table align="center"border="1px" width="70%">
<tr align="center">
<th>序号</th>
<th>学生学号</th>
<th>学生姓名</th>
<th>操作</th>
</tr>
<tr align="center">
<td>1</td>
<td>zhangsan</td>
<td>
<a href="delete.html">删除</a>
<a href="alter.html">修改</a>
<a href="detail.html" >详情</a>
</td>
</tr>
</table>
<a href="insert.html">新增学生</a>
</body>
</html>
(3)增删改查的各个html文件(insert.html,delete.html,alter.html,detail.html)
insert.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>新增学生</title>
</head>
<body>
<h1>新增学生信息</h1>
<hr>
<form action="/oa/mc/insert" method="post">
学生学号<input type="text" name="no" /><br>
学生姓名<input type="text" name="name"/><br>
学生成绩<input type="text" name="grade" /><br>
<input type="submit" value="提交" /><br>
</form>
</body>
</html>
delete.html中可以没有代码,在Java程序中对数据库进行操作即可
alter.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改</title>
</head>
<body>
<h1>修改学生信息</h1>
<hr>
<form action="/oa/mc/alter" method="post">
<!--序号<input type="text" name="id" value="1" readonly/><br>-->
<!--readonly只读,不能进行修改-->
学生学号<input type="text" name="no" value="001"/><br>
学生姓名<input type="text" name="name" value="zhangsan"/><br>
学生成绩<input type="text" name="grade" value="1" /><br>
<input type="submit" value="修改"/><br>
</form>
</body>
</html>
detail.html中也应该是动态查询出的,所以也不应该写死
(3)错误页面(error.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>出现错误</title>
</head>
<body>
<h1>操作失败,<a href="javascript:void(0)" onclick="window.history.back()">返回</a></h1>
</body>
</html>
4.编写java程序对数据库中进行操作
(1)StudentList
package MysqlConnect;
import util.DButil;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ResourceBundle;
/**
* @author H
* @version 1.0
* @description: TODO
* @date 2022/7/19 0:34
*/
public class StudentList extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取应用的根路径
String contextPath = request.getContextPath();
//设置响应类型和输出
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
out.print("<!DOCTYPE html>");
out.print("<html lang='en'>");
out.print("<head>");
out.print(" <meta charset='UTF-8'>");
out.print(" <title>学生表展示</title>");
out.print("<script type='text/javascript'>");
out.print(" function del (no) {");
//弹出确认框,用户点击确定,返回true,点击取消返回false
out.print(" var ok = window.confirm ( '亲,删了不可恢复哦! ');");
out.print(" if (ok) {");
//发送请求进行删除数据的操作。");
//在Js代码当中如何发送请求给服务器?
out.print("alert ('正在删除数据,请稍后...' ); ");
//document.location.href ='请求路径'
//document.location = '请求路径'
//window.location.href ='请求路径'
//window.location ='请求路径'
out.print(" document.location.href = '"+contextPath+"/mc/delete?no=' + no;");
out.print(" }");
out.print(" }");
out.print("</script>");
out.print("</head>");
out.print("<body>");
out.print("<h3 align='center'>学生信息操作</h3>");
out.print("<hr>");
out.print(" <table align='center' border='1px' width='70%'>");
out.print(" <tr align='center'>");
out.print(" <th>序号</th>");
out.print(" <th>学生学号</th>");
out.print(" <th>学生姓名</th>");
out.print(" <th>成绩</th>");
out.print(" <th>操作</th>");
out.print(" </tr>");
try {
//注册驱动,再静态代码块中注册
//获取连接
conn=DButil.getConnection();
//1.注册驱动
/* Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/text";
String root = "root";
String password = "root";
conn = DriverManager.getConnection(url,root,password);*/
if (request.getParameter("name") !=" "){
String no = request.getParameter("no");
String name = request.getParameter("name");
String grade = request.getParameter("grade");
//获取预编译的数据库操作对象
String sql = "insert into t_student(no,name,grade) values (?,?,?) ";
ps= conn.prepareStatement(sql);
//执行sql语句
ps.setString(1,no);
ps.setString(2,name);
ps.setString(3,grade);
}
//获取预编译的数据库操作对象
String sql = "select s.no,s.name,s.grade from t_student s";
ps= conn.prepareStatement(sql);
//执行sql语句
rs = ps.executeQuery();
//处理结果集
int i = 0;
while (rs.next()){
int no = rs.getInt("no");
String name = rs.getString("name");
String grade = rs.getString("grade");
if(no == 1) {
out.print(" <tr align='center'>");
out.print(" <td>" + (++i) + "</td>");
out.print(" <td>" + no + "</td>");
out.print(" <td><font color=\"pink\">" + name + "</font></td>");
out.print(" <td>" + grade + "</td>");
out.print(" <td>");
out.print(" <a href='javascript:void(0)' onclick='del("+no+")'>删除</a>");
out.print(" <a href='"+contextPath+"/mc/altershow?no="+no+"'>修改</a>");
out.print(" <a href='"+contextPath+"/mc/detail?no="+no+"'>详情</a>");
out.print(" </td>");
out.print(" </tr>");
}else{
out.print(" <tr align='center'>");
out.print(" <td>"+(++i)+"</td>");
out.print(" <td>"+no+"</td>");
out.print(" <td>"+name+"</td>");
out.print(" <td>"+grade+"</td>");
out.print(" <td>");
out.print(" <a href='javascript:void(0)' onclick='del("+no+")'>删除</a>");
out.print(" <a href='"+contextPath+"/mc/altershow?no="+no+"'>修改</a>");
out.print(" <a href='"+contextPath+"/mc/detail?no="+no+"'>详情</a>");
out.print(" </td>");
out.print(" </tr>");
}
//out.print("序号"+i+" "+no + ":" + name +" "+grade+ "<br>");
}
out.print(" <td>");
out.print(" <a href='"+contextPath+"/insert.html'>新增学生</a>");
out.print(" </td>");
out.print(" </tr>");
out.print(" </table>");
out.print("</body>");
out.print("</html>");
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DButil.close(conn,ps,rs);
}
}
}
(2)StudentInsert
package MysqlConnect;
import util.DButil;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class StudentInsert extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取应用的根路径
String contextPath = request.getContextPath();
//设置响应类型和输出
response.setContentType("text/html;chaarset=UTF-8");
PrintWriter out = response.getWriter();
String no = request.getParameter("no");
String name = request.getParameter("name");
String grade = request.getParameter("grade");
int count = 0;
Connection conn =null;
PreparedStatement ps = null;
try {
//注册驱动,再静态代码块中注册
//获取连接
conn=DButil.getConnection();
String sql = "insert into t_student(no,name,grade) values(?,?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1,no);
ps.setString(2,name);
ps.setString(3,grade);
count = ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DButil.close(conn,ps,null);
}
if (count == 1){
//添加成功
//仍然跳转到学生列表页面
//学生页面显示需要执行另外一个Servlet,需要使用转发机制
//这里选择了转发机制,没有选择重定向机制
request.getRequestDispatcher("/mc/list").forward(request,response);
}else {
//删除失败
request.getRequestDispatcher("/error.html").forward(request,response);
}
}
}
(3)StudentDelete
package MysqlConnect;
import util.DButil;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class StudentDelete extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取应用的根路径
String contextPath = request.getContextPath();
//设置响应类型和输出
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Connection conn =null;
PreparedStatement ps = null;
String no = request.getParameter("no");
int count = 0;
try {
//注册驱动,再静态代码块中注册
//获取连接
//conn=DButil.getConnection();
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/text";
String root = "root";
String password = "***";
conn = DriverManager.getConnection(url,root,password);
//获取预编译的数据库操作对象
String sql = "delete from t_student where no = ?";
ps= conn.prepareStatement(sql);
ps.setString(1,no);
//执行sql语句
count += ps.executeUpdate();
//System.out.println(count);
} catch (SQLException throwables) {
//遇到异常回滚
if (conn != null) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
DButil.close(conn,ps,null);
}
//System.out.println(count);
if (count == 1){
//删除成功
//仍然跳转到学生列表页面
//学生页面显示需要执行另外一个Servlet,需要使用转发机制
//这里选择了转发机制,没有选择重定向机制
request.getRequestDispatcher("/mc/list").forward(request,response);
}else {
//删除失败
request.getRequestDispatcher("/error.html").forward(request,response);
}
}
}
(4)进行修改时需要先显示出原来的数据,在原来的数据中进行修改,再提交给服务器,服务器返回给一个java程序对数据库进行修改操作
StudentAlterShow
package MysqlConnect;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import util.DButil;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class StudentAlterShow extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取应用的根路径
String contextPath = request.getContextPath();
//设置响应类型和输出
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<!DOCTYPE html>");
out.print("<html lang='en'>");
out.print("<head>");
out.print(" <meta charset='UTF-8'>");
out.print(" <title>修改</title>");
out.print("</head>");
out.print("<body>");
out.print("<h1>修改学生信息</h1>");
out.print("<hr>");
out.print("<form action='/oa/mc/alter' method='get'>");
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
String no = request.getParameter("no");
try {
//注册驱动,再静态代码块中注册
//获取连接
conn=DButil.getConnection();
//获取预编译的数据库操作对象
String sql = "select s.name,s.grade from t_student s where s.no=?";
ps= conn.prepareStatement(sql);
ps.setString(1,no);
//执行sql语句
rs = ps.executeQuery();
while (rs.next()){
String name = rs.getString("name");
String grade = rs.getString("grade");
//out.print("<hr>");
out.print("学生学号<input type='text' name='no' value='"+no+"'/><br>");
out.print("学生姓名<input type='text' name='name' value='"+name+"'/><br>");
out.print("学生成绩<input type='text' name='grade' value='"+grade+"' /><br>");
}
out.print("<input type='submit' value='修改'/><br>");
out.print("</form>");
out.print("</body>");
out.print("</html>");
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DButil.close(conn,ps,rs);
}
}
}
StudentAlter
package MysqlConnect;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import util.DButil;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class StudentAlter extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取应用的根路径
String contextPath = request.getContextPath();
//设置响应类型和输出
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Connection conn =null;
PreparedStatement ps = null;
String no = request.getParameter("no");
String name = request.getParameter("name");
String grade = request.getParameter("grade");
int count = 0;
try {
//注册驱动,再静态代码块中注册
//获取连接
conn= DButil.getConnection();
//获取预编译的数据库操作对象
String sql = "update t_student set name=?,grade=? where no=?";
ps= conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,grade);
ps.setString(3,no);
//执行sql语句
count=ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DButil.close(conn,ps,null);
}
if (count == 1){
//修改成功
//仍然跳转到学生列表页面
//学生页面显示需要执行另外一个Servlet,需要使用转发机制
//这里选择了转发机制,没有选择重定向机制
request.getRequestDispatcher("/mc/list").forward(request,response);
}else {
//删除失败
request.getRequestDispatcher("/error.html").forward(request,response);
}
}
}
(5)StudentDetail
package MysqlConnect;
import util.DButil;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class StudentDetail extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取应用的根路径
String contextPath = request.getContextPath();
//设置响应类型和输出
response.setContentType("text/html;chaarset=UTF-8");
PrintWriter out = response.getWriter();
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
out.print("<!DOCTYPE html>");
out.print("<html lang='en'>");
out.print("<head>");
out.print(" <meta charset='UTF-8'>");
out.print(" <title>学生详情</title>");
out.print("</head>");
out.print("<body>");
out.print("<h1>学生信息详情</h1>");
out.print("<hr>");
try {
String no = request.getParameter("no");
//注册驱动,再静态代码块中注册
//获取连接
//conn=DButil.getConnection();
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/text";
String root = "root";
String password = "***";
conn = DriverManager.getConnection(url,root,password);
//获取预编译的数据库操作对象
String sql = "select s.name,s.grade from t_student s where s.no=?";
ps= conn.prepareStatement(sql);
ps.setString(1,no);
//执行sql语句
//处理结果集
rs = ps.executeQuery();
while (rs.next()){
String name = rs.getString("name");
String grade = rs.getString("grade");
out.print("<hr>");
out.print("学生学号 "+no+"<br>");
out.print("学生姓名 "+name+"<br>");
out.print("学生成绩 "+grade+"<br>");
}
out.print( " <input type='button' value='后退' onclick='window.history.back()' />");
out.print("</body>");
out.print("</html>");
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
DButil.close(conn,ps,rs);
}
}
}
5.页面展示
注意!!!!
因为采用纯Servlet的编写会嵌入前端代码,所以并不推荐,后续可以采用jsp前后端代码进行一些分割,代码会变的好看一些,在之后的一些项目开发过程中,可能会与前端人员进行交互,所以大多数情况不会在后端代码中嵌入前端代码,本博客只是练习Servlet期间写的一些代码,仅供参考