欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

JSP+Servlet+MySQL學(xué)生管理系統(tǒng):從三層架構(gòu)到答辯驗收全攻略

JSP+Servlet+MySQL學(xué)生管理系統(tǒng):從三層架構(gòu)到答辯驗收全攻略 簡介這是一份面向Java Web初學(xué)者的課程設(shè)計資源基于JSPServletMysql實現(xiàn)一套簡單的學(xué)生信息管理系統(tǒng)學(xué)生可自行注冊登記、維護個人信息教師登錄后可對學(xué)生信息進行增刪改查與統(tǒng)一管理功能覆蓋常見課設(shè)要求適用于高校Java Web課程設(shè)計、畢業(yè)設(shè)計前的入門練手。項目集成Layui與jQuery搭建交互界面代碼分層清晰運行環(huán)境為JDK7Tomcat8MySQL并支持IntelliJ IDEA直接導(dǎo)入數(shù)據(jù)庫腳本及jar包配套齊全。資源包共2個文件包含1個ZIP源碼壓縮包和1個HTM說明文檔總大小僅2.13MB其中ZIP內(nèi)附完整項目代碼、lib目錄下的所需jar包數(shù)據(jù)庫文件則通過文內(nèi)百度網(wǎng)盤鏈接另行提供整體結(jié)構(gòu)緊湊、無冗余內(nèi)容。目前已有6435人學(xué)習(xí)下載對于需要快速搭建小型Web管理系統(tǒng)的同學(xué)而言這份可直接運行、便于二次開發(fā)的源碼值得參考。1. 能在答辯現(xiàn)場講明白的JSPServlet學(xué)生管理系統(tǒng)到底該怎么搭期末周在某個高校實驗室A同學(xué)攥著一份課程設(shè)計任務(wù)書發(fā)呆要求做一個基于Java Web的學(xué)生信息管理系統(tǒng)技術(shù)棧限定JSPServletMySQL。他沒有急著寫代碼而是先問了自己一個問題——這東西就算做出來了答辯的時候老師問“你用了什么設(shè)計思想”“為什么用連接池”“分頁是怎么做的”我能接得住嗎帶著這個疑問他把這個“簡單學(xué)生信息管理系統(tǒng)”拆成了需求、設(shè)計、實現(xiàn)、驗收四段來推進最終交出了一份既能跑通、又能講清楚的設(shè)計方案。這篇博文就是把這套完整方案整理出來給正在做JSPServlet課程設(shè)計、畢業(yè)設(shè)計的同學(xué)做參考。無論你是零基礎(chǔ)起步還是已經(jīng)能跑通增刪改查但總感覺哪里“不成體系”這篇都能幫你把項目從“能跑”提升到“能答辯”。方案默認(rèn)讀者會一點Java語法、會裝IDEA和MySQL不會的地方我也會把操作細(xì)節(jié)寫到命令和配置級別。2. 技術(shù)選型與總體架構(gòu)設(shè)計為什么2023年還要用JSPServlet以及三層結(jié)構(gòu)怎么落地2.1 技術(shù)棧選型這個“簡單”系統(tǒng)該用什么框架技術(shù)上很容易頭腦發(fā)熱明明學(xué)過Spring Boot為什么作業(yè)非要限定JSPServlet先別急著抱怨這門課的教學(xué)目標(biāo)其實是讓你理解Web最底層的請求-響應(yīng)模型。JSP負(fù)責(zé)視圖渲染Servlet負(fù)責(zé)控制邏輯JDBC負(fù)責(zé)數(shù)據(jù)庫交互——這正是Java Web最原始的MVC形態(tài)。你把它做扎實了后面學(xué)Spring MVC時會有一種“原來框架幫我干的就是這些事”的頓悟感。因此這套方案的技術(shù)棧定為JDK版本JDK 8最穩(wěn)妥也能兼容后續(xù)的JSP語法Web容器Tomcat 9Java EE規(guī)范里的Servlet 4.0JSP 2.3版本數(shù)據(jù)庫MySQL 5.7InnoDB引擎字符集utf8mb4前端JSP JSTL EL表達式少量CSS不引入前端框架連接管理C3P0連接池避免每次請求都用DriverManager創(chuàng)建新連接實際動手前先做一件事在IDEA里建一個Maven項目。別用Dynamic Web Project因為手動拷j(luò)ar包、手動配web.xml的體驗堪稱“鍛煉耐心”Maven能自動拉取依賴以后你們會遇到的前人踩坑帖基本也都基于Maven結(jié)構(gòu)。2.2 三層架構(gòu)劃分Servlet不在這個層面里是誰的責(zé)任很多同學(xué)做的管理系統(tǒng)會把JDBC代碼直接寫在Servlet里頁面一多就變成一片混亂。這個項目里我采用了經(jīng)典的三層架構(gòu)加控制層總共四個包com.example.entity // 實體類Student, Course, Score, User com.example.dao // 數(shù)據(jù)訪問層StudentDao, UserDao, ScoreDao com.example.service // 業(yè)務(wù)層StudentService, UserService com.example.servlet // 控制層各個Servlet BaseServlet復(fù)用 com.example.util // 工具類DBUtil, PageBean三層架構(gòu)的意義是分離職責(zé)但題目要求了“JSPServlet”所以控制層的Servlet單獨一個包JSP放在webapp目錄下。請求流程是瀏覽器發(fā)起HTTP請求Servlet接收并解析調(diào)用Service層處理業(yè)務(wù)邏輯Service層調(diào)用DAO層做數(shù)據(jù)庫操作最后Servlet把結(jié)果setAttribute后轉(zhuǎn)發(fā)或重定向到JSPJSP再用EL表達式和JSTL把數(shù)據(jù)渲染出來。我把這張圖直接畫給過A同學(xué)看JSP頁面 → Servlet控制層 → Service業(yè)務(wù)層 → DAO數(shù)據(jù)訪問層 → MySQL數(shù)據(jù)庫 ↑ | | | └──────────┴──────────────┴───────────────┘ 最終結(jié)果返回到JSP渲染這是一種單方向的依賴關(guān)系每一層的修改原則上不影響上層。Service層存在的意義在這次的課程設(shè)計中可能體現(xiàn)得不夠充分因為邏輯簡單但它為后續(xù)擴展保留了位置這也是答辯時可以主動講的“設(shè)計冗余”。2.3 數(shù)據(jù)庫設(shè)計與建表SQL四張表和一個外鍵約束數(shù)據(jù)庫設(shè)計是答辯時最容易考察“你有沒有真正理解”的一環(huán)。這次系統(tǒng)的業(yè)務(wù)場景是一個學(xué)生信息管理者要維護學(xué)生、課程和成績同時必須有一個用戶表支撐登錄功能。所以設(shè)計四張表student學(xué)生表學(xué)號是自然主鍵自帶業(yè)務(wù)含義無需自增IDcourse課程表課程編號為主鍵來自教學(xué)計劃的唯一編碼score成績表用自增ID作為邏輯主鍵(student_id, course_id)做唯一索引防止同一學(xué)生同一課程重復(fù)錄入user用戶表存儲登錄賬號密碼密碼用MD5加固定鹽存儲杜絕明文建表SQL如下直接復(fù)制到Navicat或命令行執(zhí)行即可CREATE DATABASE IF NOT EXISTS student_ms DEFAULT CHARSET utf8mb4; USE student_ms; CREATE TABLE student ( student_id VARCHAR(20) PRIMARY KEY COMMENT 學(xué)號, name VARCHAR(50) NOT NULL COMMENT 姓名, gender CHAR(1) DEFAULT 男 COMMENT 性別, class_name VARCHAR(50) COMMENT 班級, phone VARCHAR(11) COMMENT 手機號, email VARCHAR(100) COMMENT 郵箱, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時間 ) ENGINEInnoDB COMMENT 學(xué)生表; CREATE TABLE course ( course_id VARCHAR(20) PRIMARY KEY COMMENT 課程編號, course_name VARCHAR(100) NOT NULL COMMENT 課程名稱, credit DECIMAL(3,1) DEFAULT 2.0 COMMENT 學(xué)分, teacher VARCHAR(50) COMMENT 授課教師 ) ENGINEInnoDB COMMENT 課程表; CREATE TABLE score ( id INT AUTO_INCREMENT PRIMARY KEY, student_id VARCHAR(20) NOT NULL, course_id VARCHAR(20) NOT NULL, score DECIMAL(5,2) COMMENT 成績, UNIQUE KEY uk_stu_course (student_id, course_id), CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(student_id), CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course(course_id) ) ENGINEInnoDB COMMENT 成績表; CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(64) NOT NULL COMMENT MD5加鹽后密文, real_name VARCHAR(50) COMMENT 操作員姓名 ) ENGINEInnoDB COMMENT 登錄用戶表;設(shè)計說明為什么學(xué)號不用自增ID因為教務(wù)系統(tǒng)里的學(xué)號本身就是穩(wěn)定的自然鍵用它做關(guān)聯(lián)查詢可以少一次JOIN。成績表里的UNIQUE合并索引是很妙的一筆它能防止一條骯臟的數(shù)據(jù)破壞統(tǒng)計結(jié)果外鍵雖然有時影響性能但在這種小規(guī)模管理系統(tǒng)中它換來的數(shù)據(jù)完整性對驗收很有幫助。此外密碼別用明文MD5加鹽雖然不算強加密但足以表明你具備“不能存明文”的安全意識這在答辯中是個加分項。2.4 包結(jié)構(gòu)與關(guān)鍵工具類DBUtil和統(tǒng)一Servlet的寫法在寫具體功能之前先把地基打好。第一塊地基是數(shù)據(jù)庫連接工具類使用C3P0連接池。連接池為什么會是這套系統(tǒng)的關(guān)鍵優(yōu)化點因為傳統(tǒng)的DriverManager寫法是一次請求、一次連接、一次關(guān)閉高并發(fā)下數(shù)據(jù)庫會很快被拖垮而連接池能讓連接重復(fù)使用。C3P0的配置寫在src/main/resources/c3p0-config.xml中?xml version1.0 encodingUTF-8? c3p0-config default-config property namedriverClasscom.mysql.jdbc.Driver/property property namejdbcUrljdbc:mysql://localhost:3306/student_ms?useSSLfalseamp;characterEncodingutf8/property property nameuserroot/property property namepassword123456/property property nameinitialPoolSize5/property property nameminPoolSize5/property property namemaxPoolSize20/property property namemaxIdleTime60/property /default-config /c3p0-config配套的DBUtil工具類package com.example.util; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class DBUtil { // 私有靜態(tài)連接池進程內(nèi)復(fù)用不會每次new private static final DataSource dataSource new ComboPooledDataSource(); public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }這里說明兩個重點參數(shù)initialPoolSize是系統(tǒng)啟動時預(yù)先創(chuàng)建的連接數(shù)設(shè)為5意味著第一個請求進來不用等待建立連接maxPoolSize是池子上限超過就排隊等待。生產(chǎn)價值的體現(xiàn)集中在釋放連接的地方——你的DAO層用完連接后必須在finally塊里調(diào)用close()Connection對象調(diào)close()在連接池模式下實際上是把連接歸還給池子不是真正關(guān)閉。這一點踩坑率極高稍后避坑章節(jié)會展開講。第二塊地基是BaseServlet的設(shè)計。原始Servlet開發(fā)里一個功能一個Servlet類動不動建十幾個類。更優(yōu)雅的做法是一個模塊一個Servlet前端用action參數(shù)區(qū)分操作。定義一個BaseServlet繼承HttpServlet重寫service方法根據(jù)參數(shù)反射調(diào)用對應(yīng)方法package com.example.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; public class BaseServlet extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action req.getParameter(action); if (action null || action.trim().isEmpty()) { resp.sendError(400, 缺少action參數(shù)); return; } try { Method method this.getClass().getMethod(action, HttpServletRequest.class, HttpServletResponse.class); String result (String) method.invoke(this, req, resp); if (result ! null) { if (result.startsWith(redirect:)) { resp.sendRedirect(req.getContextPath() result.substring(9)); } else { req.getRequestDispatcher(result).forward(req, resp); } } } catch (NoSuchMethodException e) { resp.sendError(404, 未知的action: action); } catch (Exception e) { throw new ServletException(調(diào)用方法異常: action, e); } } }這個設(shè)計帶來的好處在后面寫StudentServlet時就能體會——刪改查都集中在同一個類里URL統(tǒng)一為student?actionlist這種形式既整潔又方便權(quán)限控制Filter統(tǒng)一攔截。你完全可以把這個BaseServlet的說明寫進設(shè)計文檔作為“可擴展性”論點的論據(jù)。3. 核心功能模塊實現(xiàn)登錄攔截、學(xué)生信息CRUD、分頁查詢與模糊搜索的完整落地3.1 登錄模塊與攔截器Session會話和Filter過濾器怎么配合登錄是所有管理系統(tǒng)的入口也是最檢驗細(xì)節(jié)的部分。登錄流程由LoginServlet和UserDao共同完成步驟是用戶提交JSP表單中的username與passwordServlet從請求中取出參數(shù)對密碼做MD5加鹽哈希處理調(diào)用UserDao的findByUsernameAndPassword方法查詢數(shù)據(jù)庫查到則setAttribute存入Session重定向到主頁面查不到則轉(zhuǎn)發(fā)回登錄頁并顯示錯誤核心代碼如下WebServlet(/login) public class LoginServlet extends BaseServlet { private UserDao userDao new UserDao(); public String doLogin(HttpServletRequest req, HttpServletResponse resp) throws Exception { String username req.getParameter(username); String password req.getParameter(password); if (username null || password null || username.trim().isEmpty() || password.trim().isEmpty()) { req.setAttribute(errorMsg, 用戶名和密碼不能為空); return /login.jsp; } String salted MD5Util.md5(password SALT); User user userDao.findByUsernameAndPassword(username, salted); if (user null) { req.setAttribute(errorMsg, 用戶名或密碼錯誤); return /login.jsp; } req.getSession().setAttribute(loginUser, user); return redirect:/index.jsp; } public String logout(HttpServletRequest req, HttpServletResponse resp) throws Exception { req.getSession().invalidate(); return redirect:/login.jsp; } }注意一個細(xì)節(jié)UserDao.findByUsernameAndPassword里用的SQL要寫成SELECT id, username, password, real_name FROM user WHERE username ? AND password ?為什么用PreparedStatement而不直接拼接字符串最直接的理由是SQL注入防護。比如用戶在用戶名字段輸入 OR 11字符串拼接直接改變SQL邏輯而PreparedStatement會把整個輸入當(dāng)作一個字符串參數(shù)對待。驗證方法很簡單你可以在登錄頁試一次用戶名填 OR 11密碼隨便填拼接SQL的系統(tǒng)會直接癱瘓而PreparedStatement的方案會提示“用戶名或密碼錯誤”。接下來是Filter。登錄后會訪問所有頁面如果只靠每個頁面檢查Session代碼會重復(fù)倒數(shù)。一個登錄攔截過濾器解決所有問題LoginFilter檢查請求路徑下的Session狀態(tài)WebFilter(/*) public class LoginFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; String path req.getRequestURI(); if (path.endsWith(/login) || path.endsWith(/login.jsp) || path.contains(static)) { chain.doFilter(request, response); return; } if (req.getSession().getAttribute(loginUser) null) { resp.sendRedirect(req.getContextPath() /login.jsp); return; } chain.doFilter(request, response); } }這里有一個隱藏細(xì)節(jié)Filter配置用/*而JSP里有訪問CSS和圖片的需求一旦攔截了靜態(tài)資源頁面會瞬間“裸奔”。解決方式是放行含有static關(guān)鍵字的路徑所以我在webapp目錄里建了一個static文件夾放CSS和JS文件。代碼里我寫的path.contains(static)邏輯在真實項目中更嚴(yán)謹(jǐn)?shù)淖龇ㄊ菍iT給靜態(tài)目錄起獨立前綴。另外重定向時要帶req.getContextPath()這是容器部署路徑的前綴不加的話假設(shè)你部署在/sms下重定向到/login.jsp會直接404這是血淚經(jīng)驗。3.2 學(xué)生信息管理CRUD操作從界面到數(shù)據(jù)庫的完整鏈路學(xué)生模塊是管理系統(tǒng)的老大哥功能包括學(xué)生列表、新增學(xué)生、修改學(xué)生、刪除學(xué)生、條件查詢。由于使用了BaseServletStudentServlet只需要專注于業(yè)務(wù)方法WebServlet(/student) public class StudentServlet extends BaseServlet { private StudentService studentService new StudentService(); // 列表 分頁 模糊查詢 public String list(HttpServletRequest req, HttpServletResponse resp) throws Exception { String pageNumStr req.getParameter(pageNum); String keyword req.getParameter(keyword); if (keyword null) keyword ; int pageNum 1; try { pageNum Integer.parseInt(pageNumStr); } catch (NumberFormatException e) { /* 保持默認(rèn)值 */ } PageBeanStudent pageBean studentService.queryPage(pageNum, keyword); req.setAttribute(pageBean, pageBean); req.setAttribute(keyword, keyword); return /student/list.jsp; } public String toAdd(HttpServletRequest req, HttpServletResponse resp) { return /student/add.jsp; } public String add(HttpServletRequest req, HttpServletResponse resp) throws Exception { Student student assembleStudent(req); if (studentService.addStudent(student)) { return redirect:/student?actionlist; } req.setAttribute(errorMsg, 學(xué)號已存在或參數(shù)不合法); return /student/add.jsp; } private Student assembleStudent(HttpServletRequest req) { Student s new Student(); s.setStudentId(req.getParameter(studentId)); s.setName(req.getParameter(name)); s.setGender(req.getParameter(gender)); s.setClassName(req.getParameter(className)); s.setPhone(req.getParameter(phone)); s.setEmail(req.getParameter(email)); return s; } }純粹的數(shù)據(jù)表單向Servlet提交的“新增”有玄學(xué)學(xué)生的學(xué)號來自用戶輸入而不是自增如果數(shù)據(jù)庫里已經(jīng)有這個學(xué)號插入會拋主鍵沖突異常。最穩(wěn)妥是在Service層先通過findById做一次預(yù)查詢存在就返回false前端提示“重復(fù)”。這個預(yù)查詢放在DAO層的實現(xiàn)也很簡單Override public boolean addStudent(Student student) throws SQLException { String checkSql SELECT COUNT(*) FROM student WHERE student_id ?; String insertSql INSERT INTO student (student_id, name, gender, class_name, phone, email) VALUES (?,?,?,?,?,?); try (Connection conn DBUtil.getConnection()) { conn.setAutoCommit(false); // 開啟事務(wù) try (PreparedStatement ps conn.prepareStatement(checkSql)) { ps.setString(1, student.getStudentId()); ResultSet rs ps.executeQuery(); if (rs.next() rs.getInt(1) 0) { return false; } } try (PreparedStatement ps conn.prepareStatement(insertSql)) { ps.setString(1, student.getStudentId()); ps.setString(2, student.getName()); ps.setString(3, student.getGender()); ps.setString(4, student.getClassName()); ps.setString(5, student.getPhone()); ps.setString(6, student.getEmail()); ps.executeUpdate(); } conn.commit(); return true; } catch (SQLException e) { e.printStackTrace(); // 這里應(yīng)該回滾 return false; } }注意conn.setAutoCommit(false)這一步它把檢查學(xué)號是否重復(fù)和插入學(xué)生這兩步操作放進了一個事務(wù)保證要么都執(zhí)行要么都不執(zhí)行。防止并發(fā)請求下多個重復(fù)學(xué)號在同一瞬間都被插入這種黑匣子問題在課設(shè)答辯時講出來老師會覺得你對“事務(wù)隔離性”有概念。界面上JSP列表頁核心代碼是這樣一個表格配合EL表達式和JSTL標(biāo)簽遍歷table classtable table-bordered thead tr th學(xué)號/thth姓名/thth性別/thth班級/th th手機/thth郵箱/thth操作/th /tr /thead tbody c:forEach items${pageBean.list} varstu tr td${stu.studentId}/td td${stu.name}/td td${stu.gender}/td td${stu.className}/td td${stu.phone}/td td${stu.email}/td td a hrefstudent?actiontoEditstudentId${stu.studentId}編輯/a button classbtn-del>document.querySelectorAll(.btn-del).forEach(btn { btn.addEventListener(click, function () { if (confirm(確定刪除該學(xué)生嗎刪除后不可恢復(fù))) { fetch(student?actiondeletestudentId this.dataset.id, { method: POST }) .then(() location.reload()); } }); });3.3 分頁查詢與模糊搜索PageBean的設(shè)計和SQL的LIMIT參數(shù)列表數(shù)據(jù)隨著測試數(shù)據(jù)變多會無限膨脹所以分頁是每個管理系統(tǒng)的標(biāo)配。這套系統(tǒng)的分頁絕對值不能漏不然一次把幾百行全部渲染出來JSP頁面會明顯卡頓。我的設(shè)計是PageBean通用分頁類package com.example.util; import java.util.List; public class PageBeanT { private int pageNum; // 當(dāng)前頁碼 private int pageSize 10; // 每頁條數(shù) private int totalCount; // 總記錄數(shù) private int totalPages; // 總頁數(shù) private ListT list; // 當(dāng)前頁數(shù)據(jù) private int startRow; // 起始行偏移量SQL限制用 // 構(gòu)造時自動計算startRow和totalPages }在DAO層的查詢方法里模糊查詢和分頁是緊耦合的。很多同學(xué)死記硬背LIMIT offset, pageSize但總淘神在offset該從0開始還是從1開始。正確邏輯是SELECT * FROM student WHERE name LIKE ? OR student_id LIKE ? OR class_name LIKE ? ORDER BY create_time DESC LIMIT ?, ?第一條?傳keyword包裝成的%關(guān)鍵詞%值可以在Java里拼好String likePattern % keyword %;第二條?傳startRow值為(pageNum-1) * pageSize第三條傳pageSize。因為SQL中LIMIT的偏移量從0開始第一頁的startRow就是0第二頁就是10由此推導(dǎo)出(pageNum-1)*pageSize。查詢總條數(shù)與查詢當(dāng)前頁數(shù)據(jù)的SQL可以拆成兩次獨立查詢在計算總頁數(shù)時加一點防御邏輯totalPages (totalCount pageSize - 1) / pageSize; if (totalPages 1) totalPages 1;這個公式比totalCount / pageSize的向上取整寫法更直接totalCount0時也能兜底。在做demo階段你也許會想“不裝分頁了”但沖刺答辯時老師大概率會問“數(shù)據(jù)量上來了怎么辦”到那時再補分頁重構(gòu)成本遠(yuǎn)超現(xiàn)在。3.4 成績與課程模塊多表關(guān)聯(lián)查詢時JDBC怎么封裝ResultSet成績模塊的業(yè)務(wù)是某個學(xué)生選修了某門課程獲得一個分?jǐn)?shù)。頁面上的成績列表往往是多表查詢的結(jié)果顯示學(xué)生姓名、課程名稱而不是裸ID。這時DAO層的SQL就變成JOINpublic ListScoreVO findScorePage(int offset, int pageSize, String keyword) throws SQLException { String sql SELECT s.student_id, s.name AS student_name, c.course_id, c.course_name, sc.score FROM score sc JOIN student s ON sc.student_id s.student_id JOIN course c ON sc.course_id c.course_id WHERE s.name LIKE ? OR c.course_name LIKE ? ORDER BY sc.id DESC LIMIT ?, ?; ListScoreVO list new ArrayList(); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { String keywordPattern % keyword %; ps.setString(1, keywordPattern); ps.setString(2, keywordPattern); ps.setInt(3, offset); ps.setInt(4, pageSize); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { ScoreVO vo new ScoreVO(); vo.setStudentId(rs.getString(student_id)); vo.setStudentName(rs.getString(student_name)); vo.setCourseId(rs.getString(course_id)); vo.setCourseName(rs.getString(course_name)); vo.setScore(rs.getDouble(score)); list.add(vo); } } } return list; }這里取別名是必須規(guī)范的點。student.name和c.course_name如果不取別名在ResultSet編碼返回值時你拿到的是同一列名取值只會取到第一個匹配列成績列表就會“學(xué)生名和課程名永遠(yuǎn)一樣”這個翻車案例非常適合拿到避坑章節(jié)。規(guī)范的寫法是先給列起別名再以別名getString(student_name)取值。成績錄入的頁面核心是三個下拉框。學(xué)生和課程的選項從數(shù)據(jù)庫動態(tài)加載這樣錄入的人沒法選到不存在的選項數(shù)據(jù)的臟率大幅降低select namestudentId c:forEach items${studentList} varstu option value${stu.studentId}${stu.studentId} - ${stu.name}/option /c:forEach /select3.5 項目工程化數(shù)據(jù)庫連接配置、日志與SQL防注入的規(guī)范建議除了功能代碼工程化的細(xì)節(jié)分為三個方面第一所有SQL參數(shù)一律使用PreparedStatement。只要看到字符串拼接SQL的地方就是需要審查的漏洞點。你可以做一個簡單的代碼搜索把Statement挑出來全部改掉同時把這個防止SQL注入的考量寫進設(shè)計文檔的“安全性”段落。第二配置外置。數(shù)據(jù)庫密碼不要寫在DAO類里而是放到c3p0-config.xml中將來部署到別的環(huán)境運維只需要修改配置而不動Java源碼。這是一個“你懂實踐”的信號答辯中可以提一句。第三統(tǒng)一異常處理。Servlet中不應(yīng)當(dāng)catch所有異常然后吞掉至少把printStackTrace()和日志框架結(jié)合。僅做課程設(shè)計的話拿System.err輸出也能跑但更好的一個習(xí)慣是集中跳轉(zhuǎn)到一個錯誤頁面而不是讓默認(rèn)的堆棧信息直接裸露在瀏覽器里觀感很差。4. 高頻翻車點排查JSPServlet項目最容易踩的五個坑及修復(fù)方法4.1 頁面中文亂碼設(shè)置編碼的地方有一處疏忽全文動態(tài)顯示都會出問題現(xiàn)象頁面上的中文、寫入MySQL的中文顯示為“???”或者JSP頁面頭部正常但Servlet寫入的數(shù)據(jù)亂碼。原因鏈路中至少需要兩級編碼一致。第一級JSP頁面本身要聲明UTF-8第二級Servlet讀取參數(shù)和寫回響應(yīng)要UTF-8第三級數(shù)據(jù)庫表和JDBC連接URL要UTF-8。很多同學(xué)只設(shè)置了pageEncoding卻漏了request.setCharacterEncoding和數(shù)據(jù)庫connector的characterEncodingutf8。解決在代碼里用一個全局的CharacterEncodingFilter在web.xml中配置為第一個Filter保證每個請求在進入業(yè)務(wù)邏輯之前就被設(shè)置為UTF-8WebFilter(/*) public class CharacterEncodingFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); resp.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); chain.doFilter(req, resp); } }4.2 同一用戶對同一課程錄了兩次成績統(tǒng)計報表直接翻車現(xiàn)象成績表里出現(xiàn)兩行student_id和course_id完全相同的數(shù)據(jù)總分和平均分都算不對像是鬧了鬼。原因錄入界面的學(xué)生、課程兩個下拉框全部可選用戶手一滑同一學(xué)生選了兩次同一門課數(shù)據(jù)庫沒有業(yè)務(wù)約束攔下重復(fù)插入。解決建表階段就該在score表上加聯(lián)合唯一約束UNIQUE KEY uk_stu_course(student_id, course_id)。如果表已建好可以后補執(zhí)行ALTER TABLE score ADD UNIQUE KEY uk_stu_course(student_id, course_id);4.3 部署到Tomcat后頁面點擊“刪除”直接暴露錯誤堆?,F(xiàn)象本地IDEA運行得好好的打包成war包放進某個實驗室的Tomcat后刪除按鈕一點頁面直接顯現(xiàn)一個500或405后臺顯示MethodNotAllowed。原因多半是列表頁的刪除操作用了a標(biāo)簽或普通form的GET分支。我用Java Web的一個常識來解釋HTTP的GET請求對應(yīng)用戶可見還可能被瀏覽器的預(yù)加載機制提取DELETE這種冪等操作本來不該由GET觸發(fā)。Tomcat默認(rèn)的JspServlet會攔截對JSP的POST請求但如果是“鏈接GET”就相對更容易因為參數(shù)不合規(guī)而拋出異常。合理的方式是用form表單模擬POST例如在列表頁把每一個按鈕包在一個表單里form actionstudent methodPOST styledisplay:inline input typehidden nameaction valuedelete input typehidden namestudentId value${stu.studentId} button typesubmit onclickreturn confirm(確定刪除)刪除/button /form4.4 登錄攔截Filter把靜態(tài)資源攔死整個頁面只有文字沒有樣式現(xiàn)象用戶登錄成功后首頁所有CSS、JS、圖片全部失效瀏覽器F12的控制臺看到大量靜態(tài)資源“blocked”或404。原因Filter路徑寫的是/*后端把樣式表、圖片等靜態(tài)文件也當(dāng)成受保護資源攔截了Session驗證不過的全被重定向到登錄頁。解決建立約定的目錄結(jié)構(gòu)把所有資源放在/static/下并在Filter的放行邏輯中加上這一條if (path.contains(/static/) || path.endsWith(.css) || path.endsWith(.js) || path.endsWith(.png)) { chain.doFilter(request, response); return; }4.5 密碼明文入庫或SQL拼接導(dǎo)致注入簡單的系統(tǒng)也要有安全意識現(xiàn)象數(shù)據(jù)庫表中user的password字段顯示為123456寫PPT時被其他同學(xué)看到臉面掛不住或者搜索框輸入一個特殊字符服務(wù)端輸出SQL報錯。原因一是怕麻煩沒用哈希二是圖省事用了Statement拼接。解決即使只是個簡單的學(xué)生管理系統(tǒng)也一律用MD5加鹽。MD5Util工具可以自己寫很簡單public class MD5Util { public static String md5(String text) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] digest md.digest(text.getBytes(UTF-8)); StringBuilder sb new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (Exception e) { throw new RuntimeException(e); } } }對所有查詢一律換成PreparedStatement。這兩件事做完你再在項目文檔里寫“本項目避免了SQL注入風(fēng)險”就是真話而不是口號。5. 方案驗收與答辯技巧項目能不能拿優(yōu)秀就看這幾個環(huán)節(jié)5.1 自測驗收的標(biāo)準(zhǔn)清單每次新功能寫完就手動測一遍。這里給一份可以直接照用的驗收清單我建議你按這個順序走一遍流程比最后期末突擊強無數(shù)倍。如果所有項都通過這份方案就已經(jīng)具備提交條件驗收項測試動作預(yù)期結(jié)果登錄頁訪問啟動Tomcat訪問登錄URL頁面完整顯示無500錯誤正常登錄輸入正確賬號密碼跳轉(zhuǎn)到首頁右上角顯示當(dāng)前用戶姓名錯誤登錄輸入錯誤密碼停留在登錄頁顯示錯誤提示越權(quán)訪問未登錄狀態(tài)下直接訪問/student頁面自動跳轉(zhuǎn)到登錄頁新增學(xué)生錄入合法數(shù)據(jù)列表出現(xiàn)新記錄無報錯重復(fù)學(xué)號新增加已存在學(xué)號頁面提示“學(xué)號已存在”模糊查詢姓名輸入“張”只顯示姓張的學(xué)生分頁跳轉(zhuǎn)造15條數(shù)據(jù)翻到第二頁URL攜帶pageNum變化列表顯示5條刪除確認(rèn)點擊刪除按鈕彈確認(rèn)框確認(rèn)后記錄消失中文顯示檢查所有頁面的中文無亂碼成績錄入選擇學(xué)生課程輸入分?jǐn)?shù)列表多一條JOIN后的完整數(shù)據(jù)重復(fù)成績再次錄入同一學(xué)生同一課程數(shù)據(jù)庫層報錯頁面被捕獲攔截5.2 答辯陳述路徑從“我會增刪改查”到“我做了完整設(shè)計”答辯最常見的翻車現(xiàn)場是老師問“為什么用三層架構(gòu)”答“別人都這么用”問“分頁怎么做”答“寫了limit”。通常的應(yīng)對策略是把項目的陳述節(jié)奏安排成“問題→設(shè)計→驗證”這樣讓老師的提問始終順著你的思路走。第一分鐘講核心問題管理系統(tǒng)面對的核心問題是數(shù)據(jù)的快速維護與準(zhǔn)確統(tǒng)計。用一句話還原業(yè)務(wù)場景然后引到技術(shù)選型。第二分鐘講架構(gòu)展示工程包結(jié)構(gòu)截圖說明控制層、Service層、DAO層的分層帶出BaseServlet和統(tǒng)一Filter的設(shè)計強調(diào)為什么從控制到數(shù)據(jù)訪問都是單一依賴方向。第三分鐘講亮點兩個亮點二選一——連接池的使用與原因防止重復(fù)成績的數(shù)據(jù)庫唯一約束。挑你最有把握的講深講透。第四分鐘留出時間給老師提問主動問“老師要不要看一下數(shù)據(jù)庫結(jié)構(gòu)”或者“我這里做了一個防止重復(fù)錄成績的約束我可以演示一下”。演示總是比紙上談兵更信服。5.3 幾個被問概率極高的難點問題最好提前準(zhǔn)備答案問題一為什么不直接用JDBC連接要引連接池標(biāo)準(zhǔn)回答數(shù)據(jù)庫連接的創(chuàng)建和銷毀都比較耗時在高并發(fā)的場景下每次請求都新建連接會產(chǎn)生明顯延遲嚴(yán)重時可能耗盡數(shù)據(jù)庫連接數(shù)。連接池在系統(tǒng)啟動時預(yù)創(chuàng)建一批連接復(fù)用用完歸還。我配置了initialPoolSize5、maxPoolSize20既滿足并發(fā)需求也能防止連接耗盡。問題二filter和interceptor有什么區(qū)別標(biāo)準(zhǔn)回答Filter是Servlet規(guī)范里的作用于Web容器層攔截所有請求無法調(diào)用Spring管理的方法Interceptor是框架層概念可以對Controller內(nèi)部的方法做橫切。我這個項目不用Spring所以用Filter實現(xiàn)登錄校驗與編碼處理更符合Servlet規(guī)范遷移到Spring MVC后則可以平滑替換成攔截器。問題三分頁為什么不用PageHelper這類插件標(biāo)準(zhǔn)回答課設(shè)的核心目標(biāo)是驗證基礎(chǔ)原理PageHelper自動生成的count查詢與分頁SQL隱藏了實現(xiàn)過程。手寫LIMIT參數(shù)并配合PageBean封裝能夠自己掌控查詢過程在內(nèi)容量大的情況下也能通過修改pageSize適配不同場景。三句話講完這些問題你的理論分就拿到了。5.4 交付物整理與復(fù)盤最后整理提交材料時通常的做法是從這幾個維度打包方便自己和別人雙層驗收源碼工程Maven目錄完整包含src、pom.xml、.idea可選數(shù)據(jù)庫腳本文檔建庫建表語句、初始化測試數(shù)據(jù)語句運行說明JDK/Tomcat/MySQL的版本啟動步驟默認(rèn)賬號密碼設(shè)計文檔包括需求分析、數(shù)據(jù)庫設(shè)計、系統(tǒng)架構(gòu)圖和核心流程說明答辯PPT控制在10頁展示頁面截圖、核心技術(shù)、總結(jié)亮點即可從那以后我每做完一個課設(shè)級別的小系統(tǒng)都強制自己走一遍“驗收清單→答辯問題預(yù)演→材料打包”不把“跑通”當(dāng)成終點。這套習(xí)慣后來在準(zhǔn)備更正式的項目評審時也幫我節(jié)省了大量臨時補文檔的時間。希望這份方案能幫你把JSPServlet的學(xué)生信息管理系統(tǒng)做得既完整又好講交出一份能讓自己滿意的課程設(shè)計。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香六月婷婷,婷| 免费AV播放| www.色色com| 97人人操| cc精品国产性传播| 婷婷色色播五月天| 影音先锋偷偷色男人站| 欧美成人猛片AAAAAAA| 色综合伊人网| 玖玖婷婷视频| 日本99视频| 嫩草AV久久伊人妇女超级a| 色玖玖综合| 操骚货在线| 婷婷性爱无码视频| 激情五月激情综合俺也去婷婷小说| 激情五月五月五月婷婷| 91久操| 日本欧美成人片AAAA| 五月色婷婷激情| 午夜成人网站在线观看| 超碰啪啪网| 五月婷婷色五月| 亚洲色A| site:hcxsz888.com| 婷婷六月丁综合| 久久99网| 99爱爱| 午夜丁香五月天综合| 99啪视频在线观看| 久久99激情五月天| 操碰色一区就去操| 99人妻碰碰久久久禁片| 五月色综合| 99精品久久久久久久婷婷| 26UUU精品一区二区c〇m| 成片免费观看视频大全| 天堂综合久久| 99精品一二三四视频| 五月停视频天堂| 激情综合婷婷| 99爱视频免费| 99热综合网| 日本色五月婷婷| 五月天婷婷色播在线网| 激情合网婷婷| 丁香五月中文字幕久色| 五月天另类小说| 色九月激情综合网| 色综合色综合网| 丁香五月aV| 久久婷婷五月天激情新地址| 婷婷五月在线综合| 五月丁香婷婷激情在线视频| 综合热无码| WWW丁香五月| 大香蕉久久久久| 婷婷五月综合色中文字幕| 婷婷五月色播天| JAPANRCEP老熟妇乱子伦视频| 五月丁香六月综合基地| 色综合色色色| 综激情网| 狠狠综合网| 五月婷婷之综合激情| 玖玖五月丁香| 婷婷五月天丁香花| 超碰人人色| 婷婷丁香五月激情| 亚洲视频一区| 伊人久热91网| 99ri在线观看视频| 九九视频这里是精品五月| 久久五月天婷婷| 91超碰在线观看| 影音先锋毛片网站| 天天插天天很| 亚洲va成人va成人va在线观看| 亚洲成人无码网站| 五月天日日操夜夜操| 日韩成人精品中文字幕| 丁香五月在线观看综合| 另类视在线| 日本熟妇精品99| 丁香五月电影| 婷婷丁香成人色综合| 五月丁香婷婷色播无码| 亚洲天堂99| 大香蕉伊人99| 激情综合亚洲色婷婷五月| 伊人色欲五月天| 99色看| 五月色天情| 97婷婷丁香| 日狠狠| 日韩乱轮AV| 婷五月天| 天天色五月| 激情五月天小说视频| av操一操| 搡BBBB搡BBB搡18| 天堂美国久久| 婷婷五月天天天日日夜夜| 天天综合天天玩夜夜玩天天玩夜夜玩| 久久99最新| 九九视频热| 99在线免费观看| 天天干天天色综合| 综合玖玖偷拍| 丁香色综合| 中文字幕,综合,91| 五月丁香婷婷综合网| 亚洲精品无码一区二区| 综合久久综合| 婷婷丁香五月网| 五月天婷婷久久视频| 色网五月婷婷| 欧美色色色色色色色色色色影视| 国色天香伊人狠狠色| 日日操夜夜骑| 久久免费少妇高潮99精品| 亚洲综合1024| www婷婷| 99热最新| 丁香五月1页| 99热这里只有精品86| 97色色婷婷| 性爱激情五月| 久久久久久草黄色片AV在线观看| 六月丁香婷婷天堂| 99只有精品| 海外网站专业操老外| 大香蕉伊人久久| 色狠狠六月| 深爱五月天| 国产精品久久久久久久久久久久| 久久精品日| 日日操夜夜操狠狠操| 夜夜撸日日操| 婷婷久久18| 色色色在线免费视频| 五月天成人在线视频网站| 涩涩五月天| 日本97在线视频| 五月天色社区| 超碰免费电影| 亚洲六月色| 密着浓厚中出乚交尾GvG935| 色五月丁香激情| 91精品视频男人的天堂| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 日本高清久| 久久五月婷天天干| 五月丁香六月婷婷中文版| 激情六月婷婷| 二色av| 狠狠狠狠狠狠| 五月丁香激情综合啪啪| 影音先锋偷偷色男人站| 超碰免费人妻| 丁香五月成人| 亚洲看av的网站| 五月丁香成人网| 欧亚洲在线高清视频| 国产亚洲色婷婷久久99精品91| 99热久| 九九色色色| 中文字幕,综合,91| 婷婷狠狠97| 国产精品香蕉| 极品五月天| 激情五月四色| 99久久久久久www| 五月色婷婷综合| 中文字幕人妻一区二区| 五月天伊人久久久久| av五月丁香| 婷婷.com| 激情婷婷| 欧美A级成人婬片免费看理论| 五月天丁香婷| www.久久久久| VfJxEwPH| 国产精品久久..4399| 色五月丁香网| 五月婷久久在线| 2050人人操免费工开爱| 99热99极品观看| 97久久精品| 99热碰碰热| 五月婷婷丁香| 艳妇野外情欲放荡HD| 五月天激情在线视频| 青柠影视免费高清电视剧| 爱草视频在线| 五月丁香在线观看99| 14色综合婷婷| tingtingzonghewang| 免费色婷婷| 91九色视频在线观看| 99热在线播放| 丁香五月瑟瑟| 91久操| 日本成人噜噜噜噜噜| 久久婷婷网址| 六月天婷婷| 亚洲色色色色| 大香蕉啪啪网| 九色在线观看91av| 香蕉AV777XXX色综合一区| 情趣视频66| 午夜成人网站在线观看| 天天做天天爽| 成人网站免费在线播放| 战争与艾拉电影免费观看| 婷婷成人五月天成人文学| 狠狠色噜噜狠狠狠狠综合| 五月天激情小说网| 精品无码视频| 成年AAAA色情| 亚洲午夜电影| 亚洲另类AV| 久久丁香五月天| 色婷婷丁香五月色综合网| 大香蕉中文| 青草视频在线播放| 狠狠色噜噜狠狠狠狠综合| 亚洲99视频| 日本不卡中文字幕| 日韩情色在线观看| 性色九九| 国产精产国品一二三在观看| 天天干天天拍| 色婷婷视频| 91精品久久久久久综合五月天| 男女av免费看| 激情综合国产| 五月婷婷亞洲中文| 婷婷五月丁香久久| 日日操人人操| 五月丁香激情婷婷综合| 五月综合亚洲婷婷| 五月天婷婷色色| 99精品视频播放| 五月婷婷在线视频| 丁香五月在线| 涩综合婷婷| 久久99热这里只频精品6学生| PORNY九色9l自拍视频成人| www久久久久久久久久久久久久久久久| 在线A色| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 久久婷婷91| 国产午夜一区二区三区| 色噜噜婷婷| 凹凸探花电影| 26uuuavcom| 激情综合五月婷| 狠狠爱婷婷| 国产色色小草视频| 五月情涩综合婷婷| 九九色院| 日本99久久| 欧美三级黄色片久久| 91高潮喷水久久久久久久久| www.1024久久| 另类国产区| 黄色激情网站在线观看| www九月婷婷| 色噜噜狠狠狠狠色综合久欧美| 免费啪啪亚州视频| WWW.17C亚洲精品| 亚洲色另类| 可以直接看的AV| 五月婷婷激情四月| 婷婷五月天基地| 五月丁香五月综合欧美| 五月色色网| A1片久久久| 久久婷婷内射| 亚洲成人AV在线播放| 天天肏在线观看| 婷婷在线视频| 久久最新色色色| 26uuu欧美激情另类| 九热...av| 日本黄色精品| 国产FREESEXVIDEOS性中国| 97人人干| 思思久久精品| 99色在线视频| 91丨九色丨东北熟女| 大香蕉网站,大香蕉综合| 色婷婷亚洲六月婷婷中文字幕| 爱iii做iiii日日| 免费看欧美成人A片无码| 欧美日本黄色| 天天色丁香| 色99在线| 久久视频婷婷视频| 久久久久人妻网址| 久久99网| 99热6这里只有精品| 丁香蜜臀黄色婷婷五月天| 欧美激情综合五月色丁香| 伊人五月成人| 天天摸天天透天天舔| 天天摸色吧天天摸色吧| 天天爽,夜夜爽| 99亚州综合精品成人网| 伊人玖玖精品| 九九这里有精品| 亚洲视频99| 色情五月婷婷| 国产午夜精品一区二区三区四区| 色婷婷丁香五月| 婷婷黄色| www.狠狠操| 无码99| 色香蕉影院| 国产毛片精品一区二区色欲黄A片| 久久怡红院| 女人被男人吃奶到高潮| 婷婷天堂综合| 噜噜在线| 草久私拍| 久热九九| 5月婷婷性视频| 色播五月丁香| 丁香花五月天激情| 九九99久久精品| 亚洲精品**不卡在线播he| 婷婷六月偷拍| 爱操人妻| site:ornaments52.com| 天天噜| 久热中文字幕| 202丰满熟女妇大| 97搞在线| 五月婷婷色影院| 99精品视频免费在线播放| 婷婷一本和五月丁香| 色播婷婷五月天| 激情五月久久| www.狠狠操| 色九九中文字幕| 欧美超碰人人| 成人丁香五月| 日本激情综合| 99热这里只有精品中文字幕| 久久电影五月天丁香电影| 六月婷婷七月丁香| 激情五月五月五月婷婷| 五月天操逼网| 色和综合网| 在线观看996精品| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 1024人妻无码中文字幕| 色婷婷亚洲| 五月夜丁香| 五月丁香六月激情欧美综合| 色五月婷婷老师| 91黄色五月天视频| 99色这里| 91九色欧美| 亚洲日韩乱码一区二区三区四区| 五月婷婷 婷婷五月 一区二区 久久久 | 激情六月天婷婷| 狠狠操.com| 狠狠狠狠狠狠狠狠| 无码免费人妻A片AAA毛片西瓜| 欧美性生交XXXXX无码小说| 五月停亭久久电影| 日韩抽插操逼| 欧美日朝成人| 五月婷婷色白丝| 天天操夜夜夜夜爽| 综合色五月天| 综合色婷婷| 这里只有精品热| 99网99热| 99草在线免费观看视频| 精品国产人人爱人人| 日本色爽| 色开心五月婷婷丁香HD| 五月婷婷和六月| 91婷色| 中文字幕91,综合| 五月天自拍网| 五月天开心网| 欧美综合五月丁香六月婷| 婷婷五月色丁香在线看| 少妇高潮呻吟A片免费看软件| 亚洲av电影网站| 精品人妻在线| 婷婷欧美激情| 五月精品99综合| 密黄站| 91久久综合亚洲鲁鲁五月天| www激情网站| 99精品免费欧美小视频 | 夜夜操夜夜操| 色色综合五月| 伊人五月丁香| www.丁香黄色五月天人与| 亚洲精久久| 丁香五月激情综合| 日熟女| 五月天色裸体视频| 91操黄| 九九热在线视频,| 91狠狠综合久久久久久| 五月婷六月综合在线观看| 色色色婷| 婷婷激情综合| 99色性爰网络| 五月天婷婷综合久久| 色综合丁香| 婷婷丁香宗合888| 婷婷成人五月天| 九九激情视频| 天天色99| 99色综合网| 丁香六月婷婷综合激情欧美| 免费成人网在线观看| 丁香五月中文字幕久色| 激情婷婷丁香色五月| 婷婷丁香五月综合激情视频| 色婷婷无吗| 国产精品五月天婷婷| 就爱日五月天| 激情五月综合| 日韩一级A片黄色| AV在线中文| 丁香五月天黄色片| 这里只有精品视频在线| 五月情综合| 国产XXXX搡XXXXX搡麻豆| 丁香成人综合| 婷婷激情五月天激情| 日本在线观看aaa 99| 激情五月丁香综合网站| 日本在线播放97| 俺去啦综合网| 久久婷婷五月天激情| 色五月婷婷91| 99久久丝| 日韩中出视频| 97极品在线| 九九色婷婷| www狠狠| 综合网激情五月天| 五月丁香婷婷综合网色欲| 色婷婷的五月天| www.henhenl| 久久婷婷视频| 婷婷五月天开心激情网| 日韩伊人大香蕉| 无码人妻激情| 丁香五月婷婷激情视频播放| 狠狠综合区| 99热都是精品| 五月丁香婷婷伊人| 日韩 中文 欧美| 九九热视频在线观看| 九九热区一区二区三区| 久99热在线观看| 五月丁香色综合| 欧美色色色| 91九色国产熟女| 五月天激情影院| aaa日韩| 激情爱爱网站超大免费| 久久久天堂国产精品女人| 综合在线丁香五月| 九月综合| 综合另类激情| 色色com| 97婷婷五月| www久久99| 9热成人在线视频| 婷婷色五天| 天天爽天天日人人爱 | 婷婷六月色情| 91人人网| www.色五月| WWW,五月| 伊人AV五月婷| 噜噜噜噜噜日本视频| 激情婷婷五月综合| 日韩成人精品中文字幕| 久操97| 五月婷婷色丁香| 91九色视频在线观看| 99免费成人网| 久久久27操| 亚洲性爱AV在线| 丁香花五月天激情| 色五月激情五月天| 婷婷基地五月色| 99久久久免费| 丁香激情综合| 北京熟妇搡BBBB搡BBBB| 丁香六月婷婷色XXXXX| 五月婷婷开心综合| 亚洲五月天伊人| 婷婷射图| 国产性爱一级| 月丁香久久久| 婷婷五月天久草在线| 夜夜爱网站| 热久久这里只有精品| 九九热99精品| 天天婷婷天天| 婷婷,五月天,丁香,第一| 91精品又长又大又粗又爽又猛| 人妻少妇色综合| 丁香五月婷婷乱| 久久久久久久综合狠狠综合| 日韩性视频| 热热99爱爱| 内射 无码 伊人| 欧洲色色| 午夜大香蕉| 欧美日韩99| 伊人五月综合网| 99热6色| 亚洲久热无码| 色狠狠色狠狠| 色婷婷九月综合| 日本精品。999| 日韩色色色色色| 超碰成人在线观看| 欧美激情中文字幕| 碰人人97| 欧美S码亚洲码精品M码| 99热| 色婷婷成人做爰A片免费看网站| 五月婷婷免费看| 久久久久久丁香五月| 五月丁香天堂网婷婷| 99综合婷婷五月| 日韩狠狠色婷婷| 天天干,天天舔| yellow视频在线观看91| 91超碰九色| 99久热在线精品| 色婷婷综合久久久久| 大香蕉欧美在线| 五月激情婷婷女| 五月丁香狠狠| 久久这里有精品| 无套内射极品大美女| 久久99热这里只有精品| 久久婷婷五月综合色丁香| 婷婷五月天伊人| 在线视频99| 综合色五月| 欧美色五月| 免费精品99| 丁香五月影院| 狠狠综合网| 51精品国自产在线| 婷婷五月另类网站| 国产熟女大叫受不了| 激情综合区| av国产精品偷| www.狠狠操.co m| 婷婷综合| 色小说五月婷婷| 天天爽综合网| 啪啪综合| 午夜69成人做爰视频| 丁香五月天AV在线| 涩九九九九| 久久久久久久丁香五月天婷婷| 97久久五月丁香婷婷| 婷婷久久五月天丁香| 色色综合网站| 99热在线这里只有精品| 婷婷六月天激情| 六月丁香激情网| 超碰9| 久久久久人妻| 天天网曰日曰夜夜综合永久免费| 九九视频在线观看视频在线播放69| 亚洲乱码日产精品BD| 九月婷婷在线视频| 久久机热探花| 五月天婷婷色五月天| 婷婷婷五月天最新综合你懂的| 黄色大片又大粗又爽| 色五月婷婷视频| 裸体美女丁香五月天。| 亚洲色网址| 日韩五月婷婷久久| 激情五月天视频| 五月天婷婷青青草| 91久久99久久91熟女精品| 日本人妻伦在线中文字幕 | 亚洲 无码 中文字幕 中出| 欧州色色| 120分钟婬片免费看| 亚洲五月天天| 九九热啪啪| 全部老头和老太XXXXX| 综合超碰熟| 激情综合自拍五月婷婷色五月| 久久亚洲婷婷| 久久九九在线视频| 丁香六月激情综合| 欧美天天搞| 丁香五月aV| 五月婷婷丁香五月| 日本黄色三级片内射| 午夜爱爱网站| 婷婷丁香五月综合激情视频| 99欧美| 99ri在线播放| 狠狠操狠狠干综合| 91九色精品熟女内射| 99久久五月天| 日日懆天天懆| 噜噜狠狠色综无码久久合欧美| 99这里热| 五月精品99综合| 99热 这里只有精品 国产 日韩| 婷婷伊人网| 天天摸夜夜夜| 99ER热精品视频| 色色五月丁香婷婷| www.五月天婷婷| 色欲一区二区三区精品A片| 久热 91| 日韩无码色色| 玖玖91| 亚洲婷婷开心五月| 一级性爱视频| 国产成人高清| 26uuu成人网| 182.t午在线观看| 亚洲色婷婷色| 五月婷视频| 久久婷婷网| 婷婷五月情天| 90色免费视频| 激情五月天之五月婷婷| 丁香五月婷婷色| 九九五月天| 大香蕉欧美在线| 亚州激情九月| 婷婷丁香人妻天天爽| 日韩av免费版| 欧美激情综合色综合色| 亚洲春色奇米影视| 激情五月综合| 可以看的AV| 色99婷婷五月天| 91碰操| 婷婷欧美偷拍综合| 夜夜骑夜夜撸| 日本99视频| 色综合久久久久| 中文无码婷婷| 久久色区| 五月丁香久人妻中文| 丁香婷婷深情五月亚洲| 9热视频在线观看| 亚洲性爱电影| a片在线免费观看一区| 激情小说婷婷五月| 日本在线播放97| 综合综合网| 日本天天色| 色播五月婷婷综合| 亚洲精品又粗又大又爽A片 | 色五月丁香总合网| 极品人妻VIDEOSSS人妻| 五月丁香五月丁香| 欧美性生交A片免费看| renre人人操国产超碰在线| 九九九九精品精| 思思精品久久艹| 婷婷激情五月呦呦| 99久在线精品99re8| 久婷婷五月综合欧美| 毛片新网地| 亚洲 成人 电影av在线观看| 成人丁香| 婷婷五月成人| 国产看真人毛片爱做A片| 五月天五月婷五月激情网| 五月天色色色网| 天天综合网站| 久久婷婷色色| 六月婷婷综合| 热久视频| 成人av播放| 欧美操人| 五月播播| 色色色色综合网| 色九月| 九九这里精品| 1区2区视频| 青青草激情网| 97韩国久久电影院| 黄色激情久久| 亚洲精品V天堂中文字幕| 激情五月综合六月丁香婷婷狠狠干| 91色涩| 五月丁香综合网色欲| 超碰日韩人妻在线| 婷婷色5月激情网| 一本久道综合99| 激情综合五月| 可以免费观看的av| 久久婷婷丁香视频网| 五月丁香色婷婷| 激情性五月天免费小说视频| 一起草Av| 日本在线观看99| 狠狠色噜噜狠狠狠狠综合| 婷婷五月激情基地| 久久丁香综合精品综合| 成人在线网址| 五月婷婷精品无在线| 在线天堂9| 97色伦另类图片小说视频 | 91黄色五月天视频| 91黄址| 色色99色色| 五月婷中文娱乐综合| 99re6久热只有精品6在线直播| 婷婷色五月综合丁香| 9 1 A v久久久| 99热只有| 俺去也五月| 婷婷五月天另类视频| 欧美WW在线网| 性做久久久久久久免费看| 色色色99| 丁香婷婷久久老熟女综合网| 婷婷色色网| www.com在线操视频免费观看| 丁香五月激情性色郤| 婷婷激情五月视频| 99精品视频在线观看| 五月丁香操婷逼| 日日爽天天| 五月丁香网av| 激情丁香社区| 色婷婷五月影院| 五月天综合在线网| 超碰人妻在线| 婷婷久久性爱| 这里只有精9| 黄色三级日本| 超碰色女| 亚洲亚洲永久无码777777| 五月丁香婷婷啪啪| 激情婷婷在线中文字幕| 久久综合伊人综合在线| 久久九九免费视频| 久99热在线观看| 99热费观看| 丁香五月av| 色五月婷婷在线| 亚洲色色香蕉| 婷婷碰碰| 久久99这里只有精品视频| 少妇人妻人伦A片| 激情五月婷色| 六月丁香好婷婷| 欧美槡BBBB槡BBB少妇| 色爱综合网| 久久综合丁香| 亚洲成人综合网在线免费观看| 久久大香蕉同僚| 亚洲天堂aaaa| 91日精品| 久久免费精彩视频| 五月丁香久久丝袜啪啪| 色婷婷社区| 涩丁香91| 丁香五月激情在线| 激情五月九九九| 婷婷十月激情综合网| 性爱技巧五月| 拳交大逼| 婷婷狠狠18禁久久| h亚洲| 五月激情综合网| 婷婷九月| 久久99最新| 99精品国产乱码久久久人妻| 色播丁香婷婷五月激情| 超碰色热| 五月天综合色| 97热这里精品在线视频| 97资源碰碰| 婷婷丁香熟妇综合网| 国产亚洲99久久精品| 婷婷色婷婷| 99九九久久| 伊人久久艹| 97香蕉碰碰人妻国产欧美| eeuus五月婷| 成人午夜视频精品一区| 我要射综合| 国产欧美熟妇另类久久久| 初夜av| 婷婷黄色网| 五月色亚洲| 97视频91| 丁香五月色情| 激情丁香淫荡婷婷| 中文毛片无遮挡高潮免费| 久久伊人日日夜夜| 九九九九这里只有精品| 麻豆忘忧草午夜| 亚洲色婷婷五月天| 狠狠狠婷婷五月综合| 色婷婷六月综合| 五月婷婷深爱六月| 五月综合婷婷五月| 五月丁香婷婷在线| 五月婷婷综合在线| 色婷婷av综合网| 婷婷 伊人 久久| 99日精品视频| 午夜丁香婷婷| 九九九九九九九热| 99爱视频| 激情五月综合| 激情网色五月| 久久99婷婷| 狠狠狠狠狠狠狠狠草| 婷婷五月天激情丁香| 先锋资源91| 色色五月婷婷| 久久九九99.www| 9久精品视频| 日日噜人人人做人| 色色综合日韩| 色综色五月天婷婷| 亚洲色模骚货| 97色女人在线| 六月婷婷中文字幕| 99热综合在线观看| 丁香五月婷婷综合91| 丁香婷婷人妻| 婷婷深爱五月亚洲综合| 亚洲热视频在线| 思思 热 99| 久久66er久久| 婷婷中文字幕| 九一99| 五月天婷婷久草丁香| 97干在线| 狠狠草狠狠草| 丁香婷婷人妻综合网| 亲子乱AV-区二区三区| 色婷婷丁香五月| 婷婷婷婷婷开心无码播放| 激情五月亚洲综合网| 日韩综合网络男女香蕉a片| 激情五月婷婷她| 嫩草AV久久伊人妇女超级A| 9久久精品| 五月激情六月丁香| 婷婷丁香在线播放| 丁香婷婷五月天网站| 狠狠爱五月婷婷| 97热91| 99热97| 一本久道综合色婷婷五月| 玖玖资源站中文| 五月婷婷五月天| 久久综合丁香| 亚欧州精品视频| 久久久这里有精品| 综合久久六月| 狠色狠色综合久久| 99热这里只有精品50| 99精品视频在线免费观看| 婷婷五月色播网| 91九色丨国产丨爆乳| 亚洲狠狠婷婷| 亚洲精品网址| 婷婷五月丁香香蕉| 五月天丁香花婷婷| 久久精品日| 婷婷五月天亚洲综合网| 婷婷五月丁香综合瑟瑟| 激情五月婷婷视频| 99色在线观看视频者| www.97视频| 91九色PORNY肉丝在线| 亚洲精品久久久无码| 亚洲精品色| 中文AV网站| 俺去也五月| 欧美99热| 亚洲妇女熟BBW| 91打屁股免费看| 亚洲日韩成人三级av| 女人被躁到高潮嗷嗷叫小| 国产精品国产成人国产三级| 亚洲亚洲人成综合网络| 99久视频| 天天久综合网永久入口18| 666555。COm毛片| 日韩99无码| 99热在线极品极品| 五月丁香六月婷婷的女人| 日韩成人电影Av| 丁香婷婷色| 久久99婷婷| 丁香五月婷婷综合视频| 丁香五月1页| 欧美激情xxxXX| 99热在线这里| 香蕉婷婷色五月| 激情婷婷六月天| 国产做A爰片毛片A片美国| 99福利视频导航| 99色.com| 激情五月婷婷丁香六月| 99er6| 婷婷五月天六点丁香五月| 这里只有精品无码| 五月丁香啪啪综合| 风流少妇A片一区二区蜜桃| 亚洲a片免费观看| 丁香影院五月综合| 美女黄频aⅴ视频| 久久婷婷六月综合资源| 天天干狠狠艹| 五月天丁香网| 国产无遮挡又黄又爽免费网站| 激情小说五月天| 亚洲精品又粗又大又爽A片| 日噜噜色| 99热碰碰热| 天天操夜夜夜拍拍拍| 天天综合中文| 91超级碰| 久久久99精品免费观看| 一区三区视频有限公司| 亚洲成人色五月天| 玖玖资源站中文| 五月激情六月丁香| 香蕉视频性爱BB做爱| www.91久久| 99精品久久久久久久婷婷久久 | 九九人妻福利| 久久婷婷欧美| 99操逼| 久久九九激情五月天 | 激情五月综合亚洲另类| 婷婷五月天小说| 热热99爱爱| 亚洲人人干| 任你日视频| 五月天婷婷色综合| 婷婷月五天在线在线看| 思思热视频| 日日做A爰片久久毛片A片英语| 亚洲无码色| 成人婷婷| 伊人五月成人| 五月婷婷激情综合| 午夜婷婷| 九九色网| 婷婷综合色色| 开心五月激情婷婷| 大香蕉综合在线| 密着浓厚中出乚交尾GvG935| 这里只有精品视频在线| 色婷婷综合久色AV五色最新| www.1024久久| 超碰免费在线| 俺去也五月天婷婷| 91精品综合久久婷婷九色| 亚洲爆乳无码精品AAA片蜜桃| 天天干天天日日| 丁香五月婷婷99| 中文字幕丰满孑伦无码专区| 亚洲国产色婷婷| 巴基斯坦粉嫰无码视频| WWW,五月| 婷婷久久大香蕉| 婷婷丁香五月亚洲综合网在线视频观看| 我要看激情五月天| 久久精品99国产精品日本| 亚洲av免费在线| 久久与婷婷| 九九丁香社区欧美激情| 婷婷在线播放| 五月丁香在线偷拍视频| 午夜色婷婷| 超碰中文字幕在线| 五月婷婷深深爱| 99热精品观看| 久久这里有精品99| 五月婷丁香花| 久久久亚洲成人无码A片| www色婷婷| 91大神操美女| 四色AVwww| 婷婷五月情色| 久久久WWW| 97久久五月丁香婷婷| 亚洲字幕AV一区二区三区四区| 秋霞三及片| 免费的日逼视频| av在线播放网址| 五月天婷婷丁香人人操91| 777精品久无码人妻蜜桃| 色综合久久综合中文综合网| 色婷婷狠狠18| 东北婷婷五月天| 国产精品久久99| 光棍影院日韩精品| av操B网站| 色色色成人网| 天天爱天天操| 思思re99视频在线观看| 爱草视频在线| 狠狠另类视频| 激情五月婷婷| 婷婷五月天久久久| 色九月婷婷综合| 91热手机在线| 六月婷婷AV| 91狼友视频网页更新| 激情文学综合婷婷五月天丁香花| 日韩久热| 五月婷婷五月天| 99亚州综合精品成人网| 五月天激情网页| 婷婷激情综合网| 婷婷六月综合在线| 激情五月天婷婷激情| 6月丁香婷婷| 91精品婷婷国产综合久久| 五月停停色色丁香| 91丨九色丨高潮丰满日本| 91久久电影| 色噜噜狠狠色综无码久久合欧美 | 五月婷无码| 六月五月丁香五月欧美| 超碰免费在线| 九月丁香| 天堂综合久| 91精品无码久久久久久五月天| 婷婷五月丁香第四色超碰在线| 天天操天天操天天操天天操天天操| 视色综合| 俺去也五月天婷婷| 深情五月天| site:pnnrt.com| 激情小说视频图片| 99热最新| 人妻aV在线| 91人人网| 26uuu精品一区二区| 日本色色网| 成人综合网站| 日本三级99人妇网站| 嫩模草| cao久久| 日本不卡中文字幕| 91Chinese在线| 97五月天婷婷午夜| 丁香六月天色婷婷| 色五狠狠| 丁香六月婷| 午夜九九九九九九九九九九九九九| 丁香六月婷婷一区二区三区| 婷婷五月天AV| 综合久久综合| 99热综合| 成人精品视频99在线观看免费| 色五月婷婷色| 激情久久久| 久久六月婷婷| 九九热在线99| 综合久久婷婷五月丁香| 婷婷五月丁香基| 强伦轩人妻一区二区电影| 丁香五月色五月| 日日操天天操| 99热最新国内| 欧美色碰| a色色片| 天天爽天天摸| 99re热在线视频观看| 丁香六月婷婷久久综合| 久久久全国免费视频| 99re青青草| 五月丁香爱婷婷深深| 激情婷婷综合| 欧美丁香婷婷五月| 夜夜骑夜夜撸| 美国少妇性做爰| 熟女91九色| 狠狠色综合777| 夜夜夜夜夜操| 激情五月天婷婷五月天| 99热综合在线观看| 日韩精品一区二区亚洲AV观看| 五月丁香网站| 丁香五月天激情五月天激情五月天激情网| 性爱网久久| 另类综合婷婷五月天欧美视频| 激情网婷婷婷| 亚洲超碰在线| 国产精女同一区二区三区久| 婷婷色在线播放| 五月丁香999| 天天操夜夜玩!| 夜夜资源站| 久久丁香综合香蕉| 黑人无码一区| 六月婷婷私欲| 激情九月婷婷| 久婷婷视平| 六月丁香啪啪| 激情五月六月婷婷| 激情综合网五月| 99精品久久久久久久久| 女性自慰系列第五页| 五月天社区狠狠| 激情五月天视频| 大香蕉啪啪啪啪啪啪| 久久99热这里只有| 激情六月婷婷| 日韩在线观看网址| 久久久久久久97| 99久久激情视频| 五月天丁香婷婷网| 日日干日日| 99国产精品白浆在线观看免费 | www.99热视频| 天天操综合网| 综合超碰熟| 婷婷综合成人五月天| 九九热精品99| 激情五月天婷婷播播久久综合91| 色色色五月天激情资源| 成人羞羞啪啪 全 视频| 九九色播五月丁香| 亚洲天堂玖玖| 日本欧美国产| 五月婷婷婷婷婷| 1000部毛片A片免费观看| 色射影院| 五月丁香777| 97色 五月天丁香| 婷婷色五月噜噜| 99网99热| 99久| 五月六月激情婷婷| 丁香五月色色| 婷色视频| 就爱射中文字幕资源网| 日本三级日本三级99| 99热这里只有精品1025| 免费视频99| 色和综合网| 婷婷五月天在线观看av| 五月婷婷丁香在线| www.色九月| 九九精品视频在线观看| 性爱激情综合网| 五月天婷亚洲天综合网综合| 九九热最新地址| 亚州第一黄网| 九玖欧洲亚洲| www.97视频| 国产日批视频| 激情欧美五月丁香| 狠狠丁香| 激情视频网址| 免费黄色AV| 日本欧美国产| 久久精品63| 五月天俺去也| 99亚洲天堂| 深爱五月月天| 色色色成人网| 丁香五月天黄色片| 98色花堂98t.R| 丁香五月激情综合婷综| 亚洲国产精品VA在线看黑人| 婷婷综合偷拍| 婷婷午夜天| 日本视频欧美观看免费| 可以看的av网站| 美女xx不卡| 激情五月婷婷六月丁香| 久久182| se99视频| 色婷婷精品视频| 丁香五月婷婷色偷偷| 婷婷五月丁香99| 深爱激情69热| 久久综合婷| 日韩啪| 91久久| 日本久久精品| 色五月视频无码播放| 免费视频在线观看的网站| 97激情五月天| 97日本在线播放| 六月色播| 色婷婷激情四射视频| 色婷婷天堂| www.日本久久videos| 色色色综合| 色五月婷婷大| 国产精品国产成人国产三级| Jh7Uf088VHafNm| 久久视频在线视频| 日韩欧美骚货| 五月色亚洲| 狠狠人妻色综合| 亚洲色婷婷| 亚洲12p| 五月婷婷免费在线视频| 超碰在线免费9| 丁香在线视频| 日日噜狠狠色综合久久| 69精品人妻不卡视频| 成人版视频在线观看| 丁香九月激情| 久久一级AV| 操人妻视频91| AV在线中文| 九九人人操| 狠狠干五月丁香综合网| 一级二级色大片| 丁香五月性爱| 99热中文字幕久久| 中文字幕欧美精品久久| 五月婷婷草| 天天综合色丁香| 丁香影院五月综合| 六月丁香综合| 色丁香综合影院| 久久婷婷的综合色丁香五月| 97在线视频观看| 3p日韩网站视频| 五月婷婷色白丝| 少妇综合网| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 人妻久久婷婷| 午夜丁香婷婷| 综合久久人妻| 91狠狠综合久久久久久| 99精品自拍视频| 九九视频精品在线免费| 国产成人AV在线播放| 国产真人做爰视频免费| 五月六月伦理|