Registre a primeira vez usando o jfinal, da construção simples da estrutura a adição, exclusão, modificação e inspeção, desde os métodos internos até o uso de estruturas normais.
Site oficial da jfinal: http://www.jfinal.com/
O jfinal é uma estrutura rápida da Web + ORM com base no idioma Java. Seus principais objetivos de design são de desenvolvimento rápido, volume de código pequeno, aprendizado simples, funções poderosas, leve, fácil de expandir e repousante. Embora tenha todas as vantagens do Java, ele também possui a eficiência de desenvolvimento de linguagens dinâmicas como Ruby, Python e PHP.
A JFinal tem os seguintes recursos principais:
Arquitetura MVC, design requintado e uso simples
Siga o princípio do COC, configuração zero, sem xml
Modo de registro DB + original, flexível e conveniente
O suporte do ActiveRecord torna o desenvolvimento do banco de dados extremamente rápido
Carregue automaticamente o arquivo Java modificado, sem necessidade de reiniciar o servidor da web durante o desenvolvimento
AOP suporta, configuração de interceptores flexíveis e funções poderosas
Arquitetura de plug -in, forte escalabilidade
Suporte de várias visualizações, Freemarker, JSP, Velocity
Função de verificação de back -end de validador poderoso
Funções totalmente, com a maioria das funções do Struts2
O tamanho pequeno é de apenas 632k e nenhuma dependência de terceiros
exemplo:
Eu uso o Maven primeiro, primeiro crie um projeto Maven:
Depois que meu projeto é criado, preciso defini -lo primeiro:
Em seguida, clique em Aplicar
Existem algumas outras configurações, etc. Minha pergunta é ignorada aqui
Em seguida, apresente o pacote JAR em pom.xml:
pacote de jar de pesquisa maven: http://mvnrepository.com/
A demonstração oficial pom.xml:
JSON não é apresentado aqui, meu último método de demonstração requer 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 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> <url> http://maven.apache.org </url> </project.build.sourceEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties> <!-- Using the Alibaba maven library --> <repositories> <repository> <id>ali-maven</id> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <leuseases> <inabiled> true </itilabed> </leases> <snapshots> <bility> true </ability> </updatepolicy> sempre </updatepolicy> <chequesumpolicy> falha </chenchesumpolicy> </snapshots> snapshot> </repository> </repository> </repositório:!-addshot> snapShot> snapShot> repositories> <repository> <id>sonatype-nexus-snapshots</id> <name>Sonatype Nexus Snapshots</name> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <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> </repositório> </repositório> </repositório <cope> Test </scope> </dependency> <pendence> <puperiD> com.jfinal </groupid> <stifactId> jetty-server </artifactId> <versão> 8.1.8 </versão <!-O valor do escopo aqui é o comércio. It only needs to be changed to provided when starting the project under IDEA to start the war package to avoid throwing some useless jars in --> <scope>compile</scope> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>3.3</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.29</version> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>cos</artifactId> <version>2017.5</version> </dependency> </dependencies> <build> <finalName>jfinal_demo_for_maven</finalName> <plugins> <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> <CanintervalSaleconds> 5 </scanintervalsaleconds> <necnectors> <conector implementação = "org.eclipse.jetty.server.nio.selectChannelConnector"> </portin> 80 </port> </Port> <TxidleTime> 60000 </maxidleTime> </plukin> </conectitor> </conector> </conector> </conector> </conector> </plukin> </plupin> </plupin> </conector> </port. </bilt> </ject>
Depois, há a configuração do web.xml:
Perceber:
O pacote onde o arquivo democonfig.java reside e seu próprio nome de arquivo deve ser consistente com a configuração na tag param-value em web.xml (neste caso, a configuração é Demo.Democonfig).
<filter> <filter-name> jfinal </filter-name> <filter-class> com.jfinal.core.jfinalfilter </filter-class> <iit-param> <amam-name> configclass </param-name> <param -value> Demo.Democonfig </param-value> </irit--param> </filter> <filter-Mapping> <filter-name> jfinal </ftrhter-name> <url-Pattern>/*</url-tattern> </ftrid-Mapping>
Em seguida, crie o arquivo java:
Crie Democonfig e Herite JFinalConfig. Democonfig é o arquivo principal. Execute este arquivo para iniciar o projeto, assim como a execução do arquivo java normal. Se você modificar outros códigos após a execução ao mesmo tempo, não precisará reiniciar. A estrutura será modificada automaticamente. Você pode atualizar diretamente para ver o conteúdo modificado.
Aqui está a demonstração simples inicial:
pacote demo; importar com.jfinal.config.*; classe pública Democonfig estende JfinalConfig {public void ConfigConstant (constantes me) {me.setDevMode (true);} public void configrote (rotas me) {me.add ("/hello", helloconTrolLer.croute (rotas me) {me.add ("/hello", helloconTrolLer.Cl); configplugin (plugins me) {} public void configIntercept (interceptor me) {} public void confighandler (manipuladores me) {}}Em seguida, configure o controlador:
Demonstração do pacote; importação com.jfinal.core.controller; classe pública hellocontroller estende o controlador {public void index () {renderText ("Hello jfinal World.");}}}Em seguida, abra o navegador e digite http: // localhost/hello diretamente e você verá que a página produz Hello jfinal World.
Aqui está o exemplo mais básico de usá -lo, aqui está o meu programa:
pacote demo; importar com.jfinal.config. com.jfinal.template.engine; importar controlador.studentController; importar Demo.model.classes; importar Demo.model.student; classe pública Democonfig estende JfinalConfig {public static void main (string [] args) {jfinal.start ("srt/main/maid static main (string [] args) {jfinal.start (" src/main/main/webs "; } public void configConstant (constantes me) {me.setDevMode (true); // Este método é usado para configurar o valor constante jfinal, como a configuração do modo de desenvolvimento constante devmode, o código a seguir configura o jfinal // executa no modo de desenvolvimento: no modo de desenvolvimento, o jfinal produzirá relatórios para cada solicitação, como saída do URL, controlador, método // e os parâmetros transportados pela solicitação. } public void configroute (me rotas) {me.add ("/", hellocontroller.class); me.add ("/test/mytest", hellocontroller.class, "teste"); me.add ("/aluno", StudentController.class); //me.add("/classes ", classeSController.class); } public void configEngine (me motor) {} public void configplugin (plugins me) {// c3p0plugin cp = new c3p0plugin ("jdbc: mysql: // lochost/db_name", // "username", "senha"); loadPropertyFile ("a_little_config.txt"); Druidplugin dp = new druidplugin (getProperty ("jdbcurl"), getProperty ("usuário"), getProperty ("senha")); me.add (dp); ActiveRecordPlugin arp = novo ActiveRecordPlugin (DP); me.Add (ARP); arp.addmapping ("Student", "StudentId", Student.class); arp.addmapping ("Classes", "Classid", Class.Class); // Este método é usado para configurar o plug -in da JFinal. O código a seguir configura o plug-in plug-in da conexão do banco de dados DRUID e o plug-in de acesso ao banco de dados ActiveRecord //. Com a configuração a seguir, é muito conveniente operar o banco de dados em seu aplicativo usando o ActiveRecord. } public void configInterceptor (interceptor me) {//me.add(new authinterceptor ()); // Este método é usado para configurar o interceptor global do jfinal. O interceptador global interceptará todas as solicitações de ação, a menos que seja liberado no controlador usando // @clear. O código a seguir configura um interceptador chamado authintercept. } public void confighandler (manipula -me) {}}A descrição simples de cada método aqui é escrita nos comentários.
Depois, há o controlador:
Embora o serviço seja declarado aqui, ele não é usado. É usado diretamente no método do controlador.
controlador de pacotes controlador; importar Java.util.list; importar java.util.map; importar com.alibaba.fastjson.jsonObject; importar com.jfinal.aop.before; import.jfinal.core.Controller; importEntintercept.StudEntIntercetor; importValident.Sudentator; Demo.model.student; importação service.StudentService; Public Class StudentController estende o controlador { /*** Existem muitas maneiras de obter o StudentID, o que é consistente com o método de escrita de parâmetros de passagem front-end. O controlador fornece os métodos GetPara Series. A API oficial é muito detalhada. O JFinal usa instruções SQL originais, que são simples e convenientes. Setattr ("StudentList", List); Coloque o resultado definido no escopo da solicitação. A JFinal também tem um método para obter diretamente o formulário para empacotar objetos em objetos getModel (Student.class); Ou seja, como o Struts2, o nome do formulário corresponde a, que é muito conveniente para adicionar, StudentId Student.Set ("StudentId", "MySequence.NextVal"). Save (); A JFinal tem várias maneiras de retornar e também pode retornar dados JSON. O método da série Render é muito detalhado no serviço oficial da API*/ Static StudentService = New StudentService (); @Before (StudentIntercept.Class) public void Index () {List <Ventul> list = student.dao.find ("Selecione * do aluno"); setattr ("StudentList", List); // Observe que, se o caminho abaixo tiver/, comece a procurar no diretório raiz, ou seja, o código = render ("/student/index.html"); render ("index.html"); } public void add () {render ("add.html"); } public void test () {list <denty> list = student.dao.find ("selecione * do aluno"); setattr ("StudentList", List); setattr ("aluno", list.get (0)); render ("test.jsp"); } public void getList () {list <estudante> list = student.dao.find ("selecione * do aluno"); JsonObject jo = new jsonObject (); jo.put ("code", 0); jo.put ("msg", true); jo.put ("count", list.size ()); jo.put ("dados", lista); renderjson (Jo); } public void layui () {list <estudante> list = student.dao.find ("selecione * do aluno"); setattr ("StudentList", List); render ("index3.html"); } public void delete () {// Obtenha o valor do nome do formulário StudentId Student.dao.deletebyId (getPara ("StudentId")); ForwardAction ("/aluno"); } public void Delete1 () {// Obtenha o primeiro valor no URL Request student.dao.deletebyId (getParatoint ()); ForwardAction ("/aluno"); } public void update () {Student = getModel (Student.class); estudante.Update (); ForwardAction ("/aluno"); } public void get () {Student = student.dao.findbyId (getPara ("StudentId")); setattr ("estudante", aluno); render ("index22.html"); } public void get1 () {Student = student.dao.findbyId (getParatoint ()); setattr ("estudante", aluno); render ("index22.html"); } @Before (StudentValidator.class) public void save () { /*** getModel é usado para receber o objeto Model Passado no campo Formulário da página. O nome do campo do formulário é chamado "ModelName.attrname" http://www.jfinal.com. O nome de attName usado pelo getModel deve ser exatamente o mesmo que o nome do campo da tabela de dados. O método getBean é usado para suportar feijões java tradicionais, incluindo modelos que usam gerador JFNal para gerar métodos Getter e Setter. Ao passar os argumentos nos formulários da página, use AttName consistente com o método Setter, em vez de nomes de campos da tabela de dados. A diferença entre getModel e getBean é que o primeiro usa o nome do campo da tabela de números e o último usa o nome do atributo consistente com o método setter para injeção de dados. Recomenda -se usar o método getBean primeiro. */// getBean (Student.class) .Save (); getModel (Student.class) .Save (); redirecionar ("/aluno"); } @Before (StudentValidator2.Class) public void saveBean () {getBean (Student.class) .Save (); redirecionar ("/aluno"); }}A mesma explicação simples também é escrita nos comentários.
Os métodos são basicamente todos aqui, aqui estão algumas outras configurações:
Esta é a classe de entidade:
pacote Demo.model; importar com.jfinal.plugin.activeCord.model; public class Student estende o modelo <very Student> {public static final Student Dao = new Student (); /*** ActiveRecord é um dos componentes mais essenciais do jfinal. A operação do banco de dados através do ActiveRecord reduzirá bastante a quantidade de código e melhorará bastante a eficiência do desenvolvimento. A configuração está na parte de trás. Estou usando o modelo aqui. O modelo é um dos componentes mais importantes do ActiveRecord, que atua como a parte do modelo no modo MVC. O usuário no código acima imediatamente possui muitos métodos convenientes para operar o banco de dados herdando o modelo. O objeto estático da DAO declarado no usuário é definido para a conveniência das operações de consulta, e o objeto não é necessário. Os modelos baseados no ActiveRecord não precisam definir atributos, getters e métodos de setter, configuração XML e configuração de anotação, o que reduz bastante a quantidade de código. Métodos comuns de modelo são encontrados na API oficial. A JFinal também possui o modo de registro DB + original, a classe DB e sua classe de registro que o acompanha, que fornecem funções de operação de banco de dados mais ricas fora da classe Model. Ao usar as classes de banco de dados e registro, não há necessidade de mapear tabelas de banco de dados e o registro é equivalente a um modelo geral. Os métodos comuns de banco de dados são encontrados na API oficial. */}StudentValidator:
pacote studentValidator; importar com.jfinal.core.controller; importar com.jfinal.validate.validator; public class StudentValidator estende o validador {//@substitua o handleArror do Void (controlador controlador) {controller.keeppara ("student.studentname"); // passa o valor do submetido para o render controller.render ("/add.html"); } @Override Protected Void Validate (controlador controlador) {// Verifique o nome do campo do formulário, retorne a chave da informação, retorne o valor da informação ValidateRequiredString ("Student.studentName", "Studentnamemsg", "digite o nome do aluno!"); }} pacote studentValidator; importar com.jfinal.core.controller; importar com.jfinal.validate.validator; classe pública StudentValidator2 estende o validador {// substituir o handleArror do Void (controlador do controlador) (controlador); } @Override Protected void Validate (controlador controlador) {// Verifique o nome do campo do formulário, retorne a chave de informação, retorne o valor da informação ValidateRequiredString ("StudentName", "StudentNineMsg", "digite o nome do aluno!"); }}StudentInterceptor:
pacote studentInterceptor; importar com.jfinal.aop.interceptor; import com.jfinal.aop.invocation; classe pública StudentIntercept implementa interceptor {public void Intercept (Invocation AI) {System.out.println ("antes da ação invock"); ai.invoke (); System.out.println ("Após a ação invocando"); }}Em seguida, a página de exibição da recepção:
Em relação à página da recepção, você precisa olhar para o sexto capítulo do documento, o conteúdo do mecanismo de modelo jfinal e entender como o jfinal é exibido na recepção. Isso é muito importante.
<! Doctype html> <html> <head> <meta charset = "utf-8"> <titter> Gerenciamento de aluno </ititle> <script type = "text/javascript" src = "/jQuery-1.12.4.min.js"> </script> </head> <body> <h1> <h1> <h1> <a href = "/student/layui"> teste Layui </a> <a href = "/student/test"> editar índice 0 </a> <br> <a href = "/student/add"> add </a> <br> <form action = "student/get"> id: <input type = "text" "" " href = "/aluno/delete"> excluir </a> <formulário action = "/student/delete"> id: <input type = "text" name = "studentId"> <input type = "submit" value = "delete"> </formável> #para (x: [1..10) #(x) #END <Table <iD = "Listtable> <th> gênero </th> <th> Idade </th> <th> endereço </th> <the> email </th> <th> operação </th> </tr> #for (x: studentlist) <tr> <td style = "text-align: esquerd;">#(x.studentId) </td> <td styleg = " style = "Texto-align: esquerda;">#(x.sex) </td> <td style = "text-align: left;">#(x.age) </td> <td style = "text-align: left; style = "text-align: esquerd;"> <a href = "/student/exclate? studentId =#(x.studentId)"> excluir </a> <a href = "/student/delete1/#(x.studentid)"> delete </a> <a href = "/student/get? href = "/student/get1/#(x.studentId)"> modificar </a> <a href = "/student/get1/#(x.studentid)"> modificar </a> </td> </tr> #end </tbody> </tabela </body> </html>
Este é o efeito da página, porque não há estilo, parece difícil. Em seguida, o seguinte é composto pelo uso normal de Layui e pelo método habitual normal para retornar dados:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> gerenciamento de aluno Layui </ititle> <script type = "text/javascript" src = "/layui-v2.2.45/layui/layui.js"> </script> href = "/Layui-V2.2.45/layui/css/layui.css" Media = "All"> </ad Head> <body> <div style = "margem: 0px; cor de fundo: White; margin: 0 10px;"> <lockquote> <a href = "/student/add ARIA-HIDDEN = "true"> </i> Adicionar </botão> </a> <form style = "float: certo;" OnsubMit = "Return false"> <div> Pesquise usuários: <div> <input name = "name" id = "Demoreload" AutoComplete = "off"> </div> <button style = "transform: translatey (-3px);" Data-type = "Reload"> Pesquisar </butut> </div> </div> </morm> </lockQuote> </div> <tabela Lay-data = "{url: '/student/getList', Id: 'IdTest', altura: 'Full-60',}" Lay-Dilter = "Demo"> <Tead ', <l THEAD', largura: '20%',} "> id </th> <th lay-data =" {field:' studentName ', width: '20%'} "> nome </th> <th lay-data =" {field: 'sexo', width: '20%'} "> gender </> <th lay-datra = {field: Lay-Data = "{Field: 'Endereço', Width: '20%'}"> endereço </th> <th lay-data = "{corrigido:' direita ', largura: '17%', alinhe: 'Centro', barra de ferramentas: '#Bardemo1'}"> </th> </tr> </tr> </tabela> id = "bardemo1"> <a id = "edit" lay -vent = "edit"> modify </a> <a Lay -vent = "del"> delete </a> </sCript> </body> <cript> layui.use ('tabela', function () {var table = Layui.table, layui.use.use ('tabela', function () {var function (obj) {console.log (obj)}); Url: "Student/Excluir? Layui.layer.open ({Title: "Modify", Tipo: 2, área: ['380px', '80%'], conteúdo: "/student/get?studentid="+Data.studentId, cancel: function (index, lakero) {Layer.Close (ndix); tabela.Reloade: function (Índice,) {Layer.Close (Index); A altura da janela pop-up para impedir que exceda a área visual (como o F12 chama Debug) $ (Window) .Resize (function () {Layui.layer.full (index);}) Layui.layer.full (index); $.ajax({ type:"post", url:"<%=basePath%>/sys/user/passuser", data:{id:data.id}, //dataType:"text",//Return success:function(returndata) { layui.use('layer', function() { layer.msg(returndata.msg); }); tabela.reload ('idtest', {página: {curr: 1 // reiniciar a página 1},}); tabela.CHECKSTATUS ('IDTEST'), Data = checkStatus.data; }, isall: function () {// Verifique se todos os variados de checkstatus = tabela.CHECKSTATUS ('IDTEST'); ativo [tipo]?Isso parece um pouco melhor, porque é apenas a primeira vez que eu o uso e faço um teste, por isso ainda é relativamente difícil.
Então é importante observar o problema do retorno dos dados dessa maneira:
public void getList () {list <vertware> list = student.dao.find ("selecione * do aluno"); JsonObject jo = new jsonObject (); jo.put ("code", 0); jo.put ("msg", true); jo.put ("count", list.size ()); jo.put ("dados", lista); renderjson (Jo); }Este é o método apontado pelo URL da tabela Layui. Aqui, você precisa retornar os dados JSON da maneira renderjson.
Então deve -se notar que tentei retornar diretamente a coleção da lista. Parece que o método é viável, mas como a tabela Layui deve estar no formato acima para receber dados, ele não é exibido na página. No entanto, quando eu retorno diretamente Jo, o erro de segundo plano relatado e esse problema só pode ser aprendido e resolvido amanhã.
A seguir, são apresentadas várias maneiras de usar o método de renderização retornado:
Então você precisa prestar atenção à chamada de método e transferência de parâmetros:
Existem dois métodos e parâmetros de transferência de métodos da seguinte forma:
<a href = "/student/delete? StudentId =#(x.studentid)"> excluir </a> <a href = "/student/delete1/#(x.studentid)"> delete </a> <a href = "/student/get? href = "/student/get1/#(x.studentid)"> modificar </a> <a href = "/student/get1/#(x.studentid)"> modificar 1 </a>
Aqui está o método do controlador:
public void Delete () {// Obtenha o valor do nome de domínio do formulário Studentid Student.dao.deletebyId (getPara ("StudentId")); ForwardAction ("/aluno"); } public void Delete1 () {// Obtenha o primeiro valor no URL Request student.dao.deletebyId (getParatoint ()); ForwardAction ("/aluno"); } public void update () {Student = getModel (Student.class); estudante.Update (); ForwardAction ("/aluno"); } public void get () {Student = student.dao.findbyId (getPara ("StudentId")); setattr ("estudante", aluno); render ("index22.html"); } public void get1 () {Student = student.dao.findbyId (getParatoint ()); setattr ("estudante", aluno); render ("index22.html"); }Finalmente, existem duas maneiras de adicionar aulas de entidade aceitadas:
@Before (StudentValidator.class) public void save () { /*** getModel é usado para receber o objeto Model Passado no campo Formulário da página. O nome do campo do formulário é chamado "ModelName.attrname" http://www.jfinal.com. O nome de attName usado pelo getModel deve ser exatamente o mesmo que o nome do campo da tabela de dados. O método getBean é usado para suportar feijões java tradicionais, incluindo modelos que usam gerador JFNal para gerar métodos Getter e Setter. Ao passar os argumentos nos formulários da página, use AttName consistente com o método Setter, em vez de nomes de campos da tabela de dados. A diferença entre getModel e getBean é que o primeiro usa o nome do campo da tabela de números e o último usa o nome do atributo consistente com o método setter para injeção de dados. Recomenda -se usar o método getBean primeiro. */// getBean (Student.class) .Save (); getModel (Student.class) .Save (); redirecionar ("/aluno"); } @Before (StudentValidator2.Class) public void saveBean () {getBean (Student.class) .Save (); redirecionar ("/aluno"); }O segundo método getBean na minha demonstração pode não ser definido e apenas o ID é gerado e nenhum outro dados é adicionado.
Se necessário. Aqui está a demonstração oficial:
pacote com.demo.common.model; importar com.demo.common.model.base.baseblog;/** * Essa demonstração apenas expressa o uso jfinal mais superficial e é mais valioso e prático de nível empresarial * para detalhes, consulte o clube jfinal: http://jfinal. * Recomenda -se usar regras de nomeação de camelos para nomes de campos de banco de dados para facilitar a consistência com o código Java, como nomes de campo: userID */@supressorwarnings ("serial") public class Blog estende BaseBlog <Blog> {} pacote com.demo.common.model.base; importar com.jfinal.plugin.activecord.model; import com.jfinal.plugin.activecord.ibean;/*** gerado pelo jfinal, não modifique este arquivo. */@Supressorwarnings ({"serial", "desmarcado"}) classe abstrata public BaseBlog <m estende BaseBlog <m>> Estende o modelo <m> implementa ibean {public M SetId (java.lang.integer id) {set ("id", id); retornar (m) isso; } public java.lang.integer getId () {return getint ("id"); } public M Settitle (título java.lang.string) {set ("title", title); retornar (m) isso; } public java.lang.string gettitle () {return getstr ("title"); } public M setContent (java.lang.string conteúdo) {set ("content", content); retornar (m) isso; } public java.lang.string getContent () {return getstr ("content"); }}O compartilhamento acima das notas de uso da estrutura de desenvolvimento rápido do jfinal é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.