本文编写于 176 天前,最后修改于 176 天前,其中某些信息可能已经过时。

J2EE CRUD

JavaWeb 入门首例,实现增加、删除、修改和查询功能。

创建数据库与表

-- 创建数据库
create database readjava_study CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建学生信息表 
CREATE TABLE `student` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `student_number` varchar(255) DEFAULT NULL,
  `student_name` varchar(255) DEFAULT NULL,
  `student_password` varchar(255) DEFAULT NULL,
  `student_sex` int(11) DEFAULT NULL,
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建动态web项目

需要注意一点,eclipse 需要将项目根目录改为 /,这样浏览器可以直接访问localhost:8080 ,无需添加项目名字。idea 默认就是 / 无需更改。

添加jar包和css

编写后台代码

工具类(util)

package com.readjava.util;
import java.sql.Connection;
import java.sql.DriverManager;
public class DbUtil {
    private static String url = "jdbc:mysql://localhost:3306/readjava_study"; // 数据库地址
    private static String userName = "root"; // 数据库用户名
    private static String passWord = "123456"; // 数据库密码
    private static Connection conn = null;
    /**
     * 获得数据库连接
     *
     * @return
     */
    public static Connection getConnection() {
        if (null == conn) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection(url, userName, passWord);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return conn;
    }
    public static void main(String[] args) {
        System.out.println(getConnection());
    }
}

实体类(bean)

