JavaWeb學習案例——學生管理系統

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"/>
            &nbsp;
            按性別查詢:<select name="sgender">
            <option value="">--請選擇--
            <option value="男">男
            <option value="女">女
            </select>
            &nbsp;&nbsp;&nbsp;
            <input type="submit" value="查詢">
            &nbsp;&nbsp;&nbsp;
            <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 }
            &nbsp;&nbsp;
            每頁顯示${pageBean.pageSize }條  &nbsp;&nbsp;&nbsp;
            總的記錄數${pageBean.totalSize } &nbsp;&nbsp;&nbsp;
            <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>

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章