ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## J2EE CRUD JavaWeb 入门首例,实现增加、删除、修改和查询功能。 ![](http://47.107.171.232/easily-j/images/20190310/7fdbb26f-12ac-473c-89fd-1b282787fc53.png) ![](http://47.107.171.232/easily-j/images/20190310/697d8ff8-ec41-4b96-908d-6dc504814b89.png) ![](http://47.107.171.232/easily-j/images/20190310/f4f50b3e-240b-4be5-ae53-f8c68ec302b8.png) ## 创建数据库与表 ```sql -- 创建数据库 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 默认就是 / 无需更改。 ![](http://47.107.171.232/easily-j/images/20190310/5a2b3138-fb88-4199-94ca-36a1b1dcb419.png) ## 添加jar包和css ![](http://47.107.171.232/easily-j/images/20190310/73e76ccc-9f39-442a-a74f-8d4b3566e471.png) ## 编写后台代码 ### 工具类(util) ```java 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) ```java 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) ```java 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) ```java 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); } } ``` ```java 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); } } ``` ```java 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); } } ``` ```java 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) ```java <%@ 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) ```java <%@ 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) ```java <%@ 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 <?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的配置,下面是原来的写法。 ```xml <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> ``` 配置文件写法升级,通过注解的方式将繁琐的配置文件简化,上面的配置文件映射就可以改为以下注解: ```java @WebServlet("/add") public class AddServlet extends HttpServlet { } ``` ## 源码下载 ![](http://47.107.171.232/easily-j/images/20190310/42196bfc-cd1a-44ca-8f9a-269fb1aa37bd.png) ![](http://47.107.171.232/easily-j/images/20190310/2556c8bc-60c3-457c-b7a9-cd25ccbd0f02.png)