لم أرغب في استخدام الجلسة مؤخرًا. أريد أن أختبر رمزًا أكثر أمانًا وأكثر ثباتًا ، وكتابة واجهة موحدة للمتصفح والتطبيق. لذلك قمت بتغيير مكتب الاستقبال لبرنامج تدريبي إلى Ajax ، ثم قفزت واستخدمت SpringMVC للتحكم في إعادة التوجيه. لدي فهم أعمق لنقل بيانات JSON. سوف أشاركها وأرجو تصحيحني.
في SpringMVC ، يمكننا اختيار عدة طرق لقبول JSON. قبل الحديث عن كيفية قبول SPRINGMVC JSON ، دعنا نتحدث عن ماهية JSON. لن أوضح التعريف المحدد. في JavaScript ، غالبًا ما نحدد كائنات JSON بهذه الطريقة.
var jsonobject = {"username": "admin" ، "password": 123}في هذا النموذج ، نسميها كائن JSON ، وهناك أيضًا مفهوم يسمى JSON String. كما يوحي الاسم ، ملفوف بالكامل بواسطة "" أو "" ، نسميها سلسلة. نحن نعلم أنه يمكن إخراج السلاسل مباشرة ، ولكن لا يمكن إخراج الكائنات مباشرة. لذلك في JavaScript ، يمكننا
// تحديد كائن jsonobjectvar jsonobject = {"username": "admin" ، "password": 123} ؛ ALERT (JSONOBJECT) ؛في هذا الوقت ، سيتم عرض [كائن الكائن] دون إخراج محتوى كائن JSON. يوفر لنا JavaScript داعمين
يتم استخدام json.parse () لتحويل سلسلة JSON إلى كائن JavaScript. يتم استخدام json.stringify () لتحويل قيم JavaScript إلى سلاسل JSON.
لذلك عندما نكتب
ALERT (JSON.Stringify (JSONOBJECT)) ؛
{"اسم المستخدم": "المسؤول" ، "كلمة المرور": 123} سيتم عرضها ؛
* حسنًا ، هذا كل شيء لشرح JSON. لنتحدث عن springmvc *
بما أن JSON لديها طريقتان أعلاه للوجود ، أيهما يجب أن ننقل القيمة إلى SpringMVC عبر AJAX؟
نحاول أولاً إرسال كائن JSON مباشرة
// define json object var username = $ ("#username"). val () ؛ var password = $ ("#password"). val () ؛ var json = {"username": username ، "password": password} ؛ // jQuery ajax request $ .ajax ({url: "jsontest" ، type: } آخر {if ($ ("#errormsg").دعونا أولاً نفكر في ما يوفره لنا springMVC. هناك تعليق توضيحي لـ @requestparam. بالنسبة لهذا التعليق التوضيحي ، فإن وظيفتها هي نفس الطلب. getParameter في servlet لدينا. نستخدم أولاً هذا التعليق التوضيحي للحصول عليه
@requestmapping ("/jSontest") اختبار الفراغ العام (requestparam (value = "username" ، مطلوب = صحيح) سلسلة المستخدم ، @requestparam (value = "password = true) كلمة مرور السلسلة) {system.out.println (" username: " + username) ؛ System.out.println ("كلمة المرور:" + كلمة المرور) ؛ }تم قبول المعلمات لدينا بنجاح من الخلفية بنجاح!
SpringMVC ذكي للغاية ، إذا أزلنا شرح requestparam ، ماذا سيحدث إذا وضعنا قيمتين مباشرة؟
requestmapping ("/jsontest") اختبار الفراغ العام (اسم المستخدم السلسلة ، كلمة مرور السلسلة) {system.out.println ("username:" + username) ؛ System.out.println ("كلمة المرور:" + كلمة المرور) ؛ }لقد كان ناجحًا بالفعل. لن أشرح المبدأ هنا. يمكن للأصدقاء المهتمين كسر هذه النقطة وإلقاء نظرة.
يوفر SPRINGMVC REQUESTBODY ، والذي يتم استخدامه لمعالجة البيانات المرسلة من نوع محتوى التعريف المقدمة: ليس ترميز التطبيق/X-WWW-Form-urlencoded ، مثل التطبيق/JSON ، Application/XML ، إلخ.
ربما اكتشف الأصدقاء المتذوقون أنه في Ajax السابق ، لم نحدد نوع المحتوى من نوع المحتوى ، ويستخدم JQuery نوع التطبيق/X-WWW-Form-urlencoded افتراضيًا. هذا يعني أن شرح requestparam الخاص بـ springMVC ، ويمكن لـ Servlet's request.getParameter قبول كائنات JSON المرسلة في هذا التنسيق.
لماذا! ؟ أعتقد أن الجميع على دراية بطلبات الحصول على. يرسل معلمات إلى الخادم في شكل عنوان URL؟ اسم المستخدم = "المسؤول" وكلمة المرور = 123 ، ويمكن لـ request.getParameter تلقي هذه المعلمة. يمكننا أيضًا أن نرى هذا في شريط عنوان المتصفح. بالنسبة للنشر الذي نستخدمه في Ajax ويرسل كائن JSON ، كيف يمكننا الحصول عليه في الخلفية؟ تكمن الإجابة في طريقة الترميز لنوع المحتوى X-WWW-Form-urlencoded بيانات JSON إلى سلسلة ، (اسم المستخدم = "المسؤول" وكلمة المرور = 123) ويضيف هذه السلسلة إلى عنوان URL واستخدامه؟ تجزئة (هل يشبه إلى حد كبير طريقة GET). عند نشر طريقة التقديم ، يقوم المتصفح بتغليف البيانات في جسم HTTP ثم يرسلها إلى الخادم. لذلك لن يتم عرضه على عنوان URL. (قد تكون هذه الفقرة قليلاً من تطور ، آمل أن يتمكن الجميع من فهمها بعناية.)
انتهى أخيرًا من الكلام ، تنفس تنهد طويل. لذلك عندما نستخدم شرح REQUESTBODY ، يجب تغيير نوع المحتوى من مكتب الاستقبال إلى التطبيق/JSON. إذا لم يكن هناك تغيير ، فسيقوم مكتب الاستقبال بالإبلاغ عن خطأ قدره 415 (نوع الوسائط غير المدعوم). سيقوم سجل الخلفية بالإبلاغ عن نوع محتوى الخطأ "Application/X-WWW-Form-urlencoded ؛ Charset = UTF-8" غير مدعوم. لن يتم عرض هذه الأخطاء في Tomcat تحت Eclipse. سيتم عرضه فقط عند استخدام السجل. يمكنك قراءة مقالتي السابقة حول كيفية تكوين السجل. بعد ذلك ، دعنا نهيئه بشكل صحيح. ذكر أعلاه أن نوع المحتوى يجب تغييره ، ويجب تغيير بياناتنا أيضًا. تقبل طريقة التعليقات التوضيحية هذه فقط سلاسل JSON بدلاً من كائنات JSON.
$ .ajax ({url: "jsontest" ، النوع: "post" ، async: true ، contentType: "application/json" ، data: json.stringify (json) ، dataType: 'json' ، success: function (data) {if (data.userstatus ==== "success") ($ ("#errormsg"). الطول <= 0) {$ ("form [name = loginform]")الخلفية تتغير أيضا. يمكن فهم JSON فعليًا على أنه زوج من القيمة الرئيسية ، لذلك نستخدم MAP لتلقيه ثم معالجة السلسلة أو أنواع البيانات الأخرى.
requestmapping ("/jsontest") اختبار الفراغ العام (requestbody (مطلوب = صحيح) الخريطة <string ، object> map) {String username = map.get ("username"). toString () ؛ سلسلة كلمة المرور = map.get ("كلمة المرور"). toString () ؛ System.out.println ("اسم المستخدم:" + اسم المستخدم) ؛ System.out.println ("كلمة المرور:" + كلمة المرور) ؛ }في الوقت نفسه ، تذكرت springmvc السحرية مرة أخرى ، لذلك قررت إزالة التعليق التوضيحي وتجربته. حسنًا ، لقد انفجرت بشكل حاسم مع خطأ مؤشر فارغ ... حاولت إيقافه.
يوفر SPRINGMVC أيضًا طريقة لربط المعلمات مباشرة بـ POJO ، دعنا نجربها. مكتب الاستقبال هو نفسه ، لذلك لن نشره.
requestmapping ("/jSontest") اختبار الفراغ العام (requestbody user user) {String username = user.getuserName () ؛ سلسلة كلمة المرور = user.getPassword () ؛ System.out.println ("اسم المستخدم:" + اسم المستخدم) ؛ System.out.println ("كلمة المرور:" + كلمة المرور) ؛ }حسنًا ، هذه المرة يمكنك الحصول على القيمة. أنا شخصياً لا أحب هذه الطريقة لتحميل أحجام البيانات الصغيرة مثل تسجيل الدخول. هناك العديد من المتغيرات في المستخدم. أنا فقط استخدم اثنين منهم. ليست هناك حاجة لإنشاء كائن مستخدم. بشكل عام ، عندما يكون حجم البيانات صغيرًا ، ما زلت أفضل استخدام قيم منفصلة للحصول عليها. دعونا نفكر في الأمر مرة أخرى ، إذا قمنا بتحميل كائنات JSON ، فهل يمكننا ربط Pojo؟ الجواب نعم. لا تستخدم شرح @requestparam ، وإلا فإن معلمة المستخدم المطلوبة "مستخدم" ليست خطأ. التفسير هنا أساسا ، دعنا نلخصه أدناه.
نتحدث أولاً عن كائنات JSON وسلاسل JSON
ثم عندما يقبل SpringMVC تنسيقين أو اثنين من التنسيقين JSON ، إعداد ContentType في الواجهة الأمامية وما إذا كانت الواجهة الخلفية تستخدم التعليقات التوضيحية لقبولها ، فقد ذكر أيضًا Servlet قليلاً.
عندما يتم تحميل Ajax بتنسيق Application/X-WWW-Form-urlencoded ، من الضروري استخدام @requestparam أو servlet للحصول عليه في الخلفية. عندما يتم تحميل Ajax بتنسيق التطبيق/JSON ، يتم استخدامه لاستخدام سلاسل JSON ، تحتاج الخلفية إلى استخدام @RquestBody للحصول عليها.
هذه بعض ملخص لتجاربي ليوم واحد. آمل أن تساعدك. إذا كانت هناك أي أخطاء ، يرجى أن تسامحني وتصحيحني.
التفسير التفصيلي أعلاه لمعلمات JSON المقبولة من قبل SpringMVC وملخص الأخطاء الشائعة هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.