ด้านล่างเราจะแนะนำรหัสตัวอย่างของ Javaweb เพื่อใช้ฟังก์ชั่นการเข้าสู่ระบบของผู้ใช้และฟังก์ชั่นการลงทะเบียนผ่านรูปภาพและข้อความ มาดูกันเถอะ
1. บทนำสู่ Servlet+JSP+Javabean Development Model (MVC)
Servlet+JSP+Javabean Mode (MVC) เหมาะสำหรับการพัฒนาเว็บแอปพลิเคชันที่ซับซ้อน ในโหมดนี้ Servlets มีหน้าที่ในการประมวลผลคำขอผู้ใช้ JSP รับผิดชอบการแสดงข้อมูลและ Javabean รับผิดชอบการห่อหุ้มข้อมูล โปรแกรมโหมด servlet+jsp+javabean มีระดับที่ชัดเจนระหว่างโมดูลและแนะนำให้ใช้การพัฒนาเว็บเพื่อใช้โหมดนี้
ที่นี่เราใช้โปรแกรมลงทะเบียนเข้าสู่ระบบผู้ใช้ที่ใช้กันมากที่สุดเพื่ออธิบายรูปแบบการพัฒนา Servlet+JSP+Javabean ผ่านกรณีที่ครอบคลุมโปรแกรมการลงทะเบียนผู้ใช้นี้เราเชื่อมต่อจุดความรู้ของ XML, XPath, Servlet และ JSP ที่เราได้เรียนรู้มาก่อน
2. สร้างโครงการเว็บด้วยสถาปัตยกรรม MVC
สร้างโครงการ WebMVCFramework ใหม่ใน MyECLIPSE นำเข้าแพ็คเกจการพัฒนา (แพ็คเกจ JAR) ที่ต้องการโดยโครงการและสร้างแพ็คเกจที่ต้องการโดยโครงการ ในการพัฒนา Java ระดับสถาปัตยกรรมจะสะท้อนในรูปแบบของแพ็คเกจ
| แพ็คเกจการพัฒนา (แพ็คเกจ JAR) ที่ต้องการโดยโครงการ | ||
| หมายเลขซีเรียล | ชื่อแพ็คเกจการพัฒนา | อธิบาย |
| 1 | dom4j-1.6.1.jar | DOM4J ใช้เพื่อจัดการไฟล์ XML |
| 2 | jaxen-1.1-beta-6.jar | ใช้ในการแยกวิเคราะห์การแสดงออกของ XPath |
| 3 | Commons-Beanutils-1.8.0.jar | คลาสเครื่องมือสำหรับการประมวลผลวัตถุถั่ว |
| 4 | Commons-logging.jar | แพ็คเกจการพึ่งพา พัสดุ |
| 5 | jstl.jar | ไลบรารีแท็ก JSTL และแพ็คเกจการพึ่งพานิพจน์ EL |
| 6 | Standard.jar | ไลบรารีแท็ก JSTL และแพ็คเกจการพึ่งพานิพจน์ EL |
สถาปัตยกรรมโครงการ Javaweb ที่ดีควรมีแพ็คเกจ 11 แพ็คเกจสูงกว่าซึ่งทำให้ชัดเจนและความรับผิดชอบระหว่างแต่ละเลเยอร์ที่ชัดเจน เมื่อสร้างสถาปัตยกรรมโครงการ Javaweb ให้สร้างแพ็คเกจตามลำดับ 1 ถึง 11 ด้านบน: โดเมน→ Dao → Dao.impl →บริการ→ Service.impl → Web.Controller → Web.ui → Web.filter → Web.Listener → Util → Junit.test เมื่อระดับแพ็คเกจถูกสร้างขึ้นแล้วสถาปัตยกรรมโครงการจะถูกกำหนด แน่นอนในการพัฒนาโครงการจริงอาจไม่ได้ขึ้นอยู่กับ
| แพ็คเกจที่จำเป็นสำหรับโครงการ | |||
| หมายเลขซีเรียล | ชื่อแพ็คเกจ | อธิบาย | ระดับ |
| 1 | me.gacl.domain | คลาส Javabean ที่เก็บระบบ (มีเฉพาะแอตทริบิวต์ที่ง่ายและรับและตั้งค่าวิธีการที่สอดคล้องกับแอตทริบิวต์และไม่รวมวิธีการประมวลผลทางธุรกิจเฉพาะ) ที่ให้กับ [เลเยอร์การเข้าถึงข้อมูล], [เลเยอร์การประมวลผลธุรกิจ] และ [Web Layer] สำหรับการใช้งาน | เลเยอร์โดเมน (โมเดลโดเมน) |
| 2 | me.gacl DAO | คลาสอินเตอร์เฟสการดำเนินการที่จัดเก็บการเข้าถึงฐานข้อมูล | เลเยอร์การเข้าถึงข้อมูล |
| 3 | me.gacl dao.impl | คลาสการใช้งานที่จัดเก็บอินเทอร์เฟซการทำงานที่เข้าถึงฐานข้อมูล | |
| 4 | me.gacl บริการ | จัดเก็บคลาสอินเทอร์เฟซระบบธุรกิจ | เลเยอร์การประมวลผลทางธุรกิจ |
| 5 | me.gacl Service.impl | คลาสการใช้งานสำหรับการจัดเก็บอินเทอร์เฟซระบบการประมวลผลทางธุรกิจ | |
| 6 | me.gacl Web.Controller | Servlets เก็บไว้เป็นตัวควบคุมระบบ | เว็บเลเยอร์ (เลเยอร์การนำเสนอ) |
| 7 | me.gacl.web.ui | Servlets (UI หมายถึงส่วนต่อประสานผู้ใช้) ที่ให้ส่วนต่อประสานผู้ใช้สำหรับผู้ใช้ | |
| 8 | me.gacl.web.filter | ตัวกรองที่ใช้สำหรับระบบจัดเก็บข้อมูล | |
| 9 | me.gacl.web.listener | ผู้ฟัง ใช้ในการจัดเก็บระบบ | |
| 10 | me.gacl .util | เครื่องมือทั่วไปสำหรับการจัดเก็บระบบที่ให้กับ [เลเยอร์การเข้าถึงข้อมูล], [เลเยอร์การประมวลผลธุรกิจ] และ [เว็บเลเยอร์] สำหรับใช้งาน | |
| 11 | Junit.test | คลาสทดสอบสำหรับการจัดเก็บระบบ | |
ดังที่ได้กล่าวไว้ข้างต้นเราสร้างลำดับชั้นของแพ็คเกจ แต่ขึ้นอยู่กับสถานการณ์จริงของโครงการเราอาจต้องสร้างมันขึ้นมา
กระเป๋าของเขาขึ้นอยู่กับความต้องการของโครงการ
ภายใต้ไดเรกทอรี SRC (ไดเรกทอรีหมวดหมู่) สร้างไฟล์ XML (db.xml) สำหรับการบันทึกข้อมูลผู้ใช้ (db.xml)
สร้างไดเรกทอรีหน้าในไดเรกทอรี Web-Inf ไดเรกทอรีหน้าจัดเก็บหน้า JSP ที่ได้รับการป้องกันบางส่วนของระบบ (ไม่อนุญาตให้ผู้ใช้เข้าถึงโดยตรงผ่านที่อยู่ URL) หากผู้ใช้ต้องการเข้าถึงหน้า JSP ที่ได้รับการป้องกันเหล่านี้พวกเขาสามารถใช้ servlet ในแพ็คเกจ me.gacl.web.ui ได้เฉพาะ
โครงการที่สร้างขึ้นจะแสดงในรูปต่อไปนี้ (รูปที่ 1):
รูปที่ 1
3. การเขียนรหัสของสถาปัตยกรรมลำดับชั้น
รหัสของสถาปัตยกรรมแบบลำดับชั้นยังเขียนตามลำดับของ [Domain Model Layer (โดเมน)] → [Layer Access Data (Dao, Dao.impl)] → [ชั้นการประมวลผลทางธุรกิจ (บริการ, service.impl) → [expression layer (web.controller, web.ui, web.filter, web.listener) (junit.test)]
3.1. พัฒนาเลเยอร์โดเมน
สร้างคลาสผู้ใช้ภายใต้แพ็คเกจ me.gacl.domain
รหัสเฉพาะของคลาสผู้ใช้มีดังนี้:
แพ็คเกจ me.gacl.domain; นำเข้า java.io.serializable; นำเข้า java.util.date;/*** @author gacl*คลาสเอนทิตีของผู้ใช้*/ผู้ใช้ระดับสาธารณะใช้ {ส่วนตัวคงที่ผู้ใช้ วันเกิดของผู้ใช้วันเกิดวันเกิด; สตริงสาธารณะ getId () {return id;} โมฆะสาธารณะ setId (รหัสสตริง) {this.id = id;} สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้;} โมฆะสาธารณะ setUserName (สตริงผู้ใช้) {this.userName = username; {this.userpwd = userpwd;} สตริงสาธารณะ getEmail () {return email;} โมฆะสาธารณะ setemail (อีเมลสตริง) {this.email = อีเมล;} วันที่สาธารณะ getBirthday () {คืนวันเกิด;} โมฆะสาธารณะ setBirthday (วันเกิดวันเกิด)3.2. พัฒนาเลเยอร์การเข้าถึงข้อมูล (dao, dao.impl)
สร้างคลาสอินเตอร์เฟส iuserdao ภายใต้แพ็คเกจ me.gacl.dao สำหรับคลาสอินเทอร์เฟซการพัฒนาฉันคุ้นเคยกับการใช้ตัวอักษร I เป็นคำนำหน้าของชั้นเรียนเพื่อให้คุณสามารถเห็นได้อย่างรวดเร็วว่าคลาสปัจจุบันเป็นอินเทอร์เฟซซึ่งเป็นนิสัยการพัฒนาที่ดี โดยการดูชื่อคลาสคุณสามารถแยกแยะความแตกต่างได้อย่างง่ายดายว่าเป็นอินเทอร์เฟซหรือคลาสการใช้งานเฉพาะ
รหัสเฉพาะของอินเทอร์เฟซ IUSERDAO มีดังนี้:
แพ็คเกจ me.gacl.dao; นำเข้า me.gacl.domain.user; อินเทอร์เฟซสาธารณะ iuserdao {/*** ค้นหาผู้ใช้ตามชื่อผู้ใช้และรหัสผ่าน* @param ชื่อผู้ใช้* @param userpwd* @@return ผู้ใช้พบผู้ใช้*/ผู้ใช้ ชื่อ* @param ชื่อผู้ใช้* @return ผู้ใช้พบ*/ผู้ใช้ค้นหา (ชื่อผู้ใช้สตริง);}สำหรับคำจำกัดความของวิธีการในอินเทอร์เฟซสิ่งนี้สามารถวิเคราะห์ได้เฉพาะวิธีการที่จะต้องกำหนดตามธุรกิจเฉพาะ อย่างไรก็ตามไม่ว่าธุรกิจจะซับซ้อนแค่ไหนก็ไม่สามารถแยกออกจากการดำเนินการ CRUD ขั้นพื้นฐาน (การเพิ่มการลบการปรับเปลี่ยนและการสืบค้น) เลเยอร์ DAO โต้ตอบโดยตรงกับฐานข้อมูลดังนั้นส่วนต่อประสาน DAO Layer โดยทั่วไปมีวิธีการที่เกี่ยวข้องสี่วิธีสำหรับการเพิ่มการลบการปรับเปลี่ยนและการสืบค้น
สร้างคลาส userdaoimpl ภายใต้แพ็คเกจ me.gacl.dao.impl
คลาส UserDaoImpl เป็นคลาสการใช้งานเฉพาะของอินเตอร์เฟส IUSERDAO สำหรับ วิธีการตั้งชื่อของคลาสการใช้งานของอินเทอร์เฟซฉันใช้ในการตั้งชื่อในรูปแบบของ "ชื่ออินเทอร์เฟซ (ลบคำนำหน้า i) + impl" หรือ "ชื่ออินเตอร์เฟส + Impl": iuserdao (อินเตอร์เฟส) → UserDaoimpl (คลาสการใช้งาน) นี่เป็นนิสัยการเขียนโปรแกรมส่วนบุคคล รหัสส่วนใหญ่ที่ฉันเห็นมักจะตั้งชื่อคลาสการใช้งานเฉพาะของอินเทอร์เฟซในหนึ่งในสองรูปแบบเหล่านี้ อย่างไรก็ตามคุณต้องสามารถดูคลาสการใช้งานที่สอดคล้องกับอินเทอร์เฟซได้อย่างรวดเร็ว
รหัสเฉพาะของคลาส userdaoimpl มีดังนี้:
แพ็คเกจ me.gacl.dao.impl; นำเข้า java.text.simpledateFormat; นำเข้า org.domj.document; นำเข้า org.domj.element; นำเข้า me.gacl.dao.iuserdao; นำเข้า me.gacl.domain.user; GACL*/คลาสสาธารณะ UserDaoImpl ใช้ iUserDao {@OverridEpublic ผู้ใช้ค้นหา (ชื่อผู้ใช้สตริง, สตริง userpwd) {ลอง {เอกสารเอกสาร = xmlutils.getDocument (); // ใช้นิพจน์ XPath @userpwd = '"+userpwd+"'] "); ถ้า (e == null) {return null;} ผู้ใช้ผู้ใช้ = ใหม่ user (); user.setId (e.attributeValue ("id")); user.setEmail (e.attributeValue ("อีเมล")); user.setUserpwd (e.attributeValue ("userpwd")) SimpledateFormat ("yyyy-mm-dd"); user.setBirthday (sdf.parse (เกิด)); return user;} catch (exception e) {โยน runtimeException ใหม่ (e);}}@suppresswarnings ("deprecation")@overridepublic void add ({{{{{{{{try {try deprecation document.getRootelement (); Element user_node = root.addelement ("ผู้ใช้"); // สร้างโหนดผู้ใช้และแขวนไว้ที่ rootuser_node.setAttributeValue ("id", user.getId ()); user_node.setAttributeValue ("ชื่อผู้ใช้", user.getUserName ()); user_node.setattributeValue ("userpwd" user.getEmail ()); SimpledateFormat SDF = New SimpledateFormat ("yyyy-mm-dd"); user_node.setattributeValue ("วันเกิด", sdf.format (user.getBirthday ()); xmlutils.writexml runtimeException (e);}}@ผู้ใช้ overridepublic ค้นหา (ชื่อผู้ใช้สตริง) {ลอง {document document = xmlutils.getDocument (); องค์ประกอบ e = (องค์ประกอบ) document.selectsingLenode ("// ผู้ใช้ [@username = '"+username+"]") user (); user.setId (e.attributeValue ("id")); user.setEmail (e.attributeValue ("อีเมล")); user.setUserpwd (e.attributeValue ("userpwd")) SimpledateFormat ("yyyy-mm-dd"); user.setBirthday (sdf.parse (เกิด)); return user;3.3. เลเยอร์บริการพัฒนา (เลเยอร์บริการให้บริการธุรกิจทั้งหมดไปยัง Web Layer)
สร้างคลาสอินเตอร์เฟส iuserService ในแพ็คเกจ me.gacl.service
รหัสเฉพาะของอินเทอร์เฟซ IUSERSERVICE มีดังนี้:
แพ็คเกจ me.gacl.service; นำเข้า me.gacl.domain.user; นำเข้า me.gacl.exception.userexistexception; อินเตอร์เฟสสาธารณะ iuserservice {/*** ให้บริการลงทะเบียน* @param ผู้ใช้* @throws userexistexception*/void registeruser @return*/ผู้ใช้ LogginUser (ชื่อผู้ใช้สตริง, สตริง userpwd);}สร้างคลาส UserserViceImpl ในแพ็คเกจ me.gacl.service.impl
คลาส UserserViceImpl เป็นคลาสการใช้งานเฉพาะของอินเตอร์เฟส IUSERSERVICE รหัสเฉพาะมีดังนี้:
แพ็คเกจ me.gacl.service.impl; นำเข้า me.gacl.dao.iuserdao; นำเข้า me.gacl.dao.impl.userdaoimpl; นำเข้า me.gacl.domain.user; นำเข้า me.gacl.exception.userexistexception; iuserdao userdao = ใหม่ userdaoimpl ();@overridepublic void registeruser (ผู้ใช้ผู้ใช้) โยน userexistexception {ถ้า (userdao.find (user.getUserName ())! = null) {// ตรวจสอบข้อยกเว้น userexistexception ("ชื่อผู้ใช้ที่ลงทะเบียนแล้วมีอยู่แล้ว !!!");} userdao.add (ผู้ใช้);}@overridepublic ผู้ใช้ LogginUser (String username, string userpwd) {return userdao.find (ชื่อผู้ใช้, userpwd);}}}}}}}3.4. พัฒนาเว็บเลเยอร์
3.4.1. พัฒนาฟังก์ชั่นการลงทะเบียน
1. เขียน registeruiservlet ภายใต้แพ็คเกจ me.gacl.web.ui เพื่อให้อินเทอร์เฟซการลงทะเบียนสำหรับผู้ใช้
หลังจากได้รับคำขอผู้ใช้แล้ว registeruiservlet จะกระโดดไปที่ register.jsp
รหัสของ registeruiservlet มีดังนี้:
แพ็คเกจ me.gacl.web.ui; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletRequest; GACL* servlet ที่ให้ผู้ใช้กับอินเทอร์เฟซผู้ใช้ที่ลงทะเบียน* registeruiservlet มีหน้าที่รับผิดชอบในการส่งออกอินเทอร์เฟซการลงทะเบียนสำหรับผู้ใช้* เมื่อผู้ใช้เข้าถึง registeruiservlet มันจะกระโดดไปยังหน้า register.jsp ในไดเร็กทอรี Web-inf/pages ServleTexception, iOexception {request.getRequestDispatcher ("/web-inf/pages/register.jsp"). ไปข้างหน้า (คำขอ, การตอบสนอง);} โมฆะสาธารณะ dopost (httpservletrequest Request2. เขียนผู้ใช้ที่ลงทะเบียน jsp page register.jsp ใน/web-inf/pages/directory
หน้า JSP ใด ๆ ที่อยู่ในไดเรกทอรี Web-Inf ไม่สามารถเข้าถึงได้โดยตรงผ่านที่อยู่ URL
ในระหว่างการพัฒนาหากมีแหล่งข้อมูลเว็บที่ละเอียดอ่อนในโครงการที่ไม่ต้องการเข้าถึงโดยตรงจากโลกภายนอกคุณสามารถพิจารณาวางแหล่งข้อมูลเว็บที่ละเอียดอ่อนเหล่านี้ลงในไดเรกทอรี Web-Inf เพื่อให้โลกภายนอกสามารถห้ามไม่ให้เข้าถึงผ่าน URL ได้โดยตรง
รหัสของหน้า register.jsp มีดังนี้:
<%@ page language = "java" pageencoding = "utf-"%> <! doctype html> <html> <head> <title> การลงทะเบียนผู้ใช้ </title> </head> <body style = "text-align: center;"> <form action = "$ {pagecontext.request. method = "post"> <table> <tr> <td> ชื่อผู้ใช้ </td> <td> <อินพุต type = "text" name = "ชื่อผู้ใช้"> </td> </tr> <tr> <td> รหัสผ่าน </td> <td> name = "confainpwd"> </td> </tr> <tr> <td> อีเมล </td> <td> <อินพุต type = "text" name = "email"> </td> </tr> <tr> <td> วันเกิด </td> <td> value = "clear"> </td> <td> <อินพุต type = "subment" value = "register"> </td> </tr> </table> </form> </body> </html> <form action = "$ {pageContext.request.contextpath}/servlet/registerServlet" method = "post"> ใน register.jsp ระบุว่าแบบฟอร์มถูกส่งและส่งไปยัง RegisterServlet สำหรับการประมวลผล
3. เขียน RegisterServlet สำหรับการจัดการการลงทะเบียนผู้ใช้ภายใต้แพ็คเกจ me.gacl.web.controller
RegisterServlet ทำหน้าที่รับผิดชอบต่อไปนี้:
1. รับข้อมูลแบบฟอร์มที่ส่งโดยไคลเอนต์ไปยังเซิร์ฟเวอร์
2. ตรวจสอบความถูกต้องตามกฎหมายของข้อมูลแบบฟอร์ม หากการตรวจสอบล้มเหลวให้ข้ามกลับไปที่ register.jsp และสะท้อนข้อความแสดงข้อผิดพลาด
3. หากผ่านการตรวจสอบให้โทรหาเลเยอร์บริการเพื่อลงทะเบียนผู้ใช้ด้วยฐานข้อมูล
เพื่ออำนวยความสะดวกให้กับการลงทะเบียนเพื่อรับข้อมูลแบบฟอร์มและข้อมูลการตรวจสอบฉันได้ออกแบบ registerFormbean สำหรับการตรวจสอบข้อมูลแบบฟอร์มลงทะเบียนจากนั้นเขียนคลาสเครื่องมือ WebUtils เพื่อห่อหุ้มข้อมูลแบบฟอร์มที่ส่งโดยลูกค้าลงในฟอร์มเบียน
สร้าง registerFormbean สำหรับการตรวจสอบข้อมูลแบบฟอร์มการลงทะเบียนภายใต้แพ็คเกจ me.gacl.web.formbean
รหัส registerformbean มีดังนี้:
แพ็คเกจ me.gacl.web.formbean; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า org.apache.commons.beanutils.locale.converters.datelocaleconverter;/*** รายการอินพุตแบบฟอร์มใน register.jsp* ความรับผิดชอบของ registerFormbean ไม่เพียง แต่รับผิดชอบในการรับค่าของรายการอินพุตแบบฟอร์มใน register.jsp แต่ยังทำหน้าที่เป็นความถูกต้องตามกฎหมายของค่าของรายการอินพุตแบบฟอร์ม* @author gacl **/คลาสสาธารณะ name = "username"/> private string username; // <input type = "password" name = "userpwd"/> สตริงส่วนตัว userpwd; // <input type = "รหัสผ่าน" name = "convainpwd"/> สตริงส่วนตัวยืนยัน pwd; // <อินพุตประเภท = "ข้อความ" การตรวจสอบล้มเหลว*/แผนที่ส่วนตัว <สตริง, สตริง> ข้อผิดพลาด = ใหม่ hashmap <สตริง, สตริง> (); แผนที่สาธารณะ <สตริง, สตริง> getERrors () {return errors;} โมฆะสาธารณะ seterrors (แผนที่ <สตริง, สตริง> ข้อผิดพลาด) {this.errors = ข้อผิดพลาด ชื่อผู้ใช้ไม่สามารถว่างเปล่าและถ้าเป็น - ตัวอักษร abcdabcd * สตริงส่วนตัว userpwd; รหัสผ่านไม่สามารถว่างเปล่าและถ้าเป็น - หมายเลข * สตริงส่วนตัวยืนยันตัวยืนยัน; รหัสผ่านจะต้องเหมือนกับอีเมลสตริงส่วนตัวสองครั้ง * อาจว่างเปล่าไม่ว่างเปล่าหากเป็นกล่องจดหมายทางกฎหมาย* วันเกิดสตริงส่วนตัว มันอาจว่างเปล่าไม่ว่างเปล่าถ้าเป็นวันที่ถูกกฎหมาย*/บูลีนสาธารณะตรวจสอบ () {บูลีน isok = true; ถ้า (this.username == null || this.username.trim (). เท่ากับ (")) {isok = false; (! this.username.matches ("[a-za-z] {,}")) {isok = false; errors.put ("ชื่อผู้ใช้", "ชื่อผู้ใช้ต้องเป็นจดหมายของ -bit !!");}} ถ้า FALSE; errors.put ("userpwd", "รหัสผ่านไม่สามารถว่างเปล่าได้ !!");} else {ถ้า (! this.userpwd.matches ("// d {,}")) {isok = false; errors.put ("userpwd" รหัสผ่านจะต้องเหมือนกันเมื่อสองครั้งคือ (this.confirmpwd! = null) {ถ้า (! this.confirmpwd.equals (this.userpwd)) {isok = false; iscrors.put ("ยืนยัน", รหัสผ่านไม่สอดคล้องกัน มันอาจว่างเปล่าไม่ใช่โมฆะ ถ้าเป็นอีเมลทางกฎหมายถ้า (this.email! = null &&! this.email.trim (). เท่ากับ (")) {ถ้า (! this.email.matches (" // w+@// w+(// w+)+") {isok = false; errors.put (" อีเมล " อาจว่างเปล่าไม่ว่างเปล่าถ้าเป็นวันที่ถูกกฎหมายถ้า (this.birthday! = null &&! this.birthday.trim (). เท่ากับ ("")) {ลอง {datelocaleconverter convert = datelocaleconverter () วันที่ !! ");}} return isok;} public String getUserName () {return username;} โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้;} สตริงสาธารณะ getUserpwd () {return userpwd; getConfirmpwd () {return confarmpwd;} โมฆะสาธารณะ setConfirmpwd (สตริงยืนยัน pwd) {this.confirmpwd = conviredpwd;} สตริงสาธารณะ getemail () {return email;} void public setemail {this.birthday = วันเกิด;}}สร้างคลาสเครื่องมือ webutils ภายใต้แพ็คเกจ me.gacl.util ฟังก์ชั่นของคลาสเครื่องมือนี้คือการห่อหุ้มข้อมูลแบบฟอร์มที่ส่งโดยไคลเอนต์ไปยัง Formbean
แพ็คเกจ me.gacl.util; นำเข้า java.util.enumeration; นำเข้า java.util.uuid; นำเข้า Javax.servlet.http.httpservletrequest นำเข้า org.apache.commons.beanutils.beanutils;/*** @author gacl* {/*** แปลงวัตถุคำขอเป็นวัตถุ t* @param คำขอ* @param clazz* @return*/สาธารณะคงที่ <t> t requestbean (คำขอ httpservletrequest, คลาส <t> clazz) {ลอง {t bean = clazz.newinstance (); ในขณะที่ (e.hasmoreElements ()) {string name = (string) e.nextelement (); ค่าสตริง = request.getParameter (ชื่อ); beanutils.setProperty (ถั่ว, ชื่อ, ค่า);} return bean;} catch (Exception e) uuid.randomuuid (). toString ();}}สุดท้ายมาดูรหัสที่สมบูรณ์ของ RegistERServlet ที่รับผิดชอบในการจัดการการลงทะเบียนผู้ใช้:
แพ็คเกจ me.gacl.web.controller; นำเข้า java.io.ioexception; นำเข้า java.util.date; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; นำเข้า org.apache.commons.beanutils.beanutils; นำเข้า org.apache.commons.beanutils.convertutils; นำเข้า org.apache.commons.beanutils.locale.locale.locale.locale.locale.locale. me.gacl.exception.userexistexception; นำเข้า me.gacl.service.iuserservice; นำเข้า me.gacl.service.impl.userserviceimpl; นำเข้า me.gacl.util.webutils; นำเข้า me.gacl.web.formbean.registerformbean;/*************************************** ขยาย httpservlet {โมฆะสาธารณะ doGet (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// encapsulate ข้อมูลแบบฟอร์มที่ส่งโดยลูกค้าลงทะเบียน (formbean.validate () == false) {// ถ้าการตรวจสอบล้มเหลว // ส่งวัตถุแบบฟอร์มห่อหุ้มข้อมูลฟอร์มที่ผู้ใช้เติมกลับไปที่แบบฟอร์มฟอร์มบนหน้า register.jsp สำหรับการร้องขอการแสดง register.jsprequest.getRequestDispatcher ("/web-inf/pages/register.jsp"). ไปข้างหน้า (คำขอ, การตอบกลับ); return;} ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); ลอง {//convertutils.register (datelocaleConverter/data user.setId (webUtils.makeId ()); // ตั้งค่าคุณสมบัติ id ของผู้ใช้บริการ iuserService service = ใหม่ UserserViceImpl (); // โทรบริการผู้ใช้ที่ลงทะเบียนโดยเลเยอร์บริการเพื่อให้ได้บริการลงทะเบียนผู้ใช้ registeruser (ผู้ใช้); String message = string.format ("ลงทะเบียนสำเร็จ! มันจะข้ามไปยังหน้าเข้าสู่ระบบโดยอัตโนมัติสำหรับคุณในไม่กี่วินาที! <meta http-equiv = 'Refresh' content = '; url =%s'/>" request.getContextPath ()+"/servlet/loginuiservlet"); request.setAttribute ("ข้อความ", ข้อความ); request.getRequestDispatcher ("/message.jsp"). forward (คำขอ, การตอบกลับ);} catch (userexistexception e) มีอยู่ !! "); request.setAttribute (" formbean ", formbean); request.getRequestDispatcher ("/web-inf/pages/register.jsp "). ไปข้างหน้า (คำขอ, ตอบกลับ); // บันทึกข้อยกเว้นในการร้องขอพื้นหลัง setAttribute ("ข้อความ", "ขออภัยการลงทะเบียนล้มเหลว !!"); request.getRequestDispatcher ("/message.jsp") ส่งต่อ (คำขอ, การตอบสนอง);}} โมฆะสาธารณะหากการตรวจสอบข้อมูลแบบฟอร์มที่กรอกข้อมูลล้มเหลวเมื่อผู้ใช้ลงทะเบียนเซิร์ฟเวอร์จะจัดเก็บวัตถุ FormBean ด้วยข้อความแสดงข้อผิดพลาดและข้อมูลฟอร์มในวัตถุคำขอแล้วส่งกลับไปที่หน้า register.jsp ดังนั้นเราจำเป็นต้องนำวัตถุ FormBean ออกในวัตถุคำขอจากหน้า register.jsp จากนั้นนำข้อมูลแบบฟอร์มที่กรอกไว้โดยผู้ใช้ไปยังรายการแบบฟอร์มที่เกี่ยวข้องและแสดงข้อความพรอมต์เมื่อเกิดข้อผิดพลาดในแบบฟอร์มเพื่อให้ผู้ใช้ทราบว่าข้อมูลใดผิดกฎหมาย
แก้ไขหน้า register.jsp, รหัสมีดังนี้:
<%@ page language = "java" pageencoding = "utf-"%> <! doctype html> <html> <head> <title> การลงทะเบียนผู้ใช้ </title> </head> <body style = "text-align: center;"> <form action = "$ {pagecontext.request. method = "post"> <table> <tr> <td> ชื่อผู้ใช้ </td> <td> <%-ใช้นิพจน์ EL $ {} เพื่อแยกข้อมูลฟอร์มที่ห่อหุ้มในวัตถุ formebean ที่เก็บไว้ในวัตถุคำขอ value = "$ {formBean.userName}"> $ {formBean.errors.userName} </td> </tr> <tr> <td> รหัสผ่าน </td> <td> <อินพุต type = "รหัสผ่าน" ชื่อ = "userpwd" value = "$ {formBean.userpwd}"> $ {formBean.errors.userpwd} </td> </tr> <tr> <td> ยืนยันรหัสผ่าน </td> <td> <อินพุตประเภท = "รหัสผ่าน" value = "$ {formBean.confirmpwd}"> $ {formbean.errors.confirmpwd} </td> </tr> <tr> <td> อีเมล </td> <td> <อินพุต type = "text" name = "อีเมล" value = "$ {formBean.email}"> $ {formBean.errors.email} </td> </tr> <tr> <td> วันเกิด </td> <td> <อินพุต type = "text" name = "วันเกิด" value = "$ {formBean.birthday}"> $ {formBean.errors.birthday} </td> </tr> <tr> <td> <อินพุตประเภท = "รีเซ็ต" value = "เคลียร์"> </td> <td>ณ จุดนี้ฟังก์ชั่นการลงทะเบียนผู้ใช้ได้รับการพัฒนาแล้ว!
การทดสอบต่อไปนี้ฟังก์ชั่นการลงทะเบียนผู้ใช้ที่พัฒนาแล้ว:
ป้อนที่อยู่ URL: http: // localhost: 8080/webmvcframework/servlet/registeruiservlet เพื่อเข้าถึงหน้า register.jsp และเอฟเฟกต์การดำเนินการมีดังนี้:
หากรายการแบบฟอร์มที่ป้อนไม่ปฏิบัติตามกฎการตรวจสอบจะไม่สามารถลงทะเบียนได้ เอฟเฟกต์การดำเนินการมีดังนี้:
3.4.2. พัฒนาฟังก์ชั่นการเข้าสู่ระบบ
1. เขียน loginuiservlet ภายใต้แพ็คเกจ me.gacl.web.ui เพื่อให้ผู้ใช้กับอินเทอร์เฟซเข้าสู่ระบบ
หลังจาก LoginUiservlet ได้รับคำขอผู้ใช้แล้วมันจะข้ามไปที่ login.jsp
รหัสของ loginuiservlet มีดังนี้:
แพ็คเกจ me.gacl.web.ui; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletRequest; javax.servlet.http.httpservletResponse;/*** @author gacl* loginuiservlet มีหน้าที่รับผิดชอบในการส่งออกอินเทอร์เฟซเข้าสู่ระบบสำหรับผู้ใช้* เมื่อผู้ใช้เข้าถึง loginuiservlet มันจะกระโดดไปยังหน้า login doGet (httpservletrequest Request, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {request.getRequestDispatcher ("/web-inf/pages/login.jsp"). forward (ขอตอบสนอง); {doget (คำขอ, การตอบกลับ);}}2. เขียนหน้าเข้าสู่ระบบของผู้ใช้ Login.jsp ภายใต้/web-inf/pages/directory
รหัสของหน้า login.jsp มีดังนี้:
<%@ page language = "java" pageencoding = "utf-"%> <! doctype html> <html> <head> <title> ผู้ใช้เข้าสู่ระบบ </title> </head> <body> <form action = "$ {pageContext.Request.ContextPath} name = "username"> <br/> รหัสผ่าน: <อินพุต type = "รหัสผ่าน" ชื่อ = "รหัสผ่าน"> <br/> <อินพุต type = "ส่ง" value = "เข้าสู่ระบบ"> </form> </body> </html> <form action = "$ {pageContext.request.contextpath}/servlet/loginServlet" method = "post"> ใน login.jsp ระบุว่าแบบฟอร์มถูกส่งและส่งไปยัง LoginServlet สำหรับการประมวลผล
3. เขียน LoginServlet สำหรับการจัดการเข้าสู่ระบบของผู้ใช้ภายใต้แพ็คเกจ me.gacl.web.controller
รหัสของ LoginServlet มีดังนี้:
แพ็คเกจ me.gacl.web.controller; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservlet นำเข้า javax.servlet.http.httpservletRequest; me.gacl.domain.user; นำเข้า me.gacl.service.iUSERSERVICE; นำเข้า me.gacl.service.impl.userserviceimpl;/*** เซิร์ฟเล็ตจัดการกับผู้ใช้เข้าสู่ระบบ*@author gacl **/ล็อกอินชั้นเรียนสาธารณะ ServleTexception, iOexception {// รับชื่อผู้ใช้เข้าสู่ระบบที่กรอกโดยผู้ใช้สตริงชื่อผู้ใช้ = request.getParameter ("ชื่อผู้ใช้"); // รับรหัสผ่านเข้าสู่ระบบที่กรอกโดยรหัสผ่านสตริงผู้ใช้ = request.getParameter ("รหัสผ่าน"); รหัสผ่าน); ถ้า (user == null) {string message = string.format ("ขออภัยชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง !! โปรดเข้าสู่ระบบอีกครั้ง! คุณจะข้ามไปยังหน้าเข้าสู่ระบบโดยอัตโนมัติในไม่กี่วินาที !! <meta http-equiv = 'Refresh' content = '; url =%s' ", request.getContextPath ()+"/servlet/loginuiservlet "); request.setAttribute (" ข้อความ ", ข้อความ); request.getRequestDispater ("/message.jsp ") request.getSession (). setAttribute ("ผู้ใช้", ผู้ใช้); ข้อความสตริง = string.format ("ขอแสดงความยินดี: %s, เข้าสู่ระบบสำเร็จ! หน้านี้จะข้ามไปที่หน้าแรกในไม่กี่วินาที! user.getUserName (), request.getContextPath ()+"/index.jsp"); request.setAttribute ("ข้อความ", ข้อความ); request.getRequestDispatcher ("/message.jsp"). ไปข้างหน้า การตอบสนอง);}}ณ จุดนี้ฟังก์ชั่นการเข้าสู่ระบบของผู้ใช้เสร็จสมบูรณ์แล้ว
ด้านล่างทดสอบฟังก์ชั่นการเข้าสู่ระบบของผู้ใช้ที่พัฒนาแล้วป้อนที่อยู่ URL: http: // localhost: 8080/webmvcframework/servlet/loginuiservlet เพื่อเข้าถึงหน้า login.jsp ให้ป้อนชื่อผู้ใช้และรหัสผ่านที่ถูกต้องเพื่อเข้าสู่ระบบ
หากชื่อผู้ใช้และรหัสผ่านที่ป้อนไม่ถูกต้องการเข้าสู่ระบบจะไม่สามารถเข้าสู่ระบบได้สำเร็จและเอฟเฟกต์การดำเนินการมีดังนี้:
3.4.3. พัฒนาฟังก์ชั่นการยกเลิก
เขียน logoutservlet สำหรับการจัดการการออกจากระบบของผู้ใช้ภายใต้แพ็คเกจ me.gacl.web.controller
รหัสของ logoutservlet มีดังนี้:
แพ็คเกจ me.gacl.web.controller; นำเข้า java.io.ioexception; นำเข้า java.text.messageformat; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; Logoutservlet ระดับสาธารณะขยาย httpservlet {โมฆะสาธารณะ doget (httpservletrequest คำขอ, httpservletresponse การตอบสนอง) โยนฟังก์ชัน servletexception, ioexception {// ลบวัตถุผู้ใช้ที่เก็บไว้ request.getSession (). RemoveAttribute ("ผู้ใช้"); // เนื่องจากสตริงมีเครื่องหมายคำพูดเดียวจะมีปัญหาเมื่อใช้วิธีการ messageFormat.format เพื่อแยกสตริงในกรณีนี้ //MessageFormat.format วิธีการใช้งานการใช้งาน <meta http-equiv = 'Refresh' content = '; url = {}'/> ", request.getContextPath ()+"/servlet/loginuiservlet "); system.out.println (tempstr); - มันจะข้ามไปที่หน้าเข้าสู่ระบบโดยอัตโนมัติสำหรับคุณในไม่กี่วินาที! - <meta http-equiv = รีเฟรช content =; url = {}/> system.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - content = ''; url = {} ''/> "," index.jsp ") สามารถส่งคืนได้ตามปกติ * <meta http-equiv = '' Refresh '' content = '' url = index.jsp '/> */string tempstr = metterformat.format ( content = ''; url = {} ''/> ", request.getContextPath ()+"/servlet/loginuiservlet ");/*** ผลลัพธ์ผลลัพธ์:*เข้าสู่ระบบได้สำเร็จ! - It will automatically jump to the login page for you in seconds! - * <meta http-equiv='refresh' content=';url=/webmvcframework/servlet/LoginUIServlet'//System.out.println(tempStr);String message = String.format("Logout successfully!! Automatically jump to the login page in seconds!! <meta http-equiv='refresh' content=';url=%s'/>", request.getContextPath()+"/servlet/LoginUIServlet");request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, การตอบสนอง);}}用户登录成功后,会将登录的用户信息存储在session中,所以我们要将存储在session中的user删除掉,这样就可以实现用户注销了。
用户登录成功后就会跳转到index.jsp页面,在index.jsp页面中放一个【退出登陆】按钮,当点击【退出登陆】按钮时,就访问LogoutServlet,将用户注销。
index.jsp的代码如下:
<%@ page language="java" pageEncoding="UTF-"%><%--为了避免在jsp页面中出现java代码,这里引入jstl标签库,利用jstl标签库提供的标签来做一些逻辑判断处理--%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML><html><head><title>首页</title><script type="text/javascript">function doLogout(){//访问LogoutServlet注销当前登录的用户window.location.href="${pageContext.request.contextPath}/servlet/LogoutServlet";}</script></head><body><h>孤傲苍狼的网站</h><hr/><c:if test="${user==null}"><a href="${pageContext.request.contextPath}/servlet/RegisterUIServlet" target="_blank">注册</a><a href="${pageContext.request.contextPath}/servlet/LoginUIServlet">登陆</a></c:if><c:if test="${user!=null}">欢迎您:${user.userName}<input type="button" value="退出登陆" onclick="doLogout()"></c:if><hr/></body></html>测试开发好的注销功能,效果如下:
到此,所有的功能都开发完成了,测试也通过了。
四、开发总结
通过这个小例子,可以了解到mvc分层架构的项目搭建,在平时的项目开发中,也都是按照如下的顺序来进行开发的:
1. สร้างสภาพแวดล้อมการพัฒนา
1.1 创建web项目
1.2 导入项目所需的开发包
1.3 创建程序的包名,在java中是以包来体现项目的分层架构的
2、开发domain
把一张要操作的表当成一个VO类(VO类只定义属性以及属性对应的get和set方法,没有涉及到具体业务的操作方法),VO表示的是值对象,通俗地说,就是把表中的每一条记录当成一个对象,表中的每一个字段就作为这个对象的属性。每往表中插入一条记录,就相当于是把一个VO类的实例对象插入到数据表中,对数据表进行操作时,都是直接把一个VO类的对象写入到表中,一个VO类对象就是一条记录。每一个VO对象可以表示一张表中的一行记录,VO类的名称要和表的名称一致或者对应。
3、开发dao
3.1 DAO操作接口:每一个DAO操作接口规定了,一张表在一个项目中的具体操作方法,此接口的名称最好按照如下格式编写:“I表名称Dao”。
├DAO接口里面的所有方法按照以下的命名编写:
├更新数据库:doXxx()
├查询数据库:findXxx()或getXxx()
3.2 DAO操作接口的实现类:实现类中完成具体的增删改查操作
├此实现类完成的只是数据库中最核心的操作,并没有专门处理数据库的打开和关闭,因为这些操作与具体的业务操作无关。
4、开发service(service 对web层提供所有的业务服务)
5、开发web层
以上内容是小编给大家介绍的JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式),希望对大家有所帮助!