先從Controller入手,使用者登入,經過路由轉寄,到達Controller類,在Action中進行對應的處理。
地址:http://localhost:8080/Jdemo/index.jsp
跳轉:http://localhost:8080/Jdemo/users/loginUsers
Action類的代碼:
@Before(ControllerInterceptor.class)public class UsersController extends Controller { private IUsersService us = new UsersServiceImpl(); /** * 使用者登入Action */ @Before({ LoginValidator.class, ActionInterceptor.class }) public void loginUsers() { String uName = getPara("USERS.UNAME"); String uPswd = getPara("USERS.UPSWD"); Users u = us.getUsers(uName, uPswd); System.out.println(u); if (null != u) { setSessionAttr("CURRENT_USER", u); renderJsp("/users/home.jsp"); } else { setAttr("loginUsersMsg", "使用者名稱或密碼錯誤!"); renderJsp("/index.jsp"); } }}
使用Annotation無侵入式的在類上別添加了Controller層級的攔截器,在Action上添加了Action層級的攔截器和登入校正。
在配置類中添加Global層級的攔截器
@Override public void configInterceptor(Interceptors me) { me.add(new GlobalInterceptor()); }
下面是登入動作完成後,控制台顯示資訊,可以反映一次請求應答過程。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/11324K2a-0.png" title="大富大貴.png" data-pinit="registered" />
分析說明:
第一步:全域攔截器;
第二步:進入Controller層級攔截器;
第三步:為loginUsers方法設定了校正類,進入校正方法校正通過進入第四步)
第四步:進入Action層級攔截器;
第五步:通過Action將請求資訊傳資訊給Service和Model進行資料處理,並返回到視圖;
第六步:各層級攔截器以棧的順序退出。
地址:http://localhost:8080/Jdemo/users/showUsersList
轉到:http://localhost:8080/Jdemo/users/home.jsp頁面
Action類代碼:
/** * 擷取所有使用者的資訊的Action */ public void showUsersList() { @SuppressWarnings("unchecked") List<Users> listUsers = us.getUsersAll(); setAttr("LIST_USERS", listUsers); renderJsp("/users/home.jsp"); }
執行流程結束,控制台資訊:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/11324G205-1.png" title="阿道夫薩芬.png" data-pinit="registered" />
從控制台顯示資訊可以看到沒有了Action層級的攔截器,同是可以看到showUsersList()方法上也沒有添加註解資訊Action層級的攔截器)。
Jsmart/JFinal提供了非常方便的可上傳10M的大小的檔案。
上傳檔案的方法很簡單,直接調用Controller的方法,getFile(...);
參見例子:
/** * 上傳使用者資料的Action */ public void uploadImage() { String uId = getPara("uId"); String realPath = getPara("realPath"); String uploadPath = ServiceUtils.newSaveDir(realPath); //******************************************* //***********擷取表單中的File立即上傳******** //******************************************* UploadFile ufile = getFile("uImage", uploadPath); if (null != ufile) { ServiceUtils.renameFile(ufile, uId); setSessionAttr("UPLOAD_MSG", "上傳成功!"); } else { setSessionAttr("UPLOAD_MSG", "上傳失敗!"); } redirect("/users/showUsersList"); }
JFinal的作者給出的修改上傳檔案名稱的方式和我做的不謀而合,這也是提供一種為上傳檔案新增時間戳記的方式。
上面代碼中的ServiceUtils.renameFile(UploadFile uploadFile, <Type> newName)給予具體實現。
public static void renameFile(UploadFile uf, String newName) { File uf.getFile(); String srcName = src.getName(); String dstName = src.getParent() + File.separator + newName + srcName.substring(srcName.indexOf('.')); File dst = new File(dstName); /** * 重新命名的檔案存在則刪除! */ if (dst.exists()) { dst.delete(); } src.renameTo(dst); }
關於檔案下載,JFinal/Jsmart架構提供了一個很好用的方法renderFile(File f);該法直接為頁面產生一個指定的下載檔案,非常簡單方便。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/11324M393-2.gif" />JFinal/Jsmart架構很靈活,很注重解決實際問題,撇開了很多很少用到的功能,並提供了外掛程式機製為擴充提供的基礎。
架構工作流程如上面兩個例子1,2,檔案下載,上傳如例子3。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/11324M393-2.gif" />關於資料訪問很有ibatis的味道,通過配置sql,Model和資料庫表映射來完成。
表映射
package com.broncho.jsmart.model.users;import com.jsmart.ext.plugin.tablebind.TableBind;import com.jsmart.plugin.activerecord.Model;/** * Users表的資料模型 * * @author Broncho * @time 2013年7月17日 09:17:18 */@TableBind(tableName = "USERS", pkName = "UID")public class Users extends Model<Users> { /** * */ private static final long serialVersionUID = 5631774099405889205L; /** * Users資料模型的共用對象 */ public static final Users dao = new Users();}
資料庫訪問
配置SQL檔案
<?xml version="1.0" encoding="UTF-8"?><sqlGroup name="USERS"> <sql id="queryCurrentUsers"> SELECT * FROM USERS WHERE UNAME=? AND UPSWD=? </sql></sqlGroup>
查詢執行個體:
@Override public Users getUsers(String uName, String uPswd) { List<Users> ulist = null; ulist=Users.dao.find("USERS.queryCurrentUsers", new Object[]{uName,uPswd}); Users u = null; if (null != ulist && ulist.size() != 0) { u = ulist.get(0); } return u; }
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/11324J944-4.gif" />註:SQL設定檔的命名,xxx-sql.xml
SQL設定檔使用了Group-Id的方式來管理SQL語句,這樣就可以用GroupName.Id的方式使用配置好的SQL語句。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/11324M393-2.gif" />JFinal正真的做到了所描述的那些特性,而每一種特性都可一從已有的架構中看到,學習起來容易,比如:Action和Struts2的Action同理,Model層的資料庫訪問和ibatis架構同理,還有體現了約定優於配置,做到了可擴充,可插拔的,輕量級,無依賴的優勢。JFinal更像是化繁為簡,為己所有的一款架構,更像是開發人員為了逃離繁瑣,減輕學習負擔而開發的架構。
本文出自 “野馬紅塵” 部落格,謝絕轉載!