日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

学生管理系统(SSM简易版)总结

發布時間:2023/12/19 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 学生管理系统(SSM简易版)总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前用 Servlet + JSP 實現了一個簡易版的學生管理系統,在學習了 SSM 框架之后,我們來對之前寫過的項目重構一下!

技術準備

為了完成這個項目,需要掌握如下技術:

Java
基礎知識
前端:
HTML, CSS, JAVASCRIPT, JQUERY
J2EE:
Tomcat, Servlet, JSP, Filter
框架:
Spring, Spring MVC, MyBatis, Spring 與 MyBatis 整合, SSM 整合
數據庫:
MySQL
開發工具:
IDEA, Maven

開發流程

之前雖然已經使用 Servlet + JSP 完成了簡單的開發,這次使用 SSM 僅僅是重構工作,但我們仍然按照商業項目的開發步驟來一步一步完成,進一步熟悉這個過程,重復的部分我就直接復制了。

① 需求分析

首先要確定要做哪些功能

使用數據庫保存數據
增刪改查學生的信息(學號,名稱,年齡,性別,出生日期)

② 表結構設計

根據需求,那么只需要一個 student 表就能夠完成功能了。

創建數據庫:student
將數據庫編碼格式設置為 UTF-8 ,便于存取中文數據

DROP DATABASE IF EXISTS student;
CREATE DATABASE student DEFAULT CHARACTER SET utf8;

創建學生表:student
不用學生學號(studentID)作為主鍵的原因是:不方便操作,例如在更新數據的時候,同時也要更改學號,那這樣的操作怎么辦呢?
所以我們加了一個 id 用來唯一表示當前數據。

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;

MySQL 在 Windows 下不區分大小寫,但在 Linux 下默認區分大小寫,因此,數據庫名、表明、字段名都不允許出現任何大寫字母,避免節外生枝。

③ 原型設計

就是設計界面,在商業項目中,這是很重要的一步,我們可以解除界面原型,低成本、高效率的與客戶達成需求的一致性

這個項目一共就分為兩個頁面:

主頁面:

學生編輯頁面:

④ SSM 環境搭建

在真正開始編寫代碼之前,我們首先需要先來搭建好我們的 SSM 環境。

第一步:創建 Maven webapp 項目

首先新建工程,選擇 Maven 標簽,然后勾選上【Create from archetype】選擇 webapp:

點擊下一步,填寫上【GroupId】和【ArtifactId】:

GroupId:項目組織唯一的標識符,實際對應 JAVA 的包的結構,也就是 main 目錄下 java 的目錄結構(包)
AritifactId:項目的唯一標識符,實際對應項目的名稱,就是項目根目錄的名稱
實際上你可以亂填上試試,我就不亂填了

然后是確認項目路徑,這一步你可以看到 Maven 配置中的參數,不需要做改動,直接下一步就可以(圖中的路徑是我配置的本地 Maven 倉庫的地址):

確認項目名稱和路徑,點擊【Finish】即可:

等待一會兒,控制臺就會有創建成功的提示信息,我們把【Enable Auto-Import】點上,這個提示會在每次 pom.xml 有改動時出現,自動導入,省掉麻煩:

第二步:搭建項目目錄結構

下面就是 Maven 風格的 webapp 的默認目錄結構:

注意: webapp 是默認沒有 java 源文件也沒有 test 目錄的。

遵循 Maven 的統一項目結構,我們搭建出項目的完整目錄結構如下圖:

我們并沒有使用 Log4j 來輸出日志,而是使用 logback
提示:我們可以在 IDEA 中右鍵目錄然后選擇【Make Directory as】,讓 IDEA 識別不同的目錄作用

這里的目錄建好之后還需要設置一下,讓 IDEA 識別目錄作用,選擇【File】>【Project Structure】:

設置好之后點擊 OK,即完成了項目目錄的搭建。

第三步:配置文件內容

在【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>
        <!-- 設置項目編碼編碼 -->
        <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標簽 -->
        <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>

        <!-- 實現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>


        <!-- 數據庫 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
            <scope>runtime</scope>
        </dependency>

        <!-- 數據庫連接池 -->
        <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> 標簽是默認生成的
我們在 <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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://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"/>

    <!-- 配置數據庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 數據庫連接池 -->
    <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">
        <!-- 注入數據庫連接池 -->
        <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接口包,動態實現Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 給出需要掃描Dao接口包 -->
        <property name="basePackage" value="cn.wmyskxz.dao"/>
    </bean>

    <!-- 配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫連接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置基于注解的聲明式事務 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

在【spring-mvc.xml】中完成 Spring MVC 的相關配置:

<?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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 掃描web相關的bean -->
    <context:component-scan base-package="cn.wmyskxz.controller"/>

    <!-- 開啟SpringMVC注解模式 -->
    <mvc:annotation-driven/>

    <!-- 靜態資源默認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 數據庫連接池:

jdbc.driver=com.mysql.jdbc.Driver
#數據庫地址
jdbc.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8
#用戶名
jdbc.username=root
#密碼
jdbc.password=root
#最大連接數
c3p0.maxPoolSize=30
#最小連接數
c3p0.minPoolSize=10
#關閉連接后不自動commit
c3p0.autoCommitOnClose=false
#獲取連接超時時間
c3p0.checkoutTimeout=10000
#當獲取連接失敗重試次數
c3p0.acquireRetryAttempts=2

在【logback.xml】中完成日志輸出的相關配置:

<?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 的相關配置信息(自動掃描 cn.wmyskxz 包下的帶有注解的類)
通過 xml 配置的方式配置好了日志和數據庫

⑤ 實體類設計

實體類僅僅是對數據庫中表的一一映射(表中字段名應該和實體類中的名稱一一對應),同時可能還需要兼顧對業務能力的支持。

在 Packge【cn.wmyskxz.entity】下創建 Student 類:

package cn.wmyskxz.entity;

import java.util.Date;

/**
 * Student 實體類
 *
 * @author: @我沒有三顆心臟
 * @create: 2018-04-23-下午 13:34
 */
public class Student {

	private int id;
	private int student_id;
	private String name;
	private int age;
	private String sex;
	private Date birthday;

	/* getter and setter */
}

⑤ DAO 類的設計

DAO,即 Date Access Object,數據庫訪問對象,就是對數據庫相關操作的封裝,讓其他地方看不到 JDBC 的代碼。

