Запишите первый раз, используя JFINAL, от простой конструкции каркаса до добавления, удаления, модификации и проверки, от встроенных методов до использования нормальных рамок.
Официальный веб -сайт Jfinal: http://www.jfinal.com/
Jfinal - это быстрая веб -структура ORM, основанная на Java Language. Его основные цели в области дизайна - быстрая разработка, небольшой объем кода, простое обучение, мощные функции, легкий, прост в расширении и спокойный. Имея все преимущества Java, он также обладает эффективностью развития динамических языков, таких как Ruby, Python и PHP.
Jfinal имеет следующие основные функции:
Архитектура MVC, изысканный дизайн и простое использование
Следуйте принципу COC, нулевой конфигурации, без XML
Оригинальный режим записи DB +, гибкий и удобный
Поддержка ActiveRecord делает разработку базы данных чрезвычайно быстрой
Автоматически загружать модифицированный файл Java, не нужно перезагрузить веб -сервер во время разработки
Опочки AOP, гибкая конфигурация перехватчика и мощные функции
Архитектура плагина, сильная масштабируемость
Поддержка с несколькими обзорами, Freemarker, JSP, Velocity
Мощная функция проверки бэкэнд валидатора
Полностью функции, с большинством функций Struts2
Небольшой размер составляет всего 632 тыс., И нет сторонних зависимостей
пример:
Сначала я использую Maven, сначала создайте проект Maven:
После создания моего проекта мне нужно сначала установить его:
Затем нажмите применить
Есть некоторые другие настройки и т. Д. Мой вопрос пропущен здесь
Затем введите пакет JAR в pom.xml:
Maven Search Package: http://mvnrepository.com/
Официальный демонстрационный pom.xml:
JSON здесь не представлен, мой последний метод демонстрации требует 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 "> <dethoderversion> 4.0.0 </modelversion> <groupid> com.demo </GroupId> <ratfactid> jfinal_demo_for_maven </artifactid> <cadegaging> War </packaging> <serse> <версия> 3 <версия> 3 <версия> 3 <версия> 2 <версия> 2 <версия> 2 <версии> 2 <версия> 2 <версии> 2 <версия>. <mame> jfinal_demo_for_maven maven webapp </name> <url> http://maven.apache.org </url> <properties> <prop.build.sourceencoding> utf-8 </project.build.sourceencoding> <maven.compiler.encoding> utf-8 </maven.compiler.encoding> </properties> <!-Использование библиотеки Alibaba Maven-> <Pepositories> <perpository> <id> ali-maven </id> <url> http://maven.aliyun.com/nexus/content/content/content/content/content/pupris/pumbr <releases> <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> <perpository> <id> Sonatype-nexus-snapshots </id> <mame> Sonatype nexus snashots </name> <url> https://oss.sonatype.org/content/repositories/snapshots/ </url> <leasees> </anabledes> <//smapeshots> <//smapesshots> <//smapesshots> <//smapesshots> </releas> </slosshots> </releas> </releas> </releas> </releas> </releas> </slosshotes> </releas> </slosshoteri <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 <Scope> test </scope> </depository> <deposity> <groupid> com.jfinal </GroupId> <straCactId> придурок Server </artifactId> <sersive> 8.1.8 </version> <!-Значение области приведена здесь композиция. 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> <sersion> 1.0.29 </version> </dependency> <DepectIdance> <groupId> com.jfinal </GroupId> <strifactid> cos </artifactid> <sersive> 2017.5 </version> </vehing> </veumbindery> <buld> <buld> jfinal_dema_maven> <groupId> org.mortbay.jetty </GroupId> <ArtifactId> Jetty-maven-plugin </artifactid> <sersive> 8.1.8.v20121106 </version> <figonturation> <StopKey> STOPPATH> </stopport> 559 </stopport> <bebappconfig> </stoppoke> </stopport> 559 </stopport> <pebappconfigh> </stoppor <scanIntervalSeconds>5</scanIntervalSeconds> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>80</port> <maxIdleTime>60000</maxIdleTime> </connector> </connector> </configuration> </plugin> </plugins> </build> </project>
Тогда есть конфигурация web.xml:
Уведомление:
Пакет, в котором находится файл democonfig.java, и его собственное имя файла должно соответствовать конфигурации в теге Param-Value в web.xml (в данном случае конфигурация-demo.democonfig).
<filter> <filter-name> jfinal </filter-name> <filter-class> com.jfinal.core.jfinalfilter </filter-class> <init-param> <param-name> configclass </param-name> <param -value> demo.democonfig </param-value> </init-param> </filter> <filter-mapping> <filter-name> jfinal </filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Далее создайте файл Java:
Создайте демоконфиг и наследуйте JfinalConfig. Демоконфиг является основным файлом. Запустите этот файл, чтобы запустить проект, точно так же, как запустить обычный файл Java Main. Если вы изменяете другие коды после запуска одновременно, вам не нужно перезапускать. Структура будет автоматически изменена. Вы можете напрямую обновить, чтобы увидеть модифицированный контент.
Вот первоначальная простая демонстрация:
Пакет Demo; Import com.jfinal.config.*;;; Democonfig public Class Extends jfinalConfig {public void configConstant (constants me) {me.setdevmode (true);} public void configroute (routs me) {me.add ("/hello", hellocontroller.class); configplugin (plugins me) {} public void configintecter (Interceptors me) {} public void confighandler (Handlers Me) {}}Затем настройте контроллер:
Пакет Demo; Import com.jfinal.core.controller; Public Class HelloController Extends Controller {public void index () {renderText ("Hello Jfinal World.");}}Затем откройте браузер и введите http: // localhost/hello напрямую, и вы увидите, что страница выводит Hello Jfinal World.
Вот самый основной пример использования, вот моя программа:
Пакет Демо; импорт com.jfinal.config.*; import com.jfinal.core.jfinal; import com.jfinal.kit.propkit; import com.jfinal.plugin.activecord.activerecordplugin; импорт com.jfinal.plugin.c3p0.c3p0plugin; импорт com.jfinal.plugin.c3p0.c3p0plugin; импорт com.jfinal.plugin.c3p0.c3p0plugin; импорт. com.jfinal.template.engine; импорт контроллер.studentController; Import demo.model.classes; импорт demo.model.student; открытый класс Democonfig Extends jfinalConfig {public Static void main (String [] args) {jfinal.start ("src/main/webapp", 80, "/" 5); } public void ConfigCOnstant (Constants Me) {me.setDevMode (true); // Этот метод используется для настройки постоянного значения Jfinal, например, конфигурация постоянного DevMode режима разработки, следующий код настраивает Jfinal // Запуск в режиме разработки: в режиме разработки Jfinal выводит отчеты для каждого запроса, такого как вывод URL, контроллер, метод // и параметры, переносимые по запросу. } public void configroute (routes me) {me.add ("/", hellocontroller.class); me.add ("/test/mytest", hellocontroller.class "test"); me.Add ("/Student", StudentController.class); //me.add("/classes ", classescontroller.class); } public void configengine (Engine Me) {} public void configplugin (плагины me) {// c3p0plugin cp = new c3p0plugin ("jdbc: mysql: // localhost/db_name", // "username", "пароль"); // me.add (cp); loadpropertyfile ("a_little_config.txt"); Druidplugin dp = new druidplugin (getProperty ("jdbcurl"), getProperty ("user"), getProperty ("пароль")); me.add (dp); Activerecordplugin arp = новый Activerecordplugin (DP); me.add (arp); arp.addmapping («студент», «Student», Student.class); arp.addmapping ("classes", "classesId", classes.class); // Этот метод используется для настройки плагина JFinal. Следующий код настраивает плагин подключаемого пула базы данных Druid и плагин Activerecord // Доступ к базе данных. С помощью следующей конфигурации очень удобно управлять базой данных в вашем приложении с помощью Activerecord. } public void ConfigInterceptor (Interceptors me) {//me.add(new authinterceptor ()); // Этот метод используется для настройки глобального перехвата jfinal. Глобальный перехватчик будет перехватывать все запросы действий, если не будет очищено в контроллере с помощью // @clear. Следующий код настраивает перехватчик с именем Authinterceptor. } public void confighandler (обработает меня) {}}Простое описание каждого метода здесь написано в комментариях.
Тогда есть контроллер:
Хотя услуга объявлена здесь, она не используется. Он напрямую используется в методе контроллера.
Контроллер пакета; импорт java.util.list; import java.util.map; import com.alibaba.fastjson.jsonobject; import com.jfinal.aop.fefore; импорт com.jfinal.core.controller; import outdentInterceptor.StudentInterceptor; importValidator.StudentValerator; импорт. demo.model.student; Import Service.StudentService; Public Class StudentController Extends Controller { /*** Существует много способов получить студент, что согласуется с методом написания параметров прохода. Контроллер предоставляет методы серии GetPara. Официальный API очень подробный. Jfinal использует исходные операторы SQL, что является простым и удобным. SetAttr ("StudentList", List); Поместите результат, установленный в сферу запроса. Jfinal также имеет метод для непосредственного получения формы для объектов упаковки в объекты getModel (study.class); то есть, как и Struts2, имя формы соответствует, что очень удобно для добавления, студент student.set ("student", "my sequence.nextval"). save (); У Jfinal есть несколько способов вернуть, а также может вернуть данные JSON. Метод серии рендеринга очень подробно описан в официальной API*/ Static Student Service = New Student Service (); @Before (studentInterceptor.class) public void index () {list <toold> list = student.dao.find ("select * from Student"); SetAttr ("StudentList", List); // Обратите внимание, что если в пути ниже есть/, начните искать из корневого каталога, то есть код = render ("/student/index.html"); render ("index.html"); } public void add () {render ("add.html"); } public void -test () {list <toodTem> list = study.dao.find ("select * from Student"); SetAttr ("StudentList", List); setattr ("Student", list.get (0)); render ("test.jsp"); } public void getList () {list <toold> list = study.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", list); renderjson (jo); } public void layUi () {list <toold> list = study.dao.find ("select * from Student"); SetAttr ("StudentList", List); рендеринг ("index3.html"); } public void lelete () {// Получить значение формы доменного имени StudentId Student.Dao.DeleteByID (getPara ("StudentId")); Передовое ("/студент"); } public void delete1 () {// Получить первое значение в URL -запросе Student.dao.deleteByid (getParatoint ()); Передовое ("/студент"); } public void update () {Student Student = getModel (Student.Class); Студент.update (); Передовое ("/студент"); } public void get () {студент студента = студент setattr ("студент", студент); рендеринг ("index2.html"); } public void get1 () {студент студента = студент.dao.findbyid (getParatoint ()); setattr ("студент", студент); рендеринг ("index2.html"); } @Before (studentvalidator.class) public void said () { /*** getModel используется для получения объекта модели, передаваемого из поля формы страницы. Имя поля формы называется «modelname.attrname» http://www.jfinal.com. ATTRNAME, используемое GetModel, должен быть точно таким же, как и имя поля таблицы данных. Метод GetBean используется для поддержки традиционных бобов Java, включая модели, которые используют генератор JFNA для генерации методов Getter и Setter. При передаче аргументов в формах страницы используйте ATTRNAME в соответствии с методом сеттера, а не именами поля таблицы данных. Разница между GetModel и GetBean состоит в том, что первое использует имя поля таблицы номеров, а в последнем используется имя атрибута в соответствии с методом сеттера для инъекции данных. Рекомендуется сначала использовать метод GetBean. */// getbean (student.class) .save (); getModel (Student.class) .save (); перенаправление ("/студент"); } @Before (studentValidator2.class) public void sailbean () {getbean (student.class) .save (); перенаправление ("/студент"); }}То же самое простое объяснение также написано в комментариях.
Методы в основном здесь, вот некоторые другие конфигурации:
Это класс сущности:
пакет demo.model; import com.jfinal.plugin.activecord.model; студент открытого класса расширяет модель <tlapt> {public static final Student dao = new Student (); /*** Activerecord является одним из самых основных компонентов Jfinal. Эксплуатация базы данных через Activerecord значительно сократит количество кода и значительно повысит эффективность разработки. Конфигурация сзади. Я использую модель здесь. Модель является одним из наиболее важных компонентов в Activerecord, который действует как модель в режиме MVC. Пользователь в приведенном выше коде сразу же имеет множество удобных методов для управления базой данных, унаследовав модель. Статический объект DAO, объявленный в пользователе, определяется для удобства операций запросов, и объект не является необходимым. Моделям, основанным на ActiveRecord, не нужно определять атрибуты, методы Getters и Setter, конфигурацию XML и конфигурацию аннотации, что значительно уменьшает объем кода. Общие методы модели обнаруживаются в официальном API. Jfinal также имеет оригинальный режим записи DB +, класс DB и сопровождающий класс записи, которые предоставляют более богатые функции работы базы данных вне класса модели. При использовании классов DB и записей нет необходимости отображать таблицы баз данных, а запись эквивалентна общей модели. Общие методы БД обнаружены в официальном API. */}StudentValidator:
Package StudentValidator; import com.jfinal.core.controller; import com.jfinal.validate.validator; public class clol ntocualvalidator extends validator {//@override void handerr (контроллер) {controller.keeppara ("Student.StudentName"); controller.render ("/add.html"); } @Override Protected void validate (Controller Controller) {// Проверьте имя поля формы, вернуть информационный ключ, вернуть информационное значение valiveAteRequiredString ("Student.StudentName", "StudentMememsg", «Пожалуйста, введите имя студента!»); }} Пакет StudentValidator; Import com.jfinal.core.controller; import com.jfinal.validate.validator; Public Class StudentValidator2 Extends validator {// переопределять защищенный void -handerr (контроллер контроллера) {Controller.keeppara («Студент»); controller.render ("/add.html"); } @Override Protected void validate (Controller Controller) {// Проверьте имя поля формы, верните информационный ключ, верните информационное значение valiveAteRequiredString («StudentName», «StudentNameMEMSG», «Пожалуйста, введите имя студента!»); }}Студент Interceptor:
Package StudentInterceptor; импорт com.jfinal.aop.Interceptor; import com.jfinal.aop.invocation; открытый класс Студент Interceptor реализует Interceptor {public void intercept (vocation ai) {System.out.println («Перед вызовом действия»); ai.invoke (); System.out.println («После действия действия»); }}Затем страница отображения на стойке регистрации:
Что касается страницы на стойке регистрации, вам нужно посмотреть на шестую главу документа, содержание двигателя шаблона JFINAL и понять, как Jfinal отображается на стойке регистрации. Это очень важно.
<! Doctype html> <html> <head> <meta charset = "utf-8"> <Title> Управление студентами </title> <script type = "text/javascript" src = "/jquery-1.12.4.min.js"> </script> </Head> <body> <h1> <a href = "/stulcy/jsp"/jsp "/jsp"/jsp "/jspa> </jsp"/jsp "/jspa> <a href = "/study/layui"> тест layui </a> <a href = "/student/test"> redit index 0 </a> <br> <a href = "/udpat/add"> add </a> <br> <form action = "/get/get"> id: <input = "name =" into "> <input upt =" value ">" quist ">" Quard = "quepty"> "Quard =" Quard = "Quard"> "Quard"> "Quard"> "Quard"> "Quard"> "Quard"> "Quard"> "Quard"> " href = "/studive/delete"> delete </a> <form action = "/studive/delete"> id: <input type = "text" name = "student"> <input type = "value =" delete "> </form> #for (x: [1..10]) #(x) #end <tale =" listtable "> <tbody> <Tbody> <try> <try> <try> <try> <Th> Пол </th> <Th> возраст </th> <Th> адрес </th> <Th> электронная почта </th> <Th> операция </th> </tr> #FOR (x: studentList) <Tr> <td style = "text-align: left;">#(x.studentid) </td> <td style = "text-align:###studentid) </td> <td style =" 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: x.email) </td> <td style =" 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? href = "/Student/get1/#(x.studentid)"> modify </a> <a href = "/student/get1/#(x.studentid)"> modify </a> </td> </tr> #end </tbody> </table> </body> </html> </tr> #end </tbody> </table> </body> </html>
Это эффект страницы, потому что нет стиля, он выглядит грубо. Затем следующее состоит из нормального использования LayUI и обычного привычного метода возврата данных:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <Title> Управление студентами layui </title> <script type = "text/javascript" src = "/layui-v2.2.45/layui/layui.js"> </script> <link relsheelet " href = "/layui-v2.2.45/layui/css/layui.css" media = "all"> </head> <body> <div style = "margin: 0px; фоновый цвет: белый; маржа: 0 10px;"> <blockquote> <a href = "/add"> <buttond = "id '=" userd_bt. aria-hidden = "true"> </i> добавить </button> </a> <form style = "float: right;" onsubmit = "вернуть false"> <div> Поиск пользователей: <div> <input name = "name" id = "demoreLoad" autoComplete = "off"> </div> <button Style = "transform: translatey (-3px);" data-type = "reload"> search </button> </div> </div> </form> </blockquote> </div> <Таблица Lay-Data = "{url: '/stulty/getList', id: 'idtest', высота: 'full-60',}" lay-filter = "demo"> <TheAd> <tre> <tr> <th Lay-Data = "{kdent", "," kdyd ', "kdyd:' wipe: 'wipe-filter =" head "> <thead> Ширина: '20%',} "> id </th> <th lay-data =" {field:' studentName ', width: '20%'} "> name </th> <th lay-data =" {field: 'sex', width: '20%'} "> gende </th> <th lay-data =" {wield:', width: width: width: width: width: width: width: width: width: width: width: '20%. Lay-Data = "{Field: 'Address', Width: '20%'}"> Адрес </th> <th Lay-Data = "{Fixed:' right ', width: '17%', align: 'center', barding: '#bardemo1'}"> </th> </tr> </tr> </table> <script = "xtml"> id = "bardemo1"> <a id = "edit" lay-event = "edit"> modify </a> <a lay-event = "del"> delete </a> </script> </body> <script> layui.use ('table', function () {var table = layui.table, form = layui.form; function (obj) {console.log (obj)}); URL: "/Удалить? layui.layer.open ({title: «modify», type: 2, область: ['380px', '80%'], Content: "/student/get?studentid="+data.studentId, отмена: функция (index, layero) {layer.close (index); table. Сбросить высоту всплывающего окна, чтобы предотвратить его превышение визуальной области (например, F12 вызывает отладку) $ (window) .resize (function () {layui.layer.full (index);}) layui.layer.full (index); function (index) {$ .ajax ({type: "post", url: "<%= basepath%>/sys/user/passuser", data: {id: data.id}, // dataType: "text", // return uccess: function (returndata) {layui.use ('layer', function () {) {lever.msg (returyDATA); Таблица. table.checkstatus ('idtest'), data = checkstatus.data; }, isall: function () {// Проверьте, все ли var checkstatus = table.checkstatus ('idtest'); Active [type]?Это чувствует себя немного лучше, потому что я только первый раз, когда я использую его и делаю тест, так что это все еще относительно грубо.
Тогда важно отметить проблему возврата данных таким образом:
public void getList () {list <toold> 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", list); renderjson (jo); }Это метод, на который указывает URL -адрес таблицы Layui. Здесь вам нужно вернуть данные JSON по пути RenderJson.
Затем следует отметить, что я попытался напрямую вернуть коллекцию списков. Кажется, что метод возможен, но поскольку таблица Layui должна быть в приведенном выше формате для получения данных, он не отображается на странице. Однако, когда я напрямую возвращаю JO, представлена фоновая ошибка, и эта проблема может быть изучена и решена только завтра.
Ниже приведены несколько способов использования возвращенного метода рендеринга:
Затем вам нужно обратить внимание на вызов метода и передачу параметров:
Существует два метода передачи параметров следующим образом:
<a href = "/student/delete? StudentId =#(x.studentid)"> delete </a> <a href = "/student/delete1/#(x.studentid)"> delete </a> <a href = "/student/get? href = "/student/get1/#(x.studentid)"> modify </a> <a href = "/student/get1/#(x.studentid)"> изменить 1 </a>
Вот метод контроллера:
public void lelete () {// Получить значение формы доменного имени Студент Студент Студент.DAO.DELETEBYID (getPara ("StudentId")); Передовое ("/студент"); } public void delete1 () {// Получить первое значение в URL -запросе Student.dao.deleteByid (getParatoint ()); Передовое ("/студент"); } public void update () {Student Student = getModel (Student.Class); Студент.update (); Передовое ("/студент"); } public void get () {студент студента = студент setattr ("студент", студент); рендеринг ("index2.html"); } public void get1 () {студент студента = студент.dao.findbyid (getParatoint ()); setattr ("студент", студент); рендеринг ("index2.html"); }Наконец, есть два способа добавить приемные классы организации:
@Before (studentvalidator.class) public void said () { /*** getModel используется для получения объекта модели, передаваемого из поля формы страницы. Имя поля формы называется «modelname.attrname» http://www.jfinal.com. ATTRNAME, используемое GetModel, должен быть точно таким же, как и имя поля таблицы данных. Метод GetBean используется для поддержки традиционных бобов Java, включая модели, которые используют генератор JFNA для генерации методов Getter и Setter. При передаче аргументов в формах страницы используйте ATTRNAME в соответствии с методом сеттера, а не именами поля таблицы данных. Разница между GetModel и GetBean состоит в том, что первое использует имя поля таблицы номеров, а в последнем используется имя атрибута в соответствии с методом сеттера для инъекции данных. Рекомендуется сначала использовать метод GetBean. */// getbean (student.class) .save (); getModel (Student.class) .save (); перенаправление ("/студент"); } @Before (studentValidator2.class) public void sailbean () {getbean (student.class) .save (); перенаправление ("/студент"); }Второй метод GetBean в моей демонстрации не может быть установлен, и создается только идентификатор и не добавляется никаких других данных.
При необходимости. Вот официальная демонстрация:
пакет com.demo.common.model; import com.demo.common.model.base.baseblog;/** * Эта демонстрация выражает только наиболее поверхностное использование JFINA * Рекомендуется использовать правила именования верблюдов для имен поля базы данных для облегчения согласованности с кодом Java, таких как имена поля: userId */@puppresswarnings ("serial") Блог открытого класса Extends baseblog <glog> {} пакет com.demo.common.model.base; import com.jfinal.plugin.activecord.model; import com.jfinal.plugin.activecord.ibean;/*** Сгенерировано JFinal, не изменяйте этот файл. */@PuppressWarnings ({"serial", "unchecked"}) открытый абстрактный класс BaseBlog <M Extends BaseBlog <M >> Extends Model <M> реализует ibean {public m setId (java.lang.integer id) {set ("id", id); вернуть (m) это; } public java.lang.integer getId () {return getInt ("id"); } public M Settitle (java.lang.string title) {set ("title", title); вернуть (m) это; } public java.lang.string getTitle () {return getstr ("title"); } public m setContent (java.lang.string content) {set ("content", content); вернуть (m) это; } public java.lang.string getContent () {return getStr ("content"); }}Вышеупомянутое совместное использование записей на основе использования Jfinal Fast Development - это весь контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.