English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
أولاً، مقدمة
1.1 ما هو التحقق في المدخلات؟ لماذا نحتاج إلى التحقق في المدخلات؟
في المقالة السابقة، تعلمنا تحويل البيانات النوعية، ذكرنا طريقتين لمعالجة البيانات في الطبقة التمثيلية، وكذلك ذكرنا أن بيانات المستخدم يجب أن يتم تحويلها إلى نوع لتحصل على البيانات التي تريدها. كيف يمكننا تحديد أن البيانات التي تم تحويلها هي البيانات التي نريدها؟ هذا أمر معقد بعض الشيء. يمكنك التفكير بهذا الطريقة: عمر رجل بالغ هو 18 سنة، تريد الحصول على هذا الرقم 18، ولكن المستخدم يدخل 32، وتم تحويله بشكل صحيح أيضًا، ولكن البيانات ليست التي تريدها. ماذا نفعل في هذه الحالة؟ لذا، يكون التحقق في المدخلات مفيدًا هنا.
علاقة تحويل النوع والتحقق في المدخلات هي: تحويل النوع هو الشرط الأساسي للتحقق في المدخلات، إذا كانت تحويلات النوع كلها خاطئة، فلا داعي لأكمال تحقق المدخلات. ولكن في كثير من الأحيان يتم إكمال تحويل النوع والتحقق في المدخلات في نفس الوقت.
هناك نوعان من التحقق في المدخلات:
1、التحقق على الجانب العملاء;
2、التحقق على الجانب الخادم. هنا يتم شرح التحقق على الجانب الخادم (إعادة كتابة ValidateXxx وتحقق ملف xml)
1.2、إعادة كتابة عملية التحقق في ValidateXxx
1、محويف التحويل المسؤول عن تحويل المعلمات النصية في الطلبات إلى نوع، وإعداد هذه القيم كخصائص في Action
2、قد يحدث استثناء أثناء تنفيذ تحويل النوع، وإذا حدث استثناء، سيتم حفظ معلومات الاستثناء تلقائيًا في ActionContext، وسيكون مسؤول interceptor conversionError عن تعبئة fieldError
3、الاستدعاء بالعكس للوصول إلى طريقة ValidateXxx()، حيث أن Xxx هو اسم الطريقة التي ستتم معالجتها في طلب المستخدم
4、استدعاء طريقة Validate في Action class
5、إذا لم يظهر fieldError في الخطوات السابقة، سيتم استدعاء طريقة معالجة الطلبات للمستخدم في Action، وإذا ظهر fieldError، سيقوم النظام بالانتقال إلى العرض الذي يشير إليه input logic view.
ثانيًا، تحقق الإدخال
2.1 هناك طريقتان لتحقق الإدخال:
1 إعادة كتابة Validate method أو إنشاء method ValidateXxx مخصص (Xxx هو اسم مخصص، سيتم تنفيذ هذا method أولاً، ثم Validate method)
2 إعادة إنشاء xml للتحقق
2.2 إعادة كتابة Validate method
في إطار MVC، سيقدم دائمًا جزءًا معياريًا من التحقق من البيانات، يقدم Struts2 هنا method Validate، يمكننا إعادة كتابة Validate method للقيام بالتحقق من الإدخال، ولكن يجب علينا معرفة نقطتين عند إعادة كتابة Validate method: 1- سيتم تنفيذ Validate method قبل method execute;2- سيتم تنفيذ Validate method لجميع Action، وللتمييز بين Action معينة، يمكننا استخدام method ValidateXxx. (Xxx هو اسم مخصص)
ملاحظة: هذه الأمثلة هي أمثلة لاستخدام تحويلات النوع المحلية والتحقق من الإدخال معًا.
مثال بسيط على التحقق من التسجيل:
إعادة إنشاء class entity User:
User
إعادة إنشاء view: Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>تسجيل المستخدم</title> </head> <body> <h2>استخدام method validateXXX() للتحقق</h2> <form action="register_test"> المستخدم:<input type="text" name="user"><br/> كلمة المرور:<input type="password" name="user"><br/> كلمة المرور:<input type="password" name="user"><br/> <input type="submit" value="إرسال"> </form> </body> </html>
إعادة إنشاء class RegisterAction ميراثًا من ActionSupport
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //إعادة كتابة validate() وvalidateXXX methods للتحقق /* * في struts.xml يتم تكوين method method إلى test(), سيتم استدعاء ValidateTest() method أولاً، * ثم يتم استدعاء validate method * بعد ذلك يتم استدعاء test method * */ public class RegisterAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } //2 @Override public void validate(){ System.out.println("إعادة كتابة Validate 方法"); if (null == user.getPassword() || "".equals(user.getPassword()) || null == user.getRepassword() || "".equals(user.getRepassword())) { this.addFieldError("repassword", "repassword should be same password"); return; } if (!user.getPassword().equals(user.getRepassword())) { //عندما يحتوي FieldError على بيانات، يقوم الخادم بتحويلنا تلقائيًا إلى المشهد logic view لـ input this.addFieldError("repassword", "repassword should be same password"); } } //1 public void validateTest(){ System.out.println("طريقة التحقق المخصصة: ValidateTest"); } //3 public String test(){ System.out.println("test: method"); return SUCCESS; } }
ملاحظة: الربط هنا هو User، لذا يجب أن تكتب اسم المعامل في صفحة jsp كاسم الصنف مثلاً user، ثم يجب عليك أيضًا إنشاء محول نوع يرجع صنفًا مليئًا بالبيانات
إنشاء ملف struts.xml، وضعه في WEB-INF/classes/struts.xml
ملاحظة: يجب أن يكون هذا النوع method هو الذي قمت بتحديده في ValudateXxx()، وقد تم تحديد هذا النوع هنا كtest. إذا كنت تستخدم *، فإنه يجب على struts2 أن يكون مزامنًا صارمًا strict-method-invocation="false"، مما يقال إنه بسبب إصدار عالي جدًا، حيث زادت أمانه، لذا يجب إضافته للحصول على الوصول إلى الاستخدام
إنشاء صنف Usertypeconverter يتولد من StrutsTypeConverter (إنشاء محول نوع)
package com.validatexxx; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; //صنف تحويل النوع public class Usertypeconverter extends StrutsTypeConverter { @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) { System.out.println("Usertypeconverter: تحويل النوع!"); User user = new User(); user.setUsername(arg1[0]); user.setPassword(arg1[1]); user.setRepassword(arg1[2]); return user; } @Override public String convertToString(Map arg0, Object arg1) { User u = (User)arg1; return u.getUsername()+"!"; } }
ملاحظة: بعد إنشاء محول النوع، يجب إنشاء ملف RegisterAction-conversion.properties، ووضعه في نفس الدليل.
محتوى هذا الملف هو:
الأول هو اسم الخاصية الخاصة بك في RegisterAction، والثاني هو مسار محول النوع.
جديد واجهة النجاح: success.jsp
success.jsp
جديد واجهة الخطأ: input.jsp
input.jsp
نتائج تنفيذ الكود بنجاح كالتالي:
صفحة Register.jsp
الصفحة التي تم التحويل إليها بنجاح: success.jsp
نتائج الاختبار على الشاشة:
يتم تحويل البيانات إلى Usertypeconverter للتحويل إلى نوع، ثم الانتقال إلى RegisterAction، تنفيذ ValidateTest()، Validate، test ثم العودة إلى SUCCESS، ثم تنفيذ عرض result.
دعونا نرى ترتيب تنفيذ الكود الذي فشل:
صفحة Register.jsp
صفحة input.jsp
نتائج الاختبار على الشاشة:
في طريقة Validate، الكود الخاص بي هو: this.addFieldError()، كما ذكرت سابقًا، إذا تم إضافة خطأ، فإن الخادم سيقوم بتحويلنا تلقائيًا إلى واجهة الخطأ. سيقوم بتقديم input، وinput تم توفيره في struts.xml، مما سيقودنا إلى واجهة input.jsp.
2.3、جديد xml للتحقق من صحة الإدخال
جديد واجهة عرض: Test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>استخدام التحقق عبر XML</title> </head> <body> <s:form action="empinfo" method="post"> <s:textfield name="name" label="Name" size="20" /> <s:textfield name="age" label="Age" size="20" /> <s:submit name="submit" label="Submit" align="center" /> </s:form> </body> </html>
إنشاء فئة Employee تورث من ActionSupport
هذه الفئة تستخدم كتابة طريقة Validate وضبط Xml، يمكننا اختيار واحدة منها للتحقق
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //استخدام طريقة validate() للتحقق، هذا هو التحقق على الجانب الخادم! public class Employee extends ActionSupport { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //الخطوة الثانية لإعادة تنفيذ هذه الطريقة public String ت�行ة() { System.out.println("ت�行ة: " + this.age); return SUCCESS; } /* استخدم التحقق من الخادم: إعادة كتابة validate(); //الخطوة الأولى هي تنفيذ هذا الوسيط //إعادة كتابة validate方法 غير مثالية: سيتم استخدام validate方法 في كل مرة، مما يؤدي إلى استنزاف موارد كبيرة. public void validate(){ System.out.println("validate"); if (name == null || name.trim().equals("")) { //عند إضافة بيانات إلى هذا الوسيط، سيعود الخادم إلى input، وبعد ذلك يتم التحويل إلى صفحة input.jsp. addFieldError("name","اسم المطلوب"); } if (age < 28 || age > 65) { addFieldError("age","العمر يجب أن يكون بين 28 و 65"); } } */ }
تتم تكوينها في ملف Struts.xml:
صفحات success.jsp و input.jsp تستخدم نفسها.
بعد ذلك يجب إنشاء ملف Employee-validation.xml، ووضعه في نفس الدليل مع ملف Employee، انتبهوا: -validation.xml ثابت لا يتغير
المحتوى هو:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <field name="name"> <field-validator type="required"> <message> اسم المطلوب. </message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">29</param> <param name="max">64</param> <message> العمر يجب أن يكون بين 28 و 65 </message> </field-validator> </field> </validators>
النقطة الرئيسية: يجب أن يكون هناك تقييد dtd للملف، وإلا سيتم رد الخطأ:
خطأ DefaultDispatcherErrorHandler حدث استثناء أثناء معالجة الطلب: [Connection timed out: connect - [unknown location], null]
الآن سنستخدمhttp://localhost:8080/LearStruts2/ValidateJSP/Test.jspزيارة.
نجاح الاختبار:
واجهة Test.jsp:
success.jsp
مثال فشل الاختبار:
واجهة input.jsp:
شرح المثال صحيح.
في Struts2 هناك عدة مُتحققين مدمجين: مُتحقق الإلزامية، مُتحقق إلزامية النص، مُتحقق عدد، مُتحقق تاريخ، مُتحقق تعبير، مُتحقق طول النص، مُتحقق تعبير عشوائي... إلخ، إذا كان هناك حاجة، سأقوم بشرحها جميعًا.
ما تم ذكره أعلاه هو شرح تفصيلي لتعليمات التحقق من المدخلات لـ Struts2، آمل أن يكون مفيدًا لكم، إذا كان لديكم أي استفسارات، فأرجو ترك تعليق، وسأقوم بالرد على رسائلكم في الوقت المناسب. وأشكركم أيضًا على دعمكم لموقع呐喊 لتعليم البرمجة!
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق الطبع والنشر، ويتم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل متعاوني وتحميله بشكل مستقل، ويتمتع الموقع غير المالك بحقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية متعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فأرجو إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') لإبلاغنا، وقدم الدليل على الدليل، وسنقوم بإزالة المحتوى المزعوم عن انتهاك حقوق النسخ فور التحقق من ذلك.