在【cn.wmyskxz.dao】包下創建【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】下創建好對應的映射文件【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的值設置為DAO類對應的路徑 -->
<mapper namespace="cn.wmyskxz.dao.StudentDao">

    <!-- 查詢數據條目 -->
    <select id="getTotal" resultType="int">
        SELECT COUNT(*) FROM student
    </select>

    <!-- 增加一條數據 -->
    <insert id="addStudent" parameterType="Student">
        INSERT INTO student VALUES(NULL, #{student_id}, #{name}, #{age}, #{sex}, #{birthday})
    </insert>

    <!-- 刪除一條數據 -->
    <delete id="deleteStudent" parameterType="int">
        DELETE FROM student WHERE id = #{id}
    </delete>

    <!-- 更新一條數據 -->
    <update id="updateStudent" parameterType="Student">
        UPDATE student SET student_id = #{student_id}, name = #{name},
        age = #{age}, sex = #{sex}, birthday = #{birthday} WHERE id = #{id}
    </update>

    <!-- 查詢一條數據 -->
    <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條數據-->
    <select id="list" resultMap="student">
        SELECT * FROM student ORDER BY student_id desc limit #{param1}, #{param2}
    </select>
</mapper>

編寫好了 Dao 類是需要測試的,這里測試類就不給出了。

⑦ 業務類設計

問題: 為什么不直接使用 Dao 類而是還要在上面封裝一層 Service 層呢?
回答:
基于責任分離的原則,Dao 層就應該專注于對數據庫的操作,而在 Service 層我們可以增加一些非 CRUD 的方法去更好的完成本身抽離出來的 service 服務(業務處理)。

在【cn.wmyskxz.service】包下創建【StudentService】接口:

package cn.wmyskxz.service;

import cn.wmyskxz.entity.Student;

import java.util.List;

public interface StudentService {

	/**
	 * 獲取到 Student 的總數
	 * @return
	 */
	int getTotal();

	/**
	 * 增加一條數據
	 * @param student
	 */
	void addStudent(Student student);

	/**
	 * 刪除一條數據
	 * @param id
	 */
	void deleteStudent(int id);

	/**
	 * 更新一條數據
	 * @param student
	 */
	void updateStudent(Student student);

	/**
	 * 找到一條數據
	 * @param id
	 * @return
	 */
	Student getStudent(int id);

	/**
	 * 列舉出從 start 位置開始的 count 條數據
	 * @param start
	 * @param count
	 * @return
	 */
	List<Student> list(int start, int count);
}

并在相同包名下創建實現類【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 的實現類
 *
 * @author: @我沒有三顆心臟
 * @create: 2018-04-23-下午 13:51
 */
@Service
public class StudentServiceImpl implements StudentService {

	@Autowired
	StudentDao 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);
	}
}

⑧ 功能開發

在【cn.wmyskxz.controller】包下創建【StudentController】控制器,代碼基本上都是復制黏貼之前在 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 {

	@Autowired
	private 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 的格式轉換為 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) {

		// 獲取分頁參數
		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";
	}
}

注意: 所有的學號都用 student_id 表示,為了契合在數據庫中的字段名(包括下面的 JSP 文件)

JSP 文件也直接黏之前的就好了,不過需要注意所有的 name 屬性

【listStudent.jsp】:

<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"
         pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>

    <%-- 引入JQ和Bootstrap --%>
    <script src="js/jquery/2.0.0/jquery.min.js"></script>
    <link href="css/bootstrap/3.3.6/bootstrap.min.css" rel="stylesheet">
    <script src="js/bootstrap/3.3.6/bootstrap.min.js"></script>
    <link href="css/style.css" rel="stylesheet">

    <title>學生管理頁面 - 首頁</title>

    <script>
        $(function () {
            $("ul.pagination li.disabled a").click(function () {
                return false;
            });
        });
    </script>
</head>

<body>

<div class="listDIV">
    <table class="table table-striped table-bordered table-hover table-condensed">

        <caption>學生列表 - 共${page.total}人</caption>
        <thead>
        <tr class="success">
            <th>學號</th>
            <th>姓名</th>
            <th>年齡</th>
            <th>性別</th>
            <th>出生日期</th>

            <th>編輯</th>
            <th>刪除</th>
        </tr>
        </thead>

        <tbody>
        <c:forEach items="${students}" var="s" varStatus="status">
            <tr>
                <td>${s.student_id}</td>
                <td>${s.name}</td>
                <td>${s.age}</td>
                <td>${s.sex}</td>
                <td>${s.birthday}</td>

                <td><a href="/editStudent?id=${s.id}"><span class="glyphicon glyphicon-edit"></span> </a></td>
                <td><a href="/deleteStudent?id=${s.id}"><span class="glyphicon glyphicon-trash"></span> </a></td>
            </tr>
        </c:forEach>

        </tbody>
    </table>
</div>

<nav class="pageDIV">
    <ul class="pagination">
        <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>>
            <a href="?page.start=0">
                <span>?</span>
            </a>
        </li>

        <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>>
            <a href="?page.start=${page.start-page.count}">
                <span>?</span>
            </a>
        </li>

        <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">

            <c:if test="${status.count*page.count-page.start<=30 && status.count*page.count-page.start>=-10}">
                <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>>
                    <a
                            href="?page.start=${status.index*page.count}"
                            <c:if test="${status.index*page.count==page.start}">class="current"</c:if>
                    >${status.count}</a>
                </li>
            </c:if>
        </c:forEach>

        <li <c:if test="${!page.hasNext}">class="disabled"</c:if>>
            <a href="?page.start=${page.start+page.count}">
                <span>?</span>
            </a>
        </li>
        <li <c:if test="${!page.hasNext}">class="disabled"</c:if>>
            <a href="?page.start=${page.last}">
                <span>?</span>
            </a>
        </li>
    </ul>
</nav>

<div class="addDIV">

    <div class="panel panel-success">
        <div class="panel-heading">
            <h3 class="panel-title">增加學生</h3>
        </div>
        <div class="panel-body">

            <form method="post" action="/addStudent" role="form">
                <table class="addTable">
                    <tr>
                        <td>學號:</td>
                        <td><input type="text" name="student_id" id="student_id" placeholder="請在這里輸入學號"></td>
                    </tr>
                    <tr>
                        <td>姓名:</td>
                        <td><input type="text" name="name" id="name" placeholder="請在這里輸入名字"></td>
                    </tr>
                    <tr>
                        <td>年齡:</td>
                        <td><input type="text" name="age" id="age" placeholder="請在這里輸入年齡"></td>
                    </tr>
                    <tr>
                        <td>性別:</td>
                        <td><input type="radio" class="radio radio-inline" name="sex" value="男"> 男
                            <input type="radio" class="radio radio-inline" name="sex" value="女"> 女
                        </td>
                    </tr>
                    <tr>
                        <td>出生日期:</td>
                        <td><input type="date" name="birthday" id="birthday" placeholder="請在這里輸入出生日期"></td>
                    </tr>
                    <tr class="submitTR">
                        <td colspan="2" align="center">
                            <button type="submit" class="btn btn-success">提 交</button>
                        </td>

                    </tr>

                </table>
            </form>
        </div>
    </div>

