Registre la primera vez usando JFinal, desde la construcción del marco simple hasta la adición, la eliminación, la modificación e inspección, desde los métodos incorporados hasta el uso de marcos normales.
Sitio web oficial de JFinal: http://www.jfinal.com/
JFinal es un marco Fast Web + ORM basado en el idioma Java. Sus objetivos de diseño básicos son el desarrollo rápido, el pequeño volumen de código, el aprendizaje simple, las funciones potentes, el peso ligero, las fáciles de expandir y el reparador. Si bien tiene todas las ventajas de Java, también tiene la eficiencia de desarrollo de idiomas dinámicos como Ruby, Python y PHP.
JFinal tiene las siguientes características principales:
Arquitectura MVC, diseño exquisito y uso simple
Siga el principio de COC, configuración cero, sin XML
Modo de registro DB + original, flexible y conveniente
El soporte de Activerecord hace que el desarrollo de la base de datos sea extremadamente rápido
Cargue automáticamente el archivo Java modificado, no es necesario reiniciar el servidor web durante el desarrollo
AOP admite, configuración de interceptor flexible y funciones potentes
Arquitectura de complementos, escalabilidad fuerte
Soporte de visión múltiple, Freemarker, JSP, Velocity
Función de verificación de backend de validador potente
Funciones totalmente, con la mayoría de las funciones de Struts2
El tamaño pequeño es de solo 632k y no hay dependencias de terceros
ejemplo:
Uso primero Maven, primero Crear un proyecto Maven:
Después de crear mi proyecto, necesito configurarlo primero:
Luego haga clic en Aplicar
Hay otras configuraciones, etc. Mi pregunta se omite aquí
Luego introduzca el paquete jar en pom.xml:
Maven Search Jar Package: http://mvnrepository.com/
La demostración oficial pom.xml:
JSON no se presenta aquí, mi último método de demostración requiere JSON
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/maven-v4_0_0.xsd "> <modelVersion> 4.0.0 </modelversion> <MoupRupid> com.demo </groupid> <artifactid> jfinal_demo_for_maven </artifactid> <calaging> war </packaging> <version> 3.2 </versión> <name> jfinal_demo_for_maven maven webapp </name> <url> http://maven.apache.org </url> <properties> <proyecto.build.sourceencoding> UTF-8 </project.build.sourceEnding> <maven.compiler.encoding> utf-8 </maven.compiler.encoding> </propiences> <!-Uso de la biblioteca Alibaba Maven-> <Repositories> <Repository> <id> ali-maven </id> <url> http://maven.aliyun.com/nexus/content/groups/ps/ps/ps/p. <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> </repository> </repository> <!-- Add snapshot repository, updatePolicy: always, daily, interval, never --> <!-- repositories> <S Repository> <id> sonatype-nexus-snapshots </id> <name> sonatype nexus snapshots </name> <url> https://oss.sonatype.org/content/repositories/snapshots/ url> <seltes> <Nealt> falso </nenapated> </selies> <snapshots> <snapshots> <nabled> real> <SpolyPolicy> Daily </updatePolicy> </snstapshots> </ Repository> </spository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </ Repository> </Repository> </Repository> </Repository> </eposory> </eposory> </eposory> <//repository> </seposory> </eposory> </eposory> </eposory> </epository> </epository> </epository> </epository> </epository> </Repository> </eposory> </eposory> </eposory> <//repository> </seposory> </eposory> </eposory> </eposory> </epository> </epository> </epository> </epository> </epository> </Repository <cope> test </cope> </pepertency> <epardency> <grupoD> com.jfinal </proupid> <artifactid> jetty-server </artifactid> <versión> 8.1.8 </versión> <!-El valor de alcance aquí es compilado. Solo debe cambiarse a proporcionado al comenzar el proyecto bajo idea para iniciar el paquete de guerra para evitar tirar algunos frascos inútiles en -> <cope> compilar </cope> </pendency> <pendency> <MoupRoMID> com.jfinal </groupId> <artifactId> jfinal </artifactID> <version> 3.3 </versión> </pendency> <pendency> <proupId> log 4J </groupid> </groupid> <artifactid> log4j </arfactid> <verververers> 1.2.16 </verversion> </pendency> <pendency> <uproupid> mysql </groupid> <artifactid> mysql-connector-java </arfactid> <version> 5.1.44 </persion> </dependency> <ependency> <grup.alibaba </groupid> </groupid> </groupid> <artifactid> druid </arfactid> <versever> 1.0.29 </versión> </pendency> <pendency> <proupid> com.jfinal </groupid> <artifactid> cos </artifactid> <versión> 2017.5 </versión> </dependencia> </dependencias> <stract> <finalname> jfinal_demo_for_for_maven> </final de finalización> </final de finalización> </final de finalización> </final </plugins> </final de finalización> </final </final de finalización> </final </final de la final. <MoupRid> org.mortbay.jetty </groupid> <artifactid> jetty-maven-plugin </artifactid> <versión> 8.1.8.v20121106 </versión> <necuteation> <stopkey> stop </stopkey> <stopport> 5599 </stopport> <sebappConfig> <contextpath> <ScanInterValSeconds> 5 </ScanIntervalSeconds> <nectores> <Connector Implementation = "org.eclipse.jetty.server.nio.selectchannelconnector"> <port> 80 </port> <maxidletime> 60000 </maxidletime> </conector> </nonector> </figuration> </tuginatin> </plemingle </plugin <glemin </plugin <glemin </pleminty </plemingle </plemingin
Luego está la configuración de Web.xml:
Aviso:
El paquete donde reside el archivo democonfig.java y su propio nombre de archivo debe ser coherente con la configuración en la etiqueta de valor param-valor en web.xml (en este caso, la configuración es demo.democonfig).
<filter> <filter-name> jfinal </filtre-name> <filter-class> com.jfinal.core.jfinalfilter </filter-class> <itel-param> <amamname> configclass </param-name> <parámetro -Value> Demo.Democonfig </Param-Value> </ init-param> </filtro> <filter-mapping> <filter-name> jfinal </filtre-name> <url-pattern>/*</ url-patern> </filter-mapping>
A continuación, cree el archivo Java:
Crear Democonfig y heredar JFinalConfig. Democonfig es el archivo principal. Ejecute este archivo para iniciar el proyecto, al igual que ejecutar el archivo Java Normal Main. Si modifica otros códigos después de ejecutarse al mismo tiempo, no necesita reiniciar. El marco se modificará automáticamente. Puede actualizar directamente para ver el contenido modificado.
Aquí está la demostración simple inicial:
Paquete de demostración; import com.jfinal.config.*; public class DeMoconfig extiende jfinalConfig {public void configConstant (constants me) {me.setdevmode (true);} public void configute (rutina me) {me.add ("/hola", hellocontroller.class);} pública void configreine (me enruta) configplugin (complementos me) {} public void configSinterceptor (interceptores me) {} public void confighandler (Handlers me) {}}Luego configure el controlador:
Paquete de demostración; import com.jfinal.core.controller; public class Hellocontroller extiende el controlador {public void index () {renderteText ("Hola Jfinal World.");}}Luego abra el navegador e ingrese http: // localhost/hola directamente y verá que la página sale hola jfinal world.
Aquí está el ejemplo más básico de usarlo, aquí está mi programa:
paquete de demostración; import com.jfinal.config.*; import com.jfinal.core.jfinal; import com.jfinal.kit.propkit; import com.jfinal.template.engine; importación de importación.studentController; import Demo.model.classes; import Demos.model.student; public class Democonfig extiende jfinalConfig {public static void main (string [] args) {jfinal.start ("src/main/webapp", 80, "/", 5, 5); } public void configConstant (constants me) {me.setdevmode (true); // Este método se utiliza para configurar el valor constante de Jfinal, como la configuración del modo de desarrollo constante DevMode, el siguiente código configura JFinal // Ejecutar en modo de desarrollo: en modo de desarrollo, JFinal emitirá informes para cada solicitud, como la salida de la URL, el controlador, el método // y los parámetros llevados por la solicitud. } public void configute (me enruta) {me.add ("/", hellocontroller.class); me.add ("/test/mytest", hellocontroller.class, "test"); me.add ("/estudiante", StudentController.class); //me.add("/classes ", classesController.class); } public void configEngine (Engine me) {} public void configplugin (complementos me) {// c3p0plugin cp = new C3p0plugin ("jdbc: mysql: // localhost/db_name", // "username", "contraseña"); // me.add (cp); loadPropertyFile ("a_little_config.txt"); DruidPlugin dp = new DruidPlugin (getProperty ("jdbcurl"), getProperty ("usuario"), getProperty ("contraseña")); me.add (dp); Activerecordplugin arp = new ActiverecordPlugin (DP); me.add (arp); arp.addmapping ("estudiante", "studentId", student.class); arp.addmapping ("classes", "classesid", classes.class); // Este método se utiliza para configurar el complemento de JFinal. El siguiente código configura el complemento del grupo de conexión de base de datos Druid y Activerecord // complemento de acceso a la base de datos. Con la siguiente configuración, es muy conveniente operar la base de datos en su aplicación usando Activerecord. } public void ConfigInterceptor (Interceptors Me) {//me.add(new authInterceptor ()); // Este método se utiliza para configurar el interceptor global de JFinal. El Interceptor Global interceptará todas las solicitudes de acción a menos que se elimine en el controlador usando // @clear. El siguiente código configura un interceptor llamado Authinterceptor. } public void confighandler (los manejadores me) {}}La descripción simple de cada método aquí está escrita en los comentarios.
Luego está el controlador:
Aunque el servicio se declara aquí, no se usa. Se usa directamente en el método del controlador.
controlador de paquete; import java.util.list; import java.util.map; import com.alibaba.fastjson.jsonObject; import com.jfinal.aop.bebore; import com.jfinal.core.controller; importador de importación.studentinterceptor; importación de estudiantes; demo.model.student; importación de importación.studentService; public Class StudentController extiende el controlador { /*** Hay muchas formas de obtener StudentId, lo cual es consistente con el método de escritura de parámetros de pase front-end. El controlador proporciona los métodos de la serie Getpara. La API oficial es muy detallada. JFinal usa declaraciones SQL originales, que es simple y conveniente. Setattr ("StudentList", List); Ponga el resultado establecido en el alcance de la solicitud. JFinal también tiene un método para obtener directamente el formulario para empaquetar objetos en objetos GetModel (Student.Class); Es decir, como Struts2, el nombre de la forma corresponde, que es muy conveniente para agregar, StudentId Student.set ("StudentId", "mySequence.NextVal"). Save (); JFinal tiene múltiples formas de regresar, y también puede devolver los datos de JSON. El método de serie Render es muy detallado en el servicio oficial API*/ Static Studentservice = New Studentservice (); @Bebore (StudentInterceptor.class) public void índice () {list <diestrem> list = student.dao.find ("select * from student"); setattr ("StudentList", List); // Tenga en cuenta que si la ruta a continuación tiene/, comience a mirar desde el directorio raíz, es decir, el código = render ("/student/index.html"); render ("index.html"); } public void add () {render ("add.html"); } public void test () {list <deude> list = student.dao.find ("Seleccionar * de Student"); setattr ("StudentList", List); setattr ("estudiante", list.get (0)); render ("test.jsp"); } public void getList () {list <diet> list = student.dao.find ("Seleccionar * de Student"); JsonObject Jo = new JsonObject (); Jo.put ("Código", 0); Jo.put ("msg", verdadero); Jo.put ("Count", list.size ()); Jo.put ("datos", lista); Renderjson (Jo); } public void Layui () {list <diestriete> list = student.dao.find ("Seleccionar * de Student"); setattr ("StudentList", List); render ("index3.html"); } public void Delete () {// Obtenga el valor del nombre de dominio de formulario StudentId Student.dao.DeleteById (getpara ("studentId")); reenviar ("/estudiante"); } public void Delete1 () {// Obtenga el primer valor en la solicitud de URL student.dao.deleteById (getParatoint ()); reenviar ("/estudiante"); } public void Update () {Student Student = getModel (student.class); estudiante.update (); reenviar ("/estudiante"); } public void get () {Student Student = student.dao.findbyid (getpara ("studentId")); setattr ("estudiante", estudiante); render ("index2.html"); } public void get1 () {Student Student = student.dao.findbyid (getParatoint ()); setattr ("estudiante", estudiante); render ("index2.html"); } @Bebore (studentValidator.class) public void save () { /*** getModel se usa para recibir el objeto modelo que se pasa desde el campo Formulario de página. El nombre del campo del formulario se llama "modelname.attrname" http://www.jfinal.com. El nombre ATtrNeed por GetModel debe ser exactamente el mismo que el nombre del campo de la tabla de datos. El método GetBean se utiliza para admitir las frijoles Java tradicionales, incluidos los modelos que usan el generador JFNAL para generar métodos de Getter y Setter. Al pasar argumentos en los formularios de página, use AttrName de manera consistente con el método Setter, en lugar de los nombres de campo de la tabla de datos. La diferencia entre GetModel y GetBean es que el primero usa el nombre del campo de la tabla de números y el segundo usa el nombre del atributo consistente con el método Setter para la inyección de datos. Se recomienda utilizar primero el método GetBean. */// getBean (student.class) .save (); getModel (student.class) .save (); redireccionar ("/estudiante"); } @Bebore (studentValidator2.class) public void saveBean () {getBean (student.class) .save (); redireccionar ("/estudiante"); }}La misma explicación simple también se escribe en los comentarios.
Los métodos están básicamente todos aquí, aquí hay algunas otras configuraciones:
Esta es la clase de entidad:
paquete demo.model; import com.jfinal.plugin.activecord.model; el estudiante de clase pública extiende el modelo <entudent> {public static final Student dao = new Student (); /*** Activerecord es uno de los componentes más centrales de JFinal. Operar la base de datos a través de ActiveRecord reducirá en gran medida la cantidad de código y mejorará en gran medida la eficiencia del desarrollo. La configuración está en la parte posterior. Estoy usando el modelo aquí. El modelo es uno de los componentes más importantes en Activerecord, que actúa como la parte del modelo en el modo MVC. El usuario en el código anterior tiene muchos métodos convenientes para operar la base de datos heredando el modelo. El objeto estático DAO declarado en el usuario se define para la conveniencia de las operaciones de consulta, y el objeto no es necesario. Los modelos basados en Activerecord no necesitan definir atributos, getters y métodos de setter, configuración XML y configuración de anotación, lo que reduce en gran medida la cantidad de código. Los métodos comunes de modelo se encuentran en la API oficial. JFinal también tiene el modo de registro DB + original, la clase DB y su clase de registro acompañante, que proporciona funciones de operación de base de datos más ricas fuera de la clase de modelo. Al usar las clases de DB y Registro, no hay necesidad de mapear tablas de bases de datos, y el registro es equivalente a un modelo general. Los métodos de DB comunes se encuentran en la API oficial. */}Estudiante Validator:
paquete studentValidator; import com.jfinal.core.controller; import com.jfinal.validate.validator; public class StudentValidator extiende validador {//@anular void handleError (controlador controlador) {controlador.keepapara ("stud.studentName"); // controlador.render ("/add.html"); } @Override Protected void Validate (controlador del controlador) {// Verifique el nombre del campo de formulario, devuelve la clave de información, devuelve el valor de información ValidateRequiredString ("Student.StudentName", "StudentNamemSg", "Ingrese el nombre del estudiante!"); }} paquete studentValidator; import com.jfinal.core.controller; import com.jfinal.validate.validator; public class StudentValidator2 extiende Validator {// anula el manejo void protegido (controlador del controlador) {controlador.KeepPara ("StudentName"); // el valor enviado a la página para mantener el valor de la página originalmente ingresada ingresada en el valor originalmente ingresado. controlador.render ("/add.html"); } @Override protegido Void Validate (controlador del controlador) {// Verifique el nombre del campo de formulario, devuelve la clave de información, devuelve el valor de información ValidateRequiredString ("StudentName", "StudentNamemSg", "Ingrese el nombre del estudiante!"); }}Estudiante Interceptor:
paquete estudiantilinterceptor; import com.jfinal.aop.interceptor; import com.jfinal.aop.invocation; public class StudentInterceptor implementa Interceptor {public void Intercept (Invocation ai) {System.out.println ("antes de la acción invocación"); ai.invoke (); System.out.println ("después de la acción invocar"); }}Luego la página de visualización de recepción:
Con respecto a la página de recepción, debe mirar el sexto capítulo del documento, el contenido del motor de plantilla JFinal y comprender cómo se muestra JFinal en la recepción. Esto es muy importante.
<! DocType html> <html> <fead> <meta charset = "utf-8"> <title> gestión de estudiantes </title> <script type = "text/javascript" src = "/jQuery-1.12.4.4.min.js"> </script> </head> <hbody> <h1> <a href = "/jsp"> student management href = "/Student/Layui"> Test Layui </a> <a href = "/estudiante/test"> editar índice 0 </a> <br> <a href = "/student/agre href = "/student/delete"> eliminar </a> <form de acción = "/estudiante/eliminar"> id: <input type = "text" name = "studentID"> <input type = "enviar" value = "eliminar"> </form> #for (x: [1..10]) #(x) #end <tabla id = "listable"> <tbody> <tr> <th> </th> name> name <th> género </th> <th> edad </th> <th> dirección </th> <th> correo electrónico </th> <th> operación </th> </tr> #for (x: studentList) <tr> <td style = "text-align: izquierda;">#(x.studentid) </td> <td style = "text-alalign: izquierda;">#(x.sstud) 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-align: izquierda;">#(x.email) </td> <td <td> 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=#(x.studentid)">Modify</a> <a href = "/student/get1/#(x.studentid)"> modificar </a> <a href = "/student/get1/#(x.studentid)"> modificar </a> </td> </tr> #end </tbody> </table> </body> </html>
Este es el efecto de la página, porque no hay estilo, se ve duro. Luego, lo siguiente se compone del uso normal de Layui y el método habitual normal para devolver los datos:
<! DOCTYPE HTML> <html> <head> <meta charset = "utf-8"> <title> gestión de estudiantes layui </title> <script type = "text/javaScript" src = "/layui-v2.2.45/layui/layui.js"> </script> <enlace rel = "stylesheet" "" "" href = "/Layui-V2.2.45/Layui/Css/Layui.css" Media = "All"> </Head> <Body> <Div style = "Margin: 0px; Background-Color: White; Margin: 0 10px;"> <Blockquote> <a href = "/Student/add"> <Botón de botón = "Botón" Id = "Useradd_btn" <I " aria-hidden = "true"> </i> add </boton> </a> <form de estilo = "float: right;" onSubMit = "return false"> <div> Buscar para usuarios: <div> <input name = "name" id = "demoRELOAD" autocomplete = "Off"> </div> <button style = "transform: traducey (-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', ancho: '20%',} "> id </th> <th lay-data =" {campo:' studentName ', width: '20%'} "> nombre </th> <th lay-data =" {field: 'sex', width: '20%'} "> género </th> <th lay-data =" {field:' edad: widt: '20%'20%'} " Lay-Data = "{Field: 'Dirección', Width: '20%'}"> Dirección </th> <th LayData = "{fijo:' Right ', Width: '17%', align: 'Center', Barbar: '#Bardemo1'}"> </th> </tr> </tr> </table> id = "edit" lay-event = "edit"> modificar </a> <a lay-event = "del"> eliminar </a> </script> </body> <script> layui.use ('table', function () {var table = layui.table, form = layui.form ;; // select table.on ('checkbox (demo), function (obj) {obj.log (obj.Log (obj.LOG (obj)}) // Speak Tool Bar table.on ('Tool (Demo)', function (obj) {var data = obj.data; if (obj.event === 'del') {layer.confirm ('re realmente eliminando el usuario', function (index) {$ .AJAX ({tipo tipo: "post", url: " DataType: "Texto", // ['380px', '80%'], contenido: "/Student/get?studentid="+Data.StudentId, cancel: function (index, layero) {layer.close (index); $ (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);}); desde la página 1},}); Layer.alert (json.Stringify (data)); table.checkstatus ('idtest'); });}); </script> </html>Esto se siente un poco mejor, porque es solo la primera vez que lo uso y hago una prueba, por lo que todavía es relativamente áspero.
Entonces es importante tener en cuenta el problema del retorno de datos de esta manera:
public void getList () {list <deuds> list = student.dao.find ("Seleccionar * de Student"); JsonObject Jo = new JsonObject (); Jo.put ("Código", 0); Jo.put ("msg", verdadero); Jo.put ("Count", list.size ()); Jo.put ("datos", lista); Renderjson (Jo); }Este es el método señalado por la URL de la tabla Layui. Aquí, debe devolver los datos JSON de la manera RenderJSON.
Entonces debe tenerse en cuenta que he intentado devolver directamente la colección de la lista. Parece que el método es factible, pero debido a que la tabla Layui debe estar en el formato anterior para recibir datos, no se muestra en la página. Sin embargo, cuando devuelvo directamente a Jo, el error de fondo informado, y este problema solo se puede aprender y resolver mañana.
Las siguientes son varias formas de usar el método de renderizado devuelto:
Luego debe prestar atención a la llamada del método y la transferencia de parámetros:
Hay dos métodos y métodos de transferencia de parámetros de la siguiente manera:
<a href = "/student/delete? StudentId =#(x.studentid)"> delete </a> <a href = "/student/delete1/#(x.studentid)"> delete </a> <a href = "/student/get? studentD =#(x.studentid)"> modify </a> <a href = "/student/get1/#(x.studentid)"> modificar </a> <a href = "/student/get1/#(x.studentid)"> modificar 1 </a>
Aquí está el método del controlador:
public void Delete () {// Obtenga el valor del nombre de dominio de formulario StudentId Student.dao.DeleteById (getpara ("studentId")); reenviar ("/estudiante"); } public void Delete1 () {// Obtenga el primer valor en la solicitud de URL student.dao.deleteById (getParatoint ()); reenviar ("/estudiante"); } public void Update () {Student Student = getModel (student.class); estudiante.update (); reenviar ("/estudiante"); } public void get () {Student Student = student.dao.findbyid (getpara ("studentId")); setattr ("estudiante", estudiante); render ("index2.html"); } public void get1 () {Student Student = student.dao.findbyid (getParatoint ()); setattr ("estudiante", estudiante); render ("index2.html"); }Finalmente, hay dos formas de agregar clases de entidad de aceptación:
@Bebore (StudentValidator.class) public void save () { /*** getModel se usa para recibir el objeto modelo que se pasa desde el campo de formulario de página. El nombre del campo del formulario se llama "modelname.attrname" http://www.jfinal.com. El nombre ATtrNeed por GetModel debe ser exactamente el mismo que el nombre del campo de la tabla de datos. El método GetBean se utiliza para admitir las frijoles Java tradicionales, incluidos los modelos que usan el generador JFNAL para generar métodos de Getter y Setter. Al pasar argumentos en los formularios de página, use AttrName de manera consistente con el método Setter, en lugar de los nombres de campo de la tabla de datos. La diferencia entre GetModel y GetBean es que el primero usa el nombre del campo de la tabla de números y el segundo usa el nombre del atributo consistente con el método Setter para la inyección de datos. Se recomienda utilizar primero el método GetBean. */// getBean (student.class) .save (); getModel (student.class) .save (); redireccionar ("/estudiante"); } @Bebore (studentValidator2.class) public void saveBean () {getBean (student.class) .save (); redireccionar ("/estudiante"); }El segundo método GetBean en mi demostración puede no estar configurado, y solo se genera la ID y no se agreguen otros datos.
Si es necesario. Aquí está la demostración oficial:
paquete com.demo.common.model; import com.demo.common.model.base.baseBlog;/** * Esta demostración solo expresa el uso jfinal más superficial, y es más valioso y práctico uso de niveles empresariales * Para detalles, ver Jfinal Club: http:/jfinal.com/club * * Blog Modelo. * Se recomienda utilizar reglas de nombres de camellos para los nombres de campo de la base de datos para facilitar la coherencia con el código Java, como los nombres de campo: userId */@supresswarnings ("serie") Blog de clase pública extiende BaseBlog <Blog> {} paquete com.demo.common.model.base; import com.jfinal.plugin.activecord.model; import com.jfinal.plugin.activecord.ibean;/*** Generado por jfinal, no modifique este archivo. */@SupressWarnings ({"serial", "sin verificar"}) public abstract classblog <M extiende baseBlog <m>> extiende el modelo <m> implementa ibean {public m setid (java.lang.integer id) {set ("id", id); return (m) esto; } public java.lang.integer getId () {return getInt ("id"); } public m settitle (java.lang.string title) {set ("title", title); return (m) esto; } public java.lang.string gettitle () {return getStr ("title"); } public m setContent (java.lang.string content) {set ("content", content); return (m) esto; } public java.lang.string getContent () {return getStr ("contenido"); }}El intercambio anterior de las notas de uso del marco de desarrollo rápido de JFinal es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.