記錄第一次使用jfinal,從簡單的框架搭建到增刪改查,從自帶的方法到正常框架習慣的使用方式。
jfinal官網:http://www.jfinal.com/
jfinal 是基于 java 語言的極速 web + orm 框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、restful。在擁有java語言所有優勢的同時再擁有ruby、python、php等動態語言的開發效率。
jfinal有如下主要特點:
mvc架構,設計精巧,使用簡單
遵循coc原則,零配置,無xml
獨創db + record模式,靈活便利
activerecord支持,使數據庫開發極致快速
自動加載修改后的java文件,開發過程中無需重啟web server
aop支持,攔截器配置靈活,功能強大
plugin體系結構,擴展性強
多視圖支持,支持freemarker、jsp、velocity
強大的validator后端校驗功能
功能齊全,擁有struts2的絕大部分功能
體積小僅632k,且無第三方依賴
例子:
本人用的maven,首先創建一個maven項目:
我的項目創建之后首先要設置:
然后點apply
還有其他一些設置等等,我的問題,這里先跳過
然后在pom.xml中引入jar包:
maven搜索jar包:http://mvnrepository.com/
官方demo的pom.xml:
這里沒有引入json,我的這個demo最后的方法需要json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
<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> <properties> <project.build.sourceencoding>utf- 8 </project.build.sourceencoding> <maven.compiler.encoding>utf- 8 </maven.compiler.encoding> </properties> <!-- 使用阿里 maven 庫 --> <repositories> <repository> <id>ali-maven</id> <url>http: //maven.aliyun.com/nexus/content/groups/public</url> <releases> <enabled> true </enabled> </releases> <snapshots> <enabled> true </enabled> <updatepolicy>always</updatepolicy> <checksumpolicy>fail</checksumpolicy> </snapshots> </repository> </repositories> <!-- 添加快照版本庫,updatepolicy: always、daily、interval、never --> <!-- 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> </repositories --> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version> 3.8 . 1 </version> <scope>test</scope> </dependency> <dependency> <groupid>com.jfinal</groupid> <artifactid>jetty-server</artifactid> <version> 8.1 . 8 </version> <!-- 此處的 scope 值為 compile 僅為支持 idea 下啟動項目 打 war 包時需要改成 provided,以免將一些無用的 jar 打進去 --> <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> <plugin> <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> <scanintervalseconds> 5 </scanintervalseconds> <connectors> <connector implementation= "org.eclipse.jetty.server.nio.selectchannelconnector" > <port> 80 </port> <maxidletime> 60000 </maxidletime> </connector> </connectors> </configuration> </plugin> </plugins> </build> </project> |
然后是web.xml的配置:
注意:
democonfig.java 文件所在的包以及自身文件名必須與 web.xml 中的 param-value 標簽內的配置相一致(在本例中該配置為 demo.democonfig)。
1
2
3
4
5
6
7
8
9
10
11
12
|
<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文件:
創建democonfig并繼承jfinalconfig,democonfig是主文件,運行這個文件啟動項目,就像運行普通java文件main一樣,同時運行之后如果修改其他代碼,并不需要重啟,框架會自動修改,直接刷新就可以看到修改后的內容。
這是初始的簡單的demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package demo; import com.jfinal.config.*; public class democonfig extends jfinalconfig { public void configconstant(constants me) { me.setdevmode( true ); } public void configroute(routes me) { me.add( "/hello" , hellocontroller. class ); } public void configengine(engine me) {} public void configplugin(plugins me) {} public void configinterceptor(interceptors me) {} public void confighandler(handlers me) {} } |
然后配置controller:
1
2
3
4
5
6
7
|
package demo; import com.jfinal.core.controller; public class hellocontroller extends controller { public void index() { rendertext( "hello jfinal world." ); } } |
然后直接打開瀏覽器輸入http://localhost/hello 就可以看到頁面輸出了 hello jfinal world 。
這是最基本的使用的例子,下面是我的程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package demo; import com.jfinal.config.*; import com.jfinal.core.jfinal; import com.jfinal.kit.propkit; import com.jfinal.plugin.activerecord.activerecordplugin; import com.jfinal.plugin.c3p0.c3p0plugin; import com.jfinal.plugin.druid.druidplugin; import com.jfinal.template.engine; import controller.studentcontroller; import demo.model.classes; import demo.model.student; public class 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、controller、method //以及請求所攜帶的參數。 } 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(plugins me) { // c3p0plugin cp = new c3p0plugin("jdbc:mysql://localhost/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( "student" , "studentid" , student. class ); arp.addmapping( "classes" , "classesid" , classes. class ); // 此方法用來配置jfinal的plugin,如下代碼配置了druid數據庫連接池插件與activerecord // 數據庫訪問插件。通過以下的配置,可以在應用中使用 activerecord 非常方便地操作數據庫。 } public void configinterceptor(interceptors me) { //me.add(new authinterceptor()); // 此方法用來配置 jfinal 的全局攔截器,全局攔截器將攔截所有 action 請求,除非使用 // @clear 在 controller 中清除,如下代碼配置了名為 authinterceptor 的攔截器。 } public void confighandler(handlers me) { } } |
這里面各個方法的簡單說明都寫在注釋里了。
然后是controller:
這里雖然聲明了service,但是并沒有使用的,都是直接在controller方法里使用dao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
package controller; import java.util.list; import java.util.map; import com.alibaba.fastjson.jsonobject; import com.jfinal.aop.before; import com.jfinal.core.controller; import studentinterceptor.studentinterceptor; import studentvalidator.studentvalidator; import studentvalidator.studentvalidator2; import demo.model.student; import service.studentservice; public class studentcontroller extends controller { /** * 獲取studentid那里有多種方法,這個要和前臺傳參寫法一致,controller 提供了 getpara 系列方法,官網api里很詳細 jfinal用的是原生態sql語句,簡單,方便,setattr("studentlist", list);把結果集放到request范圍里, jfinal也有直接獲取表單里分裝成對象的方法 getmodel(student.class);就是,和struts2一樣,表單name對應上就可以了,非常方便 添加那里對于oracle用序列維護studentid student.set("studentid", "mysequence.nextval").save(); jfinal有多種返回方式,也可以返回json數據,render 系列方法,官網api里很詳細 */ static studentservice service = new studentservice(); @before (studentinterceptor. class ) public void index() { list<student> 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<student> list = student.dao.find( "select * from student" ); setattr( "studentlist" , list); setattr( "student" , list.get( 0 )); render( "test.jsp" ); } public void getlist() { list<student> list = student.dao.find( "select * from student" ); jsonobject jo = new jsonobject(); jo.put( "code" , 0 ); jo.put( "msg" , true ); jo.put( "count" ,list.size()); jo.put( "data" , list); renderjson(jo); } public void layui() { list<student> list = student.dao.find( "select * from student" ); setattr( "studentlist" , list); render( "index3.html" ); } public void delete() { // 獲取表單域名為studentid的值 student.dao.deletebyid(getpara( "studentid" )); forwardaction( "/student" ); } public void delete1() { // 獲取url請求中第一個值 student.dao.deletebyid(getparatoint()); forwardaction( "/student" ); } public void update() { student student = getmodel(student. class ); student.update(); forwardaction( "/student" ); } public void get() { student student = student.dao.findbyid(getpara( "studentid" )); setattr( "student" , student); render( "index2.html" ); } public void get1() { student student = student.dao.findbyid(getparatoint()); setattr( "student" , student); render( "index2.html" ); } @before (studentvalidator. class ) public void save() { /** * getmodel用來接收頁面表單域傳遞過來的model對象,表單域名稱以”modelname.attrname” http://www.jfinal.com 方式命名,getmodel 使用的 attrname 必須與數據表字段名完全一樣。 getbean 方法用于支持傳統 java bean,包括支持使用 jfnal 生成器生成了 getter、setter 方法 的 model,頁面表單傳參時使用與 setter 方法相一致的 attrname,而非數據表字段名。 getmodel與getbean區別在于前者使用數表字段名而后者使用與setter方法一致的屬性名進 行數據注入。建議優先使用 getbean 方法。 */ //getbean(student.class).save(); getmodel(student. class ).save(); redirect( "/student" ); } @before (studentvalidator2. class ) public void savebean() { getbean(student. class ).save(); redirect( "/student" ); } } |
同樣的簡單的說明也寫在注釋里了。
方法基本上都在這里了,下面是其他的一些配置:
這是實體類:
1
2
3
4
5
6
7
8
9
10
11
|
package demo.model; import com.jfinal.plugin.activerecord.model; public class student extends model<student> { public static final student dao = new student(); /** * activerecord 是 jfinal 最核心的組成部分之一,通過 activerecord 來操作數據庫,將極大地減少代碼量,極大地提升開發效率,配置在后面,我這里用的是model,model 是 activerecord 中最重要的組件之一,它充當 mvc 模式中的 model部分。 以上代碼中的 user 通過繼承 model,便立即擁有的眾多方便的操作數據庫的方法。在 user 中聲明的 dao 靜態對象是為了方便查詢操作而定義的,該對象并不是必須的。 基于activerecord 的 model 無需定義屬性, 無需定義 getter、 setter方法,無需 xml 配置,無需 annotation 配置,極大降低了代碼量。model常見方法見官方api。 jfinal還有 獨創 db + record 模式,db 類及其配套的 record 類, 提供了在 model 類之外更為豐富的數據庫操作功能。使用 db 與 record 類時,無需對數據庫表進行映射,record 相當于一個通用的 model。db常見方法見官方api。 */ } |
studentvalidator:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package studentvalidator; import com.jfinal.core.controller; import com.jfinal.validate.validator; public class studentvalidator extends validator { //在校驗失敗時才會調用 @override protected void handleerror(controller controller) { controller.keeppara( "student.studentname" ); //將提交的值再傳回頁面以便保持原先輸入的值 controller.render( "/add.html" ); } @override protected void validate(controller controller) { //驗證表單域name,返回信息key,返回信息value validaterequiredstring( "student.studentname" , "studentnamemsg" , "請輸入學生名稱!" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package studentvalidator; import com.jfinal.core.controller; import com.jfinal.validate.validator; public class studentvalidator2 extends validator { //在校驗失敗時才會調用 @override protected void handleerror(controller controller) { controller.keeppara( "studentname" ); //將提交的值再傳回頁面以便保持原先輸入的值 controller.render( "/add.html" ); } @override protected void validate(controller controller) { //驗證表單域name,返回信息key,返回信息value validaterequiredstring( "studentname" , "studentnamemsg" , "請輸入學生名稱!" ); } } |
studentinterceptor:
1
2
3
4
5
6
7
8
9
10
|
package studentinterceptor; import com.jfinal.aop.interceptor; import com.jfinal.aop.invocation; public class studentinterceptor implements interceptor { public void intercept(invocation ai) { system.out.println( "before action invoking" ); ai.invoke(); system.out.println( "after action invoking" ); } } |
然后是前臺的顯示頁面:
關于前臺頁面,需要看一下文檔第六章,jfinal模板引擎的內容,了解jfinal如何在前臺顯示,這是很重要的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
<!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= "/student/jsp" >學生管理</a></h1> <a href= "/student/layui" >測試layui</a> <a href= "/student/test" >編輯索引 0 </a><br> <a href= "/student/add" >添加</a><br> <form action= "/student/get" > id:<input type= "text" name= "studentid" > <input type= "submit" value= "查詢" > </form> <a href= "/student/delete" >刪除</a> <form action= "/student/delete" > id:<input type= "text" name= "studentid" > <input type= "submit" value= "刪除" > </form> # for (x : [ 1 .. 10 ]) #(x) #end <table id= "listtable" border= "1" > <tbody> <tr> <th>id</th> <th>姓名</th> <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:left;" >#(x.studentname)</td> <td 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;" >#(x.email)</td> <td style= "text-align:left;" > <a href= "/student/delete?studentid=#(x.studentid)" >刪除</a> <a href= "/student/delete1/#(x.studentid)" >刪除</a> <a href= "/student/get?studentid=#(x.studentid)" >修改</a> <a href= "/student/get1/#(x.studentid)" >修改 1 </a> </td> </tr> #end </tbody> </table> </body> </html> |
這就是頁面效果,因為沒有樣式所以看起來比較粗狂,然后下面是用正常使用的layui,加上正常習慣的方法返回數據組成的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
<!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 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 class = "layui-elem-quote" > <a href= "/student/add" ><button type= "button" id= "usersadd_btn" class = "layui-btn layui-btn-small" > <i class = "fa fa-plus" aria-hidden= "true" ></i> 添加 </button></a> <form class = "layui-form" style= "float: right;" onsubmit= "return false" > <div class = "layui-form-item" style= "margin: 0;" > <div class = "demotable" > 搜索用戶: <div class = "layui-inline" > <input class = "layui-input" name= "name" id= "demoreload" autocomplete= "off" > </div> <button class = "layui-btn" style= "transform: translatey(-3px);" data-type= "reload" >搜索</button> </div> </div> </form> </blockquote> </div> <table class = "layui-table" lay-data= "{url:'/student/getlist',id:'idtest',height: 'full-60' ,}" lay-filter= "demo" > <thead> <tr> <th lay-data= "{field:'studentid', width:'20%',}" >id</th> <th lay-data= "{field:'studentname', width:'20%'}" >姓名</th> <th lay-data= "{field:'sex', width:'20%'}" >性別</th> <th lay-data= "{field:'age', width:'20%'}" >年齡</th> <th lay-data= "{field:'address', width:'20%'}" >地址</th> <th lay-data= "{fixed: 'right', width:'17%', align:'center', toolbar: '#bardemo1'}" ></th> </tr> </thead> </table> <script type= "text/html" id= "bardemo1" > <a class = "layui-btn layui-btn-xs" id= "edit" lay-event= "edit" >修改</a> <a class = "layui-btn layui-btn-danger layui-btn-xs" lay-event= "del" >刪除</a> </script> </body> <script> layui.use( 'table' , function(){ var table = layui.table, form = layui.form;; //監聽表格復選框選擇 table.on( 'checkbox(demo)' , function(obj){ console.log(obj) }); //監聽工具條 table.on( 'tool(demo)' , function(obj){ var data = obj.data; if (obj.event === 'del' ){ layer.confirm( '真的刪除用戶嗎' , function(index){ $.ajax({ type: "post" , url: "/student/delete?studentid=" +data.studentid, datatype: "text" , //返回的 success:function(returndata) { table.reload( "idtest" ); }, error:function(msg) { console.log(msg); } }); }); } else if (obj.event === 'edit' ){ var index = layui.layer.open({ title : "修改" , type : 2 , area: [ '380px' , '80%' ], content : "/student/get?studentid=" +data.studentid, cancel: function(index, layero){ layer.close(index); table.reload( "idtest" ); } }) //改變窗口大小時,重置彈窗的高度,防止超出可視區域(如f12調出debug的操作) $(window).resize(function(){ layui.layer.full(index); }) layui.layer.full(index); } else if (obj.event === 'detail' ){ layer.confirm( '確定通過該用戶嗎' , function(index){ $.ajax({ type: "post" , url: "<%=basepath%>/sys/user/passuser" , data:{id:data.id}, //datatype:"text",//返回的 success:function(returndata) { layui.use( 'layer' , function() { layer.msg(returndata.msg); }); table.reload( 'idtest' , { page: { curr: 1 //重新從第 1 頁開始 }, }); }, error:function(msg) { console.log(msg); } }); }); } }); var $ = layui.$, active = { getcheckdata: function(){ //獲取選中數據 var checkstatus = table.checkstatus( 'idtest' ), data = checkstatus.data; layer.alert(json.stringify(data)); } ,getchecklength: function(){ //獲取選中數目 var checkstatus = table.checkstatus( 'idtest' ) ,data = checkstatus.data; layer.msg( '選中了:' + data.length + ' 個' ); } ,isall: function(){ //驗證是否全選 var checkstatus = table.checkstatus( 'idtest' ); layer.msg(checkstatus.isall ? '全選' : '未全選' ) } }; $( '.demotable .layui-btn' ).on( 'click' , function(){ var type = $( this ).data( 'type' ); active[type] ? active[type].call( this ) : '' ; }); }); </script> </html> |
這樣感覺稍微好了一點,因為只是第一次使用,做一個測試,所以還是比較粗獷的。
然后需要注意的是這種方式的數據返回的問題:
1
2
3
4
5
6
7
8
9
|
public void getlist() { list<student> list = student.dao.find( "select * from student" ); jsonobject jo = new jsonobject(); jo.put( "code" , 0 ); jo.put( "msg" , true ); jo.put( "count" ,list.size()); jo.put( "data" , list); renderjson(jo); } |
這是layui表格url指向的方法,在這里,需要將json數據用renderjson的方式返回。
然后需要 注意的是,我嘗試過直接返回list集合,貌似方法是可行的,只是因為layui表格必須是以上格式才能接收數據所以沒有顯示到頁面上,但是當我直接return jo的時候后臺報錯,這個問題只能等明天在學習并解決了。
以下是返回的render方法的幾種使用方式:
然后需要注意的是方法的調用和傳參:
如下兩種方法和傳參的方式:
1
2
3
4
|
<a href= "/student/delete?studentid=#(x.studentid)" >刪除</a> <a href= "/student/delete1/#(x.studentid)" >刪除</a> <a href= "/student/get?studentid=#(x.studentid)" >修改</a> <a href= "/student/get1/#(x.studentid)" >修改 1 </a> |
下面是controller方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public void delete() { // 獲取表單域名為studentid的值 student.dao.deletebyid(getpara( "studentid" )); forwardaction( "/student" ); } public void delete1() { // 獲取url請求中第一個值 student.dao.deletebyid(getparatoint()); forwardaction( "/student" ); } public void update() { student student = getmodel(student. class ); student.update(); forwardaction( "/student" ); } public void get() { student student = student.dao.findbyid(getpara( "studentid" )); setattr( "student" , student); render( "index2.html" ); } public void get1() { student student = student.dao.findbyid(getparatoint()); setattr( "student" , student); render( "index2.html" ); } |
最后就是添加接受實體類的兩種方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@before (studentvalidator. class ) public void save() { /** * getmodel用來接收頁面表單域傳遞過來的model對象,表單域名稱以”modelname.attrname” http://www.jfinal.com 方式命名,getmodel 使用的 attrname 必須與數據表字段名完全一樣。 getbean 方法用于支持傳統 java bean,包括支持使用 jfnal 生成器生成了 getter、setter 方法 的 model,頁面表單傳參時使用與 setter 方法相一致的 attrname,而非數據表字段名。 getmodel與getbean區別在于前者使用數表字段名而后者使用與setter方法一致的屬性名進 行數據注入。建議優先使用 getbean 方法。 */ //getbean(student.class).save(); getmodel(student. class ).save(); redirect( "/student" ); } @before (studentvalidator2. class ) public void savebean() { getbean(student. class ).save(); redirect( "/student" ); } |
其中第二中的getbean方式在我這個demo中,可能由于沒有設置getset的原因,添加之后是只有生成了id,沒有其他數據的。
如果需要使用。下面是官方demo的寫法:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.demo.common.model; import com.demo.common.model.base.baseblog; /** * 本 demo 僅表達最為粗淺的 jfinal 用法,更為有價值的實用的企業級用法 * 詳見 jfinal 俱樂部: http://jfinal.com/club * * blog model. * 數據庫字段名建議使用駝峰命名規則,便于與 java 代碼保持一致,如字段名: userid */ @suppresswarnings ( "serial" ) public class blog extends baseblog<blog> { } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.demo.common.model.base; import com.jfinal.plugin.activerecord.model; import com.jfinal.plugin.activerecord.ibean; /** * generated by jfinal, do not modify this file. */ @suppresswarnings ({ "serial" , "unchecked" }) public abstract class baseblog<m extends baseblog<m>> extends model<m> implements 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極速開發框架使用筆記分享就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/jiangwz/p/JFinal.html