java+servlet+JDBC

JAVA连接数据库实验

1.实验思路

本实验后端采用的是JDBC连接数据库,服务端和客户端的连接采用的是servlet开发工具,主要的结构是采用servlet作为中间层实现信息交互和页面的重定向,后端则是采用JDBC实现页面和MYSQL数据库的交互。

2.代码结构图

结构图1

结构图2


3.实验开发工具

Intelij -IU 2018.3.6 旗舰版( 因为后续要使用tomcat插件,社区版没有该功能)

附上链接https://www.cnblogs.com/xin1006/p/11414278.html

Tomcat服务器的部署(用来实现servlet工具)
数据库MYSQL 8.0 外加连接工具 NAVICAT
对应数据库版本的JDBC驱动程序的 mysql-connector-java连接包

4.实验正式准备

(1)数据库 MYSQL(安装和连接首先自己实现)(免安装版也可以,那样其实可以直接用命令行)

数据库ku
内部包含两张表 table
login表 login
student表 student

(2)IDEA环境部署

1.首先获得对应的驱动包,这里我附上对应的链接
链接 提取码:a527
2.安装Tomcat(首先记得先安装JDK,不做相关的赘述 )
附上参考 https://www.jb51.net/article/137404.htm
安装之后打开 localhost:8080(检查是否出现Tomcat,如果没有出现就是安装失败,可能是接口冲突,或者是相关的环境路径有误)

样图

3.IDEA配置
new一个新的project

idea

勾选web 选择对应的jdk(我这里版本稍微高了点)

最后取上名字 (路径不能有中文,安装Tomcat的路径也不能有中文,路径不宜过长)

最终得到如下图

手动打开此路径

WEB-INF目录下新建子目录,叫做lib里面存放我们相关要用到的包,把刚刚我们的connect.jar的驱动包放入

继续进入IDEA进行操作 ,打开刚刚jar包放入的文件夹lib,右键jar包,选择ADD as Library,点击ok,点击右上角确认是否配置完成



接下来是配置Tomcat(这个才是本文的关键)

点击上图的Add Configuration


server无需改动


这个就是配置输出路径 修改一下,确认

运行,然后看弹出界面,成功弹出下图ok


生成的.class文件会存放到out目录之中



5.实验正式代码部署


src目录下新建三级文件目录,com目录 ,子目录zsh目录
及其zsh目录下所属的三个子目录,分别是util,servlet,bean目录

重定向框图(时间上比较赶,可能有些地方漏掉了)

登录操作

代码

Student 数据信息表(实现信息的接口)
package com.zsh.bean;
/// 信息表层
import java.util.ArrayList;
import java.util.List;
public class Student {
    private int id;/// 编号
    private String name;/// 姓名
    private int age;/// 年龄
    private String sex;/// 性别
    private int  grade;/// 成绩
    private String address;/// 地址
    public int get_id()
    {
        return id;
    }
    public void set_id(int ID)
    {
        this.id = ID;
    }
    public String  get_name()
    {
        return name;
    }
    public void set_name(String name)
    {
        this.name  = name;
    }
    public int get_age()
    {
        return age;
    }
    public void set_age(int age)
    {
        this.age =age;
    }
    public String  get_sex()
    {
        return sex;
    }
    public void set_sex(String sex)
    {
        this.sex  = sex;
    }
    public int  get_grade()
    {
        return grade;
    }
    public void set_grade(int  grade)
    {
        this.grade = grade;
    }
    public String  get_address()
    {
        return address;
    }
    public void set_address(String address)
    {
        this.address  = address;
    }
}

数据库连接,DBcon类 其他的基本大家都应该知晓 ,我就简单说一下我踩的坑 final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//数据库连接地址
final String URL = "jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useSSL=false";
//用户名,更换成你自己的用户名,此处为root用户
final String USER_NAME = "root";
//密码,更换成你自己设定的密码
final String PASSWORD = "root";
school是我的数据库名字,到时候改成自己的就可以了
貌似是MYSQL 5.0以下和5.0以上的驱动代码不同
8.0的final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
5.0以下的final String DRIVER_NAME = "com.mysql.jdbc.Driver";
还有就是这个,?后面表示带的参数,一个主要是用来调整时区,核对MYSQL的时区,另外一个https://www.cnblogs.com/MonkeySun/p/13406050.html
final String URL = "jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useSSL=false";