package com.readjava.bean;
public class Student {
    private Integer studentId;
    private String studentName;
    private String studentPassword;
    private Integer studentSex;
    private String studentNumber;
    public Student() {
    }
    public Integer getStudentId() {
        return studentId;
    }
    public void setStudentId(Integer studentId) {
        this.studentId = studentId;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
    public String getStudentPassword() {
        return studentPassword;
    }
    public void setStudentPassword(String studentPassword) {
        this.studentPassword = studentPassword;
    }
    public Integer getStudentSex() {
        return studentSex;
    }
    public void setStudentSex(Integer studentSex) {
        this.studentSex = studentSex;
    }
    public String getStudentNumber() {
        return studentNumber;
    }
    public void setStudentNumber(String studentNumber) {
        this.studentNumber = studentNumber;
    }
}

数据库交互层(dao)

package com.readjava.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.readjava.bean.Student;
import com.readjava.util.DbUtil;
public class StudentDao {
    /**
     * 所有学生信息
     *
     * @return
     */
    public List<Student> selectStudent() {
        List<Student> studentList = new ArrayList<>();
        Connection conn = DbUtil.getConnection();
        String sql = "select * from student";
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            ResultSet rst = pst.executeQuery();
            while (rst.next()) {
                Student student = new Student();
                student.setStudentId(rst.getInt("student_id"));
                student.setStudentName(rst.getString("student_name"));
                student.setStudentPassword(rst.getString("student_password"));
                student.setStudentSex(rst.getInt("student_sex"));
                student.setStudentNumber(rst.getString("student_number"));
                studentList.add(student);
            }
            rst.close();
            pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return studentList;
    }
    /**
     * 添加学生
     *
     * @param student
     * @return
     */
    public boolean addStudent(Student student) {
        String sql = "INSERT INTO student(student_name,student_password,student_sex,student_number) VALUES(?,?,?,?);";
        Connection conn = DbUtil.getConnection();
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            pst.setString(1, student.getStudentName());
            pst.setString(2, student.getStudentPassword());
            pst.setInt(3, student.getStudentSex());
            pst.setString(4, student.getStudentNumber());
            int count = pst.executeUpdate();
            pst.close();
            return count > 0 ? true : false;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 更新学生信息
     *
     * @param student
     * @return
     */
    public boolean updateStudent(Student student) {
        String sql = "UPDATE student set student_name=?,student_password=?,student_sex=?,student_number=? WHERE student_id=?";
        Connection conn = DbUtil.getConnection();
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            pst.setString(1, student.getStudentName());
            pst.setString(2, student.getStudentPassword());
            pst.setInt(3, student.getStudentSex());
            pst.setString(4, student.getStudentNumber());
            pst.setInt(5, student.getStudentId());
            int count = pst.executeUpdate();
            pst.close();
            return count > 0 ? true : false;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 删除学生信息
     *
     * @param studentId
     * @return
     */
    public boolean deleteStudent(int studentId) {
        String sql = "delete from student where student_id = ?";
        Connection conn = DbUtil.getConnection();
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            pst.setInt(1, studentId);
            int count = pst.executeUpdate();
            pst.close();
            return count > 0 ? true : false;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 更具id查询学生
     *
     * @param studentId
     * @return
     */
    public Student getStudentById(int studentId) {
        Connection conn = DbUtil.getConnection();
        String sql = "select * from student where student_id = " + studentId;
        Student student = new Student();
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            ResultSet rst = pst.executeQuery();
            while (rst.next()) {
                student.setStudentId(rst.getInt("student_id"));
                student.setStudentName(rst.getString("student_name"));
                student.setStudentPassword(rst.getString("student_password"));
                student.setStudentSex(rst.getInt("student_sex"));
                student.setStudentNumber(rst.getString("student_number"));
            }
            rst.close();
            pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return student;
    }
}

控制层(servlet)

package com.readjava.servlet;
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 com.readjava.bean.Student;
import com.readjava.dao.StudentDao;
import java.io.IOException;
@WebServlet("/add")
@SuppressWarnings("serial")
public class AddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("add.jsp").forward(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        Student student = new Student();
        String studentNumber = req.getParameter("studentNumber");
        String studentName = req.getParameter("studentName");
        String studentPassword = req.getParameter("studentPassword");
        int studentSex = Integer.parseInt(req.getParameter("studentSex"));
        student.setStudentNumber(studentNumber);
        student.setStudentName(studentName);
        student.setStudentPassword(studentPassword);
        student.setStudentSex(studentSex);
        StudentDao studentDao = new StudentDao();
        studentDao.addStudent(student);
        req.getRequestDispatcher("").forward(req, resp);
    }
}
package com.readjava.servlet;
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 com.readjava.dao.StudentDao;
import java.io.IOException;
@WebServlet("/delete")
@SuppressWarnings("serial")
public class DeleteServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int studentId = Integer.parseInt(req.getParameter("studentId"));
        StudentDao studentDao = new StudentDao();
        studentDao.deleteStudent(studentId);
        req.getRequestDispatcher("").forward(req, resp);
    }
}
package com.readjava.servlet;
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 com.readjava.bean.Student;
import com.readjava.dao.StudentDao;
import java.io.IOException;
import java.util.List;
@WebServlet("")
@SuppressWarnings("serial")
public class ListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StudentDao studentDao = new StudentDao();
        List<Student> studentList = studentDao.selectStudent();
        req.setAttribute("studentList", studentList);
        req.getRequestDispatcher("list.jsp").forward(req, resp);
    }
}
package com.readjava.servlet;
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 com.readjava.bean.Student;
import com.readjava.dao.StudentDao;
import java.io.IOException;
@WebServlet("/update")
@SuppressWarnings("serial")
public class UpdateServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int studentId = Integer.parseInt(req.getParameter("studentId"));
        StudentDao studentDao = new StudentDao();
        Student student = studentDao.getStudentById(studentId);
        req.setAttribute("student", student);
        req.getRequestDispatcher("update.jsp").forward(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        Student student = new Student();
        int studentId = Integer.parseInt(req.getParameter("studentId"));
        String studentNumber = req.getParameter("studentNumber");
        String studentName = req.getParameter("studentName");
        String studentPassword = req.getParameter("studentPassword");
        int studentSex = Integer.parseInt(req.getParameter("studentSex"));
        student.setStudentId(studentId);
        student.setStudentNumber(studentNumber);
        student.setStudentName(studentName);
        student.setStudentPassword(studentPassword);
        student.setStudentSex(studentSex);
        StudentDao studentDao = new StudentDao();
        studentDao.updateStudent(student);
        req.getRequestDispatcher("").forward(req, resp);
    }
}

编写前端页面

