إذا كان مشروع واجهة HTTP+JSON كعميل ، ولا يوجد JSP وغيرها من المشاهدات ، فإن استخدام إطار عمل Jersery هو الخيار الأول بالتأكيد. تحت الهندسة المعمارية المستندة إلى SPRING3 ، يعد نوع الإرجاع من HTTP+JSON دعمًا كبيرًا للغاية. ومع ذلك ، في أعمال التطوير ، من الشائع جدًا ترقية الوظائف التي يجب أن تستند إلى الهندسة المعمارية. لقد واجهت الحاجة إلى استخدام واجهة إرجاع HTTP+JSON بناءً على Struts2 ، والتي تستند إلى بنية الإطار المعمول بها.
هناك طريقتان لإرجاع JSON في Struts2: 1. استخدم دفق الإخراج من Servlet لكتابة سلسلة JSON ؛ 2. استخدم Struts2 لتمديد JSON.
1. استخدم دفق إخراج Servlet
جوهر واجهة JSON هو: أثناء عملية تمرير بيانات JSON ، فإنه في الواقع مجرد تمرير سلسلة عادية تتوافق مع تنسيق بناء الجملة JSON. يشير ما يسمى "كائن JSON" إلى نتيجة تحليل ولف سلسلة JSON هذه.
لذا ، هنا تحتاج فقط إلى كتابة سلسلة بتنسيق بناء جملة JSON إلى HttPservletResponse الخاص بـ Servlet. هنا تستخدم طريقة PrintWriter ، وبالطبع يمكنك أيضًا استخدام طريقة الدفق. تجدر الإشارة إلى أنه لم يتم تعيين الترميز قبل الاتصال بـ GetWriter (إما يسمى SetContentType أو طريقة setCharacterencoding لتعيين الترميز) ، سيعود HttPservletResponse إلى مثيل printwriter مشفر مع الترميز الافتراضي (إما ISO-8859-1). هذا سوف يتسبب في مشوهة الصينية. علاوة على ذلك ، عند تعيين الترميز ، يجب تعيينه قبل الاتصال بـ GetWriter ، وإلا فإنه سيكون غير صالح.
اكتب رمز الواجهة:
الفرق بين الطريقة هنا وطريقة Struts2 العامة هو أن هذا هو نوع إرجاع الفراغ.
public void write () remrows ioException {httpservletresponse respress = servleTactionContext.getResponse () ؛ / * * لا يتم تعيين الترميز قبل الاتصال بـ GetWriter (إما يسمى SetContentType أو طريقة SetCharCterEncoding لتعيينه) ، * سيعود httpservletResponse إلى مثيل printwriter مشفر مع الترميز الافتراضي (إما ISO-8859-1). هذا سوف يتسبب في مشوهة الصينية. علاوة على ذلك ، عند تعيين الترميز ، يجب تعيينه قبل الاتصال بـ GetWriter ، وإلا فإنه سيكون غير صالح. * */ response.setContentType ("text/ html ؛ charset = utf-8") ؛ //response.setcharacterencoding("utf-8 ") ؛ printWriter out = response.getWriter () ؛ // يتم تمرير JSON في شكل سلسلة عادية أثناء عملية التسليم. فيما يلي عملية ربط بسيطة لواحد لاختبار سلسلة jsonstring = "{/" user/": {/" id/":/" 123/"،/" name/":/" Zhang San/"،/" say/":/" hello ، am is the json!/"،/" password/":/ out.println (jsonstring) ؛ out.flush () ؛ out.close () ؛ }إجراء التكوين
من التكوين التالي ، يمكن أن نرى بوضوح أن التكوين لا يختلف عن تكوين الإجراء العادي ، ولكن لا يوجد عرض إرجاع.
<action name = "write" method = "write" />
قيمة الإرجاع
{"user": {"id": "123" ، "name": "Zhang San" ، "say":2. تمديد JSON باستخدام Struts2
لاستخدام هذا الامتداد ، ستحتاج بالتأكيد إلى إضافة حزمة دعم. بعد تصحيح الأخطاء ، إليك خياران:
1.xwork-Core-2.1.6.Jar و Struts2-Json-Plugin-2.1.8.Jar. إذا كنت ترغب في استخدام Struts2-Json-Plugin-2.1.8.jar ، لا يمكن لـ Xwork-Core-*. جرة اختيار 2.2.1 وما فوق إصدارات ، لأن الإصدارات 2.2.1 وما فوقها من Xwork-Core-*. جرة لا تحتوي على حزم مثل org.apache.commons.lang. عند بدء تشغيل Tomcat ، سيظهر: java.lang.noclassdeffounderror: org.apache.commons.lang.xwork.stringutils.
2.xwork -2.1.2.jar و jsonplugin-0.34.jar. إذا كنت ترغب في استخدام jsonplugin-0.34.jar لدعمها ، فأنت بحاجة إلى تبديل xwork-core-*. جرة إلى Xwork-2.1.2.jar. لأن jsonplugin-0.34.jar يتطلب دعمًا لـ com.opensymphony.xwork2.Util.textutils. تم العثور على إصدارات 2.2.1 وما فوق من Xwork-Core-*. ، ولا يوجد مثل هذا الفئة في Xwork-Core-2.1.6.jar.
أخيرًا ، أود أن أقول إن الأمر لا يستحق ذلك حقًا بسبب طريقة البناء الأصلية. أنا متعب حقا. إن استخدام المكونات الآلية مثل Maven سوف يتجنب إلى حد كبير الأخطاء التي تعتمد على اختلافات الإصدار بين الأجزاء الخاصة. سيتم استخدام طريقة مكون Maven في "تكوين صفر Struts2" في القسم الثالث.
كتابة رمز واجهة
في هذا الفصل ، طريقة JSON () هي طريقة Struts2 العادية. لا أرى أي سلاسل بتنسيق JSON هنا ، لأننا سنترك هذا العمل إلى الامتداد للقيام بذلك. بدون أي إعدادات ، سيتم تضمين قيم الإرجاع لجميع أساليب Getter تحت الفصل في سلسلة JSON التي تم إرجاعها إلى العميل. للتخلص من السمات التي لا تحتاج إلى تضمين ، تحتاج إلى استخدام @JSON (Serialize = false) على طريقة getter للتعليق في بنية الفصل. بالطبع ، يمكنك أيضًا إزالة طريقة getter هذه مباشرة عندما لا تؤثر على الشركات الأخرى. وبالتالي فإن العائد الناتج عن هذا المثال هو سلسلة JSON-Format التي تحول كائن Datamap إلى.
حزمة JSON ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد org.apache.struts2.json.annotations.json ؛ استيراد com.opensymphony.xwork2.actionsupport ؛ / ** * اختبار JSON * * Author Watson Xu * date 2012-8-4 06:21:01 PM */ class public jsonaction يمتد Actionupport {private Static Final Long SerialVersionuid = 1L ؛ خريطة خاصة <سلسلة ، كائن> datamap ؛ مفتاح السلسلة الخاصة = "انظر انظر" ؛ سيتم تحويل السلسلة العامة JSON () {// البيانات الموجودة في DATAMAP إلى سلسلة JSON بواسطة Struts2 ، لذلك يجب عليك أولاً مسح البيانات الموجودة فيه. datamap = new hashmap <string ، object> () ؛ مستخدم المستخدم = مستخدم جديد () ؛ user.setName ("Zhang San") ؛ user.setPassword ("123") ؛ datamap.put ("المستخدم" ، المستخدم) ؛ // ضع في علامة ما إذا كانت العملية ناجحة datamap.put ("النجاح" ، صحيح) ؛ // إرجاع النجاح الناجح للعودة ؛ } الخريطة العامة <string ، Object> getDatamap () {return datamap ؛ } // قم بتعيين سمة المفاتيح بعدم العودة كمحتوى JSON @JSON (Serialize = false) السلسلة العامة getKey () {return Key ؛ }}تكوين Aciton
في التكوين ، أولاً ، تحتاج الحزمة التي يوجد فيها الإجراء إلى وراثة JSON-Default ، أو أن الحزمة الأصل الموروثة ترث JSON-DEFAULT. يقوم هذا بتكوين نوع الإرجاع إلى JSON ، ويمكنه تكوين خصائصه المسلسل وغيرها من معلمات الفئة.
<؟ تمديد = "Struts-Default ، JSON-Default"> <Action name = "json" method = "json"> <result type = "json"> <!-هنا نحدد السمة المسلسة بواسطة Struts2. يجب أن تحتوي هذه السمة على طريقة getter المقابلة في الإجراء -> <param name = "root"> datamap </param> </redress> </sociat
قيمة الإرجاع
{"Success": True ، "User": {"Name": "Zhang San" ، "Password": "123"}}3. كيفية استخدام تكوين Struts2 صفر ، باستخدام مكون Maven:
3.1) لبناء webapp ، ما زلنا نستخدم Maven لبناءه. تشير عملية البناء إلى مدونة Limingnihao: استخدم Eclipse لإنشاء مشروع Maven's SpringMVC.
3.2) إضافة التبعية STRUTS2 ، STRUTS2 ZERO التبعية التبعية و STRUTS2 التبعية JSON:
<ependencies> <!-الدماغ الدماغي 2-> <reperency> <roupiD> org.apache.structs </groupId> <artifactId> structs2-core </stifactid> <soper> <roughid> org.apache.structs </groupId> <StifactId> structs2-convention-plugin </artifactid> <sophy> 2.3.4 </version> <type> jar </type> <scope> compile </sope> </depination> <! <StifactId> Struts2-Json-plugin </shintifactid> <الإصدار> 2.3.4 </version> <type> جرة </type> <scope> ترجمة </spex
بعد الاختبار ، لا يوجد خطأ متوافق مع الإصدار في غرفة التبعية أعلاه ، ليس فقط لأنها هي نفس الإصدار ، ولكن أيضًا بسبب طريقة البناء التلقائي في Maven.
3.3) تكوين web.xml وتمكين Struts2:
<؟ XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <ilter> <lipter-class> org.apache.struts2.dispatcher.ng.filter.strutspreparexecutefilter </filter-class> <Ing-param> <Param-name> config </param-name> <param-value> struts-default.xml ، struts-plugin.xml ، </filter> <filter-mapping> <filter-name> strutspreparexecutefilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.4) تكوين struts.xml وتعيين بعض الثوابت والتطبيقات الأساسية:
<؟ تمديد = "json-default ، struts-default"> <!-هنا يمكنك تعيين بعض علاقات تعيين قيمة الإرجاع العالمية ، إلخ. name = "struts.multipart.maxSize" value = "1073741824"/> <name name = "struts.devmode" value = "false"/> </struts>
3.5) كتابة وتكوين الإجراء. تم تحديده بواسطة أي اتفاقية محددة ، لذلك بالنسبة للمكون الإضافي للاتفاقية ، سيتعامل مع جميع فئات Java مع أسماء الفصول التي تنتهي بعملة كإجراء:
حزمة واتسون. استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد org.apache.struts2.convention.annotation.action ؛ استيراد org.apache.struts2.convention.annotation.namespace ؛ استيراد org.apache.struts2.convention.annotation.namespace ؛ استيراد org.apache.struts2.convention.annotation.parentPackage ؛ استيراد org.apache.struts2.convention.annotation.result ؛ استيراد org.apache.struts2.convention.annotation.Results ؛ parentPackage ("base") namespace ("/watson") results ({result (name = "json" ، type = "json" ، params = {"root" ، "msg"})}) الفئة العامة jsonaction {actal = value = "json") public json () {msg = new msg.put ("flag" ، "النجاح") ؛ خريطة <string ، string> user = new hashmap <string ، string> () ؛ user.put ("name" ، "Zhang San") ؛ user.put ("Age" ، "34") ؛ msg.put ("المستخدم" ، المستخدم) ؛ العودة "json" ؛ } // ======================================= MAP Private <String ، Object> msg ؛ الخريطة العامة <string ، object> getMsg () {return msg ؛ }} 3.6) نشر المشروع ، وابدأ الحاوية ، وأدخل: http: // localhost: 7070/struts2foo/watson/json في شريط عنوان المتصفح. انتظر حتى تكون النتائج كما يلي:
{"Flag": "Success" ، "User": {"Age": "34" ، "Name": "Zhang San"}}من النتائج المذكورة أعلاه ، يمكننا أن نرى أنه بعد تمكين التكوين الصفري ، يكون التكوين في XML مفقودًا ، وبدلاً من ذلك مع مرور التعليقات التوضيحية في كل إجراء. هنا نقوم بحذف التكوين أعلاه في XML ونكتب الرمز التالي إلى الجزء العلوي من JsonAction أعلاه:
parentPackage ("base") namespace ("/watson") results ({result (name = "json" ، type = "json" ، params = {"root" ، "msg"})})الجذر يعادل تكوين المعلمة في تكوين XML.
4. المرفق:
شرح مفصل للمعلمات القابلة للتكوين عندما يكون نوع الإرجاع هو JSON:
<result type = "json"> <!- هنا يحدد الخصائص التي سيتم تسلسلها بواسطة Struts2. يجب أن تحتوي هذه الخاصية على طريقة getter المقابلة في الإجراء-> <!-افتراضيًا ، سيتم تسلسل قيم جميع طرق getter مع قيم الإرجاع ، بغض النظر عما إذا كانت الطريقة لها خصائص مقابلة-> <param name = "root" datamap-> <param name = "includeproperties"> userlist.*</param> <!-هنا يحدد الخصائص التي سيتم استبعادها من datamap. لن يتم تسلسل هذه الخصائص المستبعدة ، ولا تظهر عمومًا في نفس الوقت مثل تكوين المعلمة أعلاه -> <param name = "ExcludeProperties"> النجاح </param> </result>
تنزيل المرفق
Strutsjson.rar
Struts2foo.rar
ما ورد أعلاه هو المحتوى الكامل لدعامات struts2 إرجاع كائنات JSON. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.