package com.zsh.util;

import com.mysql.cj.jdbc.exceptions.NotUpdatable;
import com.mysql.cj.xdevapi.SqlDataResult;
import java.sql.*;

public class DBcon {
    public static Connection getconn()
    {
        final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
        //数据库连接地址
        final String URL = "jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useSSL=false";
        //用户名,更换成你自己的用户名,此处为root用户
        final String USER_NAME = "root";
        //密码,更换成你自己设定的密码
        final String PASSWORD = "root";
        Connection connection =  null;/// 驱动对象
        try {
            //加载mysql的驱动类
            Class.forName(DRIVER_NAME);
            connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
        }catch (SQLException e)
        {
            e.printStackTrace();
        }catch(ClassNotFoundException e)
        {
            e.getException();
        }
        return connection;
    }
    public static void closeconn(Connection con, PreparedStatement pre, ResultSet rs)
    {
         if (con!=null)
         {
             try{
                 con.close();
             }catch(SQLException e)
             {
                 e.printStackTrace();
             }
         }
         if (pre!=null)
         {
             try{
                 pre.close();
             }catch(SQLException e){
                 e.printStackTrace();
             }
         }
         if (rs!=null)
         {
             try{
                 rs.close();
             }catch (SQLException e)
             {
                 e.printStackTrace();
             }
         }
    }
}

loginservlet (是用来实现登陆操作)
说明:doPost()函数是固定格式
继承HttpServlet接口需要实现doPost方法或者doGet方法
这两个方法的区别是doPost 是密文通道(也就是隐藏了)
doGet方法则会将你之前所在页面输入的所有信息放到重定向的URL里面(也就是明文) 所以虽然并不是什么严谨的项目,url后缀太长也很难匹配
还是先简单说明一下

 HttpServletRequest request,HttpServletResponse response///这两个参数 request获取当前页面所输入的信息
/// response是返回信息到页面的接口
///默认的response和request采用的是ios--8859-1编码 最终需要转化为utf-8
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8");
 response.setHeader("Content-Type","text/html;charset=utf-8");
/// getParameter可以理解为按照指定参数获得对应页面的数据
/// 比如说下图两个文本框,name和id都是我们所需要的参数
/// 那么我在和他连接的servlet之中就能调用该函数获取对应的id的信息
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");

package com.zsh.servlet;
import com.zsh.util.DBcon;
import javax.print.DocFlavor;
import javax.servlet.http.HttpServlet;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@WebServlet("/login")/// 声明  servlet框架需要你写上存在哪些servlet,新版本的就可以按照此种声明方式
///说明下一次重定向之后的URL路径就是https://...../login
public class loginservlet extends HttpServlet  {/// 继承该接口是因为其他接口需要重写一些方法
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type","text/html;charset=utf-8");
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        boolean flag = false;
        Connection con = DBcon.getconn();///连接数据库
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select * from login where name = ? and pwd = ?";
        PrintWriter out = response.getWriter();
        try {
            ps = con .prepareStatement(sql);
            ps.setString(1,name);
            ps.setString(2,pwd);
            rs = ps.executeQuery();/// 获取查询结果 

            if(rs.next()){/// 如果存在next就说明查询到了该账号,所以就登录成功
                flag = true;
            }else{
                flag = false;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBcon.closeconn(con,ps,rs);
        }

        if(flag){
            response.sendRedirect("jdbc.jsp");/// 页面重定向  跳转到添加数据的页面
            out.println("登录成功");
        }else {
            response.sendRedirect("error.jsp");
        }
    }
}

index.jsp连接的是loginservlet

<%--
  Created by IntelliJ IDEA.
  User: cdk13
  Date: 2021/6/7
  Time: 15:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="/login" method="post">
