学生管理系统(SSM简易版)总结
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
技術(shù)準(zhǔn)備
為了完成這個項目,需要掌握如下技術(shù):
- Java
基礎(chǔ)知識 - 前端:
HTML, CSS, JAVASCRIPT, JQUERY - J2EE:
Tomcat, Servlet, JSP, Filter - 框架:
Spring, Spring MVC, MyBatis, Spring 與 MyBatis 整合, SSM 整合 - 數(shù)據(jù)庫:
MySQL - 開發(fā)工具:
IDEA, Maven
開發(fā)流程
之前雖然已經(jīng)使用 Servlet + JSP 完成了簡單的開發(fā),這次使用 SSM 僅僅是重構(gòu)工作,但我們?nèi)匀话凑丈虡I(yè)項目的開發(fā)步驟來一步一步完成,進一步熟悉這個過程,重復(fù)的部分我就直接復(fù)制了。
① 需求分析
首先要確定要做哪些功能
- 使用數(shù)據(jù)庫來保存數(shù)據(jù)
- 能增刪改查學(xué)生的信息(學(xué)號,名稱,年齡,性別,出生日期)
② 表結(jié)構(gòu)設(shè)計
根據(jù)需求,那么只需要一個 student 表就能夠完成功能了。
-
創(chuàng)建數(shù)據(jù)庫:student
DROP DATABASE IF EXISTS student; CREATE DATABASE student DEFAULT CHARACTER SET utf8;
將數(shù)據(jù)庫編碼格式設(shè)置為 UTF-8 ,便于存取中文數(shù)據(jù) -
創(chuàng)建學(xué)生表:student
CREATE TABLE student(id int(11) NOT NULL AUTO_INCREMENT,student_id int(11) NOT NULL UNIQUE,name varchar(255) NOT NULL,age int(11) NOT NULL,sex varchar(255) NOT NULL,birthday date DEFAULT NULL,PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
不用學(xué)生學(xué)號(studentID)作為主鍵的原因是:不方便操作,例如在更新數(shù)據(jù)的時候,同時也要更改學(xué)號,那這樣的操作怎么辦呢?
所以我們加了一個 id 用來唯一表示當(dāng)前數(shù)據(jù)。
MySQL 在 Windows 下不區(qū)分大小寫,但在 Linux 下默認(rèn)區(qū)分大小寫,因此,數(shù)據(jù)庫名、表明、字段名都不允許出現(xiàn)任何大寫字母,避免節(jié)外生枝。
③ 原型設(shè)計
就是設(shè)計界面,在商業(yè)項目中,這是很重要的一步,我們可以解除界面原型,低成本、高效率的與客戶達成需求的一致性。
這個項目一共就分為兩個頁面:
-
主頁面:
-
學(xué)生編輯頁面:
④ SSM 環(huán)境搭建
在真正開始編寫代碼之前,我們首先需要先來搭建好我們的 SSM 環(huán)境。
第一步:創(chuàng)建 Maven webapp 項目
首先新建工程,選擇 Maven 標(biāo)簽,然后勾選上【Create from archetype】選擇 webapp:
點擊下一步,填寫上【GroupId】和【ArtifactId】:
- GroupId:項目組織唯一的標(biāo)識符,實際對應(yīng) JAVA 的包的結(jié)構(gòu),也就是 main 目錄下 java 的目錄結(jié)構(gòu)(包)
- AritifactId:項目的唯一標(biāo)識符,實際對應(yīng)項目的名稱,就是項目根目錄的名稱
- 實際上你可以亂填上試試,我就不亂填了
然后是確認(rèn)項目路徑,這一步你可以看到 Maven 配置中的參數(shù),不需要做改動,直接下一步就可以(圖中的路徑是我配置的本地 Maven 倉庫的地址):
確認(rèn)項目名稱和路徑,點擊【Finish】即可:
等待一會兒,控制臺就會有創(chuàng)建成功的提示信息,我們把【Enable Auto-Import】點上,這個提示會在每次 pom.xml 有改動時出現(xiàn),自動導(dǎo)入,省掉麻煩:
第二步:搭建項目目錄結(jié)構(gòu)
下面就是 Maven 風(fēng)格的 webapp 的默認(rèn)目錄結(jié)構(gòu):
- 注意: webapp 是默認(rèn)沒有 java 源文件也沒有 test 目錄的。
遵循 Maven 的統(tǒng)一項目結(jié)構(gòu),我們搭建出項目的完整目錄結(jié)構(gòu)如下圖:
- 我們并沒有使用 Log4j 來輸出日志,而是使用 logback
- 提示:我們可以在 IDEA 中右鍵目錄然后選擇【Make Directory as】,讓 IDEA 識別不同的目錄作用
這里的目錄建好之后還需要設(shè)置一下,讓 IDEA 識別目錄作用,選擇【File】>【Project Structure】:
設(shè)置好之后點擊 OK,即完成了項目目錄的搭建。
第三步:配置文件內(nèi)容
在【pom.xml】文件中聲明依賴的 jar 包 :
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><packaging>war</packaging><name>StudentManagerSSM</name><groupId>cn.wmyskxz</groupId><artifactId>StudentManagerSSM</artifactId><version>1.0-SNAPSHOT</version><build><plugins><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId><version>6.1.7</version><configuration><connectors><connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"><port>8888</port><maxIdleTime>30000</maxIdleTime></connector></connectors><webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory><contextPath>/</contextPath></configuration></plugin></plugins></build><properties><!-- 設(shè)置項目編碼編碼 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- spring版本號 --><spring.version>4.3.5.RELEASE</spring.version><!-- mybatis版本號 --><mybatis.version>3.4.1</mybatis.version></properties><dependencies><!-- jstl標(biāo)簽 --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>1.2.5</version></dependency><!-- java ee --><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0</version></dependency><!-- 單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- 實現(xiàn)slf4j接口并整合 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.2</version></dependency><!-- JSON --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.7</version></dependency><!-- 數(shù)據(jù)庫 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version><scope>runtime</scope></dependency><!-- 數(shù)據(jù)庫連接池 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- mybatis/spring整合包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency></dependencies></project>- <build> 標(biāo)簽是默認(rèn)生成的
- 我們在 <properties> 中聲明了編碼格式以及使用的 spring 和 mybatis 的版本號,然后在 <dependencies> 中聲明了具體的 jar 包
在【web.xml】中聲明編碼過濾器并配置 DispatcherServlet :
<?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_3_1.xsd"version="3.1"><!-- 編碼過濾器 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 配置DispatcherServlet --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置springMVC需要加載的配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-*.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><!-- 匹配所有請求 --><url-pattern>/</url-pattern></servlet-mapping></web-app>在【spring-mybatis.xml】中完成 spring 和 mybatis 的配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 掃描service包下所有使用注解的類型 --><context:component-scan base-package="cn.wmyskxz.service"/><!-- 配置數(shù)據(jù)庫相關(guān)參數(shù)properties的屬性:${url} --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 數(shù)據(jù)庫連接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="maxPoolSize" value="${c3p0.maxPoolSize}"/><property name="minPoolSize" value="${c3p0.minPoolSize}"/><property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/><property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/><property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/></bean><!-- 配置SqlSessionFactory對象 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入數(shù)據(jù)庫連接池 --><property name="dataSource" ref="dataSource"/><!-- 掃描entity包 使用別名 --><property name="typeAliasesPackage" value="cn.wmyskxz.entity"/><!-- 掃描sql配置文件:mapper需要的xml文件 --><property name="mapperLocations" value="classpath:mapper/*.xml"/></bean><!-- 配置掃描Dao接口包,動態(tài)實現(xiàn)Dao接口,注入到spring容器中 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 注入sqlSessionFactory --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!-- 給出需要掃描Dao接口包 --><property name="basePackage" value="cn.wmyskxz.dao"/></bean><!-- 配置事務(wù)管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 注入數(shù)據(jù)庫連接池 --><property name="dataSource" ref="dataSource"/></bean><!-- 配置基于注解的聲明式事務(wù) --><tx:annotation-driven transaction-manager="transactionManager"/></beans>在【spring-mvc.xml】中完成 Spring MVC 的相關(guān)配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><!-- 掃描web相關(guān)的bean --><context:component-scan base-package="cn.wmyskxz.controller"/><!-- 開啟SpringMVC注解模式 --><mvc:annotation-driven/><!-- 靜態(tài)資源默認(rèn)servlet配置 --><mvc:default-servlet-handler/><!-- 配置jsp 顯示ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean></beans>在【jdbc.properties】中配置 c3p0 數(shù)據(jù)庫連接池:
jdbc.driver=com.mysql.jdbc.Driver #數(shù)據(jù)庫地址 jdbc.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8 #用戶名 jdbc.username=root #密碼 jdbc.password=root #最大連接數(shù) c3p0.maxPoolSize=30 #最小連接數(shù) c3p0.minPoolSize=10 #關(guān)閉連接后不自動commit c3p0.autoCommitOnClose=false #獲取連接超時時間 c3p0.checkoutTimeout=10000 #當(dāng)獲取連接失敗重試次數(shù) c3p0.acquireRetryAttempts=2在【logback.xml】中完成日志輸出的相關(guān)配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="STDOUT"/></root> </configuration>以上就完成了 SSM 框架的基本配置:
- 添加進了 SSM 項目所需要的 jar 包
- 配置好了 spring/mybatis/spring MVC 的相關(guān)配置信息(自動掃描 cn.wmyskxz 包下的帶有注解的類)
- 通過 xml 配置的方式配置好了日志和數(shù)據(jù)庫
⑤ 實體類設(shè)計
實體類僅僅是對數(shù)據(jù)庫中表的一一映射(表中字段名應(yīng)該和實體類中的名稱一一對應(yīng)),同時可能還需要兼顧對業(yè)務(wù)能力的支持。
- 在 Packge【cn.wmyskxz.entity】下創(chuàng)建 Student 類:
⑤ DAO 類的設(shè)計
DAO,即 Date Access Object,數(shù)據(jù)庫訪問對象,就是對數(shù)據(jù)庫相關(guān)操作的封裝,讓其他地方看不到 JDBC 的代碼。
在【cn.wmyskxz.dao】包下創(chuàng)建【StudentDao】接口:
package cn.wmyskxz.dao;import cn.wmyskxz.entity.Student;import java.util.List;public interface StudentDao {int getTotal();void addStudent(Student student);void deleteStudent(int id);void updateStudent(Student student);Student getStudent(int id);List<Student> list(int start, int count); }然后在【resources/mapper】下創(chuàng)建好對應(yīng)的映射文件【StudengDao.xml】:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 將namespace的值設(shè)置為DAO類對應(yīng)的路徑 --> <mapper namespace="cn.wmyskxz.dao.StudentDao"><!-- 查詢數(shù)據(jù)條目 --><select id="getTotal" resultType="int">SELECT COUNT(*) FROM student</select><!-- 增加一條數(shù)據(jù) --><insert id="addStudent" parameterType="Student">INSERT INTO student VALUES(NULL, #{student_id}, #{name}, #{age}, #{sex}, #{birthday})</insert><!-- 刪除一條數(shù)據(jù) --><delete id="deleteStudent" parameterType="int">DELETE FROM student WHERE id = #{id}</delete><!-- 更新一條數(shù)據(jù) --><update id="updateStudent" parameterType="Student">UPDATE student SET student_id = #{student_id}, name = #{name},age = #{age}, sex = #{sex}, birthday = #{birthday} WHERE id = #{id}</update><!-- 查詢一條數(shù)據(jù) --><select id="getStudent" resultMap="student" parameterType="int">SELECT * FROM student WHERE id = #{id}</select><resultMap id="student" type="student"><id column="id" property="id"/><result column="student_id" property="student_id"/><result column="name" property="name"/><result column="age" property="age"/><result column="sex" property="sex"/><result column="birthday" property="birthday"/></resultMap><!-- 查詢從start位置開始的count條數(shù)據(jù)--><select id="list" resultMap="student">SELECT * FROM student ORDER BY student_id desc limit #{param1}, #{param2}</select> </mapper>編寫好了 Dao 類是需要測試的,這里測試類就不給出了。
⑦ 業(yè)務(wù)類設(shè)計
- 問題: 為什么不直接使用 Dao 類而是還要在上面封裝一層 Service 層呢?
- 回答:
基于責(zé)任分離的原則,Dao 層就應(yīng)該專注于對數(shù)據(jù)庫的操作,而在 Service 層我們可以增加一些非 CRUD 的方法去更好的完成本身抽離出來的 service 服務(wù)(業(yè)務(wù)處理)。
在【cn.wmyskxz.service】包下創(chuàng)建【StudentService】接口:
package cn.wmyskxz.service;import cn.wmyskxz.entity.Student;import java.util.List;public interface StudentService {/*** 獲取到 Student 的總數(shù)* @return*/int getTotal();/*** 增加一條數(shù)據(jù)* @param student*/void addStudent(Student student);/*** 刪除一條數(shù)據(jù)* @param id*/void deleteStudent(int id);/*** 更新一條數(shù)據(jù)* @param student*/void updateStudent(Student student);/*** 找到一條數(shù)據(jù)* @param id* @return*/Student getStudent(int id);/*** 列舉出從 start 位置開始的 count 條數(shù)據(jù)* @param start* @param count* @return*/List<Student> list(int start, int count); }并在相同包名下創(chuàng)建實現(xiàn)類【StudentServiceImpl】:
package cn.wmyskxz.service;import cn.wmyskxz.dao.StudentDao; import cn.wmyskxz.entity.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.List;/*** StudentService 的實現(xiàn)類** @author: @我沒有三顆心臟* @create: 2018-04-23-下午 13:51*/ @Service public class StudentServiceImpl implements StudentService {@AutowiredStudentDao studentDao;public int getTotal() {return studentDao.getTotal();}public void addStudent(Student student) {studentDao.addStudent(student);}public void deleteStudent(int id) {studentDao.deleteStudent(id);}public void updateStudent(Student student) {studentDao.updateStudent(student);}public Student getStudent(int id) {return studentDao.getStudent(id);}public List<Student> list(int start, int count) {return studentDao.list(start, count);} }⑧ 功能開發(fā)
在【cn.wmyskxz.controller】包下創(chuàng)建【StudentController】控制器,代碼基本上都是復(fù)制黏貼之前在 Servlet 中的代碼:
package cn.wmyskxz.controller;import cn.wmyskxz.entity.Student; import cn.wmyskxz.service.StudentService; import cn.wmyskxz.util.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List;/*** Student 控制器** @author: @我沒有三顆心臟* @create: 2018-04-23-下午 13:27*/ @Controller @RequestMapping("") public class StudentController {@Autowiredprivate StudentService studentService;@RequestMapping("/addStudent")public String addStudent(HttpServletRequest request, HttpServletResponse response) {Student student = new Student();int studentID = Integer.parseInt(request.getParameter("student_id"));String name = request.getParameter("name");int age = Integer.parseInt(request.getParameter("age"));String sex = request.getParameter("sex");Date birthday = null;// String 類型按照 yyyy-MM-dd 的格式轉(zhuǎn)換為 java.util.Date 類SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");try {birthday = simpleDateFormat.parse(request.getParameter("birthday"));} catch (ParseException e) {e.printStackTrace();}student.setStudent_id(studentID);student.setName(name);student.setAge(age);student.setSex(sex);student.setBirthday(birthday);studentService.addStudent(student);return "redirect:listStudent";}@RequestMapping("/listStudent")public String listStudent(HttpServletRequest request, HttpServletResponse response) {// 獲取分頁參數(shù)int start = 0;int count = 10;try {start = Integer.parseInt(request.getParameter("page.start"));count = Integer.parseInt(request.getParameter("page.count"));} catch (Exception e) {}Page page = new Page(start, count);List<Student> students = studentService.list(page.getStart(), page.getCount());int total = studentService.getTotal();page.setTotal(total);request.setAttribute("students", students);request.setAttribute("page", page);return "listStudent";}@RequestMapping("/deleteStudent")public String deleteStudent(int id) {studentService.deleteStudent(id);return "redirect:listStudent";}@RequestMapping("/editStudent")public ModelAndView editStudent(int id) {ModelAndView mav = new ModelAndView("editStudent");Student student = studentService.getStudent(id);mav.addObject("student", student);return mav;}@RequestMapping("/updateStudent")public String updateStudent(HttpServletRequest request, HttpServletResponse response) {Student student = new Student();int id = Integer.parseInt(request.getParameter("id"));int student_id = Integer.parseInt(request.getParameter("student_id"));String name = request.getParameter("name");int age = Integer.parseInt(request.getParameter("age"));String sex = request.getParameter("sex");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");Date birthday = null;try {birthday = simpleDateFormat.parse(request.getParameter("birthday"));} catch (ParseException e) {e.printStackTrace();}student.setId(id);student.setStudent_id(student_id);student.setName(name);student.setAge(age);student.setSex(sex);student.setBirthday(birthday);studentService.updateStudent(student);return "redirect:listStudent";} }- 注意: 所有的學(xué)號都用 student_id 表示,為了契合在數(shù)據(jù)庫中的字段名(包括下面的 JSP 文件)
JSP 文件也直接黏之前的就好了,不過需要注意所有的 name 屬性:
- 【listStudent.jsp】:
- 【editStudent.jsp】:
- style.css 文件:
項目的整體結(jié)構(gòu)
分頁功能
- 首先在 Packge【util】包下創(chuàng)建一個 Page 工具類:
- totalPage 是計算得來的數(shù),用來表示頁碼一共的數(shù)量
在首頁顯示的 StudentList 用 page 的參數(shù)來獲取:
List<Student> students = studentService.list(page.getStart(), page.getCount());并且在映射文件中用 LIMIT 關(guān)鍵字:
<!-- 查詢從start位置開始的count條數(shù)據(jù)--> <select id="list" resultMap="student">SELECT * FROM student ORDER BY student_id desc limit #{param1}, #{param2} </select>-
第一個參數(shù)為 start,第二個參數(shù)為 count
這樣就能根據(jù)分頁的信息來獲取到響應(yīng)的數(shù)據(jù) -
編寫分頁欄:
1.寫好頭和尾
<nav class="pageDIV"><ul class="pagination">.....</ul> </nav>2.寫好? ?這兩個功能按鈕
使用 <c:if>標(biāo)簽來增加邊界判斷,如果沒有前面的頁碼了則設(shè)置為disable狀態(tài)
再通過 JavaScrip 代碼來完成禁用功能:
<script>$(function () {$("ul.pagination li.disabled a").click(function () {return false;});}); </script>3.完成中間頁碼的編寫
從 0 循環(huán)到 page.totalPage - 1 ,varStatus 相當(dāng)于是循環(huán)變量
- status.count 是從1開始遍歷
- status.index 是從0開始遍歷
- 要求:顯示當(dāng)前頁碼的前兩個和后兩個就可,例如當(dāng)前頁碼為3的時候,就顯示 1 2 3(當(dāng)前頁) 4 5 的頁碼
- 理解測試條件:
-10 <= 當(dāng)前頁*每一頁顯示的數(shù)目 - 當(dāng)前頁開始的數(shù)據(jù)編號 <= 30
- 只要理解了這個判斷條件,其他的就都好理解了
4.在控制器中獲取參數(shù)
// 獲取分頁參數(shù) int start = 0; int count = 10;try {start = Integer.parseInt(request.getParameter("page.start"));count = Integer.parseInt(request.getParameter("page.count")); } catch (Exception e) { }....// 共享 page 數(shù)據(jù) request.setAttribute("page", page);Date 轉(zhuǎn)換的問題
最開始的時候,我們看到頁面上顯示的日期是這樣的格式:
這顯然是我們不希望看到的
- 解決方案:在映射文件中設(shè)置日期顯示的類型。
重新部署文件,然后刷新頁面,就能看到我們希望的效果啦:
項目總結(jié)
項目改進
項目很簡單,僅僅也只是在數(shù)據(jù)庫增刪改查的基礎(chǔ)上增加了一個界面,我們來動手改一改。
改進一:增加刪除提示
第一個想到的就是刪除提示,沒有刪除提示是很要命的一件事情,如果手滑了一下那可能就悲劇了....
首先我們在頂部的 <head> 標(biāo)簽中的 <script> 中增加一段代碼:
function del() {var msg = "您真的確定要刪除嗎?\n\n請確認(rèn)!";if (confirm(msg) == true) {return true;} else {return false;} }然后在刪除 a 標(biāo)簽頁中增加 onclick 屬性:
onclick="javascript:return del();" ....就像下面這樣.... td><a href="/deleteStudent?id=${s.id}" onclick="javascript:return del();"><spanclass="glyphicon glyphicon-trash"></span> </a></td>當(dāng)我們刷新頁面后,點擊刪除就會彈出提示信息:
改進二:編輯頁面自動勾選上性別
在當(dāng)前的項目中,如果點擊編輯按鈕進入到編輯頁面后,性別這個選項是空選的狀態(tài),這就很low:
這個也很簡單,在 editStudent 頁面增加一些判斷就好了:
用 <c:if> 標(biāo)簽來判斷 sex 的值,然后根據(jù)對應(yīng)的屬性增加 checked 屬性,這樣就可以自動勾選上所對應(yīng)的屬性:
改進三:空值判斷
我們允許設(shè)置為 null 的值僅僅為出生日期,其他的值均不允許出現(xiàn)空值,所以我們需要加入空值判斷:
function checkEmpty(id, name) {var value = $("#" + id).val();if (value.length == 0) {alert(name + "不能為空");$("#" + id).focus();return false;}return true; }然后再為 form 創(chuàng)建一個 id 屬性值為 “addForm” 并添加進判斷空值的方法:
- 注意: 這里需要寫在 $(function(){}) 里面,等待文檔加載完畢才能生效。
- 這里并沒有為 sex 屬性判斷空值,我們采用一個簡單的為 sex 添加一個默認(rèn)勾選項來省略空值的判斷。
同樣的,我們也在編輯頁面,采用同樣的方法進行空值判斷:
- 當(dāng)進入編輯頁面的時候已經(jīng)有默認(rèn)的勾選項了,所以 sex 值仍然不需要判空
- 最后給出項目地址:https://github.com/wmyskxz/StudentManager-SSM
我有一個微信公眾號,經(jīng)常會分享一些Java技術(shù)相關(guān)的干貨;如果你喜歡我的分享,可以用微信搜索“Java團長”或者“javatuanzhang”關(guān)注。
轉(zhuǎn)載于:https://my.oschina.net/u/3721254/blog/1806977
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的学生管理系统(SSM简易版)总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS误删除glibc导致系统系统
- 下一篇: DDMS 使用小结