JFINALを使用して、単純なフレームワークの構築から追加、削除、変更、検査、組み込みの方法から通常のフレームワークの使用まで、初めて録音します。
jfinal公式ウェブサイト:http://www.jfinal.com/
JFinalは、Java言語に基づいた高速Web + ORMフレームワークです。そのコアデザインの目標は、迅速な開発、コードボリューム、シンプルな学習、強力な機能、軽量、拡張が簡単で、安らかなものです。 Javaのすべての利点を持っていますが、Ruby、Python、PHPなどの動的言語の開発効率もあります。
JFINALには次の主な機能があります。
MVCアーキテクチャ、絶妙なデザイン、シンプルな使用
COC原理、ゼロ構成、XMLなしに従ってください
オリジナルのDB +レコードモード、柔軟で便利
ActiverCordサポートにより、データベース開発により非常に速くなります
変更されたJavaファイルを自動的にロードすると、開発中にWebサーバーを再起動する必要はありません
AOPは、柔軟なインターセプター構成、強力な機能をサポートします
プラグインアーキテクチャ、強力なスケーラビリティ
マルチビューサポート、Freemarker、JSP、Velocity
強力なバリッタバックエンド検証関数
完全に機能し、struts2のほとんどの関数を使用します
小さいサイズはわずか632kで、サードパーティの依存関係はありません
例:
最初にMavenを使用し、最初にMavenプロジェクトを作成します。
プロジェクトが作成された後、最初に設定する必要があります。
次に、[適用]をクリックします
他にもいくつかの設定などがあります。私の質問はここでスキップされています
次に、pom.xmlでJARパッケージを紹介します。
Maven Search Jarパッケージ: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.apach/4.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> <パッケージ> <name> jfinal_demo_for_maven maven webapp </name> <url> http://maven.apache.org </url> <Properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <maven.compiler.encoding> utf-8 </maven.compiler.encoding> </properties> <! - alibaba mavenライブラリを使用 - > <リポジトリ> <リポジトリ> <id> ali-maven </id> <url> http://maven.aliun.com/nexus/content/grun <LELEASES> <Enabled> true </enabled> </lileases> <snapshots> <Enabled> true </enabled> <updatePolicy>常に</updatePolicy> <CheckSpolicy> fail </checkspolicy> </snapshots> </repository> </repository> repository> repository> repository> - > <! - リポジトリ> <pository> <id> sonatype-nexus-snapshots </id> <name> sonatype nexus snapshots </name> <url> https://oss.sonatype.org/content/repositories/snapshots/ <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> </repository> </repository> </repository <scope> test </scope> </dependency> <dependency> <expendency> b groupid> com.jtty-arver </artifactid> <バージョン> 8.1.8 </バージョン> < IDEAの下でプロジェクトを開始するときに提供する必要があります - > <scope>コンパイル</scope> </dependency> <shiplency> com.jfictid> jfinal </artifactid> <バージョン> 3.3 </バージョン>依存関係> <グループ> <グループ>グループ<artifactid> log4j </artifactid> <バージョン> 1.2.16 </version> </dependency> <dependency> groupid> mysql </groupid> <artifactid> mysql-connector-java </artifactid> <バージョン> 5.1.44 </バージョン> <Artifactid> Druid </artifactid> <バージョン> 1.0.29 </version> </dependency> <dependency> groupid> com.jfinal </groupid> <artifactid> cos </artifactid> 2017.5 </version> </dependency> dependencies> <burting> <finalname> jfinme> <fername> <fundemo_ffudemo <GroupId> org.mortbay.jetty </groupid> <artifactid> jetty-maven-plugin </artifactid> <bersion> 8.1.8.v.v20121106 </version> <stopkey> stop </spotkey> <stopport> 5599 </stopptig> <webconfig> </<contition pattate> <scanintervalseconds> 5 </scanintervalseconds> <コネクター> <コネクタ実装= "org.eclipse.jetty.jetty.server.nio.selectchannelconnector"> <port> 80 </port> <maxidletime> 60000 </maxidletime> </build> </project>
次に、web.xmlの構成があります。
知らせ:
democonfig.javaファイルが存在し、独自のファイル名がWeb.xmlのパラマリュータグの構成と一致する必要があるパッケージ(この場合、構成はdemo.democonfigです)。
<filter> <filter-name> jfinal </filter-name> <filter-class> com.jfinal.core.jfinalfilter </filter-class> <init-name> configclass </param-name> <param -value> demo.democonfig </param-value> </init-param> </filter> <filter-mapping> <filter-name> jfinal </filter> <url-pattern>/*</url-pattern> </filter-mapping>
次に、Javaファイルを作成します。
democonfigを作成し、jfinalconfigを継承します。 Democonfigはメインファイルです。このファイルを実行して、通常のJavaファイルメインを実行するのと同じようにプロジェクトを開始します。実行後に他のコードを変更する場合、再起動する必要はありません。フレームワークは自動的に変更されます。変更されたコンテンツを直接更新できます。
これが最初の簡単なデモです:
パッケージデモ;インポートcom.jfinal.config。*; public class democonfigはjfinalconfig {public void configconstant(constants me){me.setdevmode(true);} public void configoute(routes me){me.add( "/hello"、hellocontroller.class(} public voidine);} configPlugin(プラグインME){} public void configEnterceptor(インターセプターme){} public void confighandler(handlers me){}}次に、コントローラーを構成します。
パッケージデモ; 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。*;インポートcom.jfinal.core.jfinal; Import com.jfinal.kit.propkit; import com.jfinal.plugin.activecord.activerecordplugin; Import com.jfinal.plugin.c3p0.c3p0plugin; import com.jfinal.plugin.druid.ddrugin.ddrugin.ddrugin. com.jfinal.template.engine; Import Controller.studentController; Import demo.model.classes; Import demo.model.student; public class democonfigはjfinalconfigを拡張します{jfinalconfig(string [] args){jfinal.start( "src/web/web/" " } public void configconstant(constants me){me.setdevmode(true); //このメソッドは、開発モード定数devModeの構成など、JFINAL定数値を構成するために使用されます。次のコードは、開発モードでJFINALを構成します。 } public void configroute(ルーティングミー){me.add( "/"、hellocontroller.class); me.add( "/test/mytest"、hellocontroller.class、 "test"); me.add( "/sustent"、sustentcontroller.class); //me.add("/classes "、classescontroller.class); } public void ConfigEngine(Engine Me){} public void configplugin(プラグインME){// c3p0plugin cp = new c3p0plugin( "jdbc:mysql:// db_name"、// "username"、 "password"); // me.add(cp); loadpropertyfile( "a_little_config.txt"); Druidplugin dp = new Druidplugin(getProperty( "jdbcurl")、getProperty( "user")、getProperty( "password")); me.add(dp); ActiverEcordPlugin arp = new ActiverEcordPlugin(DP); me.add(arp); arp.addmapping( "sudine"、 "sustentid"、desutent.class); arp.addmapping( "classes"、 "classid"、classes.class); //この方法は、JFINALのプラグインの構成に使用されます。次のコードは、Druidデータベース接続プールプラグインとActiverCord //データベースアクセスプラグインを構成します。次の構成を使用すると、ActiverCordを使用してアプリケーションでデータベースを操作するのが非常に便利です。 } public void configEnterceptor(interceptors me){//me.add(new authinterceptor()); //この方法は、JFINALのグローバルインターセプターを構成するために使用されます。グローバルインターセプターは、// @Clearを使用してコントローラーでクリアされない限り、すべてのアクションリクエストをインターセプトします。次のコードは、authinterceptorという名前のインターセプターを構成します。 } public void confighandler(Handlers me){}}ここの各方法の簡単な説明は、コメントに記載されています。
次に、コントローラーがあります。
ここではサービスが宣言されていますが、使用されていません。コントローラー法で直接使用されます。
パッケージコントローラー; Import java.util.list; import java.util.map; import com.alibaba.fastjson.jsonobject; import com.jfinal.aop.before; import com.jfinal.core.controller; Import dusteridEnterceptor.studentintercepridator.StudentValidator.Studententator.Studentator.StudentAlidator。 demo.model.student; import service.studentservice; public class dustentcontroller extends Controller { /*** StudentIDを取得するには多くの方法があります。コントローラーは、GetParaシリーズの方法を提供します。公式のAPIは非常に詳細です。 JFINALは元のSQLステートメントを使用しますが、これはシンプルで便利です。 Setattr( "StudentList"、list);結果をリクエストスコープに入れます。 JFINALには、オブジェクトをオブジェクトにパッケージ化するフォームを直接取得する方法もありますgetModel(Student.Class);つまり、struts2のように、フォーム名は対応します。これは、add、dustentid student.set( "sustentid"、 "mysequence.nextval")。save(); JFINALには複数の戻り方法があり、JSONデータを返すこともできます。レンダリングシリーズメソッドは、公式API*/ Static StudentService Service = new StudentService()で非常に詳細に詳述されています。 @before(sudine interceptor.class)public void index(){list <Student> list = dustent.dao.find( "Select * from Student"); Setattr( "StudentList"、list); //以下のパスがある場合、/、rootディレクトリから見始める、つまり、code = render( "/sustent/index.html"); render( "index.html"); } public void add(){render( "add.html"); } public void test(){list <Student> list = sustean.dao.find( "Select * from Student"); Setattr( "StudentList"、list); setattr( "desute"、list.get(0)); render( "test.jsp"); } public void getList(){list <Student> list = sustean.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 <Student> list = sustean.dao.find( "Select * from Student"); Setattr( "StudentList"、list); render( "index3.html"); } public void delete(){//フォームドメイン名の値を取得しましたStudentId Student.dao.deleteByid(getPara( "studentid")); Forwardaction( "/sudent"); } public void delete1(){// url request student.dao.deletebyid(getParatoint())で最初の値を取得します。 Forwardaction( "/sudent"); } public void update(){sustent sustent = getModel(desutent.class); Student.update(); Forwardaction( "/sudent"); } public void get(){sudent sustent = desutent.dao.findbyid(getPara( "sustentId")); setattr( "学生"、学生); render( "index2.html"); } public void get1(){sudent sustent = sustent.dao.findbyid(getParatoint()); setattr( "学生"、学生); render( "index2.html"); } @before(StudentValidator.class)public void save(){ /*** getModelは、ページフォームフィールドから渡されたモデルオブジェクトを受信するために使用されます。フォームフィールド名の名前は「modelname.attrname」http://www.jfinal.comです。 getModelが使用する属性は、データテーブルのフィールド名とまったく同じでなければなりません。 GetBeanメソッドは、JFNALジェネレーターを使用してゲッターとセッターの方法を生成するモデルを含む、従来のJava Beanをサポートするために使用されます。ページフォームに引数を渡すときは、データテーブルのフィールド名ではなく、セッターメソッドと一致するアトラームを使用します。 GetModelとGetBeanの違いは、前者がNumber Tableフィールド名を使用し、後者はデータインジェクションのセッター法と一致する属性名を使用することです。最初にgetbeanメソッドを使用することをお勧めします。 */// getBean(desutent.class).save(); getModel(Student.Class).Save(); Redirect( "/student"); } @before(sustentValidator2.class)public void savebean(){getbean(sustent.class).save(); Redirect( "/student"); }}同じ簡単な説明もコメントに記載されています。
メソッドは基本的にすべてここにあります。他の構成は次のとおりです。
これはエンティティクラスです。
パッケージdemo.model; Import com.jfinal.plugin.activecord.model; public class Student extends model <sudtent> {public static Final Student dao = new Student(); /*** ActiverCordは、JFINALの最もコアコンポーネントの1つです。 ActiverCordを介してデータベースを操作すると、コードの量が大幅に削減され、開発効率が大幅に向上します。構成は背面にあります。ここでモデルを使用しています。モデルは、ActiverCordで最も重要なコンポーネントの1つであり、MVCモードのモデル部分として機能します。上記のコードのユーザーは、モデルを継承してデータベースを操作するための多くの便利な方法をすぐに持っています。ユーザーで宣言されたDAO静的オブジェクトは、クエリ操作の利便性のために定義されており、オブジェクトは必要ありません。 ActiverCordに基づくモデルは、属性、ゲッター、セッターメソッド、XML構成、およびアノテーション構成を定義する必要はありません。これにより、コードの量が大幅に削減されます。モデルの一般的な方法は、公式のAPIにあります。 JFINALには、元のDB +レコードモードであるDBクラスとそれに付随するレコードクラスもあり、モデルクラスの外でより豊富なデータベース操作機能を提供します。 DBおよびレコードクラスを使用する場合、データベーステーブルをマップする必要はなく、レコードは一般的なモデルと同等です。一般的なDBメソッドは、公式APIにあります。 */}StudentValidator:
パッケージStudentValidator; import com.jfinal.core.controller; Import com.jfinal.validate.validator; public class dustentalidator extends validator {//@override保護されたvoid Controller(コントローラーコントローラー){controller.keeppara( "sudents.studentname"); // controller.render( "/add.html"); } @Override Protected void validate(Controller Controller){//フォームフィールド名を確認し、情報キーを返し、validAteRequiredString( "Student.StudentName"、 "StudentNamemsg"、 "sudent name!"); }} Package StudentValidator; Import com.jfinal.core.controller; Import com.jfinal.validate.validator; public class sustentalidator2 extends validator {// Override Protected Void Controller(Controller.Keepara( "StudentName"); controller.render( "/add.html"); } @Override Protected void validate(controller controller){//フォームフィールド名を確認し、情報キーを返し、validateRequiredString( "StudentName"、 "StudentNamemsg"、 "sudent name!")を返します。 }}StudentInterceptor:
Package StudentInterceptor; Import com.jfinal.aop.interceptor; Import com.jfinal.aop.invocation; public class studentInterceptorはインターセプターを実装します{public void intercept(Invocation ai){system.out.println( "action befort action vefact beaction"); ai.invoke(); system.out.println( "アクション後のInving"); }}次に、フロントデスクディスプレイページ:
フロントデスクページについては、ドキュメントの第6章、JFINALテンプレートエンジンのコンテンツを見て、JFINALがフロントデスクに表示される方法を理解する必要があります。これは非常に重要です。
<!Doctype html> <html> <head> <meta charset = "utf-8"> <title>学生管理</title> <スクリプトタイプ= "src ="/jquery-12.4.min.js "> </script> </head> <body> <a href = <a href = <a href = href = "/desute/layui"> test layui </a> <a href = "/sudent/test"> index 0 </a> <br> <a href = "/sudute/add"> add </a> <br> <form action = "/get"> id:<input type = "text" nam href = "/sudent/delete"> delete </a> <form action = "/sudent/delete"> id:<入力タイプ= "テキスト" name = "desudent"> <入力タイプ= "" value = "delete"> </form>#for(x:[1..10])#(x)#end <table id = " <th> gender </th> <th> address </th> <th> email </th> <th>操作</th> <th>操作</th> </tr> 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:left; style = "text-align:left;"> <a href = "/sudent/delete?sustentid =#(x.studentid)"> delete </a> <a href = "/suduent/delete1/#(x.studentid)"> delete </a> <a href = "/sudentid/get sudintid =#(x.studentid)"> modiy href = "/student/get1/#(x.studentid)"> modify </a> <a href = "/student/get1/#(x.studentid)"> modify </a> </td> </tr#
これはページ効果です。スタイルがないため、ラフに見えます。次に、以下は、データを返すための通常の習慣的な方法と通常の習慣的な方法で構成されています。
<!Doctype html> <html> <head> <meta charset = "utf-8"> <title>学生管理layui </title> <script> <text/javascript "src ="/layui-v2.45/layui/layui.js "> </> <link link link link" letleeet " href = "/layui-v2.2.45/layui/css/layui.css" media = "all"> </head> <body> <div style = "margin:0px; white; margin:0 10px;"> <blockquote> <a href = "/desuten aria-hidden = "true"> </i> add </button> </a> <form style = "float:right;" onsubmit = "return 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> <table lay-data = "{url: '/sudine/getSlist'、 'idtest'、height: 'full-60'、} lay-filter =" width:'20% '、} "> id </th> <th lay-data =" {field:' sudentname '、width:'20%'} "> name </th> <th lay-data =" {field: 'sex'、width:'20% '} "> gender </th lay-data =" lay-data = "{field: 'address'、width:'20% '}"> address </th> <th lay-data = "{sixt:' right '、width:'17%'、align: 'center'、 '#bardemo1'}"} "> </th> </tr </tr </the texe> <" bedmo1 id = "edit" lay-event = "edit"> modify </a> <a lay-event = "del"> delete </a> </script> </body> <script> layui.use.use.use.use.use.use.use(var table = layui.table、form = layui.form ;; // select table.on }); // Toolbar Table.on( 'Tool(demo)'、function(obj){obj.event === 'del'){'really削除'、function(index){$ .ajax = "post:"/dectudent "+データ型:// function(returndata){table.reload( "idtest");エリア:['380px'、'80% ']、コンテンツ:「/student/get?student = "+data.studentid、cancel:function(index、layero){index)(index)(" idtest ") debug)$(window).resize(function(){layui.layer.full(index);})layui.layer.full(index); url: "<%= basepath%>/sys/user/passuser"、data:{id:data.id}、// datatype:// return success:function(returndata){layui.use( 'layer'、function(){layer.msg(returndata.msg); //ページ1から}、}} {console.log(msg)}}}); layer.alert(json.stringify(data))、getCheckLength:{//選択したvar checkstatus( 'idtest')、data = checkstatus.data Table.CheckStatus( 'idtest'); layer.msg(checkstatus. 'select all': 'not all')}}; });}); </script> </html>これは少し気分が良くなります。なぜなら、それを使用してテストを行うのは初めてだからです。
次に、この方法でデータの返品の問題に注意することが重要です。
public void getList(){list <Student> list = sustean.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); }これは、LayUIテーブルURLによって指摘された方法です。ここでは、renderjsonの方法でJSONデータを返す必要があります。
その後、リストコレクションを直接返却しようとしたことに注意する必要があります。メソッドは実行可能であるように思われますが、データを受信するには上記の形式である必要があるため、ページに表示されません。ただし、Joを直接返すと、バックグラウンドエラーが報告されており、この問題は明日しか学習して解決することができます。
以下は、返されたレンダリング方法を使用するいくつかの方法です。
次に、メソッドコールとパラメーター転送に注意を払う必要があります。
次の2つの方法とパラメーター転送方法があります。
<a href = "/sudent/delete?sustentId =#(x.studentid)"> delete </a> <a href = "/sudent/delete1/#(x.studentid)"> delete </a> <a hrete </a> <a hrete </a> < href = "/student/get1/#(x.studentid)"> modify </a> <a href = "/student/get1/#(x.studentid)"> 1 </a>を変更します
これがコントローラー方法です:
public void delete(){//フォームドメイン名の値を取得しましたStudentid Student.dao.deleteByid(getPara( "studentid")); Forwardaction( "/sudent"); } public void delete1(){// url request student.dao.deletebyid(getParatoint())で最初の値を取得します。 Forwardaction( "/sudent"); } public void update(){sustent sustent = getModel(desutent.class); Student.update(); forwardaction( "/sudent"); } public void get(){sudent sustent = desutent.dao.findbyid(getPara( "sustentId")); setattr( "学生"、学生); render( "index2.html"); } public void get1(){sudent sustent = sustent.dao.findbyid(getParatoint()); setattr( "学生"、学生); render( "index2.html"); }最後に、受け入れエンティティクラスを追加する2つの方法があります。
@before(sustentalidator.class)public void save(){ /*** getModelは、ページフォームフィールドから渡されたモデルオブジェクトを受信するために使用されます。フォームフィールド名の名前は「modelname.attrname」http://www.jfinal.comです。 getModelが使用する属性は、データテーブルのフィールド名とまったく同じでなければなりません。 GetBeanメソッドは、JFNALジェネレーターを使用してゲッターとセッターの方法を生成するモデルを含む、従来のJava Beanをサポートするために使用されます。ページフォームに引数を渡すときは、データテーブルのフィールド名ではなく、セッターメソッドと一致するアトラームを使用します。 GetModelとGetBeanの違いは、前者がNumber Tableフィールド名を使用し、後者はデータインジェクションのセッター法と一致する属性名を使用することです。最初にgetbeanメソッドを使用することをお勧めします。 */// getBean(desutent.class).save(); getModel(Student.Class).Save(); Redirect( "/student"); } @before(sustentValidator2.class)public void savebean(){getbean(sustent.class).save(); Redirect( "/student"); }デモの2番目のgetBeanメソッドは設定されておらず、IDのみが生成され、他のデータが追加されません。
必要に応じて。これが公式のデモです:
パッケージcom.demo.common.model; Import com.demo.common.model.base.baseblog;/** * *データベースフィールド名のキャメルネーミングルールを使用して、フィールド名などのJavaコードとの一貫性を容易にすることをお勧めします:userid */@suppresswarnings( "serial")パブリッククラスブログ拡張baseblog <blog> {}パッケージcom.demo.common.model.base; Import com.jfinal.plugin.activecord.model; Import com.jfinal.plugin.activecord.ibean;/*** Jfinalによって生成された、このファイルを変更しません。 */@suppresswarnings({"serial"、 "un -checked"})public abstract class baseblog <m extends baseblog <m >> extends model <m> ibean {public m setid(java.lang.integer id){set( "id"、id); return(m)this; } public java.lang.integer getId(){return getInt( "id"); } public m settitle(java.lang.string title){set( "title"、title); return(m)this; } public java.lang.string getTitle(){return getStr( "title"); } public m setContent(java.lang.string content){set( "content"、content); return(m)this; } public java.lang.string getContent(){return getStr( "content"); }}JFINAL Fast Development Frameworkの使用メモの上記の共有は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。