<--%上面说明的是action连接对象,method就是处理的方法,如果写上get就是对应doGet方法,否则就是doPost方法%-->
    <table align="center" border="1 " width="50%" cellpadding="6">
    <tr>
        <td align="center" >账号:</td>
        <td align="left" ><input type="text" name="name" id="name"></td>
    </tr>
    <tr>
        <td align="center" >密码:</td>
        <td align="left" ><input type="text" name="pwd" id="pwd"></td>
    </tr>
    <tr>
        <th colspan="2" align="center" ><a href="register.jsp" >注册请点击此处                   </a> <input type="submit" name="submit" value="登录" ></th>
<--%弄一个超链接%-->
    </tr>

    </table>
</form>
</body>
</html>

registerservlet.java

package com.zsh.servlet;
import com.zsh.util.DBcon;
import javax.print.DocFlavor;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@WebServlet("/register")
public class registerservlet extends HttpServlet{
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        String name = request.getParameter("name");
        String pwd1 = request.getParameter("pwd1");
        String pwd2 = request.getParameter("pwd2");
        String sql = "insert into login(name,pwd) values(?,?)";
        Connection conn = DBcon.getconn();
        PreparedStatement ps = null;
        ResultSet rs = null;
        boolean flag = false;
        List<String >error = new ArrayList<>();///该参数主要是用来传递报错,主要传送给error1.jsp
        if (name.equals("")||pwd1.equals("")||pwd2.equals(""))///一个为空,添加报错参数
        {
            if (name.equals(""))error.add("请输入用户名
");
            if (pwd1.equals(""))error.add("请输入密码
");
            if (pwd2.equals(""))error.add("请确认密码
");
            if (!error.isEmpty()) {
                request.setAttribute("error", error);
                request.getRequestDispatcher("error1.jsp").forward(request, response);///这两句就是传递参数从servlet到jsp的关键
            }
            response.sendRedirect("error1.jsp");/// 重定向
        }
        if (pwd1==pwd2) {
            try {
                ps = conn.prepareStatement(sql);
                ps.setString(1, name);
                ps.setString(2, pwd1);
                rs = ps.executeQuery();
                if(rs.next()){
                    flag = true;
                }else{
                    flag = false;
                }
                if (flag)
                {
                    response.sendRedirect("error1.jsp");
                }
                else  ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DBcon.closeconn(conn, ps, null);
            }
            response.sendRedirect("success.jsp");
        }
        else {
            error.add("两次输入密码不一致
");
            if (!error.isEmpty()) {
                request.setAttribute("error", error);
                request.getRequestDispatcher("error1.jsp").forward(request, response);
            }
            response.sendRedirect("error1.jsp");
        }

    }
}

selectservlet
这里有一个特别值得注意的地方 因为我们要显示所有的学生信息
all.jsp之中显示,但是一般是从all.jsp之中获得参数之后传回selectservlet ,所以为了显示信息首先我们要先定向到selectservlet 获得信息之后再重定向到all.jsp

package com.zsh.servlet;
import com.mysql.cj.xdevapi.DbDoc;
import com.mysql.cj.xdevapi.SqlDataResult;
import com.zsh.bean.Student;
import com.zsh.util.DBcon;
import javax.print.DocFlavor;
import javax.servlet.http.HttpServlet;
import java.sql.*;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Statement;
import java.util.*;
@WebServlet("/select")
public class selectservlet extends HttpServlet{
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        String sql = "select * from student ";
        Connection conn = DBcon.getconn();
        try {
            PreparedStatement ps = null;
            ps = conn.prepareStatement(sql);
            ResultSet rs =  ps.executeQuery();
            List <Student> list = new ArrayList<Student>();/// 这里由于我们要在当前页面显示所有 的学生信息,所以就需要存下来,传递个和他当前相关联的all.jsp
            while (rs.next())
            {
                Student stu  =new Student();
                stu.set_id(rs.getInt("id"));
                stu.set_name(rs.getString("name"));
                stu.set_sex(rs.getString("sex"));
                stu.set_age(rs.getInt("age"));
                stu.set_grade(rs.getInt("grade"));
                stu.set_address(rs.getString("address"));
                list.add(stu);
            }
            request.setAttribute("list", list);///和上面一样的,传递给jsp
            DBcon.closeconn(conn,ps,rs);
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        request.getRequestDispatcher("all.jsp").forward(request, response);
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doPost(request, response);
    }
    public void destroy()
    {
        super.destroy();
    }
}

all.jsp
List list = (List)request.getAttribute("list");
上面这句话就是从selectservlet获取对应的学生信息,然后实现显示
删除
修改
上面是两个超链接,一个是链接deleteservlet ,另一个是update.jsp
为什么不需要delete.jsp呢因为我当前获得对应的id我就知道我要删除的对象
删除他的所有参数即可、
但是更新就需要一个界面来针对指定的页面更新

<%--
  Created by IntelliJ IDEA.
  User: cdk13
  Date: 2021/6/8
  Time: 13:01
  To change this template use File | Settings | File Templates.
--%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zsh.bean.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<body>

<table id="table1" align="center" border="1" width="50%" cellpadding="6">
    <tr>
        <th colspan="6" align="center" >查询到的学生信息</th><%--th加粗, cellpadding和android padding含义一样--%>
    </tr>
    <tr>
        <th align="center" >ID</th>
        <th align="center" >学生姓名</th>
        <th align="center" >年龄</th>
        <th align="center" >性别</th>
        <th align="center" >成绩</th>
        <th align="center" >地址</th>
        <th align="center" >操     作</th>
    </tr>
    <%
        //获取图书信息集合
        List<Student> list = (List<Student>)request.getAttribute("list");
        if(list == null || list.size() < 1){
            out.print("没有数据 ");
        }else{
            for(Student s:list){
    %>
    <tr align="center">
        <td> <%= s.get_id() %></td>
        <td> <%= s.get_name()%></td>
        <td> <%= s.get_age() %></td>
        <td> <%= s.get_sex()%></td>
        <td> <%= s.get_grade()%></td>
        <td> <%= s.get_address()%></td>
        <td>
            <a href="delete?id=<%=s.get_id() %>">删除</a>
            <a href="update.jsp?id=<%=s.get_id() %>">修改</a>
        </td>
    </tr>
    <%
            }
        }
    %>
</table>
</body>
</html>

updateservlet
提醒一下@WebServlet("/update") 一定要加上/

package com.zsh.servlet;
import com.zsh.util.DBcon;
import javax.print.DocFlavor;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@WebServlet("/update")
public class updateservlet extends HttpServlet{
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "text/html;charset=utf-8");

        String path = request.getContextPath();
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        String sex = request.getParameter("sex");
        String grade = request.getParameter("grade");
        String address = request.getParameter("address");
        String sql = "update student set name =?,age = ?,sex = ?,grade = ?,address=? where id= ?";
        Connection conn = DBcon.getconn();
        PreparedStatement ps = null;
        ResultSet rs = null;
        boolean flag = false;
        if (name == null||age== null ||sex == null ||grade==null ||address == null)
        {
            PrintWriter out = response.getWriter();//// 传递信息回对应界面的接口
            out.print("更新失败!");
            response.setHeader("Refresh", "1;jdbc.jsp");
        }
        try
        {
            conn = DBcon.getconn();
            ps = conn.prepareStatement(sql);
            ps.setString(1, name);
            ps.setInt(2, Integer.parseInt(age));
            ps.setString(3,sex);
            ps.setInt(4, Integer.parseInt(grade));
            ps.setString(5, address);
            ps.setInt(6, Integer.parseInt(id));
            int row = ps.executeUpdate();
            PrintWriter out = response.getWriter();
            /// List<String > error = new LinkedList<String >();
            if(row > 0){
                out.print("更新成功!");
                response.setHeader("Refresh", "1;jdbc.jsp");
            }
            else {
                out.print("更新失败!");
                response.setHeader("Refresh", "1;jdbc.jsp");
            }
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        finally {
            DBcon.closeconn(conn,ps,rs);
        }
    }
    protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        doPost(request,response);
    }
}

deleteservlet
这里主要是一点,删除最后要更新页面,所以又要定向到selectservlet,重新显示all.jsp,对应的id是之前的all.jsp之中删除 ?后面附加的id参数

package com.zsh.servlet;
import com.zsh.util.DBcon;
import javax.print.DocFlavor;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@WebServlet("/delete")
public class deleteservlet extends HttpServlet{
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        String sql = "delete from student where id = ?";
        Connection conn = DBcon.getconn();
        String id = request.getParameter("id");
        PreparedStatement ps = null;
        try {
           ps = conn.prepareStatement(sql);
           ps.setInt(1,Integer.parseInt(id));
           ps.executeUpdate();
        }catch(SQLException e)
        {
            e.printStackTrace();
        }finally {
            DBcon.closeconn(conn,ps,null);
        }
        response.sendRedirect("/select");/// 重定向  删除之后到达
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

insertservlet

package com.zsh.servlet;
import com.mysql.cj.xdevapi.DbDoc;
import com.zsh.util.DBcon;
import javax.print.DocFlavor;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@WebServlet("/insert")
public class insertservlet extends HttpServlet{
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        String  id = request.getParameter("id");
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        String sex = request.getParameter("sex");
        String grade = request.getParameter("grade");
        String address = request.getParameter("address");
        Connection conn =  null;
        String sql = "insert into student(id,name,age,sex,grade,address) values(?,?,?,?,?,?)";
        try{
            conn = DBcon.getconn();
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, Integer.parseInt(id));
            ps.setString(2, name);
            ps.setInt(3, Integer.parseInt(age));
            ps.setString(4,sex);
            ps.setInt(5, Integer.parseInt(grade));
            ps.setString(6, address);
            int row = ps.executeUpdate();
            PrintWriter out = response.getWriter();
            if(row > 0){
                out.print("成功添加了 " + row + "条数据! ");
                response.setHeader("Refresh", "1;jdbc.jsp");
            }
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }catch(Exception e) {
            PrintWriter out = response.getWriter();
            out.print("图书信息添加失败  请重新输入" + e.toString());
            response.setHeader("Refresh", "1;jdbc.jsp");/// 停留一秒在转到对应页面
        }
    }
}

