العمارة المواد الفعلية (D): الربيع التمهيد التكامل Thymeleaf

مقدمة

Thymeleaf هي لغة القالب. ما هي لغة قالب أو محركات القالب؟ قالب اللغة العامة يحتوي على المفاهيم التالية: البيانات (البيانات)، القالب (قالب)، محرك قالب (قالب المحرك) والوثيقة الناتجة (وثائق النتيجة).

دعم التمهيد الربيع لقوالب متعددة اللغات (Thymeleaf، Freemarker، شارب، رائع قوالب)

Thymeleaf مع معظم لغة قالب مماثلة، وسهلة الاستخدام، وسهلة الاستخدام

هيكل البرنامج.

النتائج التشغيلية النهائية

خطوة بخطوة بداية لكتابة التعليمات البرمجية التالية

زيادة التمهيد الربيع الاعتماد من مخضرم

وأضاف Swagger2 يعتمد على بنية القاعدة الأصلية للبوم

< ؟ نسخة أكس = "1.0" ترميز = "UTF-8"؟ > < XMLNS مشروع = " XMLNS: XSI = " XSI: schemaLocation = " > < modelVersion > 4.0.0 < / ModelVersion > < أصل > < groupId > org.springframework.boot < / GroupId > < artifactId > الربيع التمهيد بداية الوالدين < / ArtifactId > < نص > 1.5.10.RELEASE < / النسخة > < / الرئيسي > < groupId > com.example < / GroupId > < artifactId > ربيع التمهيد على شبكة الانترنت على thymeleaf < / ArtifactId > < نص > 1.0 لقطة < / النسخة > < خصائص > < java.version > 1.8 < /java.version > < / خصائص > < تبعيات > < ! - ترجمة - > < التبعية > < groupId > org.springframework.boot < / GroupId > < artifactId > ربيع التمهيد-بداية-thymeleaf < / ArtifactId > < / التبعية > < / التبعيات > < بناء > < الإضافات > < المساعد > < groupId > org.springframework.boot < / GroupId > < artifactId > مخضرم ربيع-التمهيد-المساعد < / ArtifactId > < / المساعد > < / الإضافات > < / بناء > < / مشروع >

إضافة فئات الرسالة

