jfinal前后端demo案例展示

作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/16559407.html


依赖

<dependencies>
 <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
   <scope>test</scope>
 </dependency>

 <!--数据库驱动-->
 <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.47</version>
 </dependency>

 <dependency>
   <groupId>com.jfinal</groupId>
   <artifactId>jfinal-undertow</artifactId>
   <version>2.8</version>
 </dependency>

 <dependency>
   <groupId>com.jfinal</groupId>
   <artifactId>jfinal</artifactId>
   <version>4.9.21</version>
 </dependency>

 <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.0.9</version>
 </dependency>
 
</dependencies>

 

后端

public class DbConfig extends JFinalConfig {

//   运行config类,浏览器输入 http://localhost:8080/book/
   public static void main(String[] args) {
       UndertowServer.start(DbConfig.class, 8080, true);
  }

   @Override
   public void configConstant(Constants me) {

       me.setDevMode(true); // 配置开发模式,true 值为开发模式
       me.setInjectDependency(true);// 配置依赖注入

  }

   @Override
   public void configRoute(Routes me) {
//         路由扫描: "controller."表示扫描被限定的包名,扫描仅会在该包以及该包的子包下进行
//       me.scan("com.jing.controller.");
       me.add("/book", BookController.class);
  }

   @Override
   public void configEngine(Engine me) {

  }

   @Override
   public void configPlugin(Plugins me) {

//       String jdbcUrlString="jdbc:mysql://127.0.0.1:3306/jfinaldb";
       String jdbcUrlString="jdbc:mysql://localhost:3306/jfinaldb";

       DruidPlugin druidPlugin = new DruidPlugin(jdbcUrlString,"root","123456");
       ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);

       activeRecordPlugin.setDevMode(true);
       activeRecordPlugin.setShowSql(true);

       activeRecordPlugin.addMapping("books", Books.class);//完成映射

       me.add(druidPlugin);
       me.add(activeRecordPlugin);

  }

   @Override
   public void configInterceptor(Interceptors me) {

  }

   @Override
   public void configHandler(Handlers me) {

  }
}

 

public class MyGenerator {

   public static DataSource getDataSource() {
       DruidPlugin dp = new DruidPlugin("jdbc:mysql://127.0.0.1:3306/jfinaldb?serverTimezone=UTC&characterEncoding=utf-8", "root", "123456");
       dp.start();
       return dp.getDataSource();
  }

   public static void main(String[] args) {
       //1 DataSource
       //2 base model package name
       String baseModelPackageName="com.jing.model.base";
       //3 base model dir
       String baseModelOutputDir= PathKit.getWebRootPath()+"/../java/com/jing/model/base";
       //4 modelPackageName
       String modelPackageName = "com.jing.model";
       //5 modelOutputDir
       String modelOutputDir = baseModelOutputDir + "/..";
       //
       Generator gernerator= new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);

       gernerator.setDialect(new MysqlDialect());
       // dao
       gernerator.setGenerateDaoInModel(true);

       gernerator.setGenerateDataDictionary(true);

       gernerator.generate();
  }
}

 

@Path("/book")
public class BookController extends Controller {

   @Inject
   BookService service;

   public void index() {
//   List<Record> bookList = Db.find("select * from books"); //进行查询
       List<Books> bookList = service.getList();
       set("books", bookList);
       render("index.html");
  }

   public void delete() {
       Integer idInteger = getInt(0);
       service.deleteBookById(idInteger);
       List<Books> bookList = service.getList();
       set("books", bookList);
       render("index.html");
  }

   public void add() {
       //获取表单内容并填充到model里
       Books book = getModel(Books.class, "book");//get para+new model with para
//   System.out.println(book.toJson());
       service.addBook(getModel(Books.class, "book"));
       List<Books> bookList = service.getList();
       set("books", bookList);
       render("index.html");
//   renderJson(service.addBook(getModel(Books.class,"book")));
  }

   public void edit() {
       Books book = service.findById(getInt(0));
       if (book == null) {
           renderText("失败");
           return;
      }
       set("book", book);
       render("edit.html");
  }

   public void update() {
       Books book = getModel(Books.class, "book");//get para+new model with para
       service.updateBook(getModel(Books.class, "book"));
       List<Books> bookList = service.getList();
       set("books", bookList);
       render("index.html");
  }
}

 

public class Books extends Model<Books> {
   // 这里不用写,自动生成
}

 

public class BookService {
   public static final Books dao = new Books().dao();