error.jsp

<%@ page import="java.util.concurrent.TimeUnit" %>
<%@ page import="java.io.PrintWriter" %><%--
  Created by IntelliJ IDEA.
  User: cdk13
  Date: 2021/6/7
  Time: 20:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>输入错误</title>
    登录失败,请重新输入!<br/>
</head>
<body>
<%response.setHeader("Refresh", "1;index.jsp"); %>
</body>
</html>

error1.jsp 用来处理基本的异常信息

<%--
  Created by IntelliJ IDEA.
  User: cdk13
  Date: 2021/6/7
  Time: 23:12
  To change this template use File | Settings | File Templates.
--%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.lang.String"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="x" class="com.zsh.servlet.registerservlet"></jsp:useBean>
<jsp:setProperty property="*" name="x"/>
<html>
<head>
    <title>注册失败</title>
    <%
        List<String> errors = (List<String>) request.getAttribute("error");
        for (String error : errors) {
            out.println("<li>" + error + "</li>");
        }
    %>
</head>
<body>
<%response.setHeader("Refresh", "1;index.jsp"); %>
</body>
</html>

jdbc.jsp 添加学生信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
<form action="/insert" method="post">

    <table align="center" border="1 " width="50%" cellpadding="6">
        <tr>
            <th colspan="2" align="center" >添加学生信息</th><%--th加粗, cellpadding和android padding含义一样--%>
        </tr>
        <tr>
            <td align="center" >学生ID:</td>
            <td align="left" ><input type="text" name="id"></td>
        </tr>
        <tr>
            <td align="center" >学生名字:</td>
            <td align="left" ><input type="text" name="name"></td>
        </tr>
        <tr>
            <td align="center" >年        龄:</td>
            <td align="left" ><input type="text" name="age"></td>
        </tr>
        <tr>
            <td align="center" >性        别:</td>
            <td align="left" ><input type="text" name="sex"></td>
        </tr>
        <tr>
            <td align="center" >成        绩:</td>
            <td align="left" ><input type="text" name="grade"></td>
        </tr>
        <tr>
            <td align="center" >地        址:</td>
            <td align="left" ><input type="text" name="address"></td>
        </tr>
        <tr>
            <th colspan="2" align="center" ><input type="submit" name="submit" value="添加"></th>
        </tr>
            <a href="/select" >查询所有学生信息点击此处</a>
    </table>