</div>


</body>
</html>

【editStudent.jsp】:

<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"
         pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>

    <%-- 引入JQ和Bootstrap --%>
    <script src="js/jquery/2.0.0/jquery.min.js"></script>
    <link href="css/bootstrap/3.3.6/bootstrap.min.css" rel="stylesheet">
    <script src="js/bootstrap/3.3.6/bootstrap.min.js"></script>
    <link href="css/style.css" rel="stylesheet">

    <title>學生管理頁面 - 編輯頁面</title>
</head>

<body>

<div class="editDIV">

    <div class="panel panel-success">
        <div class="panel-heading">
            <h3 class="panel-title">編輯學生</h3>
        </div>
        <div class="panel-body">

            <form method="post" action="/updateStudent" role="form">
                <table class="editTable">
                    <tr>
                        <td>學號:</td>
                        <td><input type="text" name="student_id" id="student_id" value="${student.student_id}"
                                   placeholder="請在這里輸入學號"></td>
                    </tr>
                    <tr>
                        <td>姓名:</td>
                        <td><input type="text" name="name" id="name" value="${student.name}" placeholder="請在這里輸入名字">
                        </td>
                    </tr>
                    <tr>
                        <td>年齡:</td>
                        <td><input type="text" name="age" id="age" value="${student.age}" placeholder="請在這里輸入年齡"></td>
                    </tr>
                    <tr>
                        <td>性別:</td>
                        <td><input type="radio" class="radio radio-inline" name="sex" value="男"> 男
                            <input type="radio" class="radio radio-inline" name="sex" value="女"> 女
                        </td>
                    </tr>
                    <tr>
                        <td>出生日期:</td>
                        <td><input type="date" name="birthday" id="birthday" value="${student.birthday}"
                                   placeholder="請在這里輸入出生日期"></td>
                    </tr>
                    <tr class="submitTR">
                        <td colspan="2" align="center">
                            <input type="hidden" name="id" value="${student.id}">
                            <button type="submit" class="btn btn-success">提 交</button>
                        </td>

                    </tr>

                </table>
            </form>
        </div>
    </div>

</div>

</body>
</html>

style.css 文件:

body {
    padding-top: 60px;
}

div.listDIV {
     600px;
    margin: 0 auto;
}

div.editDIV {
     400px;
    margin: 0 auto;
}

nav.pageDIV {
    text-align: center;
}

div.addDIV {
     300px;
    margin: 0 auto;
}

table.addTable {
     100%;
    padding: 5px;
}

table.addTable td {
    padding: 5px;
}

table.editTable {
     100%;
    padding: 5px;
}

table.editTable td {
    padding: 5px;
}

項目的整體結構

分頁功能

首先在 Packge【util】包下創建一個 Page 工具類:

package cn.wmyskxz.util;

public class Page {

	int start;		// 開始數據
	int count;		// 每一頁的數量
	int total;		// 總共的數據量

	public Page(int start, int count) {
		super();
		this.start = start;
		this.count = count;
	}

	public boolean isHasPreviouse(){
		if(start==0)
			return false;
		return true;

	}
	public boolean isHasNext(){
		if(start==getLast())
			return false;
		return true;
	}

	public int getTotalPage(){
		int totalPage;
		// 假設總數是50,是能夠被5整除的,那么就有10頁
		if (0 == total % count)
			totalPage = total /count;
			// 假設總數是51,不能夠被5整除的,那么就有11頁
		else
			totalPage = total / count + 1;

		if(0==totalPage)
			totalPage = 1;
		return totalPage;

	}

	public int getLast(){
		int last;
		// 假設總數是50,是能夠被5整除的,那么最后一頁的開始就是40
		if (0 == total % count)
			last = total - count;
			// 假設總數是51,不能夠被5整除的,那么最后一頁的開始就是50
		else
			last = total - total % count;

		last = last<0?0:last;
		return last;
	}

    // 各種 setter 和 getter
}

totalPage 是計算得來的數,用來表示頁碼一共的數量

在首頁顯示的 StudentList 用 page 的參數來獲取:

List<Student> students = studentService.list(page.getStart(), page.getCount());

并且在映射文件中用 LIMIT 關鍵字:

<!-- 查詢從start位置開始的count條數據-->
<select id="list" resultMap="student">
    SELECT * FROM student ORDER BY student_id desc limit #{param1}, #{param2}
</select>

第一個參數為 start,第二個參數為 count
這樣就能根據分頁的信息來獲取到響應的數據

編寫分頁欄:

1.寫好頭和尾

<nav class="pageDIV">
    <ul class="pagination">
    .....
    </ul>
</nav>

2.寫好? ?這兩個功能按鈕
使用 <c:if>標簽來增加邊界判斷,如果沒有前面的頁碼了則設置為disable狀態

        <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>>
            <a href="?page.start=0">
                <span>?</span>
            </a>
        </li>

        <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>>
            <a href="?page.start=${page.start-page.count}">
                <span>?</span>
            </a>
        </li>

再通過 JavaScrip 代碼來完成禁用功能:

<script>
    $(function () {
        $("ul.pagination li.disabled a").click(function () {
            return false;
        });
    });
</script>

3.完成中間頁碼的編寫
0 循環到 page.totalPage - 1varStatus 相當于是循環變量

status.count 是從1開始遍歷
status.index 是從0開始遍歷
要求:顯示當前頁碼的前兩個和后兩個就可,例如當前頁碼為3的時候,就顯示 1 2 3(當前頁) 4 5 的頁碼
理解測試條件:
-10 <= 當前頁*每一頁顯示的數目 - 當前頁開始的數據編號 <= 30

只要理解了這個判斷條件,其他的就都好理解了

<c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">

    <c:if test="${status.count*page.count-page.start<=30 && status.count*page.count-page.start>=-10}">
        <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>>
            <a
                    href="?page.start=${status.index*page.count}"
                    <c:if test="${status.index*page.count==page.start}">class="current"</c:if>
            >${status.count}</a>
        </li>
    </c:if>
</c:forEach>

4.在控制器中獲取參數

// 獲取分頁參數
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 數據
request.setAttribute("page", page);

Date 轉換的問題

最開始的時候,我們看到頁面上顯示的日期是這樣的格式:

這顯然是我們不希望看到的

解決方案:在映射文件中設置日期顯示的類型。

重新部署文件,然后刷新頁面,就能看到我們希望的效果啦:

項目總結

