Catat pertama kali menggunakan jFinal, dari konstruksi kerangka kerja sederhana hingga penambahan, penghapusan, modifikasi dan inspeksi, dari metode bawaan hingga penggunaan kerangka kerja normal.
Situs web resmi JFinal: http://www.jfinal.com/
JFinal adalah kerangka kerja Web + ORM yang cepat berdasarkan bahasa Java. Tujuan desain intinya adalah pengembangan cepat, volume kode kecil, pembelajaran sederhana, fungsi yang kuat, ringan, mudah diperluas, dan RESTful. Meskipun memiliki semua keunggulan Java, ia juga memiliki efisiensi pengembangan bahasa dinamis seperti Ruby, Python, dan PHP.
JFinal memiliki fitur utama berikut:
Arsitektur MVC, desain yang indah dan penggunaan sederhana
Ikuti prinsip coc, nol konfigurasi, tidak ada XML
Mode rekaman DB + asli, fleksibel dan nyaman
Dukungan ActiveRecord membuat pengembangan database sangat cepat
Secara otomatis memuat file java yang dimodifikasi, tidak perlu memulai ulang server web selama pengembangan
Dukungan AOP, konfigurasi pencegat yang fleksibel dan fungsi yang kuat
Arsitektur plugin, skalabilitas yang kuat
Dukungan Multi-View, Freemarker, JSP, Velocity
Fungsi verifikasi backend validator yang kuat
Sepenuhnya berfungsi, dengan sebagian besar fungsi struts2
Ukuran kecil hanya 632k, dan tidak ada dependensi pihak ketiga
contoh:
Saya menggunakan Maven pertama, pertama -tama buat proyek Maven:
Setelah proyek saya dibuat, saya perlu mengaturnya terlebih dahulu:
Lalu klik Terapkan
Ada beberapa pengaturan lain, dll. Pertanyaan saya dilewati di sini
Kemudian perkenalkan paket JAR di pom.xml:
Paket JAR Pencarian Maven: http://mvnrepository.com/
Demo resmi pom.xml:
JSON tidak diperkenalkan di sini, metode demo terakhir saya membutuhkan JSON
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/maven.romp.romp.romp. http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>jfinal_demo_for_maven</artifactId> <packaging>war</packaging> <version>3.2</version> <name> jfinal_demo_for_maven Maven Webapp </name> <rerl> http://maven.apache.org </ruRl> <properties> <poject.build.sourceencoding> UTF-8 </project.build.sourceencoding> <maven.compiler.encoding> UTF-8 </maven.compiler.encoding> </properties> <!-Menggunakan pustaka alibaba maven-> <r repositories> <depository> <dr> ali-maven </d> <rrgr> http://maven.aliycric.coup.coUp.nex/ <rrgroup/http://maven.aliy. <Reeleases> <denabled> true </enabled> </ereases> <nnapshots> <denabled> true </denabled> <dendatePolicy> selalu </updatePolicy> <seknokumpolicy> Gagal </checksumpolicy> </snapshots> </Repository> </Repository> </Repository: Repositories: Repository> <! -> <!-repositori> <repository> <dent> sonatype-nexus-snapshots </dent> <name> snapshots nexus sonatype </name> <ubl> https://oss.sonatype.org/content/repositories/snapshot <enabled>true</enabled> <updatePolicy>daily</updatePolicy> </snapshots> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </Repository> </ Repository> </ Repository> </repository <scope> test </seupope> </dependency> <dependency> <groupid> com.jfinal </groupid> <Artifactid> Jetty-Server </stifactid> <version> 8.1.8 </versi> <!-Nilai lingkup di sini adalah kompilasi. Ini hanya perlu diubah untuk disediakan ketika memulai proyek dengan ide untuk memulai paket perang untuk menghindari melempar beberapa stoples yang tidak berguna di -> <scope> mengkompilasi </opope> </dependency> <dependency> <groupid> com.jfinal </groupid> <t Artifactid> JFinal </artifactid> </Versi 3.3 </Groupid> <T/DEPENDING. <ArTifactId> log4j </stifactid> <version> 1.2.16 </version> </dependency> <dependency> <groupid> mysql </groupid> <ArTifactId> mysql-connector-java </artifactid> <version> 5.1.44 </Versi </Dependency> </Artifactid> <ArtifactId> druid </stifactid> <version> 1.0.29 </version> </dependency> <dependency> <groupid> com.jfinal </sroupid> <t Artifactid> cos </artifactid> <version> 2017.5 <version> </Dependency> </Dependencies> <build> <version> <inversi> </Versi </Dependency> </Dependencies> <build> <buile> <finor> <finalname> </Versi </Dependency> </Dependencies> <build> <dendor> <fin -final> </Versies> </Dependency> </Dependencies> <build> <finname> <FinalName> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.8.v20121106</version> <configuration> <stopKey>stop</stopKey> <stopPort>5599</stopPort> <webAppConfig> <contextPath>/</contextPath> </webAppConfig> <ScanInterValSeconds> 5 </canintervalseconds> <snonnectors> <connector implementation = "org.eclipse.jetty.server.nio.selectChannelconnector"> <port> </port/connector> </configury </maxidletime> </connector> </connector> <MaxIdletime> 60000 </maxidletime> </connector> </connector> <maxidletime> 60000 </maxidletime> </connector> </connector>
Lalu ada konfigurasi web.xml:
Melihat:
Paket di mana file democonfig.java berada dan nama file sendiri harus konsisten dengan konfigurasi dalam tag nilai param di web.xml (dalam hal ini, konfigurasi adalah demo.democonfig).
<nilter> <filter-name> jFinal </tiler-name> <nilter-class> com.jfinal.core.jfinalfilter </filter-class> <InT-param> <param-name> ConfigClass </param-name> <param -value> demo.democonfig </param-value> </it-param> </tiler> <nilter-mapping> <nilter-name> JFinal </tiler-name> <RURL-PATERS>/*</RORL-PATER> </filter-Mapping>
Selanjutnya buat file java:
Buat democonfig dan wariskan jFinalConfig. Democonfig adalah file utama. Jalankan file ini untuk memulai proyek, seperti menjalankan file utama Java Normal. Jika Anda memodifikasi kode lain setelah berjalan pada saat yang sama, Anda tidak perlu memulai kembali. Kerangka kerja akan dimodifikasi secara otomatis. Anda dapat langsung menyegarkan untuk melihat konten yang dimodifikasi.
Ini demo sederhana awal:
Demo paket; impor com.jfinal.config.*; Democonfig kelas publik memperluas jFinalConfig {public void configConstant (konstanta saya) {me.setDevMode (true);} public void configroUte (rute saya) {me.add ("/hello", hellocontroller.clapse); configplugin (plugins saya) {} public void configInterceptor (Interceptors saya) {} public void confighandler (handlers me) {}}Kemudian konfigurasikan pengontrol:
demo paket; import com.jfinal.core.controller; kelas publik HelloController memperluas pengontrol {public void index () {renderText ("Hello JFinal World.");}}Kemudian buka browser dan masukkan http: // localhost/hello secara langsung dan Anda akan melihat bahwa halaman menghasilkan hello jFinal world.
Berikut adalah contoh paling mendasar dari menggunakannya, berikut adalah program saya:
demo paket; import com.jfinal.config.*; import com.jfinal.core.jfinal; import com.jfinal.kit.propkit; import com.jfinal.plugin.activecord.activerecordin; import com.jfinal.plugin.c3p0.c3p0p0p0p0; com.jfinal.template.engine; Import Controller.StudentController; impor demo.model.classes; impor demo.model.student; Democonfig kelas publik memperluas jFinalConfig {public static void (string ", 80," 80, "SRC (" SRC/SRC/80, "SRC/" SRC/"SRC/80" } public void configConstant (konstanta saya) {me.setDevMode (true); // Metode ini digunakan untuk mengonfigurasi nilai konstan jFinal, seperti konfigurasi mode pengembangan devmode konstan, kode berikut mengonfigurasi JFinal // dijalankan dalam mode pengembangan: dalam mode pengembangan, jFinal akan menghasilkan laporan untuk setiap permintaan, seperti mengeluarkan URL, pengontrol, metode // dan parameter yang dibawa oleh permintaan. } public void configroute (rute saya) {me.add ("/", hellocontroller.class); me.add ("/test/mytest", hellocontroller.class, "test"); me.add ("/mahasiswa", studentController.class); //me.add("/classes ", classescontroller.class); } public void configEngine (engine ME) {} public void configplugin (plugin saya) {// c3p0plugin cp = c3p0plugin baru ("jdbc: mysql: // localhost/db_name", // "nama pengguna", "kata sandi"); // me.add (cp); loadPropertyFile ("a_little_config.txt"); Druidplugin dp = druidplugin baru (getProperty ("jdbcurl"), getProperty ("user"), getProperty ("kata sandi"))); me.add (dp); Activerecordplugin arp = ActiverecordPlugin baru (DP); me.add (ARP); arp.addmapping ("mahasiswa", "studentId", student.class); arp.addmapping ("kelas", "classid", class.class); // Metode ini digunakan untuk mengonfigurasi plugin JFinal. Kode berikut mengonfigurasi plug-in pool koneksi database druid dan ActiveVecord // Plug-in Access Database. Dengan konfigurasi berikut, sangat nyaman untuk mengoperasikan database di aplikasi Anda menggunakan ActiveRecord. } public void configInterceptor (interceptors saya) {//me.add(new authinterceptor ()); // Metode ini digunakan untuk mengonfigurasi pencegat global jFinal. Interceptor global akan mencegat semua permintaan tindakan kecuali dihapus dalam pengontrol menggunakan // @clear. Kode berikut mengonfigurasi pencegat bernama AuthInterceptor. } public void confighandler (handlers saya) {}}Deskripsi sederhana dari setiap metode di sini ditulis dalam komentar.
Lalu ada pengontrol:
Meskipun layanan ini dinyatakan di sini, itu tidak digunakan. Ini langsung digunakan dalam metode pengontrol.
pengontrol paket; impor java.util.list; import java.util.map; import com.alibaba.fastjson.jsonobject; import com.jfinal.aop.Before; impor com.jfinal.core.studoller; impor studentInterceptor.StudentEnteptor; impor studentvalidator.studoler; StudentInderceptor.Studenteptor; impor studervalidator.studentroller; StudentInterceptor.Studenteptor; demo.model.student; impor layanan. Controller menyediakan metode GetPARA Series. API resmi sangat rinci. JFinal menggunakan pernyataan SQL asli, yang sederhana dan nyaman. SetAttr ("studentlist", daftar); Masukkan hasil yang diatur ke dalam lingkup permintaan. JFinal juga memiliki metode untuk secara langsung mendapatkan formulir untuk mengemas objek ke objek getModel (student.class); yaitu, seperti struts2, nama formulir sesuai, yang sangat nyaman untuk ditambahkan, studentid student.set ("studentId", "mySequence.nextval"). save (); JFinal memiliki banyak cara untuk kembali, dan juga dapat mengembalikan data JSON. Metode Render Series sangat rinci dalam Layanan Layanan Siswa API*/ statis resmi = Siswa baru (); @Before (studentInterceptor.class) public void index () {list <shongen> list = student.dao.find ("SELECT * from student"); setAttr ("studentlist", daftar); // Perhatikan bahwa jika jalur di bawah ini memiliki/, mulailah melihat dari direktori root, yaitu kode = render ("/student/index.html"); render ("index.html"); } public void add () {render ("add.html"); } tes public void () {Daftar <spists> list = student.dao.find ("SELECT * from student"); setAttr ("studentlist", daftar); setAttr ("siswa", list.get (0)); render ("test.jsp"); } public void getList () {list <shonish> list = student.dao.find ("SELECT * from student"); JsonObject Jo = new jsonobject (); jo.put ("kode", 0); jo.put ("msg", true); jo.put ("count", list.size ()); jo.put ("data", daftar); Renderjson (Jo); } public void layUi () {Daftar <spulher> list = student.dao.find ("Select * from student"); setAttr ("studentlist", daftar); render ("index3.html"); } public void delete () {// Dapatkan nilai nama domain Formulir StudentId Student.dao.deletebyId (getPara ("StudentId")); Forwardaction ("/siswa"); } public void delete1 () {// Dapatkan nilai pertama di URL permintaan student.dao.deletebyId (getParatoint ()); Forwardaction ("/siswa"); } public void update () {student student = getModel (student.class); student.update (); Forwardaction ("/siswa"); } public void get () {student student = student.dao.findbyId (getPara ("studentId")); setAttr ("siswa", siswa); render ("index2.html"); } public void get1 () {student student = student.dao.findbyId (getParAToint ()); setAttr ("siswa", siswa); render ("index2.html"); } @Before (StudentValidator.class) public void save () { /*** getModel digunakan untuk menerima objek model yang diturunkan dari bidang formulir halaman. Nama bidang formulir bernama "modelname.attrname" http://www.jfinal.com. Atrname yang digunakan oleh getModel harus persis sama dengan nama bidang tabel data. Metode Getbean digunakan untuk mendukung biji java tradisional, termasuk model yang menggunakan JFNAL Generator untuk menghasilkan metode Getter dan Setter. Saat menyampaikan argumen pada formulir halaman, gunakan attrname yang konsisten dengan metode setter, daripada nama bidang tabel data. Perbedaan antara getModel dan getbean adalah bahwa yang pertama menggunakan nama bidang tabel angka dan yang terakhir menggunakan nama atribut yang konsisten dengan metode setter untuk injeksi data. Dianjurkan untuk menggunakan metode Getbean terlebih dahulu. */// getbean (student.class) .save (); getModel (student.class) .save (); redirect ("/siswa"); } @Before (studentValidator2.class) public void savebean () {getBean (student.class) .save (); redirect ("/siswa"); }}Penjelasan sederhana yang sama juga ditulis dalam komentar.
Metode pada dasarnya ada di sini, berikut adalah beberapa konfigurasi lainnya:
Ini adalah kelas entitas:
Demo Paket. /*** Activerecord adalah salah satu komponen inti paling jFinal. Mengoperasikan database melalui ActiveSecord akan sangat mengurangi jumlah kode dan sangat meningkatkan efisiensi pengembangan. Konfigurasi ada di bagian belakang. Saya menggunakan model di sini. Model adalah salah satu komponen terpenting dalam ActiveSecord, yang bertindak sebagai bagian model dalam mode MVC. Pengguna dalam kode di atas segera memiliki banyak metode yang nyaman untuk mengoperasikan database dengan mewarisi model. Objek statis DAO yang dinyatakan dalam pengguna didefinisikan untuk kenyamanan operasi kueri, dan objek tidak diperlukan. Model berdasarkan ActiveSecord tidak perlu mendefinisikan atribut, metode pengambil dan setter, konfigurasi XML, dan konfigurasi anotasi, yang sangat mengurangi jumlah kode. Metode model umum ditemukan di API resmi. JFinal juga memiliki mode rekaman DB + asli, kelas DB dan kelas rekaman yang menyertainya, yang menyediakan fungsi operasi basis data yang lebih kaya di luar kelas model. Saat menggunakan kelas DB dan rekaman, tidak perlu memetakan tabel basis data, dan catatan setara dengan model umum. Metode DB umum ditemukan di API resmi. */}
StudentValidator:
package StudentValidator;import com.jfinal.core.Controller;import com.jfinal.validate.Validator;public class StudentValidator extends Validator { //@Override protected void handleError(Controller controller) { controller.keepPara("student.studentname");//Pass the submitted value back to the page to maintain the originally entered value controller.render ("/add.html"); } @Override validate void yang dilindungi (pengontrol pengontrol) {// Verifikasi nama bidang formulir, kembalikan kunci informasi, kembalikan nilai informasi validateRequiredString ("student.studentname", "studentnamemsg", "Harap masukkan nama siswa!"); }} package StudentValidator;import com.jfinal.core.Controller;import com.jfinal.validate.Validator;public class StudentValidator2 extends Validator { //Override protected void handleError(Controller controller) { controller.keepPara("studentname");//Pass the submitted value back to the page to maintain the originally entered value controller.render ("/add.html"); } @Override validate void yang dilindungi (pengontrol pengontrol) {// Verifikasi nama bidang formulir, kembalikan kunci informasi, kembalikan nilai informasi validateRequiredString ("studentName", "studentnamemsg", "Harap masukkan nama siswa!"); }}StudentInterceptor:
Paket StudentInterceptor; impor com.jfinal.aop.interceptor; import com.jfinal.aop.invocation; kelas publik StudentInterceptor mengimplementasikan interceptor {public void intersep (doa ai) {system.out.println ("sebelum tindakan menggunakan"); ai.invoke (); System.out.println ("After Action Invoking"); }}Kemudian halaman tampilan meja depan:
Mengenai halaman meja depan, Anda perlu melihat bab keenam dari dokumen, konten mesin template jFinal, dan memahami bagaimana jFinal ditampilkan di meja depan. Ini sangat penting.
<! Doctype html> <html> <head> <meta charset = "utf-8"> <itement> manajemen siswa </title> <script type = "text/javascript" src = "/jQuery-1.12.4. href = "/student/layui"> tes LayUi </a> <a href = "/student/test"> Edit indeks 0 </a> <br> <a href = "/student/add"> Tambahkan </a> <br> <bentuk acti href="/student/delete">Delete</a> <form action="/student/delete"> id:<input type="text" name="studentid"> <input type="submit" value="delete"> </form> #for(x : [1..10]) #(x) #end <table id="listtable"> <tbody> <tr> <th>id</th> <th>Name</th> <th> Jenis Kelamin </th> <th> usia </t> <th> alamat </t> <th> Email </th> <th> operasi </t> </tr> #for (x: studentlist) <tr> <td style = "text-lign: left;">#(x.studentid) </td> <td style = "TEXT-IGHIGE;">#"x.studentid) </td> <td style =" TEXT-IGHIGE; style = "text-align: left;">#(x.sex) </td> <td style = "text-align: left;">#(x.age) </td> <td style = "text-align: left;">#(x.address) </td> <td style = "text-allign: left;">#(x. style = "text-align: left;"> <a href = "/student/delete? studentId =#(x.studentid)"> delete </a> <a href = "/student/delete1/#(x.studentid)"> delete </a> <a href = "/student/get studentid =#. href = "/siswa/get1/#(x.studentid)"> Modifikasi </a> <a href = "/student/get1/#(x.studentid)"> memodifikasi </a> </td> </tr> #end </tbody> </able> </body> </html>
Ini adalah efek halaman, karena tidak ada gaya, terlihat kasar. Kemudian berikut ini terdiri dari penggunaan normal LayUi dan metode kebiasaan normal untuk mengembalikan data:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <itement> manajemen siswa LayUi </iteme> <script type = "text/javascript" src = "/layui-v2.2.45/layui/layui.js"> </script> <link = "style"/layui/layui.js "> </script> <link =" styles "/layui/layui.js"> </script> <link = "styles" styles " href = "/layui-v2.2.45/layui/css/layui.css" media = "all"> </head> <body> <div style = "margin: 0px; latar belakang-warna: white; margin: 0 10px;"> <blockquote> <a href = "/student/add"> <kancing = "iD" "id =" ID = "ID" ID "ID =" ID "ID =" ID "ID" ID "ID"/ADD "> aria-hidden = "true"> </i> Tambahkan </button> </a> <form style = "float: right;" OnSubMit = "Return false"> <div> Cari Pengguna: <SIV> <Input Name = "Name" ID = "DemoreLoad" AutoComplete = "OFF"> </Div> <Tombol Style = "Transform: Translatey (-3px);" data-type="reload">Search</button> </div> </div> </form> </blockquote> </div> <table lay-data="{url:'/student/getlist',id:'idTest',height: 'full-60' ,}" lay-filter="demo"> <thead> <tr> <th lay-data="{field:'studentid', Lebar: '20%',} "> id </th> <th lay-data =" {field:' studentName ', lebar: '20%'} "> nama </t> <th lay-data =" {field: 'sex', width: '20%'} "> gender </th> <tH lay-data =" {tH:'}} "> gender </th> <t th away-data =" {tH: '{'20,' '' '' '' '' '' 'tH:' tH: 'tH:' tH: 'tH:' tH: 'tH:' TH: 'TH:' TH: 'TH:' TH: 'TH:' TH: 'TH:' TH: 'TH:' TH: ' Lay-Data = "{Field: 'Address', Width: '20%'}"> Alamat </th> <tH lay-data = "{fixed:' right ', lebar: '17%', align: 'center', toolbar: '#bardemo1'}"> </th> </tr> </tr> </tabel </tabel = "" hardem = "> </th> </tr> </tr> </tabel </tabel =" "" "" "" id = "Edit" Lay-event = "Edit"> Modifikasi </a> <a lay-event = "del"> delete </a> </cript> </body> <script> layUi.use ('Table', function () {var table = layui.table, form = layUi.form ;; // pilih tabel.on ('centang) (function) {function) {function (function) {function (function) {function) {function (function) {function (function) {function) {function (function) {function (function) {funche (function) {function (function) {funche (function) }); // Bicaralah Toolbar Table.on ('Tool (Demo)', Function (OBJ) {var data = obj.data; if (obj.event === 'del') {layer.confirm ('re benar -benar menghapus user DataType: Teks ", // Sukses Returned: Function (returnData) {Table.reload (" IDTest "); ['380px', '80%'], konten: "/student/get?studentId="+Data.StudentId, batal: fungsi (indeks, layero) {layer.close (indeks); $ (window) .resize (function () {layui.layer.full (index);}) layUi.layer.full (index); URL: "<%= Basepath%>/sys/user/passuser", data: {id: data.id}, // datatype: "Text", // return Success: function (returnData) {layui.use ('layer', function () {layer.msg (returndata.msg); dari halaman 1},}); Layer.alert (json.stringify (data)); Table.CheckStatus ('idtest'); });}); </script> </html>Ini terasa sedikit lebih baik, karena ini hanya pertama kalinya saya menggunakannya dan melakukan tes, jadi masih relatif kasar.
Maka penting untuk mencatat masalah pengembalian data dengan cara ini:
public void getList () {list <sisent> list = student.dao.find ("SELECT * from student"); JsonObject Jo = new jsonobject (); jo.put ("kode", 0); jo.put ("msg", true); jo.put ("count", list.size ()); jo.put ("data", daftar); Renderjson (Jo); }Ini adalah metode yang ditunjukkan oleh URL tabel Layui. Di sini, Anda perlu mengembalikan data JSON dengan cara Renderjson.
Maka perlu dicatat bahwa saya telah mencoba untuk secara langsung mengembalikan koleksi daftar. Tampaknya metode ini layak, tetapi karena tabel Layui harus dalam format di atas untuk menerima data, tidak ditampilkan pada halaman. Namun, ketika saya langsung mengembalikan Jo, kesalahan latar belakang dilaporkan, dan masalah ini hanya dapat dipelajari dan diselesaikan besok.
Berikut ini adalah beberapa cara untuk menggunakan metode render yang dikembalikan:
Maka Anda perlu memperhatikan panggilan metode dan transfer parameter:
Ada dua metode dan parameter metode transfer sebagai berikut:
<a href = "/student/delete? studentId =#(x.studentId)"> hapus </a> <a href = "/student/delete1/#(x.studentid)"> hapus </a> <a href = "/student/get? href = "/student/get1/#(x.studentid)"> Modifikasi </a> <a href = "/student/get1/#(x.studentid)"> Modifikasi 1 </a>
Berikut adalah metode pengontrol:
public void delete () {// Dapatkan nilai dari nama Domain StudentId Student.dao.deletebyId (getPara ("StudentId")); Forwardaction ("/siswa"); } public void delete1 () {// Dapatkan nilai pertama di URL permintaan student.dao.deletebyId (getParatoint ()); Forwardaction ("/siswa"); } public void update () {student student = getModel (student.class); student.update (); Forwardaction ("/siswa"); } public void get () {student student = student.dao.findbyId (getPara ("studentId")); setAttr ("siswa", siswa); render ("index2.html"); } public void get1 () {student student = student.dao.findbyId (getParAToint ()); setAttr ("siswa", siswa); render ("index2.html"); }Akhirnya, ada dua cara untuk menambahkan kelas entitas yang menerima:
@Before (StudentValidator.class) public void save () { /*** getModel digunakan untuk menerima objek model yang diturunkan dari bidang formulir halaman. Nama bidang formulir bernama "modelname.attrname" http://www.jfinal.com. Atrname yang digunakan oleh getModel harus persis sama dengan nama bidang tabel data. Metode Getbean digunakan untuk mendukung biji java tradisional, termasuk model yang menggunakan JFNAL Generator untuk menghasilkan metode Getter dan Setter. Saat menyampaikan argumen pada formulir halaman, gunakan attrname yang konsisten dengan metode setter, daripada nama bidang tabel data. Perbedaan antara getModel dan getbean adalah bahwa yang pertama menggunakan nama bidang tabel angka dan yang terakhir menggunakan nama atribut yang konsisten dengan metode setter untuk injeksi data. Dianjurkan untuk menggunakan metode Getbean terlebih dahulu. */// getbean (student.class) .save (); getModel (student.class) .save (); redirect ("/siswa"); } @Before (studentValidator2.class) public void savebean () {getBean (student.class) .save (); redirect ("/siswa"); }Metode Getbean kedua dalam demo saya mungkin tidak diatur, dan hanya ID yang dihasilkan dan tidak ada data lain yang ditambahkan.
Jika diperlukan. Inilah demo resmi:
Paket com.demo.common.model; import com.demo.common.model.base.baseblog;/** * Demo ini hanya mengungkapkan penggunaan jfinal yang paling dangkal, dan lebih berharga dan praktis penggunaan level * untuk detail, lihat JFinal Club: http://jfinal. * Disarankan untuk menggunakan aturan penamaan unta untuk nama bidang basis data untuk memfasilitasi konsistensi dengan kode java, seperti nama bidang: Userid */@SuppressWarnings ("Serial") Blog kelas publik memperluas Baseblog <BOG> {} Paket com.demo.common.model.base; import com.jfinal.plugin.activecord.model; import com.jfinal.plugin.activecord.ibean;/*** dihasilkan oleh jFinal, jangan memodifikasi file ini. */@SuppressWarnings ({"Serial", "Uncecked"}) Public Abstract Class BaseBlog <M memperluas baseBlog <m>> memperluas model <m> mengimplementasikan ibean {public m setid (java.lang.Integer ID) {set ("id", id); kembali (m) ini; } public java.lang.integer getId () {return getInt ("id"); } public m settitle (java.lang.String title) {set ("title", title); kembali (m) ini; } public java.lang.string getTitle () {return getstr ("title"); } public m setContent (java.lang.string konten) {set ("content", content); kembali (m) ini; } public java.lang.string getContent () {return getstr ("content"); }}Berbagi di atas dari catatan penggunaan kerangka kerja pengembangan cepat jFinal adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.