</form>
</body>
</html>

register.jsp

<%--
  Created by IntelliJ IDEA.
  User: cdk13
  Date: 2021/6/7
  Time: 20:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="/register" method="post">
<table align="center" border="1 " width="50%" cellpadding="6">
    <tr>
        <th colspan="2" align="center" >添加新账号</th><%--th加粗, cellpadding和android padding含义一样--%>
    </tr>
    <tr>
        <td align="center" >账号:</td>
        <td align="left" ><input type="text" name="name"></td>
    </tr>
    <tr>
        <td align="center" >密码:</td>
        <td align="left" ><input type="text" name="pwd1"></td>
    </tr>
    <tr>
        <td align="center" >再次确认密码:</td>
        <td align="left" ><input type="text" name="pwd2"></td>
    </tr>

    <tr>
        <th colspan="2" align="center" ><input type="submit" name="submit" value="注册"></th>
    </tr>
</table>
    </form>
</body>
</html>

success.jsp 登录成功页面

<%--
  Created by IntelliJ IDEA.
  User: cdk13
  Date: 2021/6/7
  Time: 23:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
    注册成功,请回主页面登录<br/>
</head>
<body>
<%response.setHeader("Refresh", "1;index.jsp"); %>
</body>
</html>

update.jsp
关于这里呢