由于之前的項目代碼都有,所以在重構的時候,基本上沒有花什么時間就完成了項目的搭建,能夠體會到代碼分離的重要性,這在很大程度上保證了我們的代碼復用。
相較于之前用 Servlet + JSP 來完成,很明顯的感覺是DAO層的編寫方便了很多,僅僅需要編寫一個 xml 映射文件和一個 Dao 層接口就可以完成功能,而不用自己再去重復的去在每一個 CRUD 方法中去處理結果集,重復而且繁瑣。
注解真的很方便,這不僅僅提升了我們自身開發的效率,寫起來也很帶勁兒。
開發效率快,而且低耦合,我們基于 xml 配置了大部分的工作,在基于 SSM 框架開發時,我們可以把專注點集中在邏輯處理上。
在 SSM 框架中能方便的對項目進行修改,這不僅僅得益于框架的約定,使得代碼分離并且可復用,也得益于 Maven 工具對于項目的管理。
我們能夠通過一個 Controller 來完成五個 Servlet 的功能,并且通過注解來完成配置。


項目改進

項目很簡單,僅僅也只是在數據庫增刪改查的基礎上增加了一個界面,我們來動手改一改。

改進一:增加刪除提示

第一個想到的就是刪除提示,沒有刪除提示是很要命的一件事情,如果手滑了一下那可能就悲劇了....

首先我們在頂部的 <head> 標簽中的 <script> 中增加一段代碼:

function del() {
    var msg = "您真的確定要刪除嗎?

請確認!";
    if (confirm(msg) == true) {
        return true;
    } else {
        return false;
    }
}

然后在刪除 a 標簽頁中增加 onclick 屬性:

onclick="javascript:return del();"
....就像下面這樣....
td><a href="/deleteStudent?id=${s.id}" onclick="javascript:return del();"><span
        class="glyphicon glyphicon-trash"></span> </a></td>

當我們刷新頁面后,點擊刪除就會彈出提示信息:

改進二:編輯頁面自動勾選上性別

在當前的項目中,如果點擊編輯按鈕進入到編輯頁面后,性別這個選項是空選的狀態,這就很low:

這個也很簡單,在 editStudent 頁面增加一些判斷就好了:

<c:if> 標簽來判斷 sex 的值,然后根據對應的屬性增加 checked 屬性,這樣就可以自動勾選上所對應的屬性:

改進三:空值判斷

我們允許設置為 null 的值僅僅為出生日期,其他的值均不允許出現空值,所以我們需要加入空值判斷:

function checkEmpty(id, name) {
    var value = $("#" + id).val();
    if (value.length == 0) {
        alert(name + "不能為空");
        $("#" + id).focus();
        return false;
    }
    return true;
}

然后再為 form 創建一個 id 屬性值為 “addForm” 并添加進判斷空值的方法:

注意: 這里需要寫在 $(function(){}) 里面,等待文檔加載完畢才能生效。
這里并沒有為 sex 屬性判斷空值,我們采用一個簡單的為 sex 添加一個默認勾選項來省略空值的判斷。

同樣的,我們也在編輯頁面,采用同樣的方法進行空值判斷:

當進入編輯頁面的時候已經有默認的勾選項了,所以 sex 值仍然不需要判空
最后給出項目地址:https://github.com/wmyskxz/StudentManager-SSM

歡迎轉載,轉載請注明出處!
簡書ID:@我沒有三顆心臟
github:wmyskxz
歡迎關注公眾微信號:wmyskxz_javaweb
分享自己的Java Web學習之路以及各種Java學習資料

總結

