## 学生信息管理系统
## 数据库准备
```
CREATE DATABASE stus;
USE stus;
CREATE TABLE stu (
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR (20),
gender VARCHAR (5),
phone VARCHAR (20),
birthday DATE,
hobby VARCHAR(50),
info VARCHAR(200)
);
```
## 查询
1. 先写一个JSP 页面, 里面放一个超链接 。
```
<a href="StudentListServlet"> 学生列表显示</a>
```
2. 写Servlet, 接收请求, 去调用 Service , 由service去调用dao
3. 先写Dao , 做Dao实现。
```java
public interface StudentDao {
/**
* 查询所有学生
* @return List<Student>
*/
List<Student> findAll() throws SQLException ;
}
---------------------------------------------
public class StudentDaoImpl implements StudentDao {
/**
* 查询所有学生
* @throws SQLException
*/
@Override
public List<Student> findAll() throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
return runner.query("select * from stu", new BeanListHandler<Student>(Student.class));
}
}
```
4. 再Service , 做Service的实现。
```java
/**
* 这是学生的业务处理规范
* @author xiaomi
*
*/
public interface StudentService {
/**
* 查询所有学生
* @return List<Student>
*/
List<Student> findAll() throws SQLException ;
}
------------------------------------------
/**
* 这是学生业务实现
* @author xiaomi
*
*/
public class StudentServiceImpl implements StudentService{
@Override
public List<Student> findAll() throws SQLException {
StudentDao dao = new StudentDaoImpl();
return dao.findAll();
}
}
```
5. 在servlet 存储数据,并且做出页面响应。
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1. 查询出来所有的学生
StudentService service = new StudentServiceImpl();
List<Student> list = service.findAll();
//2. 先把数据存储到作用域中
request.setAttribute("list", list);
//3. 跳转页面
request.getRequestDispatcher("list.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
```
6. 在list.jsp上显示数据
EL + JSTL + 表格
## 增加
1. 先跳转到增加的页面 , 编写增加的页面
```html
<h2 align="center">添加学生界面</h2>
<form action="AddStudentServlet" method="post">
<table border="1" width="400" align="center">
<tr>
<td>姓名</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio" name="gender" value="男" checked="checked"/>男
<input type="radio" name="gender" value="女"/>女
</td>
</tr>
<tr>
<td>电话</td>
<td><input type="text" name="phone"/></td>
</tr>
<tr>
<td>生日</td>
<td><input type="text" name="birthday"/></td>
</tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox" name="hobby" value="游泳"/>游泳
<input type="checkbox" name="hobby" value="篮球"/>篮球
<input type="checkbox" name="hobby" value="足球"/>足球
<input type="checkbox" name="hobby" value="看书"/>看书
<input type="checkbox" name="hobby" value="鞋子"/>写字
</td>
</tr>
<tr>
<td>简介</td>
<td><input type="text" name="info"/></td>
</tr>
<tr align="right">
<td colspan="2"><input type="submit" value="添加"/></td>
</tr>
</table>
</form>
```
2. 点击添加,提交数据到AddServlet . 处理数据。
```java
try {
// 1.获取客户端提交上来的数据
String sname = request.getParameter("name");
String gender = request.getParameter("gender");
String phone = request.getParameter("phone");
String birthday = request.getParameter("birthday");
// hobby需要对应的多个
String[] h = request.getParameterValues("hobby");
String hobby= Arrays.toString(h);
hobby = hobby.substring(1, hobby.length() - 1);
String info = request.getParameter("info");
// 2.添加到数据库
StudentServiceImpl service = new StudentServiceImpl();
Student student = new Student();
// 注意日期这里需要parse一下
Date date = null;
date = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
student.setSname(sname);
student.setGender(gender);
student.setPhone(phone);
student.setBirthday(date);
student.setHobby(hobby);
student.setInfo(info);
service.insert(student);
// 3.跳转到列表页
// servlet除了能跳转jsp,还能跳转servlet
// request.getRequestDispatcher("list.jsp").forward(request, response);
request.getRequestDispatcher("StudentListServlet").forward(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
```
3. 调用service
4. 调用dao, 完成数据持久化。
```java
/**
* 添加学生的处理功能
* @throws SQLException
*
*/
@Override
public void insert(Student student) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
String sql = "insert into stu values(null,?,?,?,?,?,?)";
queryRunner.update(sql,
student.getSname(),
student.getGender(),
student.getPhone(),
student.getBirthday(),
student.getHobby(),
student.getInfo()
);
}
```
5. 完成了这些存储工作后,需要跳转到列表页面。 这里不能直接跳转到列表页面,否则没有什么内容显示。 应该先跳转到查询所有学生信息的那个Servlet, 由那个Servlet再去跳转到列表页面。
6. 爱好的value 值有多个。
```java
request.getParameter("hobby");
String[] hobby = request.getParameterValues("hobby") ---> String[]
String value = Arrays.toString(hobby): // [爱好, 篮球, 足球]
```
### 删除
1. 点击超链接,弹出一个询问是否删除的对话框,如果点击了确定,那么就真的删除。
```html
<a href="#" onclick="doDelete(${stu.sid})">删除</a>
```
2. 让超链接,执行一个js方法
```javascript
<script type="text/javascript">
function doDelete(sid) {
/* 如果这里弹出的对话框,用户点击的是确定,就马上去请求Servlet。
如何知道用户点击的是确定。
如何在js的方法中请求servlet。 */
var flag = confirm("是否确定删除?");
if(flag){
//表明点了确定。 访问servlet。 在当前标签页上打开 超链接,
//window.location.href="DeleteServlet?sid="+sid;
location.href="DeleteServlet?sid="+sid;
}
}
</script>
```
3. 在js访问里面判断点击的选项,然后跳转到servlet。
4. servlet收到了请求,然后去调用service , service去调用dao
```java
/**
* 从数据库中删除学生
*/
@Override
public void delete(int sid) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
String sql = "delete from stu where sid=?";
queryRunner.update(sql, sid);
}
```
## 更新
1. 点击列表上的更新, 先跳转到一个EditServlet
> 在这个Servlet里面,先根据ID 去查询这个学生的所有信息出来。
```java
/**
* 查询单个学生对象
*/
@Override
public Student findStudentById(int sid) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
// 查询sql语句
String sql = "select * from stu where sid=?";
return queryRunner.query(sql, new BeanHandler<Student>(Student.class), sid);
}
```
2. 跳转到更新的页面。 ,然后在页面上显示数据
```html
<tr>
<td>姓名</td>
<td><input type="text" name="sname" value="${stu.sname }"></td>
</tr>
<tr>
<td>性别</td>
<td>
<!-- 如果性别是男的, 可以在男的性别 input标签里面, 出现checked ,
如果性别是男的, 可以在女的性别 input标签里面,出现checked -->
<input type="radio" name="gender" value="男" <c:if test="${stu.gender == '男'}">checked</c:if>>男
<input type="radio" name="gender" value="女" <c:if test="${stu.gender == '女'}">checked</c:if>>女
</td>
</tr>
<tr>
<td>爱好</td>
<td>
<!-- 爱好: 篮球 , 足球 , 看书
因为