บทความนี้แบ่งปันการใช้งาน Javaweb ของระบบการจัดการข้อมูลนักเรียนสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ฉบับแรก
ไม่มีหน้าเพิ่มเติมสำหรับเวอร์ชันเริ่มต้น เนื่องจากฉันไม่ได้เรียนรู้อะไรมากมายเกี่ยวกับส่วนหน้าอินเทอร์เฟซจึงน่าเกลียด เทคโนโลยีหลัก: JSP, Javabean, Servlet, หน้าหลัก JDBC มีดังนี้:
หน้าเข้าสู่ระบบ
โฮมเพจ
เพิ่มนักเรียน
ดูนักเรียนทุกคน
การสอบถามของนักเรียน
ไดเรกทอรีโครงการ
ฐานข้อมูล
สองตารางตารางผู้ใช้และตารางนักเรียน ในการใช้เครื่องมือ dbutils ให้แน่ใจว่าได้ให้ความสนใจกับการจับคู่ของการตั้งชื่อแอตทริบิวต์ของตารางฐานข้อมูลและวิธีการ Get () และ set () ของ Javabean ตัวอย่างเช่น Uname ในตาราง t_user คือ: uname สตริงส่วนตัว, getUname (), setUname () ใน Javabean
สร้างตาราง T_USER (UID CHAR (32) คีย์หลัก, Uname VARCHAR (40) ไม่ใช่ NULL, UPPASSWORD VARCHAR (40) ไม่ใช่ NULL);
สร้างตาราง T_STUDENT (SID Char (32) คีย์หลัก, Sname Varchar (40) ไม่ใช่ NULL, VARCHAR (6) ไม่ใช่ NULL, ถ่านวันเกิด (10), Tellphone Varchar (15) ไม่ใช่ NULL, อีเมล Varchar (40), คำอธิบาย Varchar (500));
จุดความรู้เล็กน้อย
เข้าสู่ระบบ
เมื่อเข้าสู่ระบบไม่ว่าจะเป็นชื่อผู้ใช้หรือกล่องป้อนรหัสผ่านที่ว่างเปล่าจะถูกตัดสินโดยรหัส JS ของหน้าเข้าสู่ระบบ เมื่อไม่ว่างเปล่าให้สอบถามฐานข้อมูลผ่านข้อมูลชื่อผู้ใช้ หากพบผู้ใช้การเข้าสู่ระบบจะถูกลงชื่อเข้าใช้สำเร็จไม่เช่นนั้นจำเป็นต้องพิจารณาว่าเป็นชื่อผู้ใช้หรือข้อผิดพลาดรหัสผ่าน การทำธุรกรรมนี้ถูกประมวลผลที่เลเยอร์บริการและชั้น DAO มีหน้าที่รับผิดชอบในการค้นหาผู้ใช้ผ่านชื่อผู้ใช้เท่านั้น
รหัสผู้ใช้:
Userservice คลาสสาธารณะ {UserDao ส่วนตัว userDao = ใหม่ userDao (); แบบสอบถามผู้ใช้สาธารณะ (แบบฟอร์มผู้ใช้) โยนข้อยกเว้น {ผู้ใช้ user = userDao.Query (แบบฟอร์ม); // ไม่พบผู้ใช้หาก (user == null) {โยนข้อยกเว้นใหม่ ("ชื่อผู้ใช้ไม่มีอยู่"); } // พบผู้ใช้ แต่รหัสผ่านไม่ตรงกันถ้า (! form.getUpassword (). Equals (user.getupassword ()))) {โยนข้อยกเว้นใหม่ ("ข้อผิดพลาดรหัสผ่าน"); } return user; -ตัวกรองตัวกรอง
เพื่อป้องกันไม่ให้ผู้ใช้ที่ไม่ได้ลงชื่อเข้าใช้ไม่สามารถเข้าถึงหน้าอื่นได้โดยตรงจำเป็นต้องมีตัวกรอง วางหน้าทั้งหมดนอกหน้าเข้าสู่ระบบแยกกันในโฟลเดอร์ผู้ใช้ เมื่อผู้ใช้เข้าสู่ระบบสำเร็จให้บันทึกข้อมูลของผู้ใช้ในคุณสมบัติ "SessionUser" ของเซสชัน ตัวกรองกำหนดว่าคุณสมบัตินี้จะว่างเปล่าหรือไม่ หากว่างเปล่าหมายความว่าการเข้าสู่ระบบของผู้ใช้นั้นไม่ประสบความสำเร็จและจะไม่ปล่อย ไปที่หน้าเข้าสู่ระบบโดยตรง หากไม่ว่างเปล่าให้ปล่อยมัน รหัสหลักของตัวกรอง:
โมฆะสาธารณะ Dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, ห่วงโซ่ FilterChain) พ่น IOException, servletexception {// 1 รับเซสชัน // 2 ตรวจสอบว่ามีผู้ใช้ในเซสชันหรือไม่ ถ้าเป็นเช่นนั้นปล่อย // 3 มิฉะนั้นไปที่หน้าเข้าสู่ระบบ httpservletrequest req = (httpservletrequest) คำขอ; ผู้ใช้ผู้ใช้ = (ผู้ใช้) req.getSession (). getAttribute ("sessionUser"); if (user! = null) {chain.dofilter (คำขอ, การตอบกลับ); } else {httpservletResponse resp = (httpservletResponse) การตอบสนอง; resp.sendredirect (req.getContextPath () + "/index.jsp"); -แบบสอบถามชุดค่าผสมหลายเงื่อนไข
ในหน้าการค้นหาขั้นสูงมีสี่ตัวเลือกให้เลือก: ชื่อนักเรียนเพศหมายเลขโทรศัพท์มือถือและที่อยู่อีเมล เงื่อนไขทั้งสี่สามารถจัดและรวมกันโดยพลการ ฉันพบปัญหานี้ก่อนที่จะเขียนโครงการ QT ฉันใช้คำสั่ง SQL ในเวลานั้น แต่ฉันไม่ได้คาดหวังว่าการใช้ "โดยที่ 1 = 1" จะลำบากมาก รหัสต่อไปนี้เป็นแบบคลาสสิกและใช้การสืบค้นฟัซซี่เพื่อให้การค้นหามีมนุษยธรรมมากขึ้น
รายการสาธารณะ <student> แบบสอบถาม (นักเรียน S) {ลอง {StringBuilder SQL = ใหม่ StringBuilder ("เลือก * จาก t_student โดยที่ 1 = 1"); รายการ <jobch> params = new ArrayList <Object> (); ถ้า (s.getSname ()! = null &&! s.getSname (). trim (). isempty ()) {sql.append ("และ sname ชอบ?"); params.add ("%" + s.getSname () + "%"); } if (s.getGender ()! = null &&! s.getGender (). trim (). isempty ()) {sql.append ("และเพศ =?"); params.add (s.getGender ()); } if (s.getTellphone ()! = null &&! s.getTellphone (). trim (). isempty ()) {sql.append ("และ tellphone ชอบ?"); params.add ("%" + s.getTellphone () + "%"); } if (s.getEmail ()! = null &&! s.getEmail (). trim (). isempty ()) {sql.append ("และอีเมลเช่น?"); params.add ("%" + s.getEmail () + "%"); } return qr.Query (sql.toString (), ใหม่ Beanlisthandler <student> (student.class), params.toarray ()); } catch (exception e) {โยน runtimeException ใหม่ (e); -Evolution Edition: Pagination
แสดงหน้าสอบถามเพื่อให้สวยงามยิ่งขึ้น หน้าเป็นเช่น: หน้าแรกหน้าแรกหน้าก่อนหน้า 1 2 3 4 5 6 7 8 9 10 หน้าถัดไปหน้าสุดท้าย
เอฟเฟกต์การแบ่งหน้ามีดังนี้:
ข้อมูลที่จำเป็นสำหรับการปนเปื้อน:
หน้าปัจจุบัน: PageCode
หน้ารวม: TotalPage
จำนวนบันทึกทั้งหมด: TotalRecord
จำนวนระเบียนต่อหน้า: PAGESIZE
ข้อมูลหน้าปัจจุบัน: Beanlist
หน้าเว็บ
เนื่องจากข้อมูลเพจเหล่านี้จะต้องถูกส่งกลับไปกลับมาระหว่างเลเยอร์เสมอ! เราห่อหุ้มข้อมูลเพจเหล่านี้ลงใน Javabean ซึ่งเรียกว่าถั่วเพจเช่น Pagebean เมื่อใช้แบบสอบถามหลายเงื่อนไขและคลิกที่หน้า 2 ไฮเปอร์ลิงก์ในหน้า 2 ไม่มีเงื่อนไขการสืบค้นและเงื่อนไขการสืบค้นจะหายไปดังนั้นเราจำเป็นต้องรักษาเงื่อนไขการสืบค้นบนลิงก์ทั้งหมดในหน้า! เราต้องการบันทึกเงื่อนไขเป็นสตริงไปยัง URL ของ PageBean!
รหัสมีดังนี้:
คลาสสาธารณะ Pagebean <t> {Private Integer PageCode; // หมายเลขหน้าปัจจุบันจำนวนเต็มส่วนตัว pageSize; // ขนาดข้อมูลต่อหน้าจำนวนเต็มส่วนตัว TotalRecord; // บันทึกรวมทั้งหมด <t> beanlist; // บันทึกของหน้าปัจจุบันถูกกำหนดเป็นทั่วไป เพื่อที่จะใช้ URL สตริงส่วนตัวโดยตรงในอนาคต // เงื่อนไขหลังจาก URL รวมกันในหลายเงื่อนไข // ส่งคืนจำนวนหน้าทั้งหมดของจำนวนเต็มสาธารณะ getTotalPage () {int tp = totalRecord/pagesize; ส่งคืน TotalRecord%PAGESIZE == 0? TP: TP+1; } ... // The Get, Set Method ของแอตทริบิวต์ ... }การประมวลผลการเพจในแต่ละชั้น
หน้า JSP: แสดงข้อมูลการแสดงผลและ "หน้า N/Total M หน้าก่อนหน้าหน้า 1 2 3 4 5 6 7 8 9 10 หน้าถัดไปหน้าสุดท้าย"; ผ่าน Pagecode ไปยัง Servlet
Servlet: สร้างวัตถุ PageBean กำหนดค่าให้กับแอตทริบิวต์ทั้งหมดของ PageBean จากนั้นผ่าน PageCode และ Pagesize ไปยัง Dao Layer; ยอมรับวัตถุ PageBean ที่ส่งคืนโดย DAO บันทึกไปยังฟิลด์คำขอและกลับไปที่หน้า
บริการ: ทำหน้าที่เป็นคนกลางไม่จำเป็นต้องดำเนินการธุรกรรม
DAO: รับ PageCode และ PageSize สร้างวัตถุ PageBean สอบถามฐานข้อมูลเพื่อรับ TotalRecord และ Beanlist และส่งคืน PageBean
รหัสสำหรับการประมวลผลหน้า JSP หน้า:
<enter> หน้า $ {pb.pageCode} หน้า/ทั้งหมด $ {pb.totalpage} หน้า <a href = "$ {pb.url} & pc = 1" rel = "external nofollow"> หน้าแรก </a> <c: ถ้า test = "$ {pb.pagecode> 1}" } & pc = $ {pb.pageCode-1} "rel =" external nofollow "> หน้าก่อนหน้า </a> </c: ถ้า> <!-การคำนวณหมายเลขหน้าเริ่มต้น-> <c: เลือก> <c: เมื่อทดสอบ =" $ {pb.totalPage <= 10} " value = "$ {pb.totalpage}"> </c: set> </c: เมื่อ> <c: มิฉะนั้น> <%-สูตรการคำนวณ-%> <c: set var = "เริ่มต้น" value = "$ {pb.pageCode-5}"> </c: set> <c: set var = "end" Header Overflow-%> <c: ถ้า test = "$ {เริ่มต้น <1}"> <c: set var = "เริ่มต้น" value = "1"> </c: set> <c: set var = "end" value = "10"> </c: set> </c: if> <%-tail overflow- value = "$ {pb.totalpage-9}"> </c: set> <c: set var = "end" value = "$ {pb.totalpage}"> </c: set> </c: ถ้า> </c: "เริ่มต้น" } "> <c: เลือก> <c: เมื่อ test =" $ {i eq pb.pageCode} "> [$ {i}] </c: เมื่อ> <c: มิฉะนั้น> <a href =" $ {pb.url} & pc = $ {i} "> [$ {i} test = "$ {pb.pageCode <pb.totalpage}"> <a href = "$ {pb.url} & pc = $ {pb.pagecode+1}"> หน้าถัดไป </a> </c: if> <a href = "$ {pb.url} หน้า </a> </enter>รหัสแบบสอบถามชุดค่าผสมหลายเงื่อนไขหลังจากเพิ่มการแบ่งแยก
Public PageBean <student> Query (นักเรียน S, Int PC, Int PS) {ลอง {PageBean <student> PB = New PageBean <student> (); PB.SetPageCode (PC); Pb.setPagesize (PS); /** สอบถามบันทึกทั้งหมด*/ stringbuilder numsql = new StringBuilder ("เลือกนับ (*) จาก t_student"); StringBuilder wheresql = new StringBuilder ("โดยที่ 1 = 1"); รายการ <jobch> params = new ArrayList <Object> (); if (s.getSname ()! = null &&! s.getSname (). trim (). isempty ()) {wheresql.append ("และ sname ชอบ?"); params.add ("%" + s.getSname () + "%"); } if (s.getGender ()! = null &&! s.getGender (). trim (). isempty ()) {wheresql.append ("และเพศ =?"); params.add (s.getGender ()); } if (s.getTellphone ()! = null &&! s.getTellphone (). trim (). isempty ()) {wheresql.append ("และ tellphone ชอบ?"); params.add ("%" + s.getTellphone () + "%"); } if (s.getEmail ()! = null &&! s.getEmail (). trim (). isempty ()) {wheresql.append ("และอีเมลเช่น?"); params.add ("%" + s.getEmail () + "%"); } หมายเลขหมายเลข = (หมายเลข) qr.Query (numsql.append (wheresql) .toString (), scalarhandler ใหม่ (), params.toarray ()); int totalRecord = number.intValue (); pb.settotalrecord (TotalRecord); / * * รับชุดผลลัพธ์ beanlist */ stringbuilder sql = ใหม่ stringbuilder ("เลือก * จาก t_student"); StringBuilder LimitsQl = ใหม่ StringBuilder ("Limit?,?"); params.add ((pc-1)*ps); params.add (ps); รายการ <student> นักเรียน = qr.Query (sql.append (wheresql) .append (limitsql) .tostring (), ใหม่ Beanlisthandler <student> (นักเรียน. class), params.toarray ()); PB.SetBeanList (นักเรียน); กลับ PB; } catch (exception e) {โยน runtimeException ใหม่ (e); -สำหรับสื่อการเรียนรู้เพิ่มเติมโปรดให้ความสนใจกับหัวข้อพิเศษ "การพัฒนาระบบการจัดการ"
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น