## 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)