Enregistrez la première fois à l'aide de JFinal, de la construction de framework simple à l'addition, à la suppression, à la modification et à l'inspection, des méthodes intégrées à l'utilisation de cadres normaux.
Site officiel de Jfinal: http://www.jfininal.com/
JFinal est un framework Web + ORM rapide basé sur la langue Java. Ses objectifs de conception de base sont un développement rapide, un petit volume de code, un apprentissage simple, des fonctions puissantes, un léger, facile à développer et reposant. Tout en ayant tous les avantages de Java, il a également l'efficacité de développement des langues dynamiques telles que Ruby, Python et PHP.
JFinal a les principales caractéristiques suivantes:
Architecture MVC, conception exquise et utilisation simple
Suivez le principe COC, configuration zéro, pas de XML
Mode d'enregistrement DB + original, flexible et pratique
Le support ActiveRecord rend le développement de bases de données extrêmement rapide
Chargez automatiquement le fichier Java modifié, pas besoin de redémarrer le serveur Web pendant le développement
Prise en charge AOP, configuration d'intercepteur flexible et fonctions puissantes
Architecture du plugin, forte évolutivité
Support multi-visualités, freemarker, jsp, vitesse
Fonction de vérification backend de validateur puissant
Fonctions entièrement, avec la plupart des fonctions de Struts2
La petite taille n'est que de 632k et aucune dépendance tierce
exemple:
J'utilise d'abord Maven, créez d'abord un projet Maven:
Une fois mon projet créé, je dois le définir en premier:
Puis cliquez sur Appliquer
Il y a d'autres paramètres, etc. Ma question est ignorée ici
Présentez ensuite le package JAR dans pom.xml:
Package de jar de recherche Maven: http://mvnrepository.com/
La démo officielle Pom.xml:
JSON n'est pas présenté ici, ma dernière méthode de démo nécessite JSON
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <ModelVersion> 4.0.0 </ Modelversion> <ProupId> com.demo </proupId> <ArtifActid> jfinal_demo_for_maven </ artifiactid> <packaging> war </packaging> <Durse> 3.2 </ version> <name> jfinal_demo_for_maven maven webapp </name> <url> http://maven.apache.org </url> <projeties> <projed.build.sourceencoding> utf-8 </project.build.sourceencod> <maven.compiller.encoding> utf-8 </maven.compiller.encoding> </properties> <! - Utilisation de la bibliothèque Alibaba Maven -> <fepositories> <pichage> <id> Ali-Maven </ id> <url> http://maven.aliyun.com/nexus/Content/Groups/public </ URLIC <Leleases> <Antiled> true </abled> </ releases> <napshots> <veabled> true </abled> <fatedatePolicy> Toujours </ updatePolicy> <ChordSumpolicy> échoue </CHOCKSumpolicy> </napshots> </spopository> Repositories> <Repository> <id> Sonatype nexus-snapshots </id> <name> Sonatype Nexus Snapshots </name> <url> https://oss.sonatype.org/content/repositories/snapshots/ </url> <eleases> <cable> false </abled> <fatiable> true </ enabled> <datedatePolicy> quotidien </ updatepolicy> </napshots> </pawisitory> </pawisitory> </pispository> </sispository> </sispository> </popository> </popository> </popository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </popository> </sispository> </popository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </popository> </sispository> </popository> </ Repository> </ Repository> </ Repository <POPE> TEST </ SCOPE> </ Dependency> <Dependency> <GroupId> com.jfinal </proupId> <ArtifActid> Jetty-Server </ Artifactid> <version> 8.1.8 </ version> <! - La valeur de scope ici est compilée. Il ne doit être changé que lorsque vous démarrez le projet sous l'idée de démarrer le package de guerre pour éviter de jeter des pots inutiles -> <ccope> compiler </ccope> </ Dependency> <Dendency> <proupId> com.jfinal </proupId> <pelactid> jfinal </ artifactid> </ groupid> <ArtefactId> LOG4J </ ArfactId> <Dersion> 1.2.16 </DERNIFRIGNE> </DENDENCENCE> <Dependance> <GroupId> MySQL </ProupId> <DearfactId> MySQL-Connector-Java </ Artifactid> <Dersion> 5.1.44 </preectrid> </Dedency> <Dedency> <ProupId> com.alibaba </ Groupid> <ArtefactId> Druid </ artifactid> <DERSE> 1.0.29 </ Version> </ Dependency> <Dependency> <ProupId> com.jfinal </proncID> <Artifactid> COS </ Artifactid> <DersonD> 2017.5 </ Version> </ Dependency> </Dedensences> <uild> <inalname> jfinal_demo_for_maven </ final> <inalname> jfinal_demo_for_maven </ final> <inalname> JFINAL_DEMO_FORMAGE> <GroupId> org.mortbay.jetty </prôdID> <Artifactid> jetty-maven-Plugin </ artifactid> <in version> 8.1.8.v20121106 </-version> <fonfiguration> <stopKey> STOP </ stopkey> <stopport> 5599 </ropport> <webappconfig> <ftextpath> / </ ContextPath> <scanIntervalSEcondes> 5 </ ScanIntervalSEconds> <Connectors> <Connector Implementation = "org.eclipse.jetty.server.nio.SelectChannelConnector"> <port> 80 </port> </Axidletime> 60000 </ maxidletime> </connector> </connector> </figuration> </fuild> </propwe>
Ensuite, il y a la configuration de web.xml:
Avis:
Le package où réside le fichier DemoConfig.java et son propre nom de fichier doit être cohérent avec la configuration de la balise param-valeur dans web.xml (dans ce cas, la configuration est Demo.DemoConfig).
<filter> <filter-name> jfinal </filter-name> <filter-class> com.jfininal.core.jfinalfilter </filter-Class> <Init-Param> <param-name> ConfigClass </ param-name> <param -Value> Demo.DemoConfig </ Param-Value> </ Init-Param> </filter> <Imlter-Mapping> <Filter-Name> JFinal </ Filter-Name> <Url-Pattern> / * </url-Pattern> </filter-Mapping>
Créez ensuite le fichier Java:
Créez DemoConfig et hériter de JfinalConfig. DemoConfig est le fichier principal. Exécutez ce fichier pour démarrer le projet, tout comme l'exécution du fichier Java normal. Si vous modifiez d'autres codes après l'exécution en même temps, vous n'avez pas besoin de redémarrer. Le cadre sera automatiquement modifié. Vous pouvez actualiser directement pour voir le contenu modifié.
Voici la démo simple initiale:
Package Demo; import com.jfinal.config. *; public class DemoConfig étend JfinalConfig {public void configConstant (Constants Me) {me.setDevMode (true);} public void configrote (routes me) {me.add ("/ hello",} public voide.class) ;, configPlugin (Plugins Me) {} public void configInterceptor (interceptors me) {} public void congighandler (Handlers Me) {}}Configurez ensuite le contrôleur:
Package Demo; import com.jfinal.core.Controller; public class HelloController étend le contrôleur {public void index () {renderText ("Hello Jfinal World.");}}Ensuite, ouvrez le navigateur et entrez directement http: // localhost / bonjour et vous verrez que la page produit Hello Jfinal World.
Voici l'exemple le plus élémentaire de l'utiliser, voici mon programme:
Package Demo; import com.jfinal.config. *; import com.jfinal.core.jfinal; import com.jfinal.kit.propkit; import com.jfinal.plugin.acvinord.activerecordplugin; import; com.jfininal.template.engine; import Controller.StudentController; Importer Demo.Model.classes; Import Demo.Model.Student; classe publique DemoConfig étend JfininalConfig {public static void main (String [] args) {jfininal.start ("src / main / webapp", 80, "/", 5); } public void configConstant (constants me) {me.setDevMode (true); // Cette méthode est utilisée pour configurer la valeur constante jFinale, telle que la configuration du mode de développement constant DevMode, le code suivant configure jFinal // Exécuter en mode de développement: En mode de développement, JFinal publiera des rapports pour chaque demande, tels que la sortie de l'URL, du contrôleur, de la méthode // et des paramètres transportés par la demande. } public void configrote (me routes) {me.add ("/", hellocotreller.class); me.add ("/ test / mytest", hellocontroller.class, "test"); me.add ("/ étudiant", StudentController.class); //me.add("/classes ", ClassesController.class); } public void configEngine (moteur ME) {} public void configPlugin (plugins me) {// c3p0plugin cp = new C3p0plugin ("jdbc: mysql: // localhost / db_name", // "username", "mot de passe"); // me.add (cp); loadPropertyFile ("a_little_config.txt"); DruidPlugin dp = new DruidPlugin (getProperty ("jdbcurl"), getProperty ("utilisateur"), getProperty ("mot de passe")); me.add (dp); ActiverecordPlugin arp = new activerecordPlugin (dp); me.add (arp); arp.addmapping ("Student", "StudentId", Student.class); arp.addmapping ("classes", "classesId", classes.class); // Cette méthode est utilisée pour configurer le plugin de JFinal. Le code suivant configure le plug-in Pool de connexion de la base de données Druid et le plug-in de la base de données activeRecord //. Avec la configuration suivante, il est très pratique de faire fonctionner la base de données dans votre application à l'aide d'ActiveRecord. } public void configInterceptor (interceptors me) {//me.add(New authinterceptor ()); // Cette méthode est utilisée pour configurer l'intercepteur global de JFinal. L'intercepteur global interceptera toutes les demandes d'action, sauf si c'est effacé dans le contrôleur en utilisant // @clear. Le code suivant configure un intercepteur nommé Authinterceptor. } public void conformandandler (Handlers Me) {}}La description simple de chaque méthode ici est écrite dans les commentaires.
Ensuite, il y a le contrôleur:
Bien que le service soit déclaré ici, il n'est pas utilisé. Il est directement utilisé dans la méthode du contrôleur.
Contrôleur de package; Import Java.util.list; import Java.util.map; import com.alibaba.fastjson.jsonObject; import com.jfinal.aop.before; import com.jfinal.core.controller; import étudiantInterceptor.studentInterceptor; Importer StudentValidator.StudentValidator; Importer StudentValidator.StudValidator2; Demo.Model.Student; Import Service.StudentService; Public Class StudentController étend le contrôleur {/ ** * Il existe de nombreuses façons d'obtenir StudentID, ce qui est cohérent avec la méthode de rédaction du paramètre de passe frontal. Le contrôleur fournit les méthodes de la série GetPara. L'API officielle est très détaillée. JFinal utilise des instructions SQL originales, ce qui est simple et pratique. SetAttr ("StudentList", liste); Mettez l'ensemble des résultats dans la portée de la demande. JFinal a également une méthode pour obtenir directement le formulaire pour emballer des objets dans des objets getModel (Student.class); Autrement dit, comme Struts2, le nom de formulaire correspond, ce qui est très pratique à ajouter, StudentId Student.set ("StudentId", "MySequence.NextVal"). Save (); JFinal a plusieurs façons de revenir et peut également renvoyer les données JSON. La méthode de la série Render est très détaillée dans l'API officielle * / Static Studerservice Service = New Studentservice (); @Before (StudentInterceptor.class) public void index () {list <Student> list = student.dao.find ("select * from Student"); setAttr ("StudentList", liste); // Notez que si le chemin ci-dessous a /, commencez à chercher à partir du répertoire racine, c'est-à-dire le code = rendu ("/ student / index.html"); Render ("index.html"); } public void add () {render ("add.html"); } public void test () {list <Student> list = student.dao.find ("select * from Student"); setAttr ("StudentList", liste); setAttr ("Student", list.get (0)); rendu ("test.jsp"); } public void getList () {list <Student> list = student.dao.find ("select * from Student"); JSONObject Jo = new JSONObject (); jo.put ("code", 0); jo.put ("msg", true); jo.put ("count", list.size ()); jo.put ("data", liste); Renderjson (Jo); } public void LayUi () {list <Student> list = student.dao.find ("select * from Student"); setAttr ("StudentList", liste); Render ("index3.html"); } public void delete () {// Obtenez la valeur du nom de domaine de formulaire StudentId Student.dao.deleteByid (getPara ("StudentId")); ForwardAction ("/ Student"); } public void Delete1 () {// Obtenez la première valeur dans la demande d'URL Student.dao.deleteById (getParAtoint ()); ForwardAction ("/ Student"); } public void Update () {étudiant étudiant = getModel (student.class); Student.update (); ForwardAction ("/ Student"); } public void get () {Student Student = Student.dao.FindByid (getPara ("StudentId")); setAttr ("étudiant", étudiant); rendu ("index2.html"); } public void get1 () {Student Student = Student.dao.FindById (getParAtOirn ()); setAttr ("étudiant", étudiant); rendu ("index2.html"); } @Before (StudentValidator.class) public void Save () {/ ** * getModel est utilisé pour recevoir l'objet modèle passé du champ de formulaire de page. Le nom de champ de formulaire est nommé "ModelName.Attrname" http://www.jfinal.com. Le nom d'attribution utilisé par GetModel doit être exactement le même que le nom du champ de table de données. La méthode GetBean est utilisée pour prendre en charge les haricots Java traditionnels, y compris les modèles qui utilisent le générateur JFNAL pour générer des méthodes Getter et Setter. Lorsque vous passez des arguments sur les formulaires de page, utilisez un nom d'attaque cohérent avec la méthode du secteur, plutôt que des noms de champ de table de données. La différence entre GetModel et GetBean est que le premier utilise le nom du champ de table numérique et le second utilise le nom d'attribut cohérent avec la méthode du secteur pour l'injection de données. Il est recommandé d'utiliser d'abord la méthode GetBean. * / // getBean (Student.class) .Save (); getModel (student.class) .save (); rediriger ("/ étudiant"); } @Before (StudentValidator2.class) public void SaveBean () {getBean (student.class) .save (); rediriger ("/ étudiant"); }}La même explication simple est également écrite dans les commentaires.
Les méthodes sont essentiellement toutes ici, voici quelques autres configurations:
Ceci est la classe d'entité:
Package Demo.Model; Import com.jfinal.plugin.activecord.model; étudiant de classe publique étend le modèle <Student> {public static final student dao = new student (); / ** * activeRecord est l'un des composants les plus principaux de JFinal. L'exploitation de la base de données via ActiveRecord réduira considérablement la quantité de code et améliorera considérablement l'efficacité du développement. La configuration est à l'arrière. J'utilise le modèle ici. Le modèle est l'un des composants les plus importants dans ActiveRecord, qui agit comme le modèle en mode MVC. L'utilisateur dans le code ci-dessus dispose immédiatement de nombreuses méthodes pratiques pour faire fonctionner la base de données en héritant du modèle. L'objet statique DAO déclaré dans l'utilisateur est défini pour la commodité des opérations de requête, et l'objet n'est pas nécessaire. Les modèles basés sur ActiveRecord n'ont pas besoin de définir les attributs, les getters et les méthodes de setter, la configuration XML et la configuration d'annotation, ce qui réduit considérablement la quantité de code. Des méthodes de modèle courantes se trouvent dans l'API officielle. JFinal possède également le mode d'enregistrement DB + d'origine, la classe DB et sa classe d'enregistrement qui l'accompagne, qui fournissent des fonctions de fonctionnement de base de données plus riches en dehors de la classe de modèle. Lorsque vous utilisez les classes DB et d'enregistrement, il n'est pas nécessaire de cartographier les tables de base de données, et l'enregistrement est équivalent à un modèle général. Des méthodes de base de données communes se trouvent dans l'API officielle. * /}StudentValidator:
Package StudentValidator; Import com.jfinal.core.Controller; Import com.jfinal.valated.validator; public class StudentValidator étend Validator {// @ Override Protected Void HandleError (Controller Controller) {contrôleur.Keeppara ("Student.StudentName" contrôleur.render ("/ add.html"); } @Override Protected void validate (contrôleur de contrôleur) {// Vérifiez le nom du champ de formulaire, renvoyez la clé d'informations, renvoyez la valeur d'information validateRequiredString ("Student.StudentName", "StudentNameMsg", "Veuillez saisir le nom étudiant!"); }} Package StudentValidator; Import com.jfinal.core.Controller; import com.jfinal.valated.validator; public class StudentValidator2 étend Validator {// Override Protected void handleError (contrôleur de contrôleur) {contrôleur.Keeppara ("StudentName"); // transmet la valeur soumise à la page pour maintenir la valeur à l'origine de la valeur entrée à l'origine à maintenir la valeur entrée à l'orioi contrôleur.render ("/ add.html"); } @Override Protected void validate (contrôleur de contrôleur) {// Vérifiez le nom du champ de formulaire, renvoyez la clé d'informations, renvoyez la valeur d'information validateRequiredString ("StudentName", "StudentNameMsg", "Veuillez saisir le nom de l'étudiant!"); }}StudentInterceptor:
Package StudentInterceptor; import com.jfinal.aop.interceptor; import com.jfinal.aop.invocation; public class StudentInterceptor implémente interceptor {public void intercept (invocation ai) {System.out.println ("avant invoque d'action"); ai.invoke (); System.out.println ("After Action Invoking"); }}Ensuite, la page d'affichage de la réception:
En ce qui concerne la page de réception, vous devez consulter le sixième chapitre du document, le contenu du moteur de modèle JFinal et comprendre comment Jfininal est affiché dans la réception. C'est très important.
<! Doctype html> <html> <éadf> <meta charset = "utf-8"> <tight> Student Management </ title> <script type = "text / javaScript" src = "/ jQuery-1.12.4 href = "/ student / LayUi"> Test Layui </a> <a href = "/ student / test"> modifier l'index 0 </a> <br> <a href = "> id / add"> add </a> <br> <form action = "/ student / get"> id: <entrée type = "text" name = "StudentId"> <entrée = "soumettre" value = "query"> <a <a href = "/ student / delete"> delete </a> <form action = "/ student / delete"> id: <input type = "text" name = "StudentID"> <input type = "soumi" value = "delete"> </ form> #for (x: [1..10]) # (x) #end <Table id = "listTable"> <tody> <tr> <th> id </ th> <th> th> <th> Gender </ Th> <Th> Age </ Th> <Th> Adresse </th> <th> e-mail </th> <Th> Operation </th> </tr> #for (x: étudiantList) <Tr> <td Style = "Text-Align: Left;"> # (x.StudEntid) </ td> <td style = "Text-Align: Left;"> # (x.S.STUDID) <TD = " style = "Text-Align: Left;"> # (x.sex) </td> <td style = "text-adign: Left;"> # (x.age) </td> <td style = "Text-Align: Left;"> # (x.address) </td> <td style = "Text-Align: Left;"> # (x.email) </ td> style = "text-adign: Left;"> <a href = "/ student / delete? StudentId = # (x.studentid)"> delete </a> <a href = "/ student / delete1 / # (x.studentid)"> delete </a> <a href = "/ student / get? StudentId = # (x.Studentid)"> Modify </a> <a? href = "/ student / get1 / # (x.studentid)"> modifier </a> <a href = "/ student / get1 / # (x.studentid)"> modifier </a> </td> </tr> #end </ tbody> </ table> </ body> </html>
C'est l'effet de page, car il n'y a pas de style, il a l'air rugueux. Ensuite, ce qui suit est composé de l'utilisation normale de LayUI et de la méthode habituelle normale pour retourner les données:
<! Doctype html> <html> <éadf> <meta charset = "utf-8"> <tight> gestion étudiante Layui </ title> <script type = "Text / javascrip href = "/ Layui-v2.2.45 / Layui / CSS / Layui.css" Media = "all"> </ head> <body> <div style = "margin: 0px; background-Color: White; margin: 0 10px;"> <lockquote> <a href = "/ student / add"> <bouton type = "Button" id = "utilisateursadd_bt"> <i aria-hidden = "true"> </i> add </ bouton> </a> <formy style = "float: droit;" onSubmit = "return false"> <div> Recherchez les utilisateurs: <div> <input name = "name" id = "DemoreLoad" AutoCompletele = "OFF"> </ div> <Button style = "transform: tradlatey (-3px);" Data-Type = "Reload"> Search </ Button> </div> </div> </ form> </lockquote> </div> <Table Lay-Data = "{url: '/ Student / GetList', id: 'idtest', Height: 'Full-60',}" Lay-filter = "Demo"> <Thead> <tr> <th-Data = "{Field:" Studentid "> <Thead> <tr> <th Largeur: '20% ',} "> id </ th> <th lay-data =" {field:' étudiantname ', width: '20%'} "> name </ th> <th lay-data =" {field: 'sex', width: '20% '} "> Gender </ th> <th lay-data =" {field:' Âge ', width: '20%'} Lay-data = "{champ: 'adresse', largeur: '20% '}"> adresse </ th> <th lay-data = "{fixe:' droite ', width: '17%', align: 'Center', barre d'outils: '# bardemo1'}"> </ th> </tr> </tr> </sall id = "edit" Lay-Event = "Edit"> Modifier </a> <a Lay-Event = "del"> Delete </a> </script> </ body> <cript> LayUi.use ('Table', fonction () {var Table }); DataType: "Text", // SUCCÈS RETOURNÉE: FONCTION (RETOURNÉE) {TABLE ['380px', '80% '], contenu: "/ astudent/get?studentid="+data.studentid, annule: function (index, Layo) {couche.close (index); Debug) $ (fenêtre) .resize (function () {LayUi.Layer.full (index);}) LayUi.layer.full (index);} else if (obj.event === 'Détail') {couche URL: "<% = baspath%> / sys / user / passuse", data: {id: data.id}, // dataType: "text", // return Success: function (returnData) {LayUi.use ('coucheer', function () {couche.msg (idTest '. // redémarrer à partir de la page 1},});}, une fonction: Fonction LAYER.ALERT (JSON.STRINGIFY (DATA));}, GetCheckLength: fonction () {// Obtenez le nombre de var vérifiés sélectionnés = Table. table.CHECKSTATUS ('idTest'); });}); </cript> </html>Cela se sent un peu mieux, car ce n'est que la première fois que je l'utilise et que je fais un test, il est donc encore relativement rude.
Il est alors important de noter le problème du retour des données de cette manière:
public void getList () {list <Student> list = student.dao.find ("select * from Student"); JSONObject Jo = new JSONObject (); jo.put ("code", 0); jo.put ("msg", true); jo.put ("count", list.size ()); jo.put ("data", liste); Renderjson (Jo); }C'est la méthode indiquée par l'URL de la table LayUi. Ici, vous devez retourner les données JSON de la manière Renderjson.
Il convient de noter que j'ai essayé de retourner directement la collection de liste. Il semble que la méthode soit possible, mais comme la table LayUI doit être dans le format ci-dessus pour recevoir des données, elle ne s'affiche pas sur la page. Cependant, lorsque je retourne directement Jo, l'erreur de fond rapporté, et ce problème ne peut être appris et résolu demain.
Voici plusieurs façons d'utiliser la méthode de rendu retournée:
Ensuite, vous devez faire attention à l'appel de méthode et au transfert de paramètres:
Il existe deux méthodes et méthodes de transfert de paramètres comme suit:
<a href = "/ student / delete? StudentId = # (x.studentid)"> delete </a> <a href = "/ student / delete1 / # (x.studentid)"> delete </a> <a href = "/ student / get? StudentID = # (x.studentid)"> Motify </a> <a a href = "/ student / get1 / # (x.studentid)"> modifier </a> <a href = "/ student / get1 / # (x.studentid)"> modifier 1 </a>
Voici la méthode du contrôleur:
public void Delete () {// Obtenez la valeur du nom de domaine de formulaire StudentId Student.dao.deleteByid (getPara ("StudentId")); ForwardAction ("/ Student"); } public void Delete1 () {// Obtenez la première valeur dans la demande URL Student.dao.deleteById (getParAtOirt ()); ForwardAction ("/ Student"); } public void Update () {étudiant étudiant = getModel (student.class); Student.update (); ForwardAction ("/ Student"); } public void get () {Student Student = Student.dao.FindByid (getPara ("StudentId")); setAttr ("étudiant", étudiant); rendu ("index2.html"); } public void get1 () {Student Student = Student.dao.FindById (getParAtOirn ()); setAttr ("étudiant", étudiant); rendu ("index2.html"); }Enfin, il existe deux façons d'ajouter des cours d'acceptation en entités:
@Before (StudentValidator.class) public void Save () {/ ** * getModel est utilisé pour recevoir l'objet modèle passé du champ de formulaire de page. Le nom de champ de formulaire est nommé "ModelName.Attrname" http://www.jfinal.com. Le nom d'attribution utilisé par GetModel doit être exactement le même que le nom du champ de table de données. La méthode GetBean est utilisée pour prendre en charge les haricots Java traditionnels, y compris les modèles qui utilisent le générateur JFNAL pour générer des méthodes Getter et Setter. Lorsque vous passez des arguments sur les formulaires de page, utilisez un nom d'attaque cohérent avec la méthode du secteur, plutôt que des noms de champ de table de données. La différence entre GetModel et GetBean est que le premier utilise le nom du champ de table numérique et le second utilise le nom d'attribut cohérent avec la méthode du secteur pour l'injection de données. Il est recommandé d'utiliser d'abord la méthode GetBean. * / // getBean (Student.class) .Save (); getModel (student.class) .save (); rediriger ("/ étudiant"); } @Before (StudentValidator2.class) public void SaveBean () {getBean (student.class) .save (); rediriger ("/ étudiant"); }La deuxième méthode GetBean dans ma démo peut ne pas être définie, et seul l'ID est généré et aucune autre donnée n'est ajoutée.
Si nécessaire. Voici la démo officielle:
Package com.demo.common.model; import com.demo.common.model.base.baseblog; / ** * Cette démo ne fait que l'utilisation de Jfininal la plus superficielle, et est plus précieuse et pratique en entreprise.com/club * pour plus de détails, le modèle de blog JFinal: http://jfinal.com/club * * modèle de blog. * Il est recommandé d'utiliser des règles de dénomination de camel pour les noms de champ de base de données afin de faciliter la cohérence avec le code Java, tels que les noms de champ: utilisateur * / @ suppresswarnings ("serial") Le blog de classe publique étend Baseblog <glog> {} package com.demo.common.model.base; import com.jfininal.plugin.activercord.model; import com.jfinal.plugin.activercord.ibian; / ** * généré par Jfinal, ne modifiez pas ce fichier. * / @ Suppresswarnings ({"serial", "Unchecked"}) public abstrait classblog <m étend BaseBlog <m>> étend le modèle <m> implémente iBean {public m setid (java.lang.integer id) {set ("id", id); retour (m) ceci; } public java.lang.integer getID () {return getInt ("id"); } public m SettItle (java.lang.string title) {set ("title", titre); retour (m) ceci; } public java.lang.string gettitle () {return gettr ("title"); } public m setContent (java.lang.string contenu) {set ("contenu", contenu); retour (m) ceci; } public java.lang.string getContent () {return gettr ("contenu"); }}Le partage ci-dessus des notes d'utilisation du cadre de développement rapide JFinal est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.