> 是因为我之前从all.jsp跳转到这个页面,后面附加了参数id,那么我就知道对应删除的是哪个id的学生信息,由于我这边水平有限,正则表达式和其他方法都不太会,所以采用获得参数,也就是id=?然后截取?,也就知道对应的id,然后给id这个文本框附上对应的文本值,这样就相当于默认值,这样就能修改刚刚指定id的信息,实现jsp-》jsp-》servelt信息的共享 ~~~ <%-- Created by IntelliJ IDEA. User: cdk13 Date: 2021/6/8 Time: 17:02 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> 修改
<table align="center" border="1 " width="50%" cellpadding="6">
    <tr>
        <th colspan="2" align="center" >修改学生信息</th><%--th加粗, cellpadding和android padding含义一样--%>
    </tr>
    <tr>
        <td align="center" >ID:</td>
        <td align="left" ><input type="text" name="id" value=<%=request.getQueryString().substring(3,request.getQueryString().length()) %>></td>
    </tr>
    <tr>
        <td align="center" >学生名字:</td>
        <td align="left" ><input type="text" name="name"></td>
    </tr>
    <tr>
        <td align="center" >年        龄:</td>
        <td align="left" ><input type="text" name="age"></td>
    </tr>
    <tr>
        <td align="center" >性        别:</td>
        <td align="left" ><input type="text" name="sex"></td>
    </tr>
    <tr>
        <td align="center" >成        绩:</td>
        <td align="left" ><input type="text" name="grade"></td>
    </tr>
    <tr>
        <td align="center" >地        址:</td>
        <td align="left" ><input type="text" name="address"></td>
    </tr>
    <tr>
        <th colspan="2" align="center" ><input type="submit" name="submit" value="修改"></th>
    </tr>
</table>
~~~

最后就是关于该实验的不足,由于我是第一次接触还有很多地方没理解到位,这个实验我也是临时肝了三天,基本上就没有怎么休息,因为要一步一步踩坑,避坑,主要的不足在于:1.很多异常处理没有到位,比如说所有界面的文本限制,长度限制 2.界面美化,由于时间不够,临近期末,效果只能说有个雏形 3.一些界面跳转过于敷衍,对于一个jsp实现servlet之间的通信过程有些地方没太理解,比如说可不可以响应多个servlet,所以我特意用超链接避开了,有时间的话我会继续完善的,有什么错误和意见欢迎大家指出。
参考
https://www.cnblogs.com/xin1006/p/11414278.html
https://blog.csdn.net/zs20082012/article/details/79469149
https://blog.csdn.net/weixin_45743799/article/details/103372318

齐芒行,川锋明!
原文地址:https://www.cnblogs.com/qimang-311/p/14866010.html