سجل أول مرة باستخدام JFinal ، من البناء الإطار البسيط إلى الإضافة والحذف والتعديل والتفتيش ، من الطرق المدمجة إلى استخدام الأطر العادية.
موقع Jfinal الرسمي: http://www.jfinal.com/
JFinal هو إطار عمل سريع + ORM يعتمد على لغة Java. أهداف التصميم الأساسية هي التطوير السريع ، وحجم الكود الصغير ، والتعلم البسيط ، والوظائف القوية ، والوزن الخفيف ، وسهل التوسع ، والراحة. في حين أن لديها كل مزايا Java ، فإنها تتمتع أيضًا بكفاءة تطوير اللغات الديناميكية مثل Ruby و Python و PHP.
Jfinal لديه الميزات الرئيسية التالية:
بنية MVC وتصميم رائع واستخدام بسيط
اتبع مبدأ COC ، تكوين الصفر ، لا XML
وضع سجل DB + الأصلي ، مرن ومريح
دعم ActivereCord يجعل تطوير قاعدة البيانات سريعًا للغاية
قم بتحميل ملف Java المعدل تلقائيًا ، لا حاجة لإعادة تشغيل خادم الويب أثناء التطوير
يدعم AOP وتكوين اعتراض مرن ووظائف قوية
بنية البرنامج المساعد ، قابلية التوسع قوية
دعم متعدد الرؤية ، freemarker ، JSP ، السرعة
وظيفة التحقق القوية للمقاومة الخلفية
تعمل بالكامل ، مع معظم وظائف Struts2
الحجم الصغير هو 632 كيلو واحد فقط ، وليس تبعيات الطرف الثالث
مثال:
أستخدم Maven أولاً ، أولاً إنشاء مشروع Maven:
بعد إنشاء مشروعي ، أحتاج إلى تعيينه أولاً:
ثم انقر فوق تطبيق
هناك بعض الإعدادات الأخرى ، إلخ. يتم تخطي سؤالي هنا
ثم قدم حزمة الجرة في pom.xml:
Maven Search Jar Package: http://mvnrepository.com/
العرض التجريبي الرسمي pom.xml:
لم يتم تقديم JSON هنا ، فإن طريقة العرض التوضيحية الأخيرة تتطلب JSON
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/maven-v4_0_0.xsd "> <Dodeversion> 4.0.0 </daseDversion> <roupiD> com.demo </groupid> </sontifactid> jfinal_demo_for_maven </artifactid> war </packaging> <ame> jfinal_demo_for_maven maven webapp </mame> <Url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <maven.compiler.encoding> utf-8 </maven.compiler.encoding> </sfressions> <!-باستخدام مكتبة alibaba maven-> <spositories> <ropository> <id> ali-maven </id> <erl> http://maven.aliun.com <reedease> <Enuppled> true </texuped> </reease> <splishots> <تمكين> True </enabled> <uptudePolicy> دائمًا </updatePolicy> المستودعات> <Respository> <id> sonatype-nexus-snapshots </id> <ame> sonatype nexus snapshots </name> <Url> https://oss.sonatype.org/content/repositories/snapshots/ </url> <reasable> <Tuper> true </enileded> <uptudePolicy> يوميًا </updatepolicy> </splishots> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository> </ropository <scope> اختبار </scope> </premidency> <reperency> <roupiD> com.jfinal </groupId> <StifactId> jetty-server </stifactid> <الإصدار> 8.1.8 </version> <!-قيمة النطاق هنا هي. يجب تغييرها فقط إلى توفير المشروع تحت IDEA لبدء حزمة الحرب لتجنب إلقاء بعض الجرار عديمة الفائدة في -> <scope> ترجمة </scope> </sependency> <reperency> <roupiD> com.jfinal </rougiD> <StifiD> jfinal </stifactid> <StifactId> log4j </shintifactid> <الإصدار> 1.2.16 </الإصدار> </repreadency> <reperency> <roupiD> mysql </rougeid> <tefactid> mysql-connector-java </stifactid> <splement> 5.1.44 </eser <StifactId> druid </stifactid> <soph> 1.0.29 </version> </sependency> <sependency> <groupId> com.jfinal </rougeid> <StifactId> cos </shiname> <sophin> 2017.5 </sophen> <roupl> org.mortbay.jetty </groupId> <StifactId> jetty-maven-plugin </artifactId> <sophy> 8.1.8.v20121106 </splex> <configuration> stopKey> stopekey> stopKey> <ScanInterValsEconds> 5 </suckintervalseconds> <connectors> <connector Applearation = "org.eclipse.jetty.server.nio.selectchannelconnector"> <tort> 80 </port> </maxidletime> </build> </project>
ثم هناك تكوين web.xml:
يلاحظ:
الحزمة التي يوجد بها ملف democonfig.java ويجب أن يكون اسم الملف الخاص به متسقًا مع التكوين في علامة param-value في web.xml (في هذه الحالة ، يكون التكوين demo.democonfig).
<Ivilter> <lipter-name> jfinal </filter-name> <ilter-class> com.jfinal.core.jfinalfilter </filter-class> <Ing-param> <Param-Name> configclass </param-name> <param -value> demo.democonfig </param-value> </IPT-param> </filter> <filter-mapping> <filter-name> jfinal </filter-name> <Url-pattern>/*</url-pattern> </filedpling>
بعد ذلك ، قم بإنشاء ملف Java:
إنشاء democonfig وراثي jfinalconfig. DemoconFig هو الملف الرئيسي. قم بتشغيل هذا الملف لبدء المشروع ، تمامًا مثل تشغيل ملف Java العادي الرئيسي. إذا قمت بتعديل الرموز الأخرى بعد الركض في نفس الوقت ، فلن تحتاج إلى إعادة التشغيل. سيتم تعديل الإطار تلقائيًا. يمكنك التحديث مباشرة لرؤية المحتوى المعدل.
هنا هو العرض التوضيحي البسيط الأولي:
Package Demo ؛ import com.jfinal.config.*؛ الطبقة العامة democonfig يمتد JfinalConfig {public void configConstant (constants me) {me.setdevmode (true) ؛ configplugin (ملحقات ME) {} public void configinterceptor (اعتراض ME) {} public void confighandler (معالجات ME) {}}ثم تكوين وحدة التحكم:
Package Demo ؛ import com.jfinal.core.controller ؛ public class hellocontroller يمتد وحدة التحكم {public void index () {renseText ("Hello Jfinal World.") ؛}}ثم افتح المتصفح وأدخل http: // localhost/hello مباشرة وسترى أن الصفحة تخرج Hello Jfinal World.
فيما يلي مثال أساسي على استخدامه ، إليك برنامجي:
Package Demo ؛ import com.jfinal.config.*؛ import com.jfinal.core.jfinal ؛ import com.jfinal.kit.propkit ؛ import com.jfinal.plugin.activecord.activerplugin ؛ import com.jfinal.c3p0.c3p0plugin ؛ com.jfinal.template.engine ؛ import controller.studentController ؛ import demo.model.classes ؛ import demo.model.student ؛ public class democonfig يمتد JfinalConfig {public static void main (string [] } public void configConstant (Constants me) {me.setDevMode (true) ؛ // يتم استخدام هذه الطريقة لتكوين قيمة ثابتة JFinal ، مثل تكوين DevMode وضع التطوير ، يقوم الرمز التالي بتكوين JFinal // تشغيل في وضع التطوير: في وضع التطوير ، سيقوم JFinal بإخراج تقارير كل طلب ، مثل إخراج عنوان URL ، وحدة التحكم ، الطريقة // والمعلمات التي يحملها الطلب. } public void configroute (Routes me) {me.add ("/" ، hellocontroller.class) ؛ me.add ("/test/mytest" ، hellocontroller.class ، "test") ؛ Me.add ("/student" ، studentController.class) ؛ //me.add("/classes "، classescontroller.class) ؛ } public void configengine (engine me) {} public void configplugin (plugins me) {// c3p0plugin cp = new c3p0plugin ("jdbc: mysql: // localhost/db_name" ، // "username" ، "password") ؛ // me.add (cp) ؛ loadPropertyFile ("a_little_config.txt") ؛ druidplugin dp = new druidplugin (getProperty ("jdbcurl") ، getProperty ("user") ، getProperty ("password")) ؛ Me.add (DP) ؛ ActivereCordPlugin arp = new ActivereCordPlugin (DP) ؛ Me.add (arp) ؛ arp.addmapping ("student" ، "studentId" ، student.class) ؛ arp.addmapping ("classes" ، "classeD" ، classes.class) ؛ // يتم استخدام هذه الطريقة لتكوين البرنامج المساعد JFinal. يقوم الرمز التالي بتكوين المكون الإضافي لتوصيل قاعدة بيانات قاعدة بيانات Druid و ActivereCord // قاعدة بيانات الوصول إلى قاعدة البيانات. مع التكوين التالي ، من المريح للغاية تشغيل قاعدة البيانات في التطبيق الخاص بك باستخدام ActivereCord. } public void configinterceptor (اعتراضتي) {//me.add(new authInterceptor ()) ؛ // تستخدم هذه الطريقة لتكوين التقاطع العالمي لـ JFinal. سوف يعترض Global Interceptor جميع طلبات الإجراءات ما لم يتم مسحها في وحدة التحكم باستخدام // clear. يقوم الرمز التالي بتكوين اعتراض يسمى AuthInterceptor. } public void confighandler (معالجات لي) {}}الوصف البسيط لكل طريقة هنا مكتوب في التعليقات.
ثم هناك وحدة التحكم:
على الرغم من أن الخدمة تم الإعلان عنها هنا ، إلا أنها غير مستخدمة. يتم استخدامه مباشرة في طريقة وحدة التحكم.
Package Controller ؛ Import java.util.list ؛ import java.util.map ؛ import com.alibaba.fastjson.jsonobject ؛ form.jfinal.aop.beor ؛ mortm.jfinal.core Demo.Model.student ؛ import service.studentservice ؛ studentController من الطبقة العامة يمتد وحدة التحكم { /*** هناك العديد من الطرق للحصول على الطلاب ، والتي تتوافق مع طريقة كتابة معلمة Pass في الواجهة الأمامية. يوفر وحدة التحكم أساليب سلسلة GetPara. واجهة برمجة التطبيقات الرسمية مفصلة للغاية. يستخدم JFinal عبارات SQL الأصلية ، وهو أمر بسيط ومريح. Setattr ("StudentList" ، قائمة) ؛ ضع النتيجة المحددة في نطاق الطلب. لدى JFinal أيضًا طريقة للحصول على النموذج مباشرة لتعبئة الكائنات في كائنات getModel (student.class) ؛ وهذا هو ، مثل Struts2 ، يتوافق اسم النموذج ، وهو مريح للغاية لإضافة ، studentId student.set ("studentId" ، "mySequence.nextVal"). Save () ؛ لدى JFinal طرق متعددة للعودة ، ويمكن أيضًا إرجاع بيانات JSON. طريقة سلسلة العرض مفصلة للغاية في خدمة خدمات طلاب API*/ Static الرسمية = New StudentService () ؛ before (studentInterceptor.class) index public void () {list <studtude> list = student.dao.find ("Select * from student") ؛ Setattr ("StudentList" ، قائمة) ؛ // لاحظ أنه إذا كان المسار أدناه يحتوي على/، ابدأ في البحث من دليل الجذر ، أي الكود = العرض ("/الطالب/الفهرس. html") ؛ عرض ("index.html") ؛ } public void add () {render ("add.html") ؛ } اختبار void العام () {list <Tudent> list = student.dao.find ("Select * from student") ؛ Setattr ("StudentList" ، قائمة) ؛ setattr ("الطالب" ، list.get (0)) ؛ عرض ("test.jsp") ؛ } public void getList () {list <Tudent> list = student.dao.find ("Select * from student") ؛ jsonobject jo = new JsonObject () ؛ Jo.put ("Code" ، 0) ؛ Jo.put ("MSG" ، صحيح) ؛ Jo.put ("count" ، list.size ()) ؛ jo.put ("البيانات" ، قائمة) ؛ Renderjson (Jo) ؛ } public void layui () {list <Tudent> list = student.dao.find ("Select * from student") ؛ Setattr ("StudentList" ، قائمة) ؛ عرض ("index3.html") ؛ } public void delete () {// احصل على قيمة اسم النموذج NateDid StudentId.dao.deleteByid (getPara ("studentId")) ؛ ForwardAction ("/الطالب") ؛ } public void delete1 () {// احصل على القيمة الأولى في طلب url student.dao.deletebyid (getParatoint ()) ؛ ForwardAction ("/الطالب") ؛ } update public void () {student student = getModel (student.class) ؛ student.update () ؛ ForwardAction ("/الطالب") ؛ } public void get () {student.dao.findbyid (getPara ("studentId")) ؛ Setattr ("الطالب" ، الطالب) ؛ عرض ("index2.html") ؛ } public void get1 () {studety student = student.dao.findbyid (getParatoint ()) ؛ Setattr ("الطالب" ، الطالب) ؛ عرض ("index2.html") ؛ } before (studentValIdator.Class) يتم استخدام public void save () { /*** getModel لتلقي كائن النموذج الذي تم تمريره من حقل نموذج الصفحة. يسمى اسم حقل النموذج "modelName.attrname" http://www.jfinal.com. يجب أن يكون اسم ATTRNAME المستخدمة من قبل GetModel هو نفسه بالضبط اسم حقل جدول البيانات. يتم استخدام طريقة getBean لدعم حبوب Java التقليدية ، بما في ذلك النماذج التي تستخدم مولد Jfnal لإنشاء طرق getter و setter. عند تمرير الوسائط في نماذج الصفحة ، استخدم attrname بما يتوافق مع طريقة Setter ، بدلاً من أسماء حقل جدول البيانات. الفرق بين GetModel و GetBean هو أن السابق يستخدم اسم حقل جدول الأرقام ويستخدم الأخير اسم السمة بما يتوافق مع طريقة Setter لحقن البيانات. يوصى باستخدام طريقة getBean أولاً. *///getBean (student.class) .save () ؛ getModel (student.class) .save () ؛ إعادة التوجيه ("/الطالب") ؛ } before (studentValIdator2.Class) public void saveBean () {getBean (student.class) .save () ؛ إعادة التوجيه ("/الطالب") ؛ }}نفس التفسير البسيط مكتوب في التعليقات.
الأساليب كلها في الأساس هنا ، إليك بعض التكوينات الأخرى:
هذه هي فئة الكيان:
Package Demo.model ؛ import com.jfinal.plugin.activecord.model ؛ طالب الطبقة العامة يمتد النموذج <studture> {الطالب النهائي الثابت العام dao = new student () ؛ /*** ActivereCord هي واحدة من أكثر المكونات الأساسية لـ JFinal. سيؤدي تشغيل قاعدة البيانات من خلال ActivereCord إلى تقليل كمية الكود بشكل كبير وتحسين كفاءة التطوير بشكل كبير. التكوين في الخلف. أنا أستخدم النموذج هنا. يعد النموذج أحد أهم المكونات في ActivereCord ، والذي يعمل كجزء نموذج في وضع MVC. لدى المستخدم في الكود أعلاه العديد من الطرق المريحة لتشغيل قاعدة البيانات من خلال وراثة النموذج. يتم تعريف الكائن الثابت DAO المعلن في المستخدم لراحة عمليات الاستعلام ، والكائن ليس ضروريًا. لا تحتاج النماذج المستندة إلى ActivereCord إلى تحديد السمات ، و getters وأساليب Setter ، وتكوين XML ، وتكوين التعليقات التوضيحية ، مما يقلل بشكل كبير من كمية الكود. تم العثور على الطرق الشائعة للنموذج في واجهة برمجة التطبيقات الرسمية. لدى JFinal أيضًا وضع سجل DB + الأصلي ، وفئة DB وفئة السجلات المصاحبة لها ، والتي توفر وظائف تشغيل قاعدة بيانات أكثر ثراءً خارج فئة النموذج. عند استخدام فئات DB والتسجيلات ، ليست هناك حاجة لتعيين جداول قاعدة البيانات ، والسجل يعادل نموذجًا عامًا. تم العثور على طرق DB الشائعة في API الرسمية. */}studentvalidator:
Package StudentValIdator ؛ Import com.jfinal.core.controller ؛ import com.jfinal.validate.validator ؛ public class studentValIdator يمتد المدقق {//@@override void handleerror (controller) controller.render ("/add.html") ؛ } Override Void Void Void (وحدة تحكم وحدة التحكم) {// تحقق من اسم حقل النموذج ، وإرجاع مفتاح المعلومات ، وإرجاع قيمة المعلومات ValityQuiredString ("student.studentName" ، "depreshnamemsg" ، "الرجاء إدخال اسم الطالب!") ؛ }} Package StudentValIdator ؛ import com.jfinal.core.controller ؛ import com.jfinal.validate.validator ؛ public class studentValidator2 يمتد المدقق {// override void handleerror (controller) {controller.keeppara ( controller.render ("/add.html") ؛ } override void void void (Controller Controller) {// تحقق من اسم حقل النموذج ، وإرجاع مفتاح المعلومات ، وإرجاع قيمة المعلومات ValityQuiredString ("studentName" ، "studentnamemsg" ، "الرجاء إدخال اسم الطالب!") ؛ }}مقبول الطالب:
Package StudentInterceptor ؛ import com.jfinal.aop.Interceptor ؛ import com.jfinal.aop.invocation ؛ public class studentInterceptor تنفذ interceptor {public void intercept (invocation ai) {system.out.println ("قبل إجراء عملية استدعاء") ؛ ai.invoke () ؛ System.out.println ("بعد إجراء التذرع") ؛ }}ثم صفحة عرض مكتب الاستقبال:
فيما يتعلق بصفحة مكتب الاستقبال ، تحتاج إلى إلقاء نظرة على الفصل السادس من المستند ، ومحتوى محرك قالب JFinal ، وفهم كيفية عرض JFinal في مكتب الاستقبال. هذا مهم جدا.
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> إدارة الطلاب </title> <script type = "text/javaScript" src = "/jQuery-1.4.min.js"> <a href = "/student/layui"> اختبار layui </a> <a href = "/student/test"> edit index 0 </a> <br> <a href = "/student/add"> إضافة </a> <br> <bord> href = "/student/delete"> delete </a> <form action = "/student/delete"> id: <input type = "text" name = "studentId"> <input <th> الجنس </th> <th> العمر </th> <th> العنوان </th> <th> البريد الإلكتروني </th> <th> العملية </th> </tr> #for (x: studentlist) <tr> <td style = "text-align: left ؛"># style = "text-align: left ؛">#(x.sex) </td> <td style = "text-align: left ؛">#(x.age) </td> <td style = "text-align: left ؛ style = "text-align: left ؛"> <a href = "/student/delete؟ studentId =#(x.StudentId)"> حذف </a> <a href = "/student/delete1/#(x.studentId)"> حذف </a> <a href = studentid = href = "/student/get1/#(x.studentId)"> modify </a> <a href = "/student/get1/#(x.studentId)"> تعديل </a> </td> </tr>#
هذا هو تأثير الصفحة ، لأنه لا يوجد نمط ، يبدو قاسيًا. ثم يتكون ما يلي من الاستخدام الطبيعي ل LayUI والطريقة المعتادة العادية لإرجاع البيانات:
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> إدارة الطلاب layui </itlect> <script type = "text/javaScript" src = "/layui-v2.2.45/layui/layui.js href = "/layui-v2.2.45/layui/css/layui.css" media = "all"> </head> <body> <div style = "margin: 0px ؛ proundy-color: white ؛ margin: 0 10px ؛ aria-hidden = "true"> </i> أضف </button> </a> <form style = "float: right ؛" onsubmit = "return false"> <viv> ابحث عن المستخدمين: <div> <input name = "name" id = "demoreload" autoComplete = "Off"> </div> <button style = "translatey (-3px) ؛" data-type = "reload"> البحث </button> </div> </viv> </pump> </blockquote> </viv> <table lay-data = "{url: '/student/getlist' ، id: 'idtest' ، height: 'full-60' ،}" lay-filter = "demo"> tr> <tr> العرض: '20 ٪ '،} "> معرف </th> <th lay-data =" {field:' studentName '، width: '20 ٪'} " lay-data = "{field: 'address' ، width: '20 ٪ '}"> العنوان </th> <th lay-data = "{ثابت:' right '، width: '17 ٪' ، align: 'center' ، شريط الأدوات: '#bardemo1'}"> </tr> </tr> </table> <script id = "bardemo1"> <a id = "edit" lay-event = "edit"> modify </a> <a lay-event = "del" الدالة (obj) {console.log (obj)}) ؛ URL: "الطالب/الحذف؟ layui.layer.open ({title: "modify" ، النوع: 2 ، المنطقة: ['380px' ، '80 ٪ '] ، المحتوى: "/student/get؟studentId="+data.studentid ، إلغاء: وظيفة (فهرس ، layero) {layer.close (index) ؛ reled من النافذة المنبثقة لمنعها من تجاوز المنطقة المرئية (مثل F12 Calls Out Debug). النوع: "post" ، url: {Curr: 1 // إعادة التشغيل من الصفحة 1}) ؛ CheckStatus.data ؛ checkStatus = table.CheckStatus ('idtest') ؛ }) ؛}) ؛ </script> </html>هذا يبدو أفضل قليلاً ، لأنها ليست سوى المرة الأولى التي أستخدمها فيها وأجر اختبارًا ، لذلك لا يزال قاسيًا نسبيًا.
ثم من المهم ملاحظة مشكلة إرجاع البيانات بهذه الطريقة:
public void getList () {list <Student> list = student.dao.find ("Select * from student") ؛ jsonobject jo = new JsonObject () ؛ Jo.put ("Code" ، 0) ؛ Jo.put ("MSG" ، صحيح) ؛ Jo.put ("count" ، list.size ()) ؛ jo.put ("البيانات" ، قائمة) ؛ Renderjson (Jo) ؛ }هذه هي الطريقة التي يشير إليها عنوان URL لايوي. هنا ، تحتاج إلى إعادة بيانات JSON بطريقة Renderjson.
ثم تجدر الإشارة إلى أنني حاولت إعادة مجموعة القائمة مباشرة. يبدو أن الطريقة ممكنة ، ولكن لأن جدول Layui يجب أن يكون بالتنسيق أعلاه لتلقي البيانات ، لا يتم عرضه على الصفحة. ومع ذلك ، عندما أعود مباشرة إلى جو ، تم الإبلاغ عن خطأ الخلفية ، ولا يمكن تعلم هذه المشكلة وحلها غدًا إلا.
فيما يلي عدة طرق لاستخدام طريقة العرض التي تم إرجاعها:
ثم تحتاج إلى الانتباه إلى استدعاء الطريقة ونقل المعلمات:
هناك طريقتان وطرق نقل المعلمات على النحو التالي:
<a href = "/student/delete؟ studentId =#(x.studentId)"> حذف </a> <a href = "/student/delete1/#(x.studentId)"> حذف </a> <a href = "/studentId/get؟ href = "/student/get1/#(x.studentId)"> تعديل </a> <a href = "/student/get1/#(x.studentId)"> تعديل 1 </a>
هنا طريقة وحدة التحكم:
public void delete () {// احصل على قيمة اسم النموذج name studentId.dao.deleteByid (getPara ("studentId")) ؛ ForwardAction ("/الطالب") ؛ } public void delete1 () {// احصل على القيمة الأولى في طلب url student.dao.deletebyid (getParatoint ()) ؛ ForwardAction ("/الطالب") ؛ } update public void () {student student = getModel (student.class) ؛ student.update () ؛ ForwardAction ("/الطالب") ؛ } public void get () {student.dao.findbyid (getPara ("studentId")) ؛ Setattr ("الطالب" ، الطالب) ؛ عرض ("index2.html") ؛ } public void get1 () {studety student = student.dao.findbyid (getParatoint ()) ؛ Setattr ("الطالب" ، الطالب) ؛ عرض ("index2.html") ؛ }أخيرًا ، هناك طريقتان لإضافة فصول كيان قبول:
before (studentValIdator.class) يتم استخدام void public save () { /*** getModel لتلقي كائن النموذج الذي تم تمريره من حقل نموذج الصفحة. يسمى اسم حقل النموذج "modelName.attrname" http://www.jfinal.com. يجب أن يكون اسم ATTRNAME المستخدمة من قبل GetModel هو نفسه بالضبط اسم حقل جدول البيانات. يتم استخدام طريقة getBean لدعم حبوب Java التقليدية ، بما في ذلك النماذج التي تستخدم مولد Jfnal لإنشاء طرق getter و setter. عند تمرير الوسائط في نماذج الصفحة ، استخدم attrname بما يتوافق مع طريقة Setter ، بدلاً من أسماء حقل جدول البيانات. الفرق بين GetModel و GetBean هو أن السابق يستخدم اسم حقل جدول الأرقام ويستخدم الأخير اسم السمة بما يتوافق مع طريقة Setter لحقن البيانات. يوصى باستخدام طريقة getBean أولاً. *///getBean (student.class) .save () ؛ getModel (student.class) .save () ؛ إعادة التوجيه ("/الطالب") ؛ } before (studentValIdator2.Class) public void saveBean () {getBean (student.class) .save () ؛ إعادة التوجيه ("/الطالب") ؛ }قد لا يتم تعيين طريقة getBean الثانية في العرض التوضيحي الخاص بي ، ويتم إنشاء المعرف فقط وإضافة أي بيانات أخرى.
إذا لزم الأمر. ها هو العرض التوضيحي الرسمي:
package com.demo.common.model ؛ استيراد com.demo.common.model.base.baseblog ؛/** * هذا العرض التوضيحي يعبر فقط عن استخدام Jfinal الأكثر سطحية ، وهو أكثر قيمة وعملية على مستوى المؤسسة * للحصول على التفاصيل ، انظر Jfinal Club: http:m//jfinal * * * * يوصى باستخدام قواعد تسمية الجمال لأسماء حقل قاعدة البيانات لتسهيل الاتساق مع رمز Java ، مثل أسماء الحقول: userId */@cumpresswarnings ("Serial") يمتد مدونة الفئة العامة BaseBlog <log> {} Package com.demo.common.model.base ؛ import com.jfinal.plugin.activecord.model ؛ import com.jfinal.plugin.activecord.ibean ؛/*** تم إنشاؤه بواسطة Jfinal ، لا تعدل هذا الملف. */@cumpresswarnings ({"Serial" ، "Unchected"}) public class passblog <m يمتد baseblog <m>> يمتد النموذج <m> iBean {public m setId (java.lang.integer id) {set ("id" ، id) ؛ العودة (م) هذا ؛ } public java.lang.integer getId () {return getInt ("id") ؛ } public m setTitle (java.lang.string title) {set ("title" ، title) ؛ العودة (م) هذا ؛ } public java.lang.string getTitle () {return gettr ("title") ؛ } public m setContent (java.lang.string content) {set ("content" ، content) ؛ العودة (م) هذا ؛ } public java.lang.string getContent () {return getTr ("content") ؛ }}إن المشاركة أعلاه لملاحظات استخدام إطار التطوير السريع JFinal هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.