Dump-一個輕量級mvc框架

Info

基於反射,自己寫了一套框架,完全開源,Github地址:Dump-輕量級mvc框架,取名Dump, 正如它的名字一樣, Simple is everything.Dump是一個輕配置,完全基於註解開發的框架, 他甚至沒有自己的xml文件,一切基於註解。Dump分爲三個模塊, 它們各執其責, 相互配合完成整個工作。當然,三個模塊也相互獨立,完全解藕,可根據需要自行設定選擇。
快速瞭解可根據文檔閱讀Demo:A Demo of Dump

Structure

How To Use

jar包下載

你可以clone本項目到你的路徑下, 也可以導入jar包, 點此下載,除了項目本身的jar包,項目還依賴於cglib.jarasm.jar用於實現動態代理。其jar包文件在Github倉庫lib文件夾下,可直接下載。

配置文件

項目唯一需要你配置的就是數據庫的配置文件, 配置文件名爲jdbc.properties,位於src目錄下,配置項如下。


注:配置項packageName的配置內容不能等於Dump的默認包名,即不能等於com.

當然web.xml文件也要配置爲Dump默認的Filter,代碼如下

    <servlet>
        <servlet-name>dump</servlet-name>
        <servlet-class>com.dump.filter.DefaultFilter</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dump</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

好了,只需兩個步驟,你已經完成了Dump所需的所有配置工作,下面來看看如何使用吧!

Controller

和Spring mvc用法幾乎相同, 使用@Controller來表示它是一個控制器類,@RequestMapping用於匹配它的url,@Param用於匹配表單的name值,當然,和Spring mvc一樣, 你也可以直接傳人具體類來自動填充屬性值。
示例代碼:

@Controller
public class UserController {
    private UserService userService = new UserService();
    
    //Ajax傳值,返回值爲void
    @RequestMapping("/register")
    public void register(User user, @Param("again") String again,
                        HttpServletResponse response) throws Exception {
        String result = userService.register(user, again);
        response.getWriter().print(result);
    }
    
    //Post或Get傳值,返回值爲String
    @RequestMapping("/login")
    public String login(HttpSession session,
                        HttpServletResponse response,
                        User user) throws Exception{
        User us = userService.login(user);
        if(us == null){
            //重定向返回頁面
            return "redirect:/error.jsp";
        }else{
            //request轉發跳轉頁面
            return "success.jsp";
        }
    }
}

ORM

對於對象關係映射, Dump也提供了基本的函數操作, 包括分頁操作, 而相對複雜的查詢工作還是依賴於sql語句,但再也不用你來創建對象了,這位你節省下很大的工作量。基本函數如有:save(), delete(), update(), load(), getCount(), getAll(), selectBysql(), selectByPage()
示例代碼:

public class UserDao {
    public User login(User user){
        List<User> list = Session.getSession().selectBysql("select * from user where username = ? and password = ?",User.class,user.getUsername(),user.getPassword());
        //Session.getSession().save(user);//把user加入數據庫中
        //Session.getSession().load(User.class,2);加載id爲2的User(刪除delete,更新update同理)
        //Session.getSession().getAll(User.class);得到數據庫裏user的所有映射類(getCount同理)
        //Session.getSession().selectByPage("select * from user",User.class,int pageNo, int pageSize);//得到指定頁制定大小的實體類列表
        if(list.size()!=0){
            return list.get(0);
        }else {
            return null;
        }
    }
}

逆向工程:Dump支持自動填充Model層代碼完成映射,只需要在任何位置運行以下代碼:

public class Test{
    public static void main(String[] args) throws Exception{
        //第一個參數爲表名,第二個參數爲生成的文件路徑
        SqlCreater.createModel("student","com.model");
        SqlCreater.createModel("teacher","com.model");
    }
}

IOC/AOP

IOC和AOP是Spring的核心,在此Dump也提供了對其的支持。
1.IOC

利用註解@Autowired進行自動裝備, 與Spring不同,@Autowired需要修飾需要注入的類, 而類本身和類裏含有set方法的屬性,字段將自動注入。
示例代碼:

@Autowired
@Controller
public class UserController {
    private UserService userService;
    
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
}

2.AOP

AOP及動態代理的實現基於@Aspect,@PointCut,@Before,@After. @Aspect用於定義切面,用@Aspect修飾的類將自動注入代理類,而需要被代理的方法用@PointCut修飾, @Before@After用於制定通知,處理代理函數。如果你對Spring非常熟悉,那麼它的使用對你非常簡單。
示例代碼:

@Autowired
@Aspect
public class UserDao {
    
    @Pointcut
    public User login(User user){
        System.out.println("login()");
        List<User> list = Session.getSession().selectBysql("select * from user where username = ? and password = ?",User.class,user.getUsername(),user.getPassword());
        if(list.size()!=0){
            return list.get(0);
        }else {
            return null;
        }
    }
    
    @Before
    public void before(User user){
        System.out.println(user.getUsername()+"正在登錄");
    }
    
    @After
    public void after(User user){
        System.out.println("After login()");
    }
}

V1.1更新(2016.08.18)

1.支持多組URL映射到同一方法中

示例:

@Autowired
@Controller
public class UserController {
    private UserService userService;
    
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    @RequestMapping({"/login","/test"})
    public String login(HttpSession session,
                      User user) throws Exception{
        User us = userService.login(user);
        return "test.jsp";
    }
}

2.簡化查詢語句

示例:

public class UserDao {
    @Pointcut
    public User login(User user){
        //第一個參數調整爲查詢條件
        List<User> list = Session.getSession().selectBysql("username = ? and password = ?",User.class,user.getUsername(),user.getPassword());
        if(list.size()!=0){
            return list.get(0);
        }else {
            return null;
        }
    }
}

3.增加攔截器接口,用於實現權限管理

示例:

@Handle({".*.action",".*.html"})
@Except(".*test.action")
public class BaseHandle implements Interceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if(request.getSession.getAttribute("user")==null){
            request.getRequestDispatcher("/tests.jsp").forward(request, response);
            return false;
        }else return true;
    }
}

Handle和Except都支持寫入多組url或正則表達式進行url匹配, @Handle表示你想要攔截的url,@Except表示你要除去的url(不攔截的), 攔截器統一實現Interceptor接口,並通過重寫preHandle方法進行攔截,若返回值爲false表明攔截並跳過action(Controller)層方法,返回爲true則正常執行。

以上爲Dump的基本功能以及用法介紹,Dump還有很多特性以及細節這裏未能提及到。
想具體瞭解的可以fork本項目參與開發,也可以瀏覽用於本項目完成的Demo實例,喜歡的可以給我點個star給予支持,歡迎大家提出寶貴意見。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章