JavaWeb學習案例——學生管理系統
引入jar包:
1、 c3p0-0.9.1.2.jar // 第三方數據庫連接池
2、commons-dbutils-1.4.jar // 第三方數據庫操作方法封裝
3、jstl.jar // jsp中jstl語法引入
4、mysql-connector-java-5.1.7-bin // sql 數據庫
bean對象
public class Student {
private int sid;
private String sname;
private String gender;
private String phone;
private String hobby;
private String info;
private Date birthday;
}
// 分頁的學生數據列表
public class PageBean<T> {
private int currentPage; //當前頁
private int totalPage;//總頁數
private int pageSize;//每頁的記錄數
private int totalSize; //總的記錄數
private List<T> list; //當前頁的學生集合
}
jdbc數據庫連接池方法封裝
public class JDBCUtil {
static ComboPooledDataSource dataSource = null;
static{
dataSource = new ComboPooledDataSource();}
public static DataSource getDataSource(){
return dataSource;}
/**
* 獲取連接對象
* @return
* @throws SQLException
*/
public static Connection getConn() throws SQLException{
return dataSource.getConnection();}
/**
* 釋放資源
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);}
public static void release(Connection conn , Statement st){
closeSt(st);
closeConn(conn);}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
針對數據內容數據庫查詢方法封裝
/**
* 這是StudentDao的實現。 針對前面定義的規範,做出具體的實現。
* @author xiaomi
*/
public class StudentDaoImpl implements StudentDao {
/**
* 查詢所有學生
* @throws SQLException
*/
@Override
public List<Student> findAll() throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
List<Student> query = runner.query("select * from stu", new BeanListHandler<Student>(Student.class));
return runner.query("select * from stu", new BeanListHandler<Student>(Student.class)); }
@Override
public void insert(Student student) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
runner.update("insert into stu values(null , ?,?,?,?,?,?)" ,
student.getSname(),
student.getGender(),
student.getPhone(),
student.getBirthday(),
student.getHobby(),
student.getInfo()
);}
@Override
public void delete(int sid) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
runner.update("delete from stu where sid=?" ,sid);
}
@Override
public Student findStudentById(int sid) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
return runner.query("select * from stu where sid = ?", new BeanHandler<Student>(Student.class) ,sid);}
@Override
public void update(Student student) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
runner.update("update stu set sname=? , gender=? , phone=? , birthday=? , hobby=? , info=? where sid = ?",
student.getSname(),
student.getGender(),
student.getPhone(),
student.getBirthday(),
student.getHobby(),
student.getInfo(),
student.getSid());}
@Override
public List<Student> searchStudent(String sname, String sgender) throws SQLException {
System.out.println("現在要執行模糊查詢了,收到的name ="+sname + "==genser=="+sgender);
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
//String sql = "select * from stu where sname=? or sgender=?";
/*
* 這裏要分析一下:
* 如果只有姓名 ,select * from stu where sname like ? ;
* 如果只有性別 , select * from stu where gender = ?
* 如果兩個都有 select * from stu where sname like ? and gender=?
* 如果兩個都沒有就查詢所有。
*/
String sql = "select * from stu where 1=1 ";
List<String> list = new ArrayList<String> ();
//判斷有沒有姓名, 如果有,就組拼到sql語句裏面
if(!TextUtils.isEmpty(sname)){
sql = sql + " and sname like ?";
list.add("%"+sname+"%");
}
//判斷有沒有性別,有的話,就組拼到sql語句裏面。
if(!TextUtils.isEmpty(sgender)){
sql = sql + " and gender = ?";
list.add(sgender);
}
Object[] objects = list.toArray();
return runner.query(sql , new BeanListHandler<Student>(Student.class) ,list.toArray() );
}
@Override
public List<Student> findStudentByPage(int currentPage) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
//第一個問號,代表一頁返回多少條記錄 , 第二個問號, 跳過前面的多少條記錄。
//5 0 --- 第一頁 (1-1)*5
//5 5 --- 第二頁 (2-1)*5
//5 10 --- 第三頁
return runner.query("select * from stu limit ? offset ?",
new BeanListHandler<Student>(Student.class) , PAGE_SIZE , (currentPage-1)*PAGE_SIZE);
}
@Override
public int findCount() throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource());
//用於處理 平均值 、 總的個數。
Long result = (Long) runner.query("SELECT COUNT(*) FROM stu" , new ScalarHandler() );
return result.intValue();
}
}
針對實際業務封裝的服務類
注意與DAO層進行區分
/**
* 這是學生業務實現
* @author xiaomi
*
*/
public class StudentServiceImpl implements StudentService {
@Override
public List<com.itheima.domain.Student> findAll() throws SQLException {
StudentDao dao = new StudentDaoImpl();
List<Student> all = dao.findAll();
return dao.findAll();}
@Override
public void insert(com.itheima.domain.Student student) throws SQLException {
StudentDao dao = new StudentDaoImpl();
dao.insert(student);}
@Override
public void delete(int sid) throws SQLException {
StudentDao dao = new StudentDaoImpl();
dao.delete(sid);}
@Override
public com.itheima.domain.Student findStudentById(int sid) throws SQLException {
StudentDao dao = new StudentDaoImpl();
return dao.findStudentById(sid);}
@Override
public void update(com.itheima.domain.Student student) throws SQLException {
StudentDao dao = new StudentDaoImpl();
dao.update(student);}
@Override
public List<com.itheima.domain.Student> searchStudent(String sname, String sgender) throws SQLException {
return new StudentDaoImpl().searchStudent(sname, sgender);}
@Override
public PageBean findStudentByPage(int currentPage) throws SQLException {
//封裝分頁的該頁數據
PageBean<Student> pageBean = new PageBean<Student>();
int pageSize = StudentDao.PAGE_SIZE ;
pageBean.setCurrentPage(currentPage); //設置當前頁
pageBean.setPageSize(pageSize); //設置每頁顯示多少記錄
StudentDao dao = new StudentDaoImpl() ;
List<Student> list =dao.findStudentByPage(currentPage);
pageBean.setList(list); //設置這一頁的學生數據
//總的記錄數, 總的頁數。
int count = dao.findCount();
pageBean.setTotalSize(count); //設置總的記錄數
//200 , 10 ==20 201 , 10 = 21 201 % 10 == 0 ?201 / 10 :201 % 10 + 1
pageBean.setTotalPage(count % pageSize==0 ? count / pageSize : (count / pageSize) + 1); //總頁數
return pageBean;
}
}
JSP和Servlet 業務層面代碼
鏈接servlet註冊文件:Web.xml
和android的頁面註冊文件非常類似,對於頁面的url需要提前註冊。
<servlet>
和<servlet-mapping>
需要一一對應
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>StudentListServlet</display-name>
<servlet-name>StudentListServlet</servlet-name>
<servlet-class>com.hhh.servlet.StudentListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentListServlet</servlet-name>
<url-pattern>/StudentListServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>AddServlet</display-name>
<servlet-name>AddServlet</servlet-name>
<servlet-class>com.hhh.servlet.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>DeleteServlet</display-name>
<servlet-name>DeleteServlet</servlet-name>
<servlet-class>com.hhh.servlet.DeleteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DeleteServlet</servlet-name>
<url-pattern>/DeleteServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>EditServlet</display-name>
<servlet-name>EditServlet</servlet-name>
<servlet-class>com.hhh.servlet.EditServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EditServlet</servlet-name>
<url-pattern>/EditServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>UpdateServlet</display-name>
<servlet-name>UpdateServlet</servlet-name>
<servlet-class>com.hhh.servlet.UpdateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UpdateServlet</servlet-name>
<url-pattern>/UpdateServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>SearchStudentServlet</display-name>
<servlet-name>SearchStudentServlet</servlet-name>
<servlet-class>com.hhh.servlet.SearchStudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SearchStudentServlet</servlet-name>
<url-pattern>/SearchStudentServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>StudentListPageServlet</display-name>
<servlet-name>StudentListPageServlet</servlet-name>
<servlet-class>com.hhh.servlet.StudentListPageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentListPageServlet</servlet-name>
<url-pattern>/StudentListPageServlet</url-pattern>
</servlet-mapping>
</web-app>
index.jsp 起始頁:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3><a href="StudentListServlet">顯示所有學生列表</a></h3><br>
<h3><a href="StudentListPageServlet?currentPage=1">分頁顯示所有學生</a></h3>
</body>
</html>
StudentListPageServlet:學生列表
對於跳轉到jsp進行展示的數據,我們通過request設置屬性所對應的對象進行數據傳遞。
/**
* 這是用於分頁顯示學生列表的servlet
* @author xiaomi
*/
public class StudentListPageServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1. 獲取需要顯示的頁碼數
int currentPage =Integer.parseInt( request.getParameter("currentPage"));
//2. 根據指定的頁數,去獲取該頁的數據回來
//List<Student> --- list.jsp
StudentService service = new StudentServiceImpl();
PageBean pageBean= service.findStudentByPage(currentPage);
request.setAttribute("pageBean", pageBean);
//3. 跳轉界面。
request.getRequestDispatcher("list.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
list.jsp 學生列表展示界面
對於直接跳轉的頁面直接通過a標籤帶參跳轉,jsp中我們一般進行少量數據的傳遞。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: huhanghao
Date: 2019-10-31
Time: 22:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="SearchStudentServlet" method="post">
<table border="1" width="700">
<tr >
<td colspan="8">
按姓名查詢:<input type="text" name="sname"/>
按性別查詢:<select name="sgender">
<option value="">--請選擇--
<option value="男">男
<option value="女">女
</select>
<input type="submit" value="查詢">
<a href="add.jsp">添加</a>
</td>
</tr>
<tr align="center">
<td>編號</td>
<td>姓名</td>
<td>性別</td>
<td>電話</td>
<td>生日</td>
<td>愛好</td>
<td>簡介</td>
<td>操作</td>
</tr>
<c:forEach items="${pageBean.list}" var="stu">
<tr align="center">
<td>${stu.sid }</td>
<td>${stu.sname }</td>
<td>${stu.gender }</td>
<td>${stu.phone }</td>
<td>${stu.birthday }</td>
<td>${stu.hobby }</td>
<td>${stu.info }</td>
<td><a href="EditServlet?sid=${stu.sid }">更新</a> <a href="#" onclick="doDelete(${stu.sid})">刪除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="8">
第 ${pageBean.currentPage } / ${pageBean.totalPage }
每頁顯示${pageBean.pageSize }條
總的記錄數${pageBean.totalSize }
<c:if test="${pageBean.currentPage !=1 }">
<a href="StudentListPageServlet?currentPage=1">首頁</a>
| <a href="StudentListPageServlet?currentPage=${pageBean.currentPage-1 }">上一頁</a>
</c:if>
<c:forEach begin="1" end="${pageBean.totalPage }" var="i">
<c:if test="${pageBean.currentPage == i }">
${i }
</c:if>
<c:if test="${pageBean.currentPage != i }">
<a href="StudentListPageServlet?currentPage=${i }">${i }</a>
</c:if>
</c:forEach>
<c:if test="${pageBean.currentPage !=pageBean.totalPage }">
<a href="StudentListPageServlet?currentPage=${pageBean.currentPage+1 }">下一頁</a> |
<a href="StudentListPageServlet?currentPage=${pageBean.totalPage }">尾頁</a>
</c:if>
</td>
</tr>
</table>
</form>
</body>
<script>
function doDelete(sid) {
/* 如果這裏彈出的對話框,用戶點擊的是確定,就馬上去請求Servlet。
如何知道用戶點擊的是確定。
如何在js的方法中請求servlet。 */
var flag = confirm("是否確定刪除?");
if(flag){
//表明點了確定。 訪問servlet。 在當前標籤頁上打開 超鏈接,
//window.location.href="DeleteServlet?sid="+sid;
location.href="DeleteServlet?sid="+sid;
}
}
</script>
</html>
EditServlet學生信息更新
/**
* 處理單個學生的更新, 查詢一個學生的信息,然後跳轉到更新頁面
* @author xiaomi
*
*/
public class EditServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1. 接收id
int sid = Integer.parseInt(request.getParameter("sid"));
//2. 查詢學生數據
StudentService service = new StudentServiceImpl();
Student stu = service.findStudentById(sid);
//3. 顯示數據
//存數據
request.setAttribute("stu", stu);
//跳轉
request.getRequestDispatcher("edit.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
edit.jsp更新學生信息頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>更新學生頁面</title>
</head>
<body>
<h3>更新學生頁面</h3>
<form method="post" action="UpdateServlet">
<input type="hidden" name="sid" value="${stu.sid }">
<table border="1" width="600">
<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><input type="text" name="phone" value="${stu.phone }"></td>
</tr>
<tr>
<td>生日</td>
<td><input type="text" name="birthday" value="${stu.birthday }"></td>
</tr>
<tr>
<td>愛好</td>
<td>
<!-- 愛好: 籃球 , 足球 , 看書
因爲愛好有很多個, 裏面存在包含的關係 -->
<input type="checkbox" name="hobby" value="游泳" <c:if test="${fn:contains(stu.hobby,'游泳') }">checked</c:if>>游泳
<input type="checkbox" name="hobby" value="籃球" <c:if test="${fn:contains(stu.hobby,'籃球') }">checked</c:if>>籃球
<input type="checkbox" name="hobby" value="足球" <c:if test="${fn:contains(stu.hobby,'足球') }">checked</c:if>>足球
<input type="checkbox" name="hobby" value="看書" <c:if test="${fn:contains(stu.hobby,'看書') }">checked</c:if>>看書
<input type="checkbox" name="hobby" value="寫字" <c:if test="${fn:contains(stu.hobby,'寫字') }">checked</c:if>>寫字
</td>
</tr>
<tr>
<td>簡介</td>
<td><textarea name="info" rows="3" cols="20">${stu.info }</textarea></td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="更新"> </td>
</tr>
</table>
</form>
</body>
</html>