1. معنى تحويل النوع
بالنسبة لإطار عمل MVC الذكي، لا بد من تنفيذ تحويل النوع نظرًا لأن معلمات الطلب لتطبيقات بنية B/S (المتصفح/الخادم) يتم إرسالها إلى الخادم من خلال المتصفح، ولا يمكن أن تحتوي هذه المعلمات على أنواع بيانات غنية، لذلك نوع البيانات يجب أن يكتمل التحويل على جانب الخادم
يعد إطار عمل MVC بمثابة حل لطبقة العرض التقديمي ويجب أن يوفر دعمًا لتحويل النوع. يوفر Struts2 دعمًا قويًا جدًا لتحويل النوع.
2. معالجة بيانات طبقة العرض
1. بالنسبة لتطبيقات الويب، تُستخدم طبقة العرض التقديمي بشكل أساسي للتفاعل مع المستخدمين، بما في ذلك جمع بيانات إدخال المستخدم وعرض حالة الخادم للمستخدمين. لذلك، فإن تدفق البيانات في طبقة العرض التقديمي له اتجاهان أساسيان: بيانات الإدخال وبيانات الإخراج.
2. بالنسبة للبيانات المدخلة: من الضروري إكمال التحويل من بيانات السلسلة إلى أنواع متعددة من البيانات. عادةً لا يمكن إكمال البرنامج تلقائيًا ويجب تحويله يدويًا في التعليمات البرمجية.
3. بالنسبة لبيانات الإخراج: يدعم كل من Java وjsp الإخراج المباشر لأنواع بيانات متعددة.
4. معالجة البيانات الأخرى في طبقة العرض هي: التحقق من البيانات، والذي ينقسم إلى التحقق من العميل والتحقق من جانب الخادم، وسيتم شرح ذلك بالتفصيل لاحقًا.
3. نوع التحويل
1. معلمات HTTP هي جميع أنواع السلاسل. قد تكون البيانات المحفوظة عبارة عن سلسلة أو رقم أو منطقية أو تاريخ ووقت وما إلى ذلك أو نوع JavaBean. تحويل النوع يدويًا، مثل تحويل سلسلة إلى تاريخ، عن طريق: الحصول على السلسلة من خلال طريقة request.getParameter؛ والتحقق مما إذا كانت فارغة؛ تحويل السلسلة إلى كائن تاريخ من خلال طريقة DateFormat.parse
2. تحويل نوع Struts2
Struts2 تحويل النوع المدمج
تُكمل السلسلة والقيمة المنطقية التحويل بين قيم السلسلة والقيم المنطقية
تحويل السلسلة والحرف بين السلاسل والأحرف العادية
تُكمل String وint وInteger عملية التحويل بين السلاسل والأعداد الصحيحة.
تُكمل String وLong عملية التحويل بين قيم السلسلة والأعداد الصحيحة الطويلة
تُكمل السلسلة والمزدوجة والمزدوجة تحويل السلاسل وقيم الفاصلة العائمة ذات الدقة المزدوجة.
تُكمل String وFloat التحويل بين السلاسل والنقطة العائمة ذات الدقة الواحدة
تقوم السلسلة والتاريخ بإكمال التحويل بين أنواع السلسلة والتاريخ يستخدم تنسيق التاريخ التنسيق SHORT للغة المحلية حيث يطلب المستخدم التنسيق.
السلسلة والمصفوفة في الحالة الافتراضية، يكون عنصر المصفوفة عبارة عن سلسلة إذا قام المستخدم بتعريف محول النوع، فقد يكون أيضًا أنواع بيانات مركبة أخرى.
سلسلة وخريطة وقائمة
Struts2 تحويل النوع المدمج
تُكمل السلسلة والقيمة المنطقية التحويل بين قيم السلسلة والقيم المنطقية
تحويل السلسلة والحرف بين السلاسل والأحرف العادية
تُكمل String وint وInteger عملية التحويل بين السلاسل والأعداد الصحيحة.
تُكمل String وLong عملية التحويل بين قيم السلسلة والأعداد الصحيحة الطويلة
تُكمل السلسلة والمزدوجة والمزدوجة تحويل السلاسل وقيم الفاصلة العائمة ذات الدقة المزدوجة.
تقوم String وFloat بإكمال التحويل بين السلاسل والنقطة العائمة ذات الدقة الواحدة
تقوم السلسلة والتاريخ بإكمال التحويل بين أنواع السلسلة والتاريخ يستخدم تنسيق التاريخ التنسيق SHORT للغة المحلية حيث يطلب المستخدم التنسيق.
السلسلة والمصفوفة في الحالة الافتراضية، يكون عنصر المصفوفة عبارة عن سلسلة إذا قام المستخدم بتعريف محول النوع، فقد يكون أيضًا أنواع بيانات مركبة أخرى.
سلسلة وخريطة وقائمة
3. تحويل النوع المدمج
4. واجهة برمجة تطبيقات تحويل نوع الدعامات
تم تنفيذ محول النوع الخاص بـ Struts2 فعليًا استنادًا إلى OGNL. توجد واجهة ognl.TypeConverter في مشروع OGNL. هذه الواجهة هي الواجهة التي يجب تنفيذها لتنفيذ محول النوع. يتم تعريف الواجهة على النحو التالي:
الواجهة العامة TypeConverter {
كائن عام تحويل القيمة (خريطة arg0، كائن arg1، عضو arg2، سلسلة arg3،
كائن arg4، فئة arg5) {
عودة فارغة؛
}
لتنفيذ محول النوع، يجب عليك تنفيذ TypeConverter أعلاه، ومع ذلك، فإن الطرق الموجودة في الواجهة أعلاه معقدة للغاية، لذا يوفر مشروع OGNL أيضًا فئة تنفيذ لهذه الواجهة: ognl.DefaultTypeConverter. يمكنك تنفيذ محول النوع الخاص بك وراثة هذه الفئة يتم تعريفها على النحو التالي:
الطبقة العامة DefaultTypeConverter تمتد الكائن بتنفيذ TypeConverter{
كائن عام ConvertValue(Map<String,Object>context, Objectvalue, ClasstoType) {
}
……//طرق أخرى
}
يتمثل دور طريقة ConvertValue في إكمال تحويل النوع، ولكن تحويل النوع هذا ثنائي الاتجاه عندما تحتاج السلسلة إلى التحويل إلى مثيل كائن، يتم استخدام هذه الطريقة أيضًا مستخدم. يتم هذا التحويل من خلال نوع المعلمة toType وهو النوع الهدف الذي يحتاج إلى التحويل. لذلك، يمكن تحديد اتجاه التحويل بناءً على المعلمة toType.
معلمات طريقة ConvertValue ومعنى الإرجاع المعلمة الأولى: السياق هو سياق بيئة تحويل النوع المعلمة الثانية: القيمة هي المعلمة التي تحتاج إلى التحويل. تختلف قيمة معلمة القيمة أيضًا اعتمادًا على اتجاه التحويل.
المعلمة الثالثة: toType هي نوع الهدف المحول. القيمة المرجعة لهذه الطريقة هي القيمة بعد تحويل النوع. يتغير نوع القيمة أيضًا مع اتجاه التحويل. يمكن أن نرى أن طريقة ConvertValue المحولة تقبل القيمة التي تحتاج إلى تحويل، ونوع الهدف الذي يحتاج إلى تحويل هو معلمة، ثم تقوم بإرجاع القيمة المستهدفة المحولة.
لماذا تعتبر القيمة مصفوفة سلسلة؟
بالنسبة لمحول DefaultTypeConverter، يجب أن يأخذ في الاعتبار الموقف الأكثر شيوعًا، لذلك يعامل جميع معلمات الطلب كمصفوفات سلسلة بدلاً من سلاسل. أي ما يعادل قيم المعلمات التي تم الحصول عليها بواسطة getParameterValues ()
4. تنفيذ محول النوع
1. صفحة التسجيل بالخطوة الأولى
2. الخطوة الثانية: تنفيذ فئة تغليف المستخدم
3. الخطوة الثالثة: تنفيذ فئة العمل
5. الخطوة 5: تسجيل محول النوع هناك ثلاث طرق للتسجيل:
1. قم بتسجيل محول النوع المحلي: يعمل محول النوع المحلي فقط على خصائص إجراء معين
2. تسجيل محول النوع العام: سيصبح محول النوع العمومي ساري المفعول على جميع سمات الإجراء المحددة.
3. استخدم التعليقات التوضيحية JDK1.5 لتسجيل محول النوع: أنشئ محول النوع من خلال التسجيل.
6. تنسيق اسم ملف تسجيل محول النوع الجزئي: ActionName-conversion.properties: ActionName هو اسم فئة الإجراء الذي يحتاج إلى المحول ليصبح ساري المفعول، وسلسلة -conversion.properties التالية هي ملف خصائص نموذجي عند إصلاح جزء أو المزيد من الملف. ويتكون من أزواج قيمة المفتاح. محتوى الملف هو: propertyName = فئة محول النوع. وفيما يلي محتوى ملف UserAction-conversion.properties:
#حدد أن سمة المستخدم في UserAction تحتاج إلى استخدام فئة redarmy.user.UserConverter لإكمال تحويل النوع
user=redarmy.user.UserConverter
ملاحظة: يجب أن يكون ملف الخصائص أعلاه في نفس الحزمة مثل UserAction، أي أنه في الحالة المذكورة أعلاه، يمكن استخدام الطريقة المذكورة أعلاه لتحقيق تحويل النوع المحلي.
7. تنسيق الملف لاسم تسجيل محول النوع العام: ملف xwork-conversion.properties. هذا الملف هو أيضًا ملف خصائص، ويتكون محتواه أيضًا من عنصر "النوع المركب = فئة محول النوع المقابل".
فيما يلي محتوى ملف xwork-conversion.properties:
# حدد محول النوع لجميع فئات redarmy.user.User كـ redarmy.user.UserConverter
redarmy.user.User=redarmy.user.UserConverter
ملاحظة: يجب إنشاء ملف xwork-conversion.properties ضمن مجلد الفئة، أي ضمن src.
5. تحويل نوع مخصص Struts2
يتم توفير فئة StrutsTypeConverter في Struts2 لتبسيط تصميم تحويل النوع المخصص. تحتوي هذه الفئة على طريقتين مجردتين يجب تنفيذهما:
(1) كائن عام ConvertFromString(Map context, String[]values, Class toClass);
معلمات طريقة المعالجة المستخدمة لتحويل بيانات نوع السلسلة إلى أنواع مخصصة:
السياق --- المعلومات السياقية المتعلقة بالإجراء
القيم --- قيم المعلمات التي تم الحصول عليها من الطلب
toClass --- النوع الهدف المراد تحويله
(2) سلسلة عامة ConvertToString(Map context, Object obj);
يستخدم لتحويل الأنواع المخصصة إلى سلسلة
المعلمة:
السياق --- المعلومات السياقية المتعلقة بالإجراء
obj --- كائن من النوع المخصص
تحليل المثال: تصميم وتكوين تحويل نوع التاريخ
(1) قم بتصميم MyDateTypeConverter، وورث StrutsTypeConverter، وقم بتغطية اثنين من أساليبه، ويكون الرمز المرجعي كما يلي:
كائن عام تحويل من سلسلة (سياق الخريطة، قيم السلسلة []، الفئة إلى فئة) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
يحاول{
التاريخ v = sdf.parse(values[0]);
العودة ضد؛
}قبض(استثناء ه){
printStackTrace();
إرجاع تاريخ جديد ()؛
}
}
تابع
سلسلة عامة ConvertToString(Map context, Object obj) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy year MM Month dd day");
Date v = (Date)obj;
إرجاع sdf.format(v);
}
على الرغم من أن Struts2 يدعم تحويل السلسلة والتاريخ بشكل افتراضي، إلا أنه يدعم فقط تحويل التنسيق القصير وتنسيق التاريخ المحلي، وهو ما قد لا يلبي احتياجاتك. نحتاج إلى تنفيذ تحويل النوع الخاص بنا.
(2) أضف سمة عيد ميلاد إلى فئة UserInfo، نوعها java.util.Date
معلومات المستخدم للفئة العامة {
معرف عدد صحيح خاص؛
اسم سلسلة خاصة؛
كلمة مرور سلسلة خاصة؛
تاريخ ميلاد خاص؛
...
}
(3) قم بتكوين محول النوع لمكون UserInfo أولاً، قم بإنشاء ملف خصائص بناءً على اسم فئة مكون UserInfo. تنسيق تسمية الملف هو class name-conversion.properties.
على سبيل المثال معلومات المستخدم-conversion.properties
يجب أن يكون هذا الملف في نفس الحزمة مثل مكون UserInfo.
تنسيق محتوى ملف الميزة هذا كما يلي:
عيد ميلاد=demo.converter.MyDateTypeConverter
يوضح:
عيد الميلاد هو اسم السمة لنوع java.util.Date في مكون UserInfo
demo.converter.MyDateTypeConverter هي فئة تنفيذ تحويل مخصصة
يأخذ إطار عمل Strus2 ذلك في الاعتبار ويوفر طريقة بسيطة للتعامل معه.
لتكوين محول النوع على المستوى العام، ما عليك سوى كتابة ملف خصائص باسم xwork-conversion.properties، والذي يجب أن يكون موجودًا في الدليل /WEB-INF/classes، بالمحتوى التالي:
java.util.Date=demo.converter.MyDateTypeConverter
6. محول نوع مخصص
خصائص النوع java.util.Date يمكن أن تتلقى قيم معلمات الطلب بتنسيق 2009-07-20. ولكن إذا كنا بحاجة إلى تلقي معلمات الطلب بتنسيق 20091221، فيجب علينا تحديد محول النوع، وإلا فلن يتمكن struts2 من إكمال تحويل النوع تلقائيًا.
import java.util.Date;
الطبقة العامة HelloWorldAction {
تاريخ إنشاء خاص؛
التاريخ العام getCreatetime() {
إرجاع وقت الإنشاء؛
}
مجموعة الفراغ العام (تاريخ إنشاء الوقت) {
this.createtime = createtime;
}
}
الطبقة العامة DateConverter تمتد DefaultTypeConverter {
@Override public Object converterValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
يحاول {
if(toType == Date.class){// عندما يتم تحويل السلسلة إلى نوع التاريخ
String[] params = (String[]) value;// Request.getParameterValues()
إرجاع dateFormat.parse(params[0]);
}else if(toType == String.class){// عندما يتم تحويل التاريخ إلى سلسلة
تاريخ التاريخ = (التاريخ) القيمة؛
تاريخ الإرجاعFormat.format(date);
}
} قبض على (ParseException e) {}
عودة فارغة؛
}
}
قم بتسجيل محول النوع أعلاه كمحول نوع محلي:
ضع الملف ActionClassName-conversion.properties ضمن الحزمة حيث توجد فئة Action. ActionClassName هو اسم فئة Action، و-conversion.properties التالي هو أسلوب كتابة ثابت. في هذا المثال، يجب أن يكون اسم الملف HelloWorldAction-conversion.properties. محتويات ملف الخصائص هي:
اسم الخاصية = اسم الفئة الكاملة لمحول النوع في هذا المثال، محتويات ملف HelloWorldAction-conversion.properties هي:
createtime=cn.csdn.conversion.DateConverter
قم بتسجيل محول النوع أعلاه كمحول نوع عام:
ضع ملف xwork-conversion.properties ضمن WEB-INF/classes. محتويات ملف الخصائص هي:
النوع المطلوب تحويله = اسم الفئة المؤهلة بالكامل لمحول النوع في هذا المثال، محتويات الملف xwork-conversion.properties هي:
java.util.Date=cn.csdn.conversion.DateConverter
خصائص النوع java.util.Date يمكن أن تتلقى قيم معلمات الطلب بتنسيق 2009-07-20. ولكن إذا كنا بحاجة إلى تلقي معلمات الطلب بتنسيق 20091221، فيجب علينا تحديد محول النوع، وإلا فلن يتمكن struts2 من إكمال تحويل النوع تلقائيًا.
import java.util.Date;
الطبقة العامة HelloWorldAction {
تاريخ إنشاء خاص؛
التاريخ العام getCreatetime() {
إرجاع وقت الإنشاء؛
}
مجموعة الفراغ العام (تاريخ إنشاء الوقت) {
this.createtime = createtime;
}
}
الطبقة العامة DateConverter تمتد DefaultTypeConverter {
@Override public Object converterValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
يحاول {
if(toType == Date.class){// عندما يتم تحويل السلسلة إلى نوع التاريخ
String[] params = (String[]) value;// Request.getParameterValues()
إرجاع dateFormat.parse(params[0]);
}else if(toType == String.class){// عندما يتم تحويل التاريخ إلى سلسلة
تاريخ التاريخ = (التاريخ) القيمة؛
تاريخ الإرجاعFormat.format(date);
}
} قبض على (ParseException e) {}
عودة فارغة؛
}
}
قم بتسجيل محول النوع أعلاه كمحول نوع محلي:
ضع الملف ActionClassName-conversion.properties ضمن الحزمة حيث توجد فئة Action. ActionClassName هو اسم فئة Action، و-conversion.properties التالي هو أسلوب كتابة ثابت. في هذا المثال، يجب أن يكون اسم الملف HelloWorldAction-conversion.properties. محتويات ملف الخصائص هي:
اسم الخاصية = اسم الفئة الكاملة لمحول النوع في هذا المثال، محتويات ملف HelloWorldAction-conversion.properties هي:
createtime=cn.csdn.conversion.DateConverter
قم بتسجيل محول النوع أعلاه كمحول نوع عام:
ضع ملف xwork-conversion.properties ضمن WEB-INF/classes. محتويات ملف الخصائص هي:
النوع المطلوب تحويله = اسم الفئة المؤهلة بالكامل لمحول النوع في هذا المثال، محتويات الملف xwork-conversion.properties هي:
java.util.Date= cn.csdnconversion.DateConverter