حزمة sample.web.ui؛ استيراد java.util.Calendar؛ استيراد org.hibernate.validator.constraints.NotEmpty، فئة العمومي رسالة {خاص معرف طويل؛ // كتابة يمكن الفوري لا تكون فارغة NotEmpty (رسالة = "مطلوب رسالة.") النص سلسلة الخاص؛ // لا يمكن إرسال بريد موجه فارغة NotEmpty (رسالة = "مطلوب الملخص".) ملخص سلسلة الخاص؛ التقويم الخاص خلقت = Calendar.getInstance ()؛ // الحصول على مجموعة}

حفظ واجهة رسالة

حزمة sample.web.ui، واجهة MessageRepository الجمهور {Iterable < رسالة >  findAll ()؛ رسالة حفظ (رسالة رسالة)؛ رسالة findMessage (لونغ معرف)؛ deleteMessage الفراغ (لونغ معرف)؛}

استخدام الذاكرة توفير رسالة

حزمة sample.web.ui؛ استيراد java.util.concurrent.ConcurrentHashMap؛ استيراد java.util.concurrent.ConcurrentMap؛ استيراد java.util.concurrent.atomic.AtomicLong، ويستخدم الأدوات الطبقة العامة InMemoryMessageRepository MessageRepository {المفتاح الأساسي // الاضافة إلى محاكاة خاصة مكافحة ساكنة AtomicLong = AtomicLong جديدة ()؛ // لتخزين الرسائل ConcurrentMap النهائي الخاص < منذ فترة طويلة، رسالة >  رسائل = جديد من الإعلاميين المستقلين rentHashMap < منذ فترة طويلة، رسالة > ()؛Override الجمهور Iterable < رسالة >  findAll () {this.messages.values عودة ()؛ }Override حفظ الجمهور الرسالة (رسالة رسالة) { معرف طويل = message.getId ()؛ إذا (معرف == فارغة) {// يولد ID ID = counter.incrementAndGet ()؛ message.setId (معرف)؛ } // حفظ الرسائل this.messages.put (الهوية، ورسالة)؛ رسالة العودة؛ }Override findMessage رسالة الجمهور (لونغ معرف) {العودة this.messages.get (معرف)؛ }Override deleteMessage الفراغ الجمهور (معرف طويل) {this.messages.remove (معرف)؛}}

طبقة التحكم كتابة التعليمات البرمجية

حزمة sample.web.ui.mvc؛ استيراد org.springframework.stereotype.Controller؛ استيراد org.springframework.validation.BindingResult؛ استيراد org.springframework.web.bind.annotation * ؛. org.springframework.web.servlet.ModelAndView استيراد ، org.springframework.web.servlet.mvc.support.RedirectAttributes الاستيراد؛ استيراد sample.web.ui.Message؛ استيراد sample.web.ui.MessageRepository؛ استيراد javax.validation.Valid، @ المراقب @ RequestMapping ( "/ رسائل" ) فئة العمومي MessageController {خاص النهائية messageRepository messageRepository، MessageController الجمهور (messageRepository messageRepository) {this.messageRepository = messageRepository. } // رسالة واردة صفحة قائمة GetMapping قائمة ModelAndView الجمهور () { Iterable < رسالة >  رسائل = this.messageRepository.findAll ()؛ عودة ModelAndView الجديدة ( "رسائل / قائمة"، "رسائل" ورسائل)؛ } // التحقق من تفاصيل الرسالة GetMapping ( "{معرف}") عرض ModelAndView العام (PathVariable ( "ID") رسالة رسالة) {العودة ModelAndView الجديدة ( "رسائل / عرض"، "رسالة"، رسالة)؛ } // إنشاء رسالة في الصفحة GetMapping (بارامس = "شكل") الجمهور سلسلة createForm (رسالة رسالةModelAttribute) {عودة "رسائل / شكل من الأشكال". } // إنشاء رسالة PostMapping الجمهور ModelAndView إنشاء (رسالةValid رسالة، نتيجة BindingResult، RedirectAttributes إعادة توجيه) {// التحقق المحتوى إذا (result.hasErrors ()) {العودة ModelAndView الجديدة ( "رسائل / شكل من الأشكال"، "formErrors"، result.getAllErrors ())؛ } // حفظ الرسائل رسالة = this.messageRepository.save (رسالة)؛ // إضافة توجيه رسالة redirect.addFlashAttribute ( "globalMessage"، "خلق بنجاح رسالة جديدة")؛ العودة ModelAndView الجديدة ( "إعادة توجيه: / الرسائل / {message.id}"، "message.id"، message.getId ())؛ } // حذف الرسالة GetMapping (القيمة = "/ حذف {معرف}") ModelAndView الجمهور حذف (PathVariable ( "ID") معرف طويل) {this.messageRepository.deleteMessage (معرف)؛ Iterable < رسالة >  رسائل = this.messageRepository.findAll ()؛ عودة ModelAndView الجديدة ( "رسائل / قائمة"، "رسائل" ورسائل)؛ } // الذهاب إلى صفحة تحرير رسالة GetMapping (القيمة = "تعديل / {معرف}") الجمهور ModelAndView modifyForm (PathVariable ( "ID") رسالة رسالة) {العودة ModelAndView الجديدة ( "رسائل / شكل من الأشكال"، "رسالة"، الرسالة)؛}}

دخول البرنامج الرئيسي

حزمة sample.web.ui.mvc؛ استيراد org.springframework.stereotype.Controller؛ استيراد org.springframework.validation.BindingResult؛ استيراد org.springframework.web.bind.annotation * ؛. org.springframework.web.servlet.ModelAndView استيراد ، org.springframework.web.servlet.mvc.support.RedirectAttributes الاستيراد؛ استيراد sample.web.ui.Message؛ استيراد sample.web.ui.MessageRepository؛ استيراد javax.validation.Valid، @ المراقب @ RequestMapping ( "/ رسائل" ) فئة العمومي MessageController {خاص النهائية MessageRepository messageRepository، MessageController الجمهور (MessageRepository messageRepository) {this.messageRepository = messageRepository. } // رسالة واردة صفحة قائمة GetMapping قائمة ModelAndView الجمهور () { Iterable < رسالة >  رسائل = this.messageRepository.findAll ()؛ عودة ModelAndView الجديدة ( "رسائل / قائمة"، "رسائل" ورسائل)؛ } // التحقق من تفاصيل الرسالة GetMapping ( "{معرف}") عرض ModelAndView العام (PathVariable ( "ID") رسالة رسالة) {العودة ModelAndView الجديدة ( "رسائل / عرض"، "رسالة"، رسالة)؛ } // إنشاء رسالة في الصفحة GetMapping (بارامس = أشكال "") الجمهور سلسلة createForm (رسالة رسالةModelAttribute) {عودة "رسائل / شكل من الأشكال". } // إنشاء رسالة PostMapping الجمهور ModelAndView إنشاء (رسالةValid رسالة، BindingResult نتيجة لذلك، RedirectAttributes إعادة توجيه) {// التحقق المحتوى إذا (result.hasErrors ()) {العودة ModelAndView الجديدة ( "رسائل / شكل من الأشكال"، "formErrors"، result.getAllErrors ())؛ } // حفظ الرسائل رسالة = this.messageRepository.save (رسالة)؛ // إضافة توجيه رسالة redirect.addFlashAttribute ( "globalMessage"، "خلق بنجاح رسالة جديدة")؛ العودة ModelAndView الجديدة ( "إعادة توجيه: / الرسائل / {message.id}"، "message.id"، message.getId ())؛ } // حذف الرسالة GetMapping (القيمة = "/ حذف {معرف}") ModelAndView الجمهور حذف (PathVariable ( "ID") معرف طويل) {this.messageRepository.deleteMessage (معرف)؛ Iterable < رسالة >  رسائل = this.messageRepository.findAll ()؛ عودة ModelAndView الجديدة ( "رسائل / قائمة"، "رسائل" ورسائل)؛ } // الذهاب إلى صفحة تحرير رسالة GetMapping (القيمة = "تعديل / {معرف}") الجمهور ModelAndView modifyForm (PathVariable ( "ID") رسالة رسالة) {العودة ModelAndView الجديدة ( "رسائل / شكل من الأشكال"، "رسالة"، الرسالة)؛}}

تخطيط الصفحة مكتوبة

< ! DOCTYPE HTML > < أتش تي أم أل XMLNS: ال = " XMLNS: تخطيط = " > < رئيس > < لقب > تصميم < / عنوان > < رابط يختلط = "أنماط" عشر: أ href = "@ {/ المغلق / bootstrap.min.css}" أ href = "../../ المغلق / bootstrap.min.css" / > < رابط يختلط = "رمز" عشر: أ href = "@ {/ favicon.jpg}" أ href = "favicon.jpg" / > < / رئيس > < هيئة > < شعبة الطبقة = "حاوية" > < شعبة الطبقة = "الناف بار" > < شعبة الطبقة = "الناف بار-الداخلية" > < فئة = "العلامة التجارية" عشر: أ href = "@ {/} رسائل" أ href = "#" > Thymeleaf - تخطيط < / A > < فئة المجاهدين = "الملاحة" > < لى > < على عشر: أ href = "@ {/} رسائل" أ href = "messages.html" >  رسائل < / A > < / لي > < / UL > < / شعبة > < / شعبة > < H1 التخطيط: جزء = "رأس" > تصميم < / H1 > < شعبة التخطيط: جزء = "المحتوى" > محتوى وهمية < / شعبة > < / شعبة >   < / الهيئة >   < / الاكواد >

كتابة قائمة من الصفحة

< ! DOCTYPE HTML > < أتش تي أم أل XMLNS: ال = " XMLNS: تخطيط = " التخطيط: الديكور = "تخطيط" > < رئيس > < لقب > الرسائل: عرض جميع < / عنوان > < / رئيس > < هيئة > < H1 التخطيط: جزء = "رأس" > الرسائل: عرض جميع < / H1 > < شعبة التخطيط: جزء = "المحتوى" الطبقة = "حاوية" > < شعبة الطبقة = "سحب حق" > < وأ href = "form.html" عشر: أ href = "@ {/ الرسائل / (شكل)}" > إنشاء رسالة < / A > < / شعبة > < الطبقة الجدول = "يحدها الجدول الجدول مخطط الجدول" > < ! - استخدم التالي الطبقة الشرح IntelliJ للحل المسألة - > < ! - / * @ thymesVar معرف = "الرسائل" نوع = "java.util.List" * / - > < ! - / * @ thymesVar معرف = "رسالة" نوع = "sample.web.ui.Message" * / - > < THEAD > < آر > < الدفتيريا > الهوية < / الدفتيريا > < الدفتيريا > مكون < / الدفتيريا > < الدفتيريا > ملخص < / الدفتيريا > < / طن تبريد > < / THEAD > < TBODY > < آر عشر: إذا = "$ {messages.isEmpty ()}" > < الدفتيريا كولسبان = "3" > لا توجد رسائل < / الدفتيريا > < / طن تبريد > < آر عشر: كل = "الرسالة: $ {الرسائل}" > < الدفتيريا عشر: النص = "$ {message.id}" > 1 < / الدفتيريا > < الدفتيريا عشر: النص = "$ {# calendars.format (message.created)}" > 11 يوليو 201214:17:16 CDT < / الدفتيريا > < الدفتيريا > < وأ href = "view.html" عشر: أ href = "@ { '/ الرسائل /' + $ {message.id}}" عشر: النص = "$ {message.summary}" >  ملخص < / A > < / الدفتيريا > < / طن تبريد > < / TBODY > < / الجدول > < / شعبة > < / الهيئة > < / الاكواد >

الصفحة الزيادة إرسال

< ! DOCTYPE HTML > < أتش تي أم أل XMLNS: ال = " XMLNS: تخطيط = " التخطيط: الديكور = "تخطيط" > < رئيس > < لقب > رسائل: إنشاء < / عنوان > < / رئيس > < هيئة > < H1 التخطيط: جزء = "رأس" > رسائل: إنشاء < / H1 > < شعبة التخطيط: جزء = "المحتوى" الطبقة = "حاوية" > < ! - استخدم التالي الطبقة الشرح IntelliJ للحل المسألة - > < ! - / * @ thymesVar معرف = "رسالة" نوع = "sample.web.ui.Message" * / - > < شكل معرف = "messageForm" عشر: العمل = "@ {/ الرسائل / (شكل)}" عشر: كائن = "$ {رسالة}" العمل = "#" طريقة = "آخر" > < شعبة عشر: إذا = "$ {# fields.hasErrors ( '*')}" الطبقة = "تنبيه تنبيه خطأ" > < ص عشر: كل = "خطأ: $ {# fields.errors ( '*')}" عشر: النص = "$ {خطأ}" > خطأ التحقق من صحة < / P > < / شعبة > < شعبة الطبقة = "سحب حق" > < على عشر: أ href = "@ {/} رسائل" أ href = "messages.html" >  رسائل < / A > < / شعبة > < إدخال نوع = "مخفي" عشر: المجال = "* {معرف}" عشر: فئة = "؟ $ {# fields.hasErrors ( 'الهوية')}" الحقل من الأخطاء "/ >   < ملصق ل= "موجز" > ملخص < / تسمية >   < إدخال نوع = "نص" عشر: المجال = "* {موجز}" عشر: فئة = "؟ $ {# fields.hasErrors ( 'ملخص')}" الحقل من الأخطاء "/ >   < ملصق ل= "النص" > رسالة < / تسمية > < تيكستاريا عشر: المجال = "* {نص}" عشر: فئة = "؟ $ {# fields.hasErrors ( 'النص')} الحقل الخطأ" > < / ناحية النص > < الطبقة شعبة = "شكل إجراءات" > < إدخال نوع = "تقدم" قيمة = "حفظ" / > < / شعبة > < / نموذج > < / شعبة > < / الهيئة > < / الاكواد >

صفحة تفاصيل مكتوبة

< أتش تي أم أل XMLNS: ال = " XMLNS: تخطيط = " التخطيط: الديكور = "تخطيط" > < رئيس > < لقب > الرسائل: مشاهدة < / عنوان > < / رئيس > < هيئة > < ! - استخدم التالي الطبقة الشرح IntelliJ للحل المسألة - > < ! - / * @ thymesVar معرف = "رسالة" نوع = "sample.web.ui.Message" * / - > < H1 التخطيط: جزء = "رأس" > رسائل: إنشاء < / H1 > < شعبة التخطيط: جزء = "المحتوى" الطبقة = "حاوية" > < ! - / * @ thymesVar معرف = "globalMessage" نوع = "" * / - > < شعبة الطبقة = "تنبيه تنبيه النجاح" عشر: إذا = "$ {globalMessage}" عشر: النص = "$ {globalMessage}" > بعض الرسائل النجاح < / شعبة > < شعبة الطبقة = "سحب حق" > < على عشر: أ href = "@ {/} رسائل" أ href = "list.html" >  رسائل < / A > < / شعبة > < دل > < دينارا > الهوية < / DT > < معرف DD = "معرف" عشر: النص = "$ {message.id}" > 123 < / DD > < دينارا > تاريخ < / DT > < DD معرف = "خلق" عشر: النص = "$ {# calendars.format (message.created)}" > 11 يوليو 201214:17:16 CDT < / DD > < دينارا > ملخص < / DT > < معرف DD = "موجز" عشر: النص = "$ {message.summary}" > ملخص قصير ... < / DD > < دينارا > رسالة < / DT > < معرف DD = "النص" عشر: النص = "$ {message.text}" > رسالة المفصلة التي ومن أطول من التلخيص. < / DD > < / دل > < شعبة الطبقة = "اليسار سحب" > < وأ href = "الرسائل" عشر: أ href = "@ { '/ الرسائل / / حذف" + $ {message.id}} " > حذف < / A >  | < وأ href = "form.html" عشر: أ href = "@ { '/ الرسائل / تعديل /' + $ {message.id}}" >  تعديل < / A > < / شعبة > < / شعبة > < / الهيئة > < / الاكواد >

مجموعة ربيع application.properties

spring.thymeleaf.cache = = falseserver.tomcat.basedir الهدف / هر server.tomcat.accesslog.enabled = صحيح

كتابة logback.xml ملف السجل

< ؟ نسخة أكس = "1.0" ترميز = "UTF-8"؟ > < ترتيب > < تشمل الموارد = "ORG / springframework / التمهيد / تسجيل / logback / base.xml" / > < / تكوين >

التمهيد V2.0 يرجى الدخول إلى الموقع الرسمي لتحميل

هنا جميع الطبقات كتب أكثر، دعونا استخدام مع نظرة

فتح شريط عنوان المتصفح دعونا إلى الوصول

HTTP: // المضيف المحلي: 8080 /

عرض

النتائج التشغيل الخاص بك أليس كذلك؟

تابعنا

لمزيد من المعلومات، يرجى التركيز على "IT تحالف مكافحة"، يمكنك أيضا ترك رسالة والحصول على الشفرة المصدرية لليا التفاعلي! ! !

المصور ووهان | الانقلاب الشتوي، نرجس نحت منزل

الشباب إلى القاضي في بقعة صعبة: في النهاية هو 4P أو الاغتصاب الجماعي، ونبه نائب رئيس مجلس الوزراء الإيطالي

على غرار المسرح زفاف مذهلة "حفلة رقم" الثقافة التقليدية الزواج جلب الذوق

"ريفرز" يحيي الذكرى الأربعين للإصلاح والانفتاح أمامنا بدا في الفريق الجديد "قائمة Langya"

بدأت لوتشو للتركيز على 78 مشاريع كبرى اجمالى الاستثمارات 48.8 مليار يوان الجنوب من عهد التجارية المعقدة

A الشمس الذهبية سيتشوان

إنجن إكس الهندسة المعمارية التفصيلية: تركيب إنجن إكس والتكوين

فاز صندوق هو الرهان الحقيقي، و "يتجول في الأرض" التعاون "الناي السحري موتي" السجائر الإلكترونية تزعم أن "المنتج الوظيفي"، وليس "أسلوب حياة"

تحولت رقاقة الضوئية خارج، البالغ من العمر 28 عاما العلماء الشباب الصينيين MIT AI مباشرة للاستيلاء على السلطة هيمنة العد!

الويب الجوال المواد الفعلية - العفاريت استخدام CSS تقلل طلب الصفحة HTTP الخاص بك

yongling الذهبي (8) | المدنيين الإمبراطور وانغ: تحت حكمه السابق الازدهار الوطني شو تشنغدو تاج عالم مزدهر

"الغامض الصوتية" هجوم دبلوماسي؟ بحث جديد: الدماغ في المرضى الذين يعانون من أعراض غير عادية الآن