使用JFinal/Jsmart架構開發體驗(二)

來源:互聯網
上載者:User

 先從Controller入手,使用者登入,經過路由轉寄,到達Controller類,在Action中進行對應的處理。

  • 1.登入:

地址: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進行資料處理,並返回到視圖;

第六步:各層級攔截器以棧的順序退出。


  • 2.查看所有使用者:

地址: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層級的攔截器)。

  • 3.上傳檔案:

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和資料庫表映射來完成。

  1. 表映射

    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();}


  2. 資料庫訪問

    配置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更像是化繁為簡,為己所有的一款架構,更像是開發人員為了逃離繁瑣,減輕學習負擔而開發的架構。


本文出自 “野馬紅塵” 部落格,謝絕轉載!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.