أدناه ، سنقدم رمز مثال Javaweb لتنفيذ وظيفة تسجيل الدخول وتسجيل المستخدم من خلال الصور والنصوص. دعونا نلقي نظرة.
1. مقدمة إلى نموذج تطوير Servlet+JSP+Javabean (MVC)
Servlet+JSP+Javabean Mode (MVC) مناسب لتطوير تطبيقات الويب المعقدة. في هذا الوضع ، تكون Servlets مسؤولة عن معالجة طلبات المستخدمين ، JSP مسؤولة عن عرض البيانات ، وجافابان مسؤولة عن تغليف البيانات. يحتوي برنامج Servlet+JSP+Javabean Mode على مستويات واضحة بين الوحدات ، ويوصى بتطوير الويب لاستخدام هذا الوضع.
هنا نستخدم برنامج تسجيل تسجيل الدخول إلى المستخدم الأكثر استخدامًا لشرح نموذج تطوير Servlet+JSP+Javabean. من خلال برنامج تسجيل تسجيل الدخول إلى المستخدم هذا ، نقوم بتوصيل نقاط المعرفة لـ XML و XPath و Servlet و JSP التي تعلمناها من قبل.
2. قم بإنشاء مشروع ويب مع بنية MVC
قم بإنشاء مشروع WebMVCframework جديد في Myeclipse ، واستيراد حزمة التطوير (حزمة JAR) المطلوبة من قبل المشروع ، وإنشاء الحزم المطلوبة من قبل المشروع. في تطوير Java ، ينعكس مستوى الهندسة المعمارية في شكل حزمة
| حزم التطوير (حزم الجرة) المطلوبة من قبل المشروع | ||
| رقم سري | اسم حزمة التطوير | يصف |
| 1 | DOM4J-1.6.1.JAR | يتم استخدام DOM4J لمعالجة ملفات XML |
| 2 | Jaxen-1.1-Beta-6.Jar | تستخدم لتحليل تعبيرات xpath |
| 3 | العموم blautils -1.8.0.Jar | فئة الأدوات لمعالجة كائنات الفول |
| 4 | المشاعات-logging.jar | Commons-Bunutils-1.8.0.Jar Package JAR |
| 5 | JSTL.JAR | مكتبة علامة JSTL وحزمة التبعية EL Expression |
| 6 | standard.jar | مكتبة علامة JSTL وحزمة التبعية EL Expression |
يجب أن تحتوي بنية مشروع Javaweb الجيدة على 11 حزمًا أعلاه ، مما يجعلها واضحة والمسؤوليات بين كل طبقة واضحة. عند إنشاء بنية مشروع Javaweb ، قم بإنشاء الحزم بترتيب من 1 إلى 11 أعلاه: المجال → DAO بمجرد إنشاء مستوى الحزمة ، سيتم تحديد بنية المشروع. بالطبع ، في تطوير المشروع الفعلي ، قد لا يعتمد تمامًا على
| الحزم المطلوبة للمشروع | |||
| رقم سري | اسم الحزمة | يصف | مستوى |
| 1 | me.gacl.domain | فئة Javabean التي تخزن النظام (لا تحتوي إلا على سمات بسيطة وحصل على الأساليب المقابلة للسمات ، ولا تتضمن طرقًا محددة لمعالجة الأعمال) ، المقدمة إلى [طبقة الوصول إلى البيانات] ، [طبقة معالجة الأعمال] ، و [طبقة الويب] للاستخدام | طبقة المجال (نموذج المجال) |
| 2 | me.gacl. داو | فئة واجهة التشغيل التي تخزن الوصول إلى قاعدة البيانات | طبقة الوصول إلى البيانات |
| 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 (واجهة المستخدم يشير إلى واجهة المستخدم) التي توفر واجهة المستخدم للمستخدمين | |
| 8 | me.gacl.web.filter | مرشح يستخدم لنظام التخزين | |
| 9 | me.gacl.web.listener | مستمع يستخدم لتخزين النظام | |
| 10 | me.gacl .til | الأدوات الشائعة لتخزين النظام ، المقدمة إلى [طبقة الوصول إلى البيانات] و [طبقة معالجة الأعمال] و [طبقة الويب] للاستخدام | |
| 11 | Junit.test | فئة الاختبار لتخزين النظام | |
كما ذكر أعلاه ، نقوم بإنشاء التسلسل الهرمي للحزمة ، ولكن بناءً على الموقف الفعلي للمشروع ، قد نحتاج أيضًا إلى إنشائها.
حقيبته ، وهذا يعتمد على احتياجات المشروع.
ضمن دليل SRC (دليل الفئة) ، قم بإنشاء ملف XML (db.xml) لحفظ بيانات المستخدم (db.xml)
قم بإنشاء دليل صفحات في دليل الويب. يقوم دليل الصفحات بتخزين بعض صفحات JSP المحمية للنظام (لا تسمح للمستخدمين بالوصول مباشرة من خلال عناوين URL). إذا أراد المستخدمون الوصول إلى صفحات JSP المحمية هذه ، فيمكنهم فقط استخدام Servlet في حزمة Me.gacl.web.ui
يظهر المشروع الذي تم إنشاؤه في الشكل التالي (الشكل 1):
الشكل 1
3. كتابة رمز للهندسة المعمارية الهرمية
تتم كتابة رمز الهندسة المعمارية الهرمية أيضًا بترتيب [طبقة نموذج المجال (المجال)] → [طبقة الوصول إلى البيانات (DAO ، DAO.IMPL)] → [طبقة معالجة الأعمال (SERVICE ، SERVICE.IMPL)] →]
3.1. تطوير طبقة المجال
قم بإنشاء فئة مستخدم ضمن حزمة me.gacl.domain
الكود المحدد لفئة المستخدم هو كما يلي:
package me.gacl.domain ؛ import java.io.serializable ؛ استيراد java.util.date ؛/*** author gacl*فئة المستخدم*/فئة عامة ، يطبق مستخدم الفئة العامة serializable {private static static final str string userpversionuid = -l ؛ عيد ميلاد التاريخ الخاص ؛ السلسلة العامة getId () {return id ؛} public void setId (string id) {this.id = id ؛} السلسلة العامة getUserName () {return username ؛} public void setusername (string username) {this.username = username ؛ {this.userpwd = userpwd ؛} السلسلة العامة getEmail () {return elem ؛} setemail public void (سلسلة البريد الإلكتروني) {this.email = elem ؛3.2. تطوير طبقة الوصول إلى البيانات (DAO ، DAO.IMPL)
إنشاء فئة واجهة iuserdao تحت حزمة me.gacl.dao. بالنسبة لفصول واجهة التطوير ، اعتدت على استخدام الحرف I كبادئة للفصل ، حتى تتمكن من رؤية لمحة عن أن الفئة الحالية هي واجهة ، وهي أيضًا عادة تطوير جيدة. من خلال النظر إلى اسم الفصل ، يمكنك بسهولة التمييز بين ما إذا كانت واجهة أو فئة تنفيذ محددة.
الكود المحدد لواجهة iuserdao هو كما يلي:
package me.gacl.dao ؛ import me.gacl.domain.user ؛ الواجهة العامة iuserdao {/*** ابحث عن المستخدم بناءً على اسم المستخدم وكلمة المرور* username* param userpwd* return user the user*/user find (string username ، string userpwd) ؛ الاسم* param username* @Return الذي تم العثور على المستخدم*/user find (string username) ؛}بالنسبة لتعريف الطريقة في الواجهة ، يمكن أن يحلل هذا فقط الأساليب التي يجب تحديدها بناءً على الأعمال المحددة. ومع ذلك ، بغض النظر عن مدى تعقيد العمل ، لا يمكن فصله عن تشغيل CRUD الأساسي (الإضافة والحذف والتعديل والاستعلام). تتفاعل طبقة DAO مباشرة مع قاعدة البيانات ، وبالتالي فإن واجهة طبقة DAO لديها عمومًا أربع طرق ذات صلة لإضافة وحذف وتعديل والاستعلام.
قم بإنشاء فئة userDaoImpl ضمن حزمة me.gacl.dao.impl
فئة userDaoImpl هي فئة تنفيذ محددة لواجهة iuserdao. بالنسبة لطريقة التسمية لفئة التنفيذ الخاصة بالواجهة ، اعتدت على تسميةها في شكل "اسم الواجهة (إزالة البادئة I) + INM" أو "اسم الواجهة + ضمن": iuserdao (واجهة) → userDaoImpl (فئة التنفيذ) أو iuserdao (واجهة) → iuserdaiimpl (تطبيق الفئة). هذه هي أيضا عادة البرمجة الشخصية. عادة ما تسمي معظم الكود الذي أراه فئة التنفيذ المحددة للواجهة في أحد هذين النموذجين. على أي حال ، يجب أن تكون قادرًا على معرفة فئة التنفيذ التي تتوافق مع الواجهة هي في لمحة.
الرمز المحدد لفئة userDaoImpl هو كما يلي:
package me.gacl.dao.impl ؛ import java.text.simpleDateFormat ؛ import org.domj.document ؛ import org.domj.element ؛ import me.gacl.dao.iuserdao ؛ import me.gacl.domain.user ؛ GACL*/public class userDaoImpl تنفذ iuserdao {OverRidepublic find (string username ، string userpwd) {try {document document = xmlutils.getDocument () ؛ // use xpath expression to menipulate xml novelement e = (element) document.selectsinglenode ( userpwd = '"+userpwd+"'] ") ؛ if (e == null) {return null ؛} user user = new user () ؛ user.setId ( SimpleDateFormat ("yyyy-mm-dd") ؛ user.setbirthday (sdf.parse (birth)) ؛ إرجاع المستخدم ؛} catch (استثناء e) {رمي runTimeException (e) ؛}}@cumpresswarnings ("deprecation")@overridepublic add (مستخدم المستخدم) document.getRootElement () ؛ element user_node = root.adDelement ("user") ؛ // قم بإنشاء عقدة مستخدم وقم بتعليقها إلى rootuser_node.setattributeValue ("id" ، user.getID ()) ؛ user_node.setAttributeValue ("username" ، user.getusername () user.getEmail ()) ؛ simpledateFormat sdf = new SimplEdateFormat ("yyyy-mm-dd") ؛ user_node.setAttributeValue ("عيد ميلاد" ، sdf.format (user.getBirthDay ())) ؛ xmlutils.writexml (document) ؛ Find (string username) {try {document document = xmlutils.getDocument () ؛ element e = (element) document.selectsinglenode ("// user [username = '"+username+"']") ؛ if (e == null) {return null ؛ user () ؛ user.setId ( SimpleDateFormat ("yyyy-mm-dd") ؛ user.setbirthday (sdf.parse (الولادة))3.3. طبقة خدمة التطوير (توفر طبقة الخدمة جميع خدمات الأعمال لطبقة الويب)
إنشاء فئة واجهة iuserservice في حزمة ME.GACL.SERVICE
الكود المحدد لواجهة iuserservice هو كما يلي:
package me.gacl.service ؛ import me.gacl.domain.user ؛ import me.gacl.exception.userexistexception ؛ public interface iuserservice {/*** توفير خدمة التسجيل* param user* athrows userexistexception*/void registerUser (user user) @return*/user loginuser (اسم المستخدم ، سلسلة userpwd) ؛}إنشاء فئة sterserviceimpl في حزمة me.gacl.service.impl
فئة UserviceServiceImpl هي فئة تنفيذ محددة لواجهة iuserservice. الرمز المحدد كما يلي:
package me.gacl.service.impl ؛ import me.gacl.dao.iuserdao ؛ import me.gacl.dao.impl.userdaoimpl ؛ import me.gacl.domain.user ؛ import me.gacl.exception.userexistexception ؛ iuserdao userdao = new userDaoImpl () ؛@Outdridepublic void registerUser (مستخدم المستخدم) يلقي userexistexception {if (userDao.find (user.getusername () userexistexception ("اسم المستخدم المسجل موجود بالفعل !!!") ؛} userDao.add (user) ؛}@outridepublic loginuser (اسم المستخدم usernuser ، string userpwd) {return userDao.find (username ، userpwd) ؛}}3.4. تطوير طبقة الويب
3.4.1. تطوير وظيفة التسجيل
1. اكتب registeruiservlet ضمن حزمة me.gacl.web.ui لتوفير واجهة تسجيل للمستخدمين
بعد استلام طلب المستخدم ، يقفز registeruiservlet إلى التسجيل. jsp
رمز التسجيل على النحو التالي:
package me.gacl.web.ui ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservlest ؛ gacl* servlet الذي يوفر للمستخدمين واجهة مستخدم مسجلة* registeruiservlet هو المسؤول عن إخراج واجهة التسجيل للمستخدمين* عندما يصل المستخدم إلى registerUiservlet ، فإنه يقفز إلى صفحة التسجيل. ServleTexception ، ioException {request.getRequestDispatcher ("/web-inf/pages/register.jsp").2. اكتب صفحة تسجيل JSP مسجلة مستخدم jsp في/web-inf/pages/directory
لا يمكن الوصول إلى أي صفحة JSP الموجودة في دليل Web-INF مباشرة من خلال عنوان عنوان URL.
أثناء التطوير ، إذا كان هناك بعض موارد الويب الحساسة في المشروع التي لا ترغب في الوصول إليها مباشرة من قبل العالم الخارجي ، فيمكنك التفكير في وضع موارد الويب الحساسة هذه في دليل الويب الخاص بـ Web ، بحيث يمكن منع العالم الخارجي من الوصول مباشرة عبر عنوان URL.
رمز صفحة register.jsp كما يلي:
<٪@ page language = "java" pageencoding = "utf-" ٪> <! doctype html> <html> <head> <title> تسجيل المستخدم </title> </head> <body style = "text-align: center ؛" <form action = "$ {pagecontext.request.request method = "post"> <table> <tr> <td> اسم المستخدم </td> <td> <td input type = "text" name = "username"> </td> </r> <td> name = "includepwd"> </td> </tr> <tr> <td> البريد الإلكتروني </td> <td> <type type = "text" name = "email"> </td> </td> <tr> <td> <td> </td> <td> <td type = "text" value = "clear"> </td> <td> <input type = "submit" value = "register"> </td> </tr> </table> </pump> </body> </html> <form action = "$ {pagecontext.request.contextpath}/servlet/resterservlet" method = "post"> in registric.jsp يشير إلى أن النموذج يتم تقديمه وتسليمه إلى REGISTERSERVELL للمعالجة
3. اكتب سجلات سفر للتعامل مع تسجيل المستخدم بموجب حزمة ME.GACL.WEB.CONTROLLER
يخدم RecisterServlet المسؤوليات التالية:
1. استلام بيانات النموذج المقدمة من العميل إلى الخادم.
2. تحقق من شرعية بيانات النموذج. في حالة فشل التحقق ، قفز مرة أخرى إلى register.jsp وتردد رسالة الخطأ.
3. إذا تم تمرير التحقق ، فاتصل بطبقة الخدمة لتسجيل المستخدم في قاعدة البيانات.
من أجل تسهيل سجلات Recisterservlet لتلقي بيانات النماذج وبيانات نموذج التحقق ، قمت بتصميم registerFormBean للتحقق من بيانات نموذج التسجيل ، ثم كتبت فئة أداة WebUtils لتغليف بيانات النموذج المقدمة من العميل إلى النموذج.
إنشاء registerformbean للتحقق من بيانات نموذج التسجيل ضمن حزمة me.gacl.web.formbean
رمز registerformbean كما يلي:
package me.gacl.web.formbean ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد org.apache.commons.beanutils.locale.converters.datelocaleConverter ؛/*** تم استخدام نموذج تسجيل المستخدم المغطى بتقديم قيمة الإدخال في التسجيل. نموذج إدخال عنصر في register.jsp* مسؤوليات registerFormBean ليست مسؤولة فقط عن استلام قيمة عنصر إدخال النموذج في register.jsp ، ولكن أيضًا بمثابة شرعية قيمة عنصر إدخال النموذج* Author GACL **/الفئة العامة registerFormBean {// بالقيمة في Properties in the Recordformbean مع اسم عنصر الإدخال في التسجيل. name = "username"/> username الخاص بالسلسلة الخاصة ؛ // <إدخال type = "password" name = "userPwd"/> سلسلة خاصة userPwd ؛ // <input type = "password" name = "intractpwd"/> string private intrengpwd ؛ // <input type = "text" name = فشل التحقق*/خريطة خاصة <string ، string> errors = new hashmap <string ، string> () ؛ خريطة عامة <string ، string> geterrors () {return errors ؛} public void seterrors (map <string ، string> errors) {this.errors = errors ؛}/** التحقق من صحة طريقة التحقق من العناصر الإدخال:* لا يمكن أن يكون اسم المستخدم فارغًا ، وإذا كان - حرف ABCDABCD * سلسلة خاصة userPWD ؛ لا يمكن أن تكون كلمة المرور فارغة ، وإذا كانت - الرقم * سلسلة خاصة تأكيد ؛ يجب أن تكون كلمة المرور هي نفس البريد الإلكتروني للسلسلة الخاصة مرتين * ؛ يمكن أن يكون فارغًا ، وليس فارغًا إذا كان صندوق بريد قانوني* عيد ميلاد خاص سلسلة ؛ يمكن أن يكون فارغًا ، وليس فارغًا ، إذا كان تاريخًا قانونيًا*/Public Boolean Devility () {boolean isok = true ؛ if (this.username == null || this.username.trim (). (! this.username.matches ("[[a-za-z] {،}")) {isok = false ؛ errors.put ("username" ، "يجب أن يكون اسم المستخدم خطابًا من -bit !!") ؛}} if (this.userpwd == null || false ؛ errors.put ("userpwd" ، "لا يمكن أن تكون كلمة المرور فارغة !!") ؛} آخر {if (! this.userpwd.matches ("// d {،}")) {isok = false ؛ errors.put ("userpwd" ، "يجب أن تكون كلمة المرور عبارة عن عدد من البتات !!) ؛}}} // يجب أن تكون كلمات المرور هي نفسها عندما تكون المرتين (this.confirmpwd! = null) {if (! this.confirmpwd.equals (this.userpwd)) {isok = false ؛ errors.put ("تأكيد pword" ، "كلمات المرور غير متسقة عندما لا تكون مرتين فارغة !! يمكن أن يكون فارغا ، وليس فارغا. إذا كان بريدًا إلكترونيًا قانونيًا إذا كان (this.email! = null &&! this.email.trim (). يساوي ("")) {if (! this.email.matches ("// w+@// w+(// w+)+") يمكن أن يكون فارغًا ، وليس فارغًا ، إذا كان تاريخًا قانونيًا إذا (this.birthday! = null &&! this.birthday.trim (). يساوي ("")) تاريخ !! getConfirmpwd () {return infresspwd ؛} public void setConfirmPwd (سلسلة تأكيد pwd) {this.confirmpwd = infernationPwd ؛} السلسلة العامة getemail () {this.birthday = عيد ميلاد ؛}}قم بإنشاء فئة أداة WebUtils ضمن حزمة me.gacl.util. تتمثل وظيفة فئة الأدوات هذه في تغليف بيانات النموذج المقدمة من العميل في Formbean
package me.gacl.util ؛ استيراد java.util.enumeration ؛ استيراد java.util.uuid ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد org.apache.commons.beanutils.beanutils ؛ قم بتحويل كائن الطلب إلى كائن t* param request* param clazz* @return*/public static <T> t requestBean (طلب httpservletrequest ، الفئة <T> clazz) {try {t bean = clazz.newinstance () ؛ التعداد <string> e = request.getparameternames () ؛ بينما (e.hasmoreElements ()) {string name = (string) uuid.randomuuid (). tostring () ؛}}أخيرًا ، دعونا نلقي نظرة على رمز سجلات الكامل المسؤول عن معالجة تسجيل المستخدم:
package me.gacl.web.controller ؛ import java.io.ioException ؛ استيراد java.util.date ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.http.httplest ؛ javax.servlet.http.httpservletresponse ؛ استيراد org.apache.commons.beanutils.beanutils ؛ استيراد org.apache.commons.beanutils.convertutils ؛ استيراد org.apache.commons.beanutils.locale.converters.datelocaleConverter ؛ me.gacl.exception.userexistexception ؛ import me.gacl.service.iuserservice ؛ import me.gacl.service.impl.userserviceimpl ؛ يمتد httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {// alsapition بيانات النموذج المقدمة من العميل في registerformbean formbean formbean = webutils.requestbean (طلب ، registerformbean (formbean.validate () == false) {// إذا فشل التحقق // إرسال كائن النموذج الذي يتغلف بيانات النموذج التي يتم تعبئتها بواسطة المستخدم إلى النموذج على صفحة التسجيل. register.jsprequest.getRequestDispatcher ("/web-inf/register.jsp"). user.setId (webUtils.MakeId ()) ؛ // قم بتعيين خاصية معرف المستخدم IUSERSERVICE SERVICE = NEW USERSERVICEIMPL () رسالة سلسلة = string.format ("مسجل بنجاح!! سوف تقفز تلقائيًا إلى صفحة تسجيل الدخول لك في ثوان! request.getContextPath ()+"/servlet/loginuiservlet") ؛ request.setAttribute ("message" ، message) ؛ 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.request method = "post"> <table> <tr> <td> اسم المستخدم </td> <td> <٪-استخدم EL Expression $ {} لاستخراج بيانات النموذج المغطاة في كائن formbean المخزن في كائن الطلب (formbean.username) ورسالة الخطأ (formbean.errors.username)-٪> value = "$ {formbean.username}"> $ {formbean.errors.username} </td> </tr> <tr> <td> password </td> <td> <type type = "password" name = "userpwd" value = "$ {formbean.userpwd}"> $ {formbean.errors.userpwd} </td> </tr> <tr> <td> تأكيد كلمة المرور </td> <td> <type type = "password" name = "inscriptionPWD" value = "$ {formbean.confirmpwd}"> $ {formbean.errors.confirmpwd} </td> </tr> <tr> <td> البريد الإلكتروني </td> <td> <type type = "text" name = "email" value = "$ {formbean.email}"> $ {formbean.errors.email} </td> </tr> <tr> <td> عيد ميلاد </td> <td> <type type = "text" name = "birthday" value = "$ {formbean.birthday}"> $ {formbean.errors.birthday} </td> </tr> <tr> <td> <type type = "reset" value = "clear"> </td> <td> <trype type = "submit" value = "register">في هذه المرحلة ، تم تطوير وظيفة تسجيل المستخدم!
الاختبارات التالية وظيفة تسجيل المستخدم المتقدمة:
أدخل عنوان عنوان URL: http: // localhost: 8080/webmvcframework/servlet/registerUiservlet للوصول إلى صفحة register.jsp ، وتأثير العملية كما يلي:
إذا كان عنصر النموذج الذي تم إدخاله لا يتوافق مع قواعد التحقق ، فلا يمكن تسجيله. تأثير العملية على النحو التالي:
3.4.2. تطوير وظيفة تسجيل الدخول
1. اكتب loginuiservlet ضمن حزمة me.gacl.web.ui لتزويد المستخدمين بواجهة تسجيل الدخول.
بعد أن يتلقى loginuiservlet طلب المستخدم ، يقفز إلى login.jsp
رمز loginuiservlet هو كما يلي:
package me.gacl.web.ui ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletexception ؛ import javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservlest ؛ javax.servlet.http.httpservletresponse ؛/*** author gacl* loginuiservlet هو المسؤول عن إخراج واجهة تسجيل الدخول للمستخدمين* عندما يصل المستخدم إلى loginuiservlet ، فإنه يقفز إلى صفحة login.jsp DOGET (طلب httpservletrequest ، استجابة httpservletresponse) servletexception ، ioException {request.getRequestDispatcher ("/web-inf/pages/login.jsp"). {doget (طلب ، استجابة) ؛}}2. اكتب صفحة تسجيل الدخول إلى تسجيل الدخول.
رمز صفحة login.jsp كما يلي:
<٪@ page language = "java" pageencoding = "utf-" ٪> <! doctype html> <html> <head> <title> تسجيل الدخول إلى المستخدم </title> </head> <body> <form action = "$ {pagecontext.request.contextpath}/loginservlet" name = "username"> <br/> كلمة المرور: <إدخال type = "password" name = "password"> <br/> <input type = "submit" value = "login"> </form> </body> </html> <form action = "$ {pagecontext.request.contextpath}/servlet/loginservlet" method = "post"> في login.jsp يشير إلى أن النموذج يتم إرساله وتسليمه إلى loginservlet للمعالجة.
3. اكتب loginservlet للتعامل مع تسجيل الدخول إلى المستخدم ضمن حزمة me.gacl.web.controller
رمز Loginservlet هو كما يلي:
package me.gacl.web.controller ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservlest ؛ me.gacl.domain.user ؛ import me.gacl.service.iuserservice ؛ import me.gacl.service.impl.userserviceimpl ؛ ServleTexception ، ioException {// احصل على اسم مستخدم تسجيل الدخول الذي تم ملؤه بواسطة اسم المستخدم username = request.getParameter ("اسم المستخدم") ؛ // الحصول على كلمة مرور تسجيل الدخول إلى كلمة مرور المستخدم = request.getParameter ("كلمة المرور") كلمة المرور) ؛ if (user == null) {string message = string.format ("آسف ، اسم المستخدم أو كلمة المرور غير صحيح !! يرجى تسجيل الدخول مرة أخرى! سوف تقفز تلقائيًا إلى صفحة تسجيل الدخول بالثواني !! <meta http-equiv = 'refresh' content = '؛ url = ٪ s' ، request.getContextPath ()+"/servlet/loginuiservlet") ؛ request.setattribute ("message" ، message) ؛ request.getRequestDispatcher ("/message.jsp"). request.getSession (). setAttribute ("user" ، user) ؛ string message = string.format ("تهانينا: ٪ s ، تسجيل الدخول ناجح! ستقفز هذه الصفحة إلى الصفحة الرئيسية في ثوان! user.getUserName () ، request.getContextPath ()+"/index.jsp") ؛ request.setattribute ("message" ، message) ؛ request.getRequestDispatcher ("/message.jsp"). إجابة)؛}}في هذه المرحلة ، تم الانتهاء من وظيفة تسجيل دخول المستخدم.
أدناه ، اختبر وظيفة تسجيل دخول المستخدم المطورة ، أدخل عنوان عنوان URL: http: // localhost: 8080/webmvcframework/servlet/loginuiservlet للوصول إلى صفحة login.jsp ، أدخل اسم المستخدم وكلمة المرور الصحيح لتسجيل الدخول ، تأثير العملية على النحو التالي:
إذا كان اسم المستخدم وكلمة المرور إدخالهما غير صحيحين ، فلا يمكن تسجيل الدخول إلى تسجيل الدخول بنجاح ، وتأثير العملية كما يلي:
3.4.3. تطوير وظيفة الإلغاء
اكتب logoutservlet لمعالجة تسجيل الدخول إلى المستخدم تحت حزمة me.gacl.web.controller
كود Logoutservlet هو كما يلي:
package me.gacl.web.controller ؛ import java.io.ioException ؛ استيراد java.text.messageformat ؛ استيراد javax.servlet.servletexception ؛ javax.servlet.http.httpservlet ؛ import javax.servlet.http.httplet ؛ javax.servlet.http.httpservletresponse ؛ الطبقة العامة logoutservlet يمتد httpservlet {public void doget request.getSession (). removeAttribute ("user") ؛ // لأن السلسلة تحتوي على علامات اقتباس مفردة ، ستكون هناك مشاكل عند استخدام طريقة messageformat.format لالتقاط السلسلة في هذه الحالة //messageformat.format طريقة فقط تزيل الأسعار المفردة! <meta http-equiv = 'refresh' content = '؛ url = {}'/> "، request.getContextPath ()+"/servlet/loginuiservlet ") ؛ system.out.println (tempstr) ؛ // نتيجة الإخراج: logout بنجاح! ! سوف تقفز تلقائيًا إلى صفحة تسجيل الدخول لك في ثوانٍ! ! <meta http-equiv = تحديث content = ؛ url = {}/> system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- content='';url={}''/>","index.jsp") can return normally * <meta http-equiv=''refresh'' content='';url=index.jsp'/>*/String tempStr = MessageFormat.format("Login successfully!! It will automatically jump to the login page in seconds!! <meta http-equiv=''refresh'' content='';url={}''/>", request.getContextPath()+"/servlet/LoginUIServlet");/*** Output result: *Login successfully! ! 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模式),希望对大家有所帮助!