   //查找列表
   public List<Books> getList() {
       return dao.findAll();
  }

   public Books findById(Integer id) {
       return dao.findById(id);
  }

   //删
   public Ret deleteBookById(Integer id) {
       Books book = dao.findById(id);
       if (book == null) {
           return Ret.fail("msg", "删除失败");
      }
       boolean success = book.delete();
       return success ? Ret.ok("msg", "删除成功") : Ret.fail("msg", "删除失败");
  }

   //增
   public Ret addBook(Books book) {
       if (book == null) {
           return Ret.fail("msg", "保存失败");
      }
       boolean success = book.save();
       return success ? Ret.ok("msg", "保存成功") : Ret.fail("msg", "保存失败");
  }

   //改
   public Ret updateBook(Books book) {
       if (book == null || book.get("id") == null) {
           return Ret.fail("msg", "更新失败");
      }

       Books dbBook = dao.findById(book.getInt("id"));
       if (dbBook == null) {
           return Ret.fail("msg", "更新失败");
      }
       boolean success = book.update();
       return success ? Ret.ok("msg", "更新成功") : Ret.fail("msg", "更新失败");
  }
}

 

前端

index.html

<!DOCTYPE html>
<html>
   <head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
   <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
   <title>图书列表</title>
   <style>
       #books
      {
           font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
           width:100%;
           border-collapse:collapse;
      }
       #books td, #books th
      {
           font-size:1em;
           border:1px solid #98bf21;
           padding:3px 7px 2px 7px;
           background-color:#e7e7e7;
      }
       #books th
      {
           font-size:1.1em;
           text-align:left;
           padding-top:5px;
           padding-bottom:4px;
           background-color:#A7C942;
           color:#FFFFFF;
      }
       button{
           background-color: #e7e7e7;
           border: none;
           color: black;
           padding: 10px 25px;
           border-radius: 4px;
           text-align: center;
           text-decoration: none;
           display: inline-block;
           font-size: 16px;
           margin: 4px 2px;
           cursor: pointer;
      }
       .input-group{
           width: 30%;
      }
   </style>
</head>

<body>
<table id="books">
   <tbody>
   <tr><th>序号</th><th>书号id</th><th>书名name</th><th>作者author</th><th>价格price</th><th>操作</th>

      #for(book:books)

   <tr>
       <td>#(for.index)</td>
       <td>#(book.id)</td>
       <td>#(book.name)</td>
       <td>#(book.author)</td>
       <td>#(book.price)</td>
       <td><a href="/book/delete/#(book.id)">删除</a>&nbsp;&nbsp;<a href="/book/edit/#(book.id)">修改</a></td>
   </tr>
  #end
   </tbody>
   <h4>图书列表:</h4>
</table>
<h4>添加图书:</h4>
<form action="/book/add" method="post">

   <div class="input-group mb-3">
       <span class="input-group-text">书名</span>
       <input type="text" class="form-control" id="book.name" value="#(book.name??)" name="book.name">
   </div>
   <div class="input-group mb-3">
       <span class="input-group-text">作者</span>
       <input type="text" class="form-control" id="book.author" value="#(book.author??)" name="book.author">
   </div>
   <div class="input-group mb-3">
       <span class="input-group-text">价格</span>
       <input type="text" class="form-control" id="book.price" value="#(book.price??)" name="book.price">
   </div>
   <button type="submit">添加</button>
</form>
</body>
</html>

 

edit.html

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>Insert title here</title>
</head>
<body>
<h4>修改:</h4>
<form action="/book/update" method="post">
   <div class="input-group mb-3">
       <span class="input-group-text">id</span>
       <input type="text" class="form-control" id="book.id" value="#(book.id??)" name="book.id">
   </div>
   <div class="input-group mb-3">
       <span class="input-group-text">name</span>
       <input type="text" class="form-control" id="book.name" value="#(book.name??)" name="book.name">
   </div>
   <div class="input-group mb-3">
       <span class="input-group-text">author</span>
       <input type="text" class="form-control" id="book.author" value="#(book.author??)" name="book.author">
   </div>
   <div class="input-group mb-3">
       <span class="input-group-text">price</span>
       <input type="text" class="form-control" id="book.price" value="#(book.price??)" name="book.price">
   </div>
   <button type="submit">修改</button>
</form>
</body>
</html>
 
posted @   kuaiquxie  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-08-07 《大道至简》----周爱民 读后感
点击右上角即可分享
微信分享提示