1. قيم افتراضية مختلفة في تكوين الإجراء
<اسم الحزمة = "csdn" namespace = "/ اختبار" يمتد = "struts-default">
< اسم الإجراء = "helloworld" طريقة = "تنفيذ" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</أكشن>
</حزمة>
1>إذا لم يتم تحديد فئة للعمل، فإن الإعداد الافتراضي هو ActionSupport.
2>إذا لم يتم تحديد طريقة للإجراء، فسيتم تنفيذ طريقة التنفيذ () في الإجراء بشكل افتراضي.
3>إذا لم يتم تحديد سمة اسم النتيجة، فإن القيمة الافتراضية هي النجاح.
2. أنواع مختلفة من إعادة توجيه النتائج في الإجراء
<اسم العمل = "helloworld">
<result name="success">/WEB-INF/page/hello.jsp</result>
</أكشن>
يشبه تكوين النتيجة إعادة التوجيه في الدعامات 1، لكن الدعامات 2 توفر أنواع نتائج متعددة. الأنواع شائعة الاستخدام هي: المرسل (القيمة الافتراضية)، وإعادة التوجيه، وإعادة التوجيه، والنص العادي.
فيما يلي مثال على نوع نتيجة redirectAction، إذا كان الإجراء المعاد توجيهه موجودًا في نفس الحزمة:
<result type="redirectAction">helloworld</result>
إذا كان الإجراء المُعاد توجيهه موجودًا في مساحة اسم أخرى:
<نوع النتيجة = "redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">/test</param>
</النتيجة>
نص عادي: يعرض محتوى الملف الأصلي، على سبيل المثال، عندما نحتاج إلى عرض الكود المصدري لملف jsp كما هو، يمكننا استخدام هذا النوع.
<اسم النتيجة = "مصدر" نوع = "نص عادي">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- حدد التشفير لقراءة الملفات -->
</النتيجة>
وفي النتيجة، يمكنك أيضًا استخدام تعبير ${attribute name} للوصول إلى السمات الموجودة في الإجراء. تتوافق أسماء السمات في التعبير مع السمات الموجودة في الإجراء. على النحو التالي:
<result type="redirect">view.jsp?id=${id}</result>
3. تشترك الإجراءات المتعددة في عرض واحد - تكوين النتائج العامة
عند استخدام نفس العرض في إجراءات متعددة، يجب أن نحدد النتيجة على أنها عرض عام. يتم توفير الأمام العالمي في الدعامات 1، ويتم توفير وظائف مماثلة أيضًا في الدعامات 2:
<حزمة...>
<النتائج العالمية>
<result name="message">/message.jsp</result>
</النتائج العالمية>
</حزمة>
4. أدخل القيم في خصائص الإجراء
يوفر Struts2 وظيفة حقن التبعية للخصائص في Action. في ملف التكوين struts2، يمكننا بسهولة حقن القيم في الخصائص في Action. ملاحظة: يجب أن توفر الخصائص طرق الضبط.
الطبقة العامة HelloWorldAction {
سلسلة خاصة savePath؛
سلسلة عامة getSavePath () {
إرجاع مسار الحفظ؛
}
مجموعة الفراغ العامSavePath(سلسلة savePath) {
this.savePath = savePath;
}
...
}
<اسم الحزمة = "csdn" namespace = "/ اختبار" يمتد = "struts-default">
<اسم العمل = "helloworld">
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</أكشن>
</حزمة>
يقوم ما سبق بإدخال "/ الصور" في سمة savePath الخاصة بالإجراء من خلال العقدة <param>.
5. حدد لاحقة الطلب التي يجب معالجتها بواسطة Struts 2
في السابق، استخدمنا اللاحقة .action بشكل افتراضي للوصول إلى Action. في الواقع، يمكن تعديل اللاحقة الافتراضية من خلال "struts.action.extension" الثابت. على سبيل المثال، يمكننا تكوين Struts 2 لمعالجة مسارات الطلب فقط مع .do كلاحقة:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE دعامات عامة
"-//مؤسسة برمجيات أباتشي//تكوين DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<الدعامات>
<الاسم الثابت = "struts.action.extension" value = "do"/>
</الدعامات>
إذا كان المستخدم يحتاج إلى تحديد لاحقات طلب متعددة، فافصل بين اللواحق المتعددة بفواصل (،). يحب:
<الاسم الثابت = "struts.action.extension" value = "do,go"/>
6. وصف تعريف الثوابت بالتفصيل
يمكن تكوين الثوابت في ملف struts.xml أو struts.properties، ومن المستحسن تكوينها في ملف struts.xml، كما يلي:
قم بتكوين الثوابت في ملف struts.xml
<الدعامات>
<الاسم الثابت = "struts.action.extension" value = "do"/>
</الدعامات>
تكوين الثوابت في struts.properties
struts.action.extension=do
نظرًا لأنه يمكن تعريف الثوابت في ملفات تكوين متعددة أدناه، فنحن بحاجة إلى فهم ترتيب البحث الذي يقوم من خلاله struts2 بتحميل الثوابت:
الدعامات-default.xml
الدعامات-plugin.xml
struts.xml
struts.properties
web.xml
إذا تم تكوين نفس الثابت في ملفات متعددة، فإن القيمة الثابتة التي تم تكوينها في الملف الأخير ستحل محل القيمة الثابتة التي تم تكوينها في الملف السابق.
7. مقدمة للثوابت شائعة الاستخدام
<!-- حدد مجموعة الترميز الافتراضية، التي تعمل على طريقة setCharacterEncoding الخاصة بـ HttpServletRequest ومخرجات العلامة الحرة والسرعة -->
<الاسم الثابت = "struts.i18n.encoding" value = "UTF-8"/>
<!-- تحدد هذه السمة لاحقة الطلب التي يجب معالجتها بواسطة Struts 2. القيمة الافتراضية لهذه السمة هي الإجراء، أي أن جميع الطلبات المطابقة لـ *.action تتم معالجتها بواسطة Struts2.
إذا كان المستخدم يحتاج إلى تحديد لاحقات طلب متعددة، فافصل بين اللواحق المتعددة بفواصل (،). -->
<الاسم الثابت = "struts.action.extension" value = "do"/>
<!-- قم بتعيين ما إذا كان المتصفح يقوم بتخزين المحتوى الثابت مؤقتًا أم لا. القيمة الافتراضية صحيحة (تستخدم في بيئة الإنتاج) -->
<الاسم الثابت = "struts.serve.static.browserCache" value = "false"/>
<!-- عندما يتم تعديل ملف تكوين الدعامات، ما إذا كان النظام سيعيد تحميل الملف تلقائيًا، فإن القيمة الافتراضية تكون خاطئة (تستخدم في بيئة الإنتاج)، فمن الأفضل تشغيلها أثناء مرحلة التطوير -->
<الاسم الثابت = "struts.configuration.xml.reload" value = "true"/>
<!-- يُستخدم في وضع التطوير، بحيث يمكن طباعة رسائل خطأ أكثر تفصيلاً -->
<اسم ثابت = "struts.devMode" value = "true" />
<!--موضوع العرض الافتراضي-->
<اسم ثابت = "struts.ui.theme" value = "بسيط" />
<!عند التكامل مع الربيع، حدد أن الربيع مسؤول عن إنشاء كائن الإجراء -->
<اسم ثابت = "struts.objectFactory" value = "spring" />
<!تحدد هذه الخاصية ما إذا كان Struts 2 يدعم استدعاء الأسلوب الديناميكي أم لا. القيمة الافتراضية لهذه الخاصية صحيحة. إذا كنت بحاجة إلى إيقاف تشغيل استدعاء الأسلوب الديناميكي، فيمكنك تعيين هذه الخاصية إلى خطأ. -->
<اسم ثابت = "struts.enable.DynamicMethodInvocation" value = "false"/>
<!--الحد الأقصى لحجم الملفات التي تم تحميلها-->
<الاسم الثابت = "struts.multipart.maxSize" value = "10701096"/>
8. حدد ملفات تكوين الدعامات المتعددة للتطبيق
في معظم التطبيقات، مع زيادة حجم التطبيق، سيزيد أيضًا عدد الإجراءات في النظام بشكل ملحوظ، مما يتسبب في تضخم ملف التكوين struts.xml بشكل كبير. لتجنب أن يكون ملف struts.xml كبيرًا جدًا ومتضخمًا ولتحسين إمكانية قراءة ملف struts.xml، يمكننا تحليل ملف تكوين struts.xml إلى ملفات تكوين متعددة، ثم تضمين ملفات تكوين أخرى في ملف struts.xml ملف. يحدد ملف struts.xml التالي ملفات تكوين متعددة من خلال عنصر <include>:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE دعامات عامة
"-//مؤسسة برمجيات أباتشي//تكوين DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<الدعامات>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</الدعامات>
بهذه الطريقة، يمكننا إضافة Struts 2 Action إلى ملفات تكوين متعددة حسب الوحدة.
9. استدعاء الطريقة الديناميكية
إذا كانت هناك طرق متعددة في الإجراء، فيمكننا استخدام !+method name لاستدعاء الطريقة المحددة. على النحو التالي:
الطبقة العامة HelloWorldAction {
رسالة سلسلة خاصة؛
....
تنفيذ السلسلة العامة () يلقي استثناءً {
this.message = "تطبيقي الأول لـ struts2";
إرجاع "النجاح" ؛
}
سلسلة عامة أخرى () تطرح استثناءً {
this.message = "الطريقة الثانية";
إرجاع "النجاح" ؛
}
}
افترض أن مسار URL للوصول إلى الإجراء أعلاه هو: /struts/test/helloworld.action
للوصول إلى التابع ()الآخر للإجراء، يمكننا أن نسميه بهذا الشكل:
/struts/test/helloworld!other.action
إذا لم نرغب في استخدام استدعاء الأسلوب الديناميكي، فيمكننا إيقاف استدعاء الأسلوب الديناميكي من خلال الدعامات الثابتة.enable.DynamicMethodInvocation.
<اسم ثابت = "struts.enable.DynamicMethodInvocation" value = "false"/>
10. استخدم أحرف البدل لتحديد الإجراءات
<اسم الحزمة = "csdn" namespace = "/ اختبار" يمتد = "struts-default">
<action name="helloworld_*"method="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
</أكشن>
</حزمة>
الطبقة العامة HelloWorldAction {
رسالة سلسلة خاصة؛
....
تنفيذ السلسلة العامة () يلقي استثناءً {
this.message = "تطبيقي الأول لـ struts2";
إرجاع "النجاح" ؛
}
سلسلة عامة أخرى () تطرح استثناءً {
this.message = "الطريقة الثانية";
إرجاع "النجاح" ؛
}
}
للوصول إلى طريقةother()، يمكنك الوصول إليها من خلال عنوان URL مثل هذا: /test/helloworld_other.action
11. تلقي معلمات الطلب
استخدم الأنواع الأساسية لتلقي معلمات الطلب (الحصول على/النشر)
حدد سمة بنفس اسم معلمة الطلب في فئة الإجراء، ويمكن لـ struts2 تلقي معلمة الطلب تلقائيًا وتعيينها للسمة التي تحمل الاسم نفسه.
مسار الطلب: http://localhost:8080/test/view.action?id=78
فئة المنتج العامة {
معرف عدد صحيح خاص؛
public void setId(Integer id) {// يستخدم struts2 تقنية الانعكاس لاستدعاء طريقة ضبط الخاصية بنفس اسم معلمة الطلب للحصول على قيمة معلمة الطلب
this.id = id;
}
عدد صحيح عام getId () {معرف الإرجاع؛}
}
استخدم النوع المركب لتلقي مسار طلب معلمات الطلب: http://localhost:8080/test/view.action?product.id=78
فئة المنتج العامة {
منتج المنتج الخاص؛
مجموعة الفراغ العامة (منتج المنتج) { this.product = المنتج }
المنتج العام getProduct () {إرجاع المنتج؛}
}
تقوم Struts2 أولاً بإنشاء كائن المنتج عن طريق استدعاء المُنشئ الافتراضي للمنتج من خلال تقنية الانعكاس، ثم استدعاء طريقة ضبط الخاصية التي تحمل نفس اسم معلمة الطلب في المنتج من خلال تقنية الانعكاس للحصول على قيمة معلمة الطلب.
12. معنى تحويل النوع
بالنسبة لإطار عمل MVC الذكي، لا بد من تنفيذ تحويل النوع نظرًا لأن معلمات الطلب لتطبيقات بنية B/S (المتصفح/الخادم) يتم إرسالها إلى الخادم من خلال المتصفح، ولا يمكن أن تحتوي هذه المعلمات على أنواع بيانات غنية، لذلك نوع البيانات يجب أن يكتمل التحويل على جانب الخادم
يعد إطار عمل MVC بمثابة حل لطبقة العرض التقديمي ويجب أن يوفر دعمًا لتحويل النوع. يوفر Struts2 دعمًا قويًا جدًا لتحويل النوع.
13. معالجة بيانات طبقة العرض
بالنسبة لتطبيقات الويب، تُستخدم طبقة العرض التقديمي بشكل أساسي للتفاعل مع المستخدمين، بما في ذلك جمع بيانات إدخال المستخدم وعرض حالة الخادم للمستخدمين. لذلك، فإن تدفق البيانات في طبقة العرض التقديمي له اتجاهان أساسيان: بيانات الإدخال وبيانات الإخراج.
بالنسبة لبيانات الإدخال: تحتاج إلى إكمال التحويل من بيانات السلسلة إلى أنواع متعددة من البيانات. عادةً لا يمكن إكمال البرنامج تلقائيًا ويجب تحويله يدويًا في التعليمات البرمجية.
بالنسبة لبيانات الإخراج: يدعم كل من Java وjsp الإخراج المباشر لأنواع بيانات متعددة.
معالجة البيانات الأخرى في طبقة العرض هي: التحقق من البيانات، والذي ينقسم إلى التحقق من العميل والتحقق من جانب الخادم، وسيتم شرح ذلك بالتفصيل لاحقًا.
14. نوع التحويل
معلمات HTTP هي جميع أنواع السلاسل. قد تكون البيانات المحفوظة عبارة عن سلسلة أو رقم أو منطقية أو تاريخ ووقت وما إلى ذلك أو نوع JavaBean. تحويل النوع يدويًا، مثل تحويل سلسلة إلى تاريخ، عن طريق: الحصول على السلسلة من خلال طريقة request.getParameter؛ والتحقق مما إذا كانت فارغة؛ تحويل السلسلة إلى كائن تاريخ من خلال طريقة DateFormat.parse
15. تحويل نوع Struts2
Struts2 تحويل النوع المدمج
تُكمل السلسلة والقيمة المنطقية التحويل بين قيم السلسلة والقيم المنطقية
تحويل السلسلة والحرف بين السلاسل والأحرف العادية
تُكمل String وint وInteger عملية التحويل بين السلاسل والأعداد الصحيحة.
تُكمل String وLong عملية التحويل بين قيم السلسلة والأعداد الصحيحة الطويلة
تُكمل السلسلة والمزدوجة والمزدوجة تحويل السلاسل وقيم الفاصلة العائمة ذات الدقة المزدوجة.
تقوم String وFloat بإكمال التحويل بين السلاسل والنقطة العائمة ذات الدقة الواحدة
تقوم السلسلة والتاريخ بإكمال التحويل بين أنواع السلسلة والتاريخ يستخدم تنسيق التاريخ التنسيق SHORT للغة المحلية حيث يطلب المستخدم التنسيق.
السلسلة والمصفوفة في الحالة الافتراضية، يكون عنصر المصفوفة عبارة عن سلسلة إذا قام المستخدم بتعريف محول النوع، فقد يكون أيضًا أنواع بيانات مركبة أخرى.
سلسلة وخريطة وقائمة
16. واجهة برمجة تطبيقات تحويل نوع الدعامات
تم تنفيذ محول النوع الخاص بـ Struts2 فعليًا استنادًا إلى OGNL. توجد واجهة ognl.TypeConverter في مشروع OGNL. هذه الواجهة هي الواجهة التي يجب تنفيذها لتنفيذ محول النوع. يتم تعريف الواجهة على النحو التالي:
الواجهة العامة TypeConverter {
كائن عام تحويل القيمة (خريطة arg0، كائن arg1، عضو arg2، سلسلة arg3،
كائن arg4، فئة arg5) {
عودة فارغة؛
}
لتنفيذ محول النوع، يجب عليك تنفيذ TypeConverter أعلاه، ومع ذلك، فإن الطرق الموجودة في الواجهة أعلاه معقدة للغاية، لذا يوفر مشروع OGNL أيضًا فئة تنفيذ لهذه الواجهة: ognl.DefaultTypeConverter. يمكنك تنفيذ محول النوع الخاص بك وراثة هذه الفئة يتم تعريفها على النحو التالي:
الطبقة العامة DefaultTypeConverter تمتد الكائن بتنفيذ TypeConverter{
كائن عام ConvertValue(Map<String,Object> context, Object value, Class toType) {
}
……//طرق أخرى
}
يتمثل دور طريقة ConvertValue في إكمال تحويل النوع، ولكن تحويل النوع هذا ثنائي الاتجاه عندما تحتاج السلسلة إلى التحويل إلى مثيل كائن، يتم استخدام هذه الطريقة أيضًا مستخدم. يتم هذا التحويل من خلال نوع المعلمة toType وهو النوع الهدف الذي يحتاج إلى التحويل. لذلك، يمكن تحديد اتجاه التحويل بناءً على المعلمة toType.
معلمات طريقة ConvertValue ومعنى الإرجاع المعلمة الأولى: السياق هو سياق بيئة تحويل النوع المعلمة الثانية: القيمة هي المعلمة التي تحتاج إلى التحويل. تختلف قيمة معلمة القيمة أيضًا اعتمادًا على اتجاه التحويل.
المعلمة الثالثة: toType هي نوع الهدف المحول. القيمة المرجعة لهذه الطريقة هي القيمة بعد تحويل النوع. يتغير نوع القيمة أيضًا مع اتجاه التحويل. يمكن أن نرى أن طريقة ConvertValue المحولة تقبل القيمة التي تحتاج إلى تحويل، ونوع الهدف الذي يحتاج إلى تحويل هو معلمة، ثم تقوم بإرجاع القيمة المستهدفة المحولة.
لماذا تعتبر القيمة مصفوفة سلسلة؟
بالنسبة لمحول DefaultTypeConverter، يجب أن يأخذ في الاعتبار الموقف الأكثر شيوعًا، لذلك يعامل جميع معلمات الطلب كمصفوفات سلسلة بدلاً من سلاسل. أي ما يعادل قيم المعلمات التي تم الحصول عليها بواسطة getParameterValues ()