jfinal 是一個orm框架,可是在用他的時候你不用寫任何配置,或者說想寫的話能夠寫一個數據源的配置文件若是不想寫的話那真的什麼都不用寫,真有這麼神奇咱們來看看!
html
首先來個工程的目錄結構:前端
ok 從傳遞的文件中咱們能看到全部的文件,簡單的說一下有哪些文件,每一個文件的做用是什麼:java
一、web.xml 配置文件這裏面配置了jfinal的攔截器,攔截器的做用就是將請求指向了一個JFinalConfig類。mysql
二、datasource.properties 數據源配置文件,這個能夠配置也能夠不配置。web
三、WebContent 下的view 目錄下都是前端的jsp文件。spring
四、chm/model 下的User類,這個類的繼承了Jfinal的Model<User> 這個類,也就是對象模型對應的bean可是這裏不定義屬性。sql
五、chm/init 下的ProjectConfig 類繼承了JFinalConfig 這個類並重寫了JFinalConfig 的方法。數據庫
六、chm/controller下的UserController 就是請求的具體處理以及返回前端的處理。json
簡單看了文件結構後咱們來看看代碼:restful
一、web.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <filter> <filter-name>jfinal</filter-name> <filter-class>com.jfinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <!--處理請求的具體類 --> <param-value>chm.init.ProjectConfig</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
二、ProjectConfig.java 類繼承了JFinalConfig 類
package chm.init; import chm.controller.UserController; import chm.model.User; import com.jfinal.config.Constants; import com.jfinal.config.Handlers; import com.jfinal.config.Interceptors; import com.jfinal.config.JFinalConfig; import com.jfinal.config.Plugins; import com.jfinal.config.Routes; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.c3p0.C3p0Plugin; import com.jfinal.render.ViewType; /** * @author WHD data 2016年3月12日 */ public class ProjectConfig extends JFinalConfig { @Override public void configConstant(Constants me) { // 加載少許必要配置,隨後可用getProperty(...)獲取值 loadPropertyFile("datasource.properties"); me.setDevMode(getPropertyToBoolean("devMode", false)); // 視圖的配置jsp me.setViewType(ViewType.JSP); } @Override public void configRoute(Routes me) { // 請求路徑的配置當請求/user 時對應到UserController控制層的index方法(默認) // 若是要調用UserController層的其餘方法要在請求路徑中指定方法名稱 me.add("/user", UserController.class); // 請求路徑 } @Override public void configPlugin(Plugins me) { // jfinal 插件配置 // 配置C3p0數據庫鏈接池插件 C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password").trim(), "com.mysql.jdbc.Driver"); me.add(c3p0Plugin); // 配置ActiveRecord插件 ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin); me.add(arp); arp.addMapping("user_table", User.class); // 映射blog 表到 Blog模型 } @Override public void configInterceptor(Interceptors me) { // TODO Auto-generated method stub } @Override public void configHandler(Handlers me) { // TODO Auto-generated method stub } }
三、UserController 類繼承了jfinal的Controller類
package chm.controller; import java.util.List; import chm.model.User; import com.jfinal.core.Controller; import com.jfinal.plugin.activerecord.Page; /** * @author WHD data 2016年3月12日 */ public class UserController extends Controller { // 默認訪問index方法因此不能再同一個controller中定義兩個index方法 public void index() { System.out.println("index 參數"); // getPara getPara(1) getPara("age") // getParaToInt()都是獲取參數的方法jfinal支持restful規則 // 參數獲取規則具體見jfinal手冊 String a = getPara(0); String b = getPara(1); String c = getPara(); String age = getPara("age"); System.out.println("a:" + a); System.out.println("b: " + b); System.out.println("c:" + c); System.out.println("age:" + age); // 分頁獲取數據 Page<User> userPages = User.dao.paginate(1, 10, "select *", "from user_table order by id asc"); // jfinal 的sql是原生的,平時怎麼寫就怎麼寫 List<User> list = User.dao.find("select * from user_table limit 1,3"); System.out.println("list.size: " + list.size()); // 這裏的setAttribute是HttpServletRequest 對象的setAttribute方法 setAttr("userList", userPages.getList()); setAttr("list", list); // 返回到指定前端,這個和springmvc的返回和展現或者說和HttpServlet同樣的 render("/view/user.jsp"); } // 添加方法 public void add() { System.out.println("新增"); // 這種方法的話前端定義的名稱要和數據庫中表的字段要一致,否則的不行,這個有點像springmvc pojo方法獲取參數的方式 getModel(User.class).save(); // 第二種添加方法 String name = getPara("user.userName"); String password = getPara("user.password"); System.out.println("name:" + name + " password: " + password); // 建立對象,設置屬性調用對象的save方法保存到對應的數據庫表中 boolean b = new User().set("userName", name).set("password", password) .save(); System.out.println("b: " + b); // user就是配置文件中配置的/user 這裏也就是方法index方法 redirect("/user"); } // 按照id刪除 public void delete() { // 獲取參數id並將參數轉化爲int型,在調用刪除方法進行刪除 User.dao.deleteById(getParaToInt()); redirect("/user"); } // 編輯 public void edit() { // 獲取編輯的id並進行查詢在將獲取的參數值並設置到request對象的setAttribute方法 setAttr("user", User.dao.findById(getParaToInt())); // 返回到指定的jsp頁面 render("/view/userEdit.jsp"); } // 更新方法 public void update() { // getModel(User.class).update(); String id = getPara("user.id"); String name = getPara("user.userName"); String password = getPara("user.password"); System.out.println("update id: " + id + " name: " + name + " password: " + password); // 更新的方法先獲取id爲id的user對象在設置改變的值最後更新數據庫 new User().findById(id).set("userName", name).set("password", password) .update(); redirect("/user"); } }
四、User.java 類 繼承了Model<User> 類
package chm.model; import com.jfinal.plugin.activerecord.Model; /** * @author WHD data 2016年3月12日 */ public class User extends Model<User> { /** * */ private static final long serialVersionUID = -6465542910996567778L; public static final User dao = new User(); }
上面的四個配置文件能夠說是從請求開始到返回數據的整個流程,可是數據前臺怎麼展現那,下面來看看user.jsp
五、user.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <body> <a href="/jfinal/view/userAdd.jsp" class="btn btn-primary btn-sm"> 新增用戶 </a> <table> <c:forEach var="user" items="${userList}"> <tr> <td><c:out value="${user.id}" default="" /></td> <td>${user.userName}</td> <td>${user.password}</td> <td> <a href="/jfinal/user/delete/${user.id}">刪除</a> <a href="/jfinal/user/edit/${user.id}">修改</a></td> </tr> </c:forEach> <!--controller 用兩種方式獲取數據並進行展現 --> <c:forEach var="users" items="${list}"> <tr> <td><c:out value="${users.id}" default="" /></td> <td>${users.userName}</td> <td>${users.password}</td> <td> <a href="/jfinal/user/delete/${users.id}">刪除</a> <a href="/jfinal/user/edit/${users.id}">修改</a></td> </tr> </c:forEach> </table> </body> </html>
六、datasource.properties配置文件,在前面說了jfinal是零配置因此這個配置不是必須的
jdbcUrl = jdbc:mysql://127.0.0.1/chm?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull user = root password =admin devMode = true
ok到這裏咱們全部的代碼都有了,也就是一個流程都有了,下面咱們來看看整個流程是什麼,而具體的處理細節不在這裏囉嗦了由於代碼中有不少註釋
這是web 項目因此web.xml 是必須配置的,而從上面的文件中咱們看到這個配置文件中配置了jfinal的過濾器,而過濾器所指向的就是咱們定義的配置文件,因此全部的請求都會先到配置類中的configRoute() 這個方法中去找對應的路徑,而同過上面的文件咱們發現每個路徑對應着一個Class 實例這裏的class實例就是 一個繼承了Controller的類,這樣的話就會把這個請求重定向到Controller類的具體方法上,這裏注意若是在請求路徑中不指定方法名的話會默認調用控制層的index() 方法來處理。ok 到這裏一個請求就到了想要到的地方。以後就是從請求路徑中獲取數據,獲取數據的方法能夠看上面的代碼也能夠看文檔,獲取參數後咱們按照參數去數據庫查詢。
這裏要特別說如下查詢的事情,jfinal的查詢特別方便你能夠直接調用model下定義的那個類的User 類型的dao 的方法去獲取數據,獲取後的數據就是一個個的user對象你能夠調用jfinal 的model 提供的方法來獲取一個對象的各個屬性的值。
將獲取的一個對象獲一個對象集合設置到request 中,而在jfinal 中能夠直接調用setAttr("list", list);方法來將集合添加到request中。
ok數據獲取了,也添加到request對象中了,剩下的就是返回,jfinal 支持 jsp freemark json text html 等等前端解析器因此這裏使用的是jsp 返回調用了render("/view/user.jsp"); 來返回到指定的頁面,具體展現看以前的代碼。
過程描述到此結束,明天話一個請求的時序圖