JFinal極速開發框架使用筆記

記錄第一次使用JFinal,從簡單的框架搭建到增刪改查,從自帶的方法到正常框架習慣的使用方式。 javascript

JFinal官網:http://www.jfinal.com/php

JFinal 是基於 Java 語言的極速 WEB + ORM 框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、Restful。在擁有Java語言全部優點的同時再擁有ruby、python、php等動態語言的開發效率。css

JFinal有以下主要特色:

  • MVC架構,設計精巧,使用簡單html

  • 遵循COC原則,零配置,無xmljava

  • 首創Db + Record模式,靈活便利python

  • ActiveRecord支持,使數據庫開發極致快速mysql

  • 自動加載修改後的java文件,開發過程當中無需重啓web serverjquery

  • AOP支持,攔截器配置靈活,功能強大web

  • Plugin體系結構,擴展性強ajax

  • 多視圖支持,支持FreeMarker、JSP、Velocity

  • 強大的Validator後端校驗功能

  • 功能齊全,擁有struts2的絕大部分功能

  • 體積小僅632K,且無第三方依賴

例子:

本人用的maven,首先建立一個maven項目:

個人項目建立以後首先要設置:

而後點Apply

還有其餘一些設置等等,個人問題,這裏先跳過

而後在pom.xml中引入jar包:

maven搜索jar包:http://mvnrepository.com/

官方demo的pom.xml:

這裏沒有引入json,個人這個demo最後的方法須要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>
  
  <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)。

複製代碼
<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:

複製代碼
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:

複製代碼
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  。

這是最基本的使用的例子,下面是個人程序:

複製代碼
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

複製代碼
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");
    }

}
複製代碼

 

一樣的簡單的說明也寫在註釋裏了。

方法基本上都在這裏了,下面是其餘的一些配置:

這是實體類:

複製代碼
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:

複製代碼
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",
                "請輸入學生名稱!");
    }

}
複製代碼
複製代碼
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:

複製代碼
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如何在前臺顯示,這是很重要的

複製代碼
<!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;">
                    &nbsp;&nbsp;<a href="/student/delete?studentid=#(x.studentid)">刪除</a>
                    &nbsp;&nbsp;<a href="/student/delete1/#(x.studentid)">刪除</a>
                    &nbsp;&nbsp;<a href="/student/get?studentid=#(x.studentid)">修改</a>
                    &nbsp;&nbsp;<a href="/student/get1/#(x.studentid)">修改1</a>
                </td>
            </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 rel="stylesheet" href="/layui-v2.2.45/layui/css/layui.css"     media="all">
</head>
<body>
    <div style="margin: 0px;  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>
複製代碼

這樣感受稍微好了一點,由於只是第一次使用,作一個測試,因此仍是比較粗獷的。

而後須要注意的是這種方式的數據返回的問題:

複製代碼
    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方法的幾種使用方式:

而後須要注意的是方法的調用和傳參:

以下兩種方法和傳參的方式:

            &nbsp;&nbsp;<a href="/student/delete?studentid=#(x.studentid)">刪除</a>
                    &nbsp;&nbsp;<a href="/student/delete1/#(x.studentid)">刪除</a>
                    &nbsp;&nbsp;<a href="/student/get?studentid=#(x.studentid)">修改</a>
                    &nbsp;&nbsp;<a href="/student/get1/#(x.studentid)">修改1</a>

下面是controller方法:

複製代碼
    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");
    }
複製代碼

其中第二中的getBean方式在我這個demo中,可能因爲沒有設置getset的緣由,添加以後是隻有生成了ID,沒有其餘數據的。

若是須要使用。下面是官方demo的寫法:

複製代碼
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> {
    
}
複製代碼
複製代碼
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");
    }
}
複製代碼
相關文章
相關標籤/搜索