1. التدويل
تحضير ملفات الموارد يكون تنسيق تسمية ملفات الموارد كما يلي:
baseName_language_country.properties
baseName_language.properties
baseName.properties
من بينها، baseName هو الاسم الأساسي لملف المورد الذي يمكننا تخصيصه، ولكن يجب أن تكون اللغة والبلد هي اللغة والبلد اللذين تدعمهما Java. يحب:
البر الرئيسى للصين: baseName_zh_CN.properties
الولايات المتحدة: baseName_en_US.properties
أضف الآن ملفين من ملفات الموارد إلى التطبيق:
الأول يخزن الصيني: csdn_zh_CN.properties
المحتوى هو: Welcome=Welcome to Chuanzhi Podcast المستودع الثاني باللغة الإنجليزية (الولايات المتحدة): csdn_en_US.properties
المحتوى هو: Welcome=welcome to csdn
بالنسبة لملفات الملكية الصينية، بعد أن نكتبها، يجب علينا استخدام الأمر original2ascii المقدم من jdk لتحويل الملفات إلى ملفات مرمزة يونيكود. يتم استخدام الأمر على النحو التالي:
original2ascii file.properties المصدر file.properties
2. تكوين الموارد العالمية وإخراج المعلومات الدولية
بعد إعداد ملف المورد، يمكننا تعريف ملف المورد كملف مورد عام من خلال الثابت struts.custom.i18n.resources في ملف struts.xml، كما يلي:
<الاسم الثابت = "struts.custom.i18n.resources" value = "csdn" />
csdn هو الاسم الأساسي لملف المورد.
يمكننا لاحقًا الوصول إلى معلومات التدويل على الصفحة أو في الإجراء:
استخدم العلامة <s:text name=""/> في صفحة JSP لإخراج معلومات التدويل:
<s:text name="user"/>، الاسم هو المفتاح في ملف المورد
في فئة الإجراء، يمكنك وراثة ActionSupport واستخدام طريقة getText() للحصول على معلومات التدويل. يتم استخدام المعلمة الأولى لهذه الطريقة لتحديد المفتاح في ملف المورد.
في علامة النموذج، حدد المفتاح في ملف المورد من خلال سمة المفتاح، مثل:
<s:textfield name="realname" key="user"/>
3. التدويل - إخراج معلومات التدويل باستخدام العناصر النائبة
محتويات ملف الموارد هي كما يلي:
مرحبًا= {0}، مرحبًا بك في Chuanzhi Podcast {1}
معلومات تدويل الإخراج مع العناصر النائبة في صفحة jsp
<s:text name="welcome">
<s:param><s:property value="realname"/></s:param>
<s:param>التعلم</s:param>
</s:نص>
للحصول على معلومات التدويل باستخدام العناصر النائبة في فئة الإجراء، يمكنك استخدام طريقة getText(String key, String[] args) أو getText(String aTextName, List args).
4. التدويل - ملفات موارد النطاق
في تطبيق كبير، يحتوي التطبيق بأكمله على كمية كبيرة من المحتوى الذي يحتاج إلى التدويل. إذا وضعنا كل المحتوى الدولي في ملف سمة المورد العام، فمن الواضح أن ذلك سيؤدي إلى أن يصبح ملف المورد كبيرًا جدًا ومتضخمًا وغير مريح. للمحافظة على هذا، يمكننا أحيانًا استخدام نطاق الحزمة لتنظيم ملفات التدويل لوحدات مختلفة.
وإليك الطريقة:
ضع ملف المورد package_language_country.properties ضمن حزمة Java. تعد الحزمة طريقة كتابة ثابتة ضمن هذه الحزمة ويمكن للحزم الفرعية الوصول إلى هذا المورد. عند البحث عن رسائل ذات مفتاح محدد، سيقوم النظام أولاً بالبحث من ملف مورد الحزمة. عندما لا يمكن العثور على المفتاح المقابل، فإنه سيبحث من ملف المورد المحدد بواسطة struts.custom.i18n.resources الثابت.
5. ملف موارد نطاق التدويل-العمل
يمكننا أيضًا تحديد ملف مورد بشكل منفصل لإجراء ما على النحو التالي:
في المسار الذي توجد به فئة الإجراء، ضع ملف المورد ActionClassName_language_country.properties وهو ActionClassName الاسم البسيط لفئة الإجراء.
عند البحث عن رسائل ذات مفتاح محدد، سيقوم النظام أولاً بالبحث من ملف المورد ActionClassName_language_country.properties إذا لم يتم العثور على المفتاح المقابل، فسوف يبحث في ملف المورد باستخدام حزمة الاسم الأساسية على طول الحزمة الحالية حتى يتم العثور عليه حزمة المستوى الأعلى. إذا لم يتم العثور على المفتاح المقابل، فسيتم البحث عنه أخيرًا من ملف المورد المحدد بواسطة الدعامة الثابتة struts.custom.i18n.resources.
6. التدويل - الوصول المباشر إلى ملف الموارد في JSP
يزودنا Struts2 بالعلامة <s:i18n> باستخدام العلامة <s:i18n> يمكننا الحصول على بيانات دولية مباشرة من ملف مورد على مسار الفصل دون أي تكوين:
<s:i18n name="csdn">
<s:text name="welcome"/>
</s:i18n>
csdn هو الاسم الأساسي لملف المورد في مسار الفئة.
إذا كان ملف المورد الذي تريد الوصول إليه موجودًا ضمن حزمة معينة في مسار الفصل، فيمكنك الوصول إليه على النحو التالي:
<s:i18n name="cn/csdn/action/package">
<s:text name="welcome">
<s:param>شياو تشانغ</s:param>
</s:نص>
</s:i18n>
ما ورد أعلاه يصل إلى ملف المورد المسمى بشكل أساسي الحزمة ضمن حزمة cn.csdn.action.
7. لغة التعبير OGNL
OGNL هو اختصار لـ Object Graphic Navigation Language، وهو مشروع مفتوح المصدر. يستخدم إطار عمل Struts 2 لغة OGNL كلغة التعبير الافتراضية.
بالمقارنة مع تعبيرات EL، فإنه يوفر بعض الوظائف التي نحتاجها عادة، مثل:
دعم استدعاءات أسلوب الكائن، مثل xxx.sayHello();
يدعم استدعاء الأسلوب الثابت للفئة والوصول إلى القيمة. تنسيق التعبير هو @[اسم الفئة الكامل (بما في ذلك مسار الحزمة)]@[اسم الطريقة |. أو 'شريط') أو @cn.csdn.Constant@APP_NAME؛
التعامل مع كائنات المجموعة.
لدى Ognl مفهوم السياق. بصراحة، السياق عبارة عن بنية MAP، والتي تنفذ واجهة java.utils.Map. في Struts2، يتم تنفيذ السياق بواسطة ActionContext.
للوصول إلى الكائنات في السياق، تحتاج إلى استخدام الرمز # لتحديد مساحة الاسم، مثل #application و #session
بالإضافة إلى ذلك، سيقوم OGNL بتعيين كائن جذر (كائن جذر) في Struts2، الكائن الجذر هو ValueStack (مكدس القيمة). إذا كنت تريد الوصول إلى خصائص الكائن في الكائن الجذر (أي ValueStack)، فيمكنك حذف مساحة الاسم # والوصول مباشرة إلى خصائص الكائن.
في struts2، فئة التنفيذ للكائن الجذر ValueStack هي OgnlValueStack. لا يخزن هذا الكائن قيمة واحدة فقط كما تخيلنا، بل يخزن مجموعة من الكائنات. يوجد متغير جذر من نوع القائمة في فئة OgnlValueStack، والذي يستخدم لتخزين مجموعة من الكائنات.
|--طلب
|--تطبيق
السياق ------|--المتغير الجذري لـ OgnlValueStack [action, OgnlUtil,...]
|--جلسة
|--attr
|--المعلمات
يُسمى الكائن الأول في المتغير الجذري بالكائن العلوي في المكدس. يمكننا عادةً الوصول إلى خصائص الكائن في المتغير الجذري عن طريق كتابة اسم الخاصية مباشرةً في تعبير OGNL، ويبدأ تسلسل البحث من الكائن الموجود أعلى المكدس في حالة عدم وجود الخاصية على الكائن في الجزء العلوي من المكدس، سيتم البحث عنه من الكائن الثاني، وإذا لم يتم العثور عليه، فابحث من الكائن الثالث، وقم بالوصول إليه بالتسلسل حتى يتم العثور عليه.
تنبيه: في Struts2، يجب استخدام تعبيرات OGNL مع علامات Struts. على سبيل المثال: <s:property value="name"/>
نظرًا لأن ValueStack هو الكائن الجذر لـ OGNL في Struts 2، إذا كان المستخدم يحتاج إلى الوصول إلى الكائنات الموجودة في حزمة القيمة، فيمكن لصفحة JSP الوصول مباشرة إلى خصائص الكائنات في ValueStack من خلال تعبير EL التالي:
${foo} // احصل على سمة foo لكائن في مكدس القيمة
إذا قمت بالوصول إلى كائنات في سياقات أخرى، نظرًا لأنها ليست كائنات جذرية، فستحتاج إلى إضافة البادئة # عند الوصول.
كائن التطبيق: يُستخدم للوصول إلى ServletContext، مثل #application.userName أو #application['userName']، وهو ما يعادل استدعاء getAttribute("username") لـ ServletContext.
كائن الجلسة: يستخدم للوصول إلى HttpSession، مثل #session.userName أو #session['userName']، وهو ما يعادل استدعاء session.getAttribute("userName").
كائن الطلب: خريطة تُستخدم للوصول إلى سمات HttpServletRequest، مثل #request.userName أو #request['userName']، وهو ما يعادل استدعاء request.getAttribute("userName").
كائن المعلمات: يُستخدم للوصول إلى معلمات طلب HTTP، مثل #parameters.userName أو #parameters['userName']، وهو ما يعادل استدعاء request.getParameter("username").
كائن attr: يستخدم للوصول إلى سماته بترتيب الصفحة->الطلب->الجلسة->التطبيق.
8. لماذا يمكنك استخدام تعبيرات EL للوصول إلى خصائص الكائنات في valueStack؟
والسبب هو أن Struts2 يقوم بتغليف HttpServletRequest بشكل أكبر. الكود المبسط هو كما يلي:
الطبقة العامة StrutsRequestWrapper تمتد HttpServletRequestWrapper {
عامة StrutsRequestWrapper(HttpServletRequest req) {
سوبر (طلب)؛
}
كائن عام getAttribute(سلسلة ق) {
...
ActionContext ctx = ActionContext.getContext();
سمة الكائن = super.getAttribute(s);// احصل أولاً على قيمة السمة من نطاق الطلب
إذا (ctx!= فارغة) {
if (attribute == null) {// إذا لم يتم العثور على قيمة السمة من نطاق الطلب، فابحث عن قيمة السمة للكائن من ValueStack
...
مكدس ValueStack = ctx.getValueStack();
السمة = stack.findValue(s);
...
}
}
سمة الإرجاع؛
}
}
9. قم بإنشاء كائنات مجموعة القائمة/الخريطة باستخدام تعبيرات OGNL
إذا كنت بحاجة إلى عنصر مجموعة (مثل كائن قائمة أو كائن خريطة)، فيمكنك استخدام التعبيرات المتعلقة بالمجموعة في OGNL.
استخدم التعليمة البرمجية التالية لإنشاء كائن قائمة مباشرة:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:iterator>
إنشاء كائن خريطة:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:iterator>
يتم استخدام علامة Set لوضع قيمة في نطاق محدد.
النطاق: يحدد النطاق الذي يتم وضع المتغير فيه. يمكن لهذه السمة قبول التطبيق أو الجلسة أو الطلب أو الصفحة أو الإجراء. إذا لم يتم تعيين هذه السمة، فسيتم وضعها في سياق OGNL افتراضيًا.
القيمة: القيمة المخصصة للمتغير إذا لم يتم تعيين هذه السمة، فسيتم تعيين القيمة الموجودة في أعلى مكدس ValueStack إلى المتغير.