添加页(add.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <meta charset="utf-8">
        <title>学生管理系统</title>
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
    </head>
    <body style="padding-top: 20px;">
        <div class="container">
            <div class="col-md-8 col-md-offset-2">
                <h1>添加学生</h1><br>
                <form action="add" method="post">
                    <div class="form-group">
                        <label>学生编号</label>
                        <input type="text" class="form-control" name="studentNumber">
                    </div>
                    <div class="form-group">
                        <label>学生姓名</label>
                        <input type="text" class="form-control" name="studentName">
                    </div>
                    <div class="form-group">
                        <label>学生密码</label>
                        <input type="password" class="form-control" name="studentPassword">
                    </div>
                    <div class="form-group">
                        <label class="radio-inline">
                                  <input type="radio" name="studentSex" value="1" checked="checked"> 男
                                </label>
                        <label class="radio-inline">
                                  <input type="radio" name="studentSex" value="0"> 女
                                </label>
                    </div>
                    <div class="form-group">
                        <button type="submit" class="btn btn-info">添加学生</button>
                    </div>
                </form>
            </div>
        </div>
    </body>
</html>

列表页(list.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
    <head>
        <meta charset="utf-8">
        <title>学生管理系统</title>
        <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
    </head>
    <body style="padding-top: 20px;">
        <div class="container">
            <div class="col-md-8 col-md-offset-2">
                <h1>学生列表</h1><br>
                <table class="table">
                    <thead>
                        <td>学生ID</td>
                        <td>学生编号</td>
                        <td>学生姓名</td>
                        <td>学生密码</td>
                        <td>学生性别</td>
                        <td>操作</td>
                    </thead>
                    <tbody>
                        <c:forEach items="${studentList}" var="student">
                            <tr>
                                <td>${student.studentId}</td>
                                <td>${student.studentNumber}</td>
                                <td>${student.studentName}</td>
                                <td>${student.studentPassword}</td>
                                <td>
                                    <c:choose>
                                        <c:when test="${student.studentSex == 0}">女</c:when>
                                        <c:when test="${student.studentSex == 1}">男</c:when>
                                    </c:choose>
                                </td>
                                <td>
                                    <a class="btn btn-info btn-sm" href="/update?studentId=${student.studentId}">更 新</a>
                                    <a class="btn btn-danger btn-sm" href="/delete?studentId=${student.studentId}">删 除</a>
                                </td>
                            </tr>
                        </c:forEach>
                    </tbody>
                </table>
                <button class="btn btn-success" onclick="window.location.href='/add'">添加学生</button>
                <button class="btn btn-info" onclick="window.location.href='/'">学生列表</button>
            </div>
        </div>
    </body>
</html>

更新页(update.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
    <head>
        <meta charset="utf-8">
        <title>学生管理系统</title>
        <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
    </head>
    <body style="padding-top: 20px;">
        <div class="container">
            <div class="col-md-8 col-md-offset-2">
                <h1>更新学生</h1><br>
                <form action="/update" method="post">
                    <div class="form-group">
                        <label>学生ID</label>
                        <input type="hidden" class="form-control" name=studentId value="${student.studentId}">
                    </div>
                    <div class="form-group">
                        <label>学生编号</label>
                        <input type="text" class="form-control" name="studentNumber" value="${student.studentNumber}">
                    </div>
                    <div class="form-group">
                        <label>学生姓名</label>
                        <input type="text" class="form-control" name="studentName" value="${student.studentName}">
                    </div>
                    <div class="form-group">
                        <label>学生密码</label>
                        <input type="password" class="form-control" name="studentPassword" value="${student.studentPassword}">
                    </div>
                    <div class="form-group">
                        <c:choose>
                            <c:when test="${student.studentSex == 1}">
                                <label class="radio-inline">
                                          <input type="radio" name="studentSex" id="studentSex" value="1" checked="checked"> 男
                                        </label>
                                <label class="radio-inline">
                                          <input type="radio" name="studentSex" id="studentSex" value="0"> 女
                                        </label>
                            </c:when>
                            <c:when test="${student.studentSex == 0}">
                                <label class="radio-inline">
                                          <input type="radio" name="studentSex" id="studentSex" value="1"> 男
                                        </label>
                                <label class="radio-inline">
                                          <input type="radio" name="studentSex" id="studentSex" value="0" checked="checked"> 女
                                        </label>
                            </c:when>
                        </c:choose>
                    </div>
                    <div class="form-group">
                        <button type="submit" class="btn btn-info">更新学生</button>
                    </div>
                </form>
            </div>
        </div>
    </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>servlet-crud</display-name>
  <welcome-file-list>
    <welcome-file>list.jsp</welcome-file>
  </welcome-file-list>
</web-app>

基于注解开发

一定很好奇为什么配置文件只修改了欢迎页面为 list.jsp,而没有类似servlet-mapper的配置,下面是原来的写法。

<servlet>
    <servlet-name>AddServlet</servlet-name>
    <servlet-class>com.readjava.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AddServlet</servlet-name>
    <url-pattern>/Add</url-pattern>
</servlet-mapping>

配置文件写法升级,通过注解的方式将繁琐的配置文件简化,上面的配置文件映射就可以改为以下注解:

@WebServlet("/add")
public class AddServlet extends HttpServlet {
}

源码下载