以上是生活随笔為你收集整理的学生管理系统(SSM简易版)总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲精品成人av在线 | 99久久精品国产系列 | 国产无套精品久久久久久 | 国产传媒中文字幕 | 亚洲专区欧美专区 | www.婷婷com| 亚洲视频456| 91亚洲精品乱码久久久久久蜜桃 | 国产一级精品在线观看 | 婷婷亚洲综合五月天小说 | 免费视频久久 | 91精品视频免费在线观看 | 久久精品国产v日韩v亚洲 | 大荫蒂欧美视频另类xxxx | 一区二区三区在线观看中文字幕 | 欧美成人理伦片 | 在线电影日韩 | 国产视频二 | 在线最新av | 中文字幕久久网 | 国内精品久久久久影院男同志 | www.色综合.com| 国产麻豆电影在线观看 | 一级大片在线观看 | 久久av网址 | 国产精品永久免费在线 | 亚洲国产色一区 | 国产在线播放观看 | 国产伦理久久 | 日韩av黄 | 成人av一二三区 | 久久人人爽人人人人片 | 免费在线观看av的网站 | 中文字幕在线播放日韩 | 国产99久久99热这里精品5 | 久久久久国产精品午夜一区 | 国产极品尤物在线 | 四虎成人av | 国内精品视频在线 | 四虎成人精品在永久免费 | 综合在线色 | 国产精品国产三级国产aⅴ9色 | 国产又粗又猛又黄 | 国产特级毛片aaaaaa高清 | 久久无码精品一区二区三区 | 又粗又长又大又爽又黄少妇毛片 | 欧美精品久久久久久久久久丰满 | 激情欧美一区二区三区免费看 | 欧美黄污视频 | 久久一二区 | 久久国产成人午夜av影院宅 | 国产精品一区二区三区久久久 | 日韩精品一区在线播放 | 国偷自产中文字幕亚洲手机在线 | 日韩在线观看一区二区三区 | 日韩高清av在线 | 国产视频91在线 | a视频在线观看 | 六月丁香色婷婷 | 日本不卡123 | 在线免费观看国产 | 久久视频国产精品免费视频在线 | 91粉色视频 | 欧美亚洲国产一卡 | 久久69精品久久久久久久电影好 | 玖玖在线播放 | 在线视频专区 | 97视频人人免费看 | 国产成人一区三区 | 免费人成网 | 亚洲专区 国产精品 | 九九免费精品视频在线观看 | 激情 一区二区 | 91插插视频 | 亚洲午夜在线视频 | av成人动漫在线观看 | 免费av视屏 | 日韩精品久久一区二区三区 | 中文字幕视频观看 | aaa日本高清在线播放免费观看 | 国产 视频 高清 免费 | 91成人蝌蚪 | 国产精品一区二区久久久久 | 欧美激情视频免费看 | 久久久91精品国产一区二区精品 | 91成人看片 | 高清av网 | 精品99免费视频 | 一区二区视频在线免费观看 | 天天天在线综合网 | 成人h电影在线观看 | 中文字幕在线电影 | 欧美片一区二区三区 | 国产一区二区三区视频在线 | 日韩精品久久久免费观看夜色 | 免费观看国产视频 | 天天激情综合网 | 男女全黄一级一级高潮免费看 | av免费电影网站 | 999久久久欧美日韩黑人 | 天天操天天干天天操天天干 | 青青草国产精品 | 久久国产免费 | 黄色a一级片 | 欧美视频xxx | 日韩在线无 | 成人精品电影 | 一区二区精品国产 | 成 人 黄 色 视频免费播放 | 国产一区免费观看 | 国产中文自拍 | 99精品电影 | 91手机视频在线 | 亚洲欧美国产精品18p | 日韩欧美在线一区 | 久久精品免费看 | 久久久久久久久毛片精品 | 欧美另类性 | 性色大片在线观看 | 婷婷国产v亚洲v欧美久久 | 成年人免费电影 | 黄色小说视频网站 | 国产麻豆精品95视频 | 亚洲在线黄色 | 久久精品在线免费观看 | 激情久久五月 | 久久精品一二三区白丝高潮 | 色中色亚洲 | 欧美爽爽爽 | 国内精品免费 | 麻豆精品传媒视频 | 久久精品视频4 | 久久精品一区二区 | 在线观看色视频 | 五月天婷婷在线播放 | 国产麻豆精品久久一二三 | 欧美污污网站 | 久久精品视频日本 | 91你懂的 | 国产a国产 | 91原创在线观看 | 亚洲传媒在线 | 五月天堂网 | 懂色av懂色av粉嫩av分享吧 | av免费试看 | 精品主播网红福利资源观看 | 久久综合给合久久狠狠色 | 国内外成人免费在线视频 | 国产xxxxx在线观看 | 伊人网av| 国产精品3 | 97国产大学生情侣白嫩酒店 | 成人永久免费 | 久久国产精品视频观看 | 中文理论片 | 国产精品久久久久久久久久久久午夜 | 狠狠色伊人亚洲综合网站色 | 96精品高清视频在线观看软件特色 | 欧美亚洲成人免费 | 久久精品a | 国产高清视频免费最新在线 | 日日日日日 | 欧美成人手机版 | 久久精品久久99精品久久 | 日日操天天操狠狠操 | 国产黄色片免费 | 成人午夜电影网站 | 9999激情 | 亚洲一区二区黄色 | 日韩精品久久一区二区 | 国产亚洲视频在线免费观看 | 天天干天天天天 | 久久公开免费视频 | 不卡的av在线播放 | 在线免费中文字幕 | 免费在线观看a v | 日韩av电影免费在线观看 | 国产露脸91国语对白 | 51精品国自产在线 | 亚洲精品国产精品国自产在线 | av免费看网站 | 狠狠色2019综合网 | h视频在线看| 91成人久久 | 在线a人片免费观看视频 | 国产精品国产三级国产不产一地 | 91桃色在线播放 | 五月婷婷丁香色 | 中文字幕精品三区 | 精品免费视频 | 狠狠色丁香九九婷婷综合五月 | 中国一级片在线 | 日本中文字幕视频 | 国产小视频在线观看 | 国产成人三级三级三级97 | 97超碰在线人人 | 国产成人区 | 久久艹中文字幕 | 欧洲色综合 | 欧美做受高潮1 | 亚洲精品欧美专区 | 日韩午夜三级 | www91在线观看 | 久久午夜国产精品 | 91精品成人久久 | 国产精品视频专区 | 麻豆视频免费入口 | 伊人久久婷婷 | 国产精品久久久久久超碰 | 天天干 夜夜操 | 中文字幕av在线免费 | 九九九九精品 | 99视频免费看 | 丁香九月激情综合 | 天天天天爽| 美女黄久久 | 国产麻豆电影在线观看 | 97视频免费观看2区 亚洲视屏 | 欧美一级电影在线观看 | 久久黄色网页 | 日韩久久久| 久久久久国产精品免费网站 | 精油按摩av | 欧美精品久久人人躁人人爽 | 97色国产| 婷婷在线精品视频 | 国产麻豆精品久久 | 伊人国产在线播放 | 国产蜜臀av | 欧美污网站 | 中文在线资源 | 黄色的片子 | 操操操com | 亚洲视频axxx | 最新影院| 中文字幕资源在线 | 免费男女羞羞的视频网站中文字幕 | 在线观看中文字幕av | 永久免费视频国产 | 精品你懂的 | 91精品一区二区在线观看 | 最近日本字幕mv免费观看在线 | 国产精品成人av在线 | 综合网在线视频 | 国产精品毛片一区二区在线看 | 亚洲黄色app | 九色最新网址 | 久久99精品国产 | 色五月成人 | 久久久久久久国产精品影院 | 亚洲六月丁香色婷婷综合久久 | www五月| 亚洲视频免费视频 | 欧美乱码精品一区 | 免费成人av| www.五月天激情 | 日韩精品一区二区不卡 | 丁香婷婷综合激情五月色 | 国产综合激情 | 亚洲aaa毛片 | 色橹橹欧美在线观看视频高清 | 又污又黄网站 | 黄色大片免费网站 | 亚洲一一在线 | 99久久综合狠狠综合久久 | 在线天堂v | 日韩三级免费观看 | 日本一区二区三区免费观看 | 国产精品久久99 | 亚洲97在线| 午夜国产福利在线 | 最近日本韩国中文字幕 | 在线小视频| 日韩三级av | 西西人体4444www高清视频 | 日韩黄色免费在线观看 | 国产精品福利久久久 | 国产尤物一区二区三区 | 日本精品久久久久影院 | 中文字幕中文字幕在线一区 | 91亚洲精品乱码久久久久久蜜桃 | 黄色小说网站在线 | 亚洲国产美女精品久久久久∴ | 男女激情网址 | 人人爽人人爽人人片av免 | 精品国产欧美 | 日韩av在线免费看 | 久久se视频 | 国产一级免费片 | 中文字幕在线播放一区 | 午夜av激情| 亚洲,国产成人av | 亚洲久在线 | 成人试看120秒| 欧美巨大荫蒂茸毛毛人妖 | 六月色 | 久久精品4| 伊人伊成久久人综合网站 | 国产高清免费 | 色综合天天爱 | 亚洲免费av电影 | 日韩理论电影在线观看 | 亚洲三级黄色 | 免费日韩 精品中文字幕视频在线 | 久久综合中文字幕 | 亚洲黄色成人av | 国产成人在线免费观看 | 色99久久 | 久久1电影院 | www.色婷婷.com| 免费观看一区二区 | 亚洲国产一二三 | 成人高清在线观看 | 国产精品一区二区在线观看 | 亚洲天堂精品视频 | 在线观看免费观看在线91 | 97**国产露脸精品国产 | 精品视频成人 | 中文字幕在线免费播放 | 亚洲国产中文字幕 | 中文字幕在线免费97 | 国产一区二区三区免费在线观看 | av中文字幕av | 国产一级二级在线播放 | 国产精品第二页 | 亚洲国产精品一区二区久久hs | 天天干天天插 | 久久色亚洲 | 91av久久 | 日韩激情视频在线观看 | 一级做a爱片性色毛片www | 精品免费| 欧美日韩99| 国产亚洲精品久久久久久电影 | 在线免费观看一区二区三区 | 91资源在线免费观看 | 亚洲精品中文字幕在线 | 国产成人一区在线 | 超碰官网 | av免费看在线 | 色成人亚洲网 | 久99久视频 | 伊人五月在线 | 91av在线视频免费观看 | 激情久久久 | 午夜电影av | 五月色综合 | 99视频国产在线 | 亚洲无吗天堂 | av高清一区二区三区 | 三级av片 | 欧美日韩在线观看一区 | 99久热在线精品视频 | 亚洲第一中文网 | 久久理论视频 | 婷婷丁香花 | 日韩免费中文 | 国产中文字幕91 | 999在线精品 | 久久久国产日韩 | 91伊人| 精品国产久 | 91成人亚洲 | 成人性生交大片免费看中文网站 | 久久国产热视频 | 日本h视频在线观看 | 中文字幕精品一区 | 亚洲精品乱码久久久久久高潮 | 午夜精品一区二区三区在线视频 | 久久人人爽视频 | 日日摸日日添日日躁av | 久久综合中文色婷婷 | 国产护士hd高朝护士1 | 成人中文字幕在线观看 | 99久久精 | 91精品久久久久久久99蜜桃 | 97人人超| 黄色一集片 | av 一区 二区 久久 | 四虎影视成人精品国库在线观看 | 操天天操| 丁香婷婷综合激情 | 久要激情网 | 久久精品牌麻豆国产大山 | 亚洲美女精品视频 | 国产亚洲成人精品 | 久久久国产视频 | 天天干,天天射,天天操,天天摸 | 久久免费黄色大片 | 亚洲精品一区二区网址 | 日日夜夜精品视频天天综合网 | 日韩高清一区在线 | 美女黄网站视频免费 | 成人免费xxx在线观看 | 一二三区在线 | 国模一区二区三区四区 | 91视频观看免费 | 国产福利91精品一区二区三区 | 国产 日韩 欧美 自拍 | 成人av在线一区二区 | 精品久久久久国产免费第一页 | 久久精品中文 | 日韩视频一区二区在线 | 国产香蕉97碰碰碰视频在线观看 | 久久免费视频7 | 日韩在线视频一区 | 国产一区福利在线 | 992tv在线观看 | 日韩电影在线一区 | 91精彩视频在线观看 | 国产伦理久久精品久久久久_ | 超碰国产在线观看 | 欧美一二三四在线 | 日韩欧美综合精品 | 中文字幕网站视频在线 | www夜夜操com| 成人观看 | 婷婷色资源 | 99视频国产精品 | 91视频网址入口 | 狠狠操导航 | 日本中文在线播放 | 久久综合五月天 | 国产精品视频永久免费播放 | 久草视频精品 | 在线天堂中文在线资源网 | 国产精品成人一区二区三区 | 奇米先锋| 久久国产网站 | 在线视频 影院 | 91精品在线看 | 日韩高清免费观看 | 亚洲精品综合久久 | 不卡的av在线 | 在线观看免费av片 | av一级片| 亚洲 欧美 91 | 五月婷婷综合在线 | 国产精品久久久久久久久久久久 | 在线成人小视频 | 日韩高清黄色 | 精品久久1 | 国产精品1区2区3区 久久免费视频7 | 亚洲精品中文字幕在线 | www.av中文字幕.com | 国产亚洲欧洲 | 免费看黄在线 | 国产高清永久免费 | 欧美贵妇性狂欢 | 91av超碰| 黄色综合 | 99精品免费| 亚洲天堂在线观看完整版 | 成人午夜电影网站 | 亚洲欧美国内爽妇网 | 超碰97在线资源 | 中文字幕第一 | 久久久久久久av | 午夜aaaa| 免费三级影片 | 久久综合99| 日日操网| 亚洲精品乱码久久久久久蜜桃动漫 | 成人蜜桃 | 91精品在线麻豆 | 欧美日韩在线观看不卡 | 国产午夜av| 国产原创91 | 免费观看黄色av | 久久人人爽人人爽人人 | 婷婷亚洲综合 | 手机av永久免费 | 日本久久久久久久久久久 | 日本一区二区三区免费观看 | 久久久久久久电影 | 久久天天躁 | 青春草免费视频 | 久久视频中文字幕 | 国产无遮挡又黄又爽在线观看 | av高清免费在线 | 久久精品视频在线观看 | 美女网站一区 | 免费热情视频 | 精品国产理论 | 69中文字幕 | 久久在线观看视频 | 国产精品18久久久久久久网站 | 亚洲亚洲精品在线观看 | 黄色免费av | 日韩中文字幕91 | www.99久久.com| www.香蕉视频在线观看 | 最近日韩免费视频 | 久久99精品久久久久婷婷 | 成片免费观看视频大全 | 色在线视频 | 久久久久久国产精品久久 | av在线电影网站 | 蜜桃视频在线视频 | 91免费观看国产 | 久久夜色精品国产欧美乱 | 日韩av成人在线 | 天堂成人在线 | 欧美福利视频 | 碰碰影院 | 天天操天天射天天插 | 色天天久久 | 国产一级免费在线 | 欧美日韩精品在线视频 | 我要看黄色一级片 | 日韩激情网 | 亚洲最新在线 | 午夜在线资源 | 日韩av电影一区 | 国产理论一区二区三区 | 亚洲色图色 | 美女视频a美女大全免费下载蜜臀 | 激情视频网页 | 日韩特黄一级欧美毛片特黄 | 久久久亚洲国产精品麻豆综合天堂 | 中文字幕在线观看第三页 | 狠狠色丁香婷婷综合久小说久 | 亚洲理论在线观看电影 | 亚洲精选在线 | 国产精品资源在线 | 国产亚洲va综合人人澡精品 | 国产精品国产亚洲精品看不卡 | 玖操| 亚洲成人xxx | 国产黄色看片 | 国产麻豆果冻传媒在线观看 | 黄色三级免费观看 | 婷婷在线不卡 | 国产精品人成电影在线观看 | 精品一区二区av | 色综合久久中文字幕综合网 | 国产精品美女999 | 国产视频在线免费 | 久久精品精品电影网 | 999久久久欧美日韩黑人 | 一区二区视频在线免费观看 | 国产九九九精品视频 | 免费成人看片 | 久久精品一区二区三区国产主播 | 欧美日韩另类在线 | 国产福利资源 | 在线影视 一区 二区 三区 | 天堂va在线高清一区 | 人人爽影院 | 六月色 | 精品一区二区三区香蕉蜜桃 | 国产亚洲精品成人av久久影院 | 久久99中文字幕 | 成人午夜电影网 | 国产免费xvideos视频入口 | 精品一区二区影视 | 干综合网 | 亚洲一区久久久 | 久久成人欧美 | 超碰97公开| 亚洲一区二区黄色 | 中文字幕免费久久 | 网站在线观看你们懂的 | 日本公妇在线观看高清 | 又色又爽又激情的59视频 | 中文字幕乱码电影 | 深夜免费网站 | 久久av福利| 国产精品久久久久久久久久久不卡 | 99亚洲天堂| www国产亚洲精品久久麻豆 | 亚洲精品国产成人 | 在线亚洲午夜片av大片 | 天天射网站 | av看片网址 | 夜夜躁日日躁 | 中文在线免费一区三区 | 日韩精品一卡 | 日韩区欧美久久久无人区 | 高潮久久久久久久久 | 国产首页 | 91香蕉国产 | 久久精久久精 | 国产xxxx | 99re国产 | 99久久久| 国产成人精品一区二区三区福利 | 免费观看国产精品视频 | 日韩欧美在线免费 | 91亚色视频在线观看 | 日韩av中文字幕在线免费观看 | a天堂在线看 | 国产黄色免费看 | 久久久久久久久久影视 | 伊人永久在线 | 高清视频一区二区三区 | 亚洲精品大全 | 99riav1国产精品视频 | 五月婷婷视频 | 国产区 在线 | www四虎影院| 黄色三级av | 97在线观看免费高清完整版在线观看 | 人人爽人人爽人人爽学生一级 | 狠狠躁夜夜av | 久久久久久久久久免费视频 | 综合色播| 免费男女羞羞的视频网站中文字幕 | 九九热国产视频 | 久草影视在线 | 国产精品日韩欧美一区二区 | 久久久久免费看 | 又黄又爽又色无遮挡免费 | 欧美一级电影 | 中文字幕在线播放一区二区 | 久久久久视| 国产又粗又猛又色又黄视频 | 国产福利一区二区三区在线观看 | 日日爱网站 | 天堂av在线7 | 国产精品久久久久久超碰 | 亚州精品天堂中文字幕 | 国产精品久久一区二区三区不卡 | 黄色日本免费 | 婷婷六月综合网 | 丁香五月网久久综合 | 国产精品国产三级国产不产一地 | 日韩在线视频网站 | 91精品啪在线观看国产线免费 | 久久久久激情电影 | 色综合天天射 | 中文 一区二区 | 在线观看日韩视频 | 国产成人免费观看久久久 | 中文字幕在线播放日韩 | 一级成人免费视频 | 欧美一级黄色片 | 色橹橹欧美在线观看视频高清 | 美女国内精品自产拍在线播放 | 日b视频国产| 欧美日韩国内在线 | 天天摸天天操天天爽 | 国产精品不卡在线观看 | 免费观看黄 | 免费观看一级特黄欧美大片 | 亚洲激情在线 | 成人一级视频在线观看 | 欧美日韩大片在线观看 | 97超碰人人 | 色婷婷欧美 | 嫩草av在线 | av888av.com | 69视频在线播放 | 97视频免费观看2区 亚洲视屏 | av在线免费网 | 日韩午夜精品福利 | 91精品国产91久久久久福利 | www免费在线观看 | 91日韩精品视频 | 免费观看黄 | 国产亚洲精品久久久久久久久久久久 | 麻豆视频免费入口 | 国产精品色在线 | 久久精品视频在线免费观看 | 久久99亚洲网美利坚合众国 | 亚洲电影一区二区 | 久久久久综合精品福利啪啪 | 亚洲视频一级 | 国产福利一区在线观看 | 日韩一级黄色片 | 日韩av在线资源 | 黄色福利网 | 天天综合色天天综合 | 在线一区av| 在线免费性生活片 | 天天操狠狠操夜夜操 | 日本成人免费在线观看 | 精品在线观看一区二区 | 最新成人av | 久久精品久久久久 | 欧美国产日韩一区二区三区 | 激情视频区 | 91天堂素人约啪 | 97成人在线观看视频 | 国产精品2019 | 91大神在线看| 操处女逼 | 高清国产午夜精品久久久久久 | 国产视频综合在线 | 久久精品99久久久久久 | 又长又大又黑又粗欧美 | 日韩精品在线视频免费观看 | 天天色天天综合 | 波多野结衣在线视频免费观看 | 久久热首页| 国产高清区 | 国产二区视频在线 | 久草在线视频首页 | 草久草久| 国产成人精品免费在线观看 | 91精品免费看 | 成人黄色电影视频 | 最新日韩在线观看 | 日韩伦理片一区二区三区 | 91传媒在线观看 | 五月天综合婷婷 | 国产精品高清在线观看 | 色99在线 | 国内视频在线观看 | 婷婷色在线播放 | 夜色资源站国产www在线视频 | 国产69久久精品成人看 | 99在线视频免费观看 | 白丝av免费观看 | 日韩中出在线 | 国产麻豆剧果冻传媒视频播放量 | 这里有精品在线视频 | 成人国产精品久久久久久亚洲 | 精品视频亚洲 | 国产精品激情在线观看 | 天天干天天干天天色 | 国产麻豆成人传媒免费观看 | 欧美另类xxxxx | 欧美电影黄色 | 黄色成人av | 五月婷婷黄色 | 91精品在线观看视频 | 天天摸天天操天天舔 | 亚洲欧美国内爽妇网 | 精品免费久久久久 | 国产福利在线免费 | 91精品国产高清自在线观看 | 97视频免费看 | 亚a在线| 最近2019中文免费高清视频观看www99 | 国产精品免费一区二区三区 | 免费日韩| 天天狠狠 | 中文字幕在线看视频国产 | 免费在线日韩 | 久久最新网址 | 日韩在线不卡视频 | 欧美日韩精品综合 | 观看免费av | 亚洲精品视频观看 | 国产精品爽爽爽 | 激情伊人 | 亚洲精品日韩一区二区电影 | 五月天综合激情网 | 久久综合狠狠综合久久综合88 | 97视频免费在线看 | 国产小视频91 | 国产亚洲精品久 | 日韩精品在线视频 | 麻豆国产精品va在线观看不卡 | 香蕉久草| 亚洲最新av在线网站 | 国产成人久久精品77777综合 | 亚洲男男gaygayxxxgv | 天天干天天综合 | 操操日| 超碰在线日本 | 久久综合色天天久久综合图片 | 国产一区二区精品在线 | 青春草免费视频 | 久久久久久久久久久久影院 | 999成人国产| 日韩午夜在线 | 久久精品成人欧美大片古装 | 九草视频在线 | 2022国产精品视频 | 日韩精品五月天 | 国产xxxx性hd极品 | 亚洲精品99久久久久中文字幕 | 亚洲成人高清在线 | 国产精品尤物视频 | 久久精品国产一区二区 | 国产毛片aaa| 日韩中文字| 国产精品乱码久久 | 91香蕉嫩草 | 国产精品一区二区久久精品爱涩 | av大片网站 | 伊人狠狠| 日日夜夜中文字幕 | 国产精品99久久久久久武松影视 | av大片网址 | 97精品国产手机 | 成人久久综合 | 久久精品牌麻豆国产大山 | 丝袜精品视频 | 国产精品区在线观看 | 免费观看黄色av | 久久久久国产精品免费免费搜索 | 天天夜夜狠狠操 | 国产69精品久久久久久久久久 | 亚洲日日日| 伊人伊成久久人综合网站 | 亚洲一区二区视频在线 | 最近免费中文字幕 | 91av视频观看 | 亚洲精品字幕 | 黄网在线免费观看 | 午夜精品久久 | 狠狠色狠狠色 | 99国产视频| 日韩av免费在线看 | 最近日本字幕mv免费观看在线 | 四虎4hu永久免费 | 九九在线精品视频 | 日日日操 | 婷婷色综合 | www.久久99| 国产精品手机播放 | 久久免费视频2 | 久久深夜 | 午夜久久电影网 | 欧美日韩在线观看视频 | 欧美日韩国产在线 | 日韩精品中文字幕av | 在线观看黄污 | 久草在线视频网站 | 啪啪肉肉污av国网站 | 久久久久成人免费 | 日韩欧美精品免费 | 99久久精品免费看 | 欧美99热 | 日韩在线不卡 | 黄污视频网站 | 国内视频| 中文字幕人成一区 | 成人国产精品久久久 | 国内精品久久久精品电影院 | 欧洲色综合| 韩国一区二区三区在线观看 | 在线观看国产www | 超碰激情在线 | 婷婷九九 | 国产一区二区在线播放视频 | 黄色a视频| 国产精品久久久久一区二区 | 2021久久| 99久久这里有精品 | 日韩午夜在线 | 国产在线观看你懂得 | 色综合天天天天做夜夜夜夜做 | 久久久精品综合 | 日本精品久久久久久 | 日b视频在线观看网址 | 成人蜜桃视频 | 91精品视频免费看 | 极品久久久久久久 | av在线一级| 国产精品久久艹 | 亚洲一区二区三区毛片 | 日本成人a| 麻豆传媒在线视频 | 成年人免费在线播放 | 国产亚洲精品美女久久 | 久久久久一区二区三区四区 | 色视频成人在线观看免 | 久久精品亚洲综合专区 | 天天色天天操综合 | 少妇自拍av | 91传媒在线观看 | 国产精品99久久免费黑人 | 丰满少妇久久久 | 91麻豆精品一区二区三区 | 91在线你懂的 | 精品国产一区二区三区久久久久久 | 偷拍精偷拍精品欧洲亚洲网站 | 日韩国产精品久久 | 国产成人精品国内自产拍免费看 | 狠狠干中文字幕 | wwwwwww色| 色丁香婷婷 | 色干干| 超碰人人草 | 欧美精品网站 | 国产不卡精品 | 国产成人精品电影久久久 | 色视频在线看 | 国产精品久久久久久久久久直播 | 欧美精品久久久久久久久久白贞 | aaa免费毛片 | 午夜三级影院 | 成年免费在线视频 | 丰满少妇一级 | 超碰在线日韩 | 在线观看a视频 | 国产精品乱码久久久久久1区2区 | 亚洲精品一区二区三区高潮 | 天堂在线免费视频 | 成人国产精品一区二区 | 国产精品午夜久久久久久99热 | 五月婷婷中文网 | 精品国偷自产在线 | 91漂亮少妇露脸在线播放 | 国产欧美在线一区二区三区 | 国产h片在线观看 | 欧美精品免费一区二区 | 国产91精品欧美 | av丁香| 黄污视频大全 | 久久久精品久久日韩一区综合 | 日韩免费看的电影 | 日韩一区二区三区免费电影 | 国产在线精品观看 | 免费黄色小网站 | 中文字幕综合在线 | 成全在线视频免费观看 | 天天天天天天天天操 | 丁香综合五月 | 有码视频在线观看 | 黄色国产高清 | 99国产精品视频免费观看一公开 | 三级在线播放视频 | 久久久久久毛片 | 日本性动态图 | 超级碰碰碰碰 | 在线观看中文字幕一区二区 | 99九九免费视频 | 91香蕉视频在线 | av黄色在线| 久久久精品免费观看 | 中文字幕资源站 | 韩国av电影在线观看 | 国产精品免费视频网站 | av在线播放网址 | 伊人中文网 | 丁香在线观看完整电影视频 | 97视频资源 | 黄色的网站免费看 | 96精品高清视频在线观看软件特色 | 国产精品自拍在线 | 在线观看黄网站 | 日韩高清av | 免费看的黄网站软件 | 黄色小说网站在线 | 成人影视片 | 99 色| 久久观看免费视频 | 一区二区三区精品在线视频 | 国产片免费在线观看视频 | 久久国产午夜精品理论片最新版本 | 九九免费精品视频 | 国产精品一区二区三区视频免费 | 亚洲国产久| 亚洲精品在线网站 | 狠狠色丁香婷婷综合久小说久 | 国产精品系列在线播放 | 国产亚州精品视频 | 中文字幕在线观看免费高清电影 | 久久久性 | 久久九九影院 | 亚洲成年人免费网站 | 国产91区| 色吊丝在线永久观看最新版本 | 欧美日韩国产一区二区在线观看 | 久久国产亚洲视频 | 96av麻豆蜜桃一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美在线观看禁18 | 狠狠夜夜 | 夜夜嗨av色一区二区不卡 | 国产精品美女久久久久久2018 | 精品一区二区在线播放 | 五月婷婷丁香六月 | 国产又粗又猛又黄又爽视频 | 国产香蕉av | 97视频精品 | 99热在线免费观看 | 国产96av| 欧美小视频在线观看 | 亚洲成人av一区二区 | 日韩最新在线 | 亚洲精品国产麻豆 | 欧美成人精品三级在线观看播放 | 日韩乱色精品一区二区 | 热99在线 | www.亚洲精品在线 | 欧美 日韩精品 | 国产成人av网 | 亚洲毛片久久 | 99精品在线直播 | 9ⅰ精品久久久久久久久中文字幕 | 国产福利免费在线观看 | 国产免费嫩草影院 | 91资源在线 | av动态图片| 日韩理论电影网 | 国产一区二区三区在线 | 精品专区一区二区 | 国产精品成人免费精品自在线观看 | 亚洲国产激情 | 日韩电影中文 | 天天超碰| 九九免费在线观看视频 |