Dump-一個(gè)輕量級(jí)mvc框架

Info

基于反射阶女,自己寫了一套框架颊糜,完全開源,Github地址:Dump-輕量級(jí)mvc框架秃踩,取名Dump, 正如它的名字一樣, Simple is everything.Dump是一個(gè)輕配置衬鱼,完全基于注解開發(fā)的框架, 他甚至沒有自己的xml文件,一切基于注解。Dump分為三個(gè)模塊, 它們各執(zhí)其責(zé), 相互配合完成整個(gè)工作憔杨。當(dāng)然,三個(gè)模塊也相互獨(dú)立,完全解藕,可根據(jù)需要自行設(shè)定選擇鸟赫。
快速了解可根據(jù)文檔閱讀Demo:A Demo of Dump

Structure

structure.png

How To Use

jar包下載

你可以clone本項(xiàng)目到你的路徑下, 也可以導(dǎo)入jar包, 點(diǎn)此下載,除了項(xiàng)目本身的jar包,項(xiàng)目還依賴于cglib.jarasm.jar用于實(shí)現(xiàn)動(dòng)態(tài)代理。其jar包文件在Github倉庫lib文件夾下,可直接下載。

配置文件

jdbc.png

項(xiàng)目唯一需要你配置的就是數(shù)據(jù)庫的配置文件, 配置文件名為jdbc.properties,位于src目錄下,配置項(xiàng)如下抛蚤。


注:配置項(xiàng)packageName的配置內(nèi)容不能等于Dump的默認(rèn)包名,即不能等于com.

當(dāng)然web.xml文件也要配置為Dump默認(rèn)的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>

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

Controller

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

@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轉(zhuǎn)發(fā)跳轉(zhuǎn)頁面
            return "success.jsp";
        }
    }
}

ORM

對(duì)于對(duì)象關(guān)系映射, Dump也提供了基本的函數(shù)操作, 包括分頁操作, 而相對(duì)復(fù)雜的查詢工作還是依賴于sql語句,但再也不用你來創(chuàng)建對(duì)象了,這位你節(jié)省下很大的工作量∷昃基本函數(shù)如有: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加入數(shù)據(jù)庫中
        //Session.getSession().load(User.class,2);加載id為2的User(刪除delete,更新update同理)
        //Session.getSession().getAll(User.class);得到數(shù)據(jù)庫里user的所有映射類(getCount同理)
        //Session.getSession().selectByPage("select * from user",User.class,int pageNo, int pageSize);//得到指定頁制定大小的實(shí)體類列表
        if(list.size()!=0){
            return list.get(0);
        }else {
            return null;
        }
    }
}

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

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

IOC/AOP

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

利用注解@Autowired進(jìn)行自動(dòng)裝備, 與Spring不同,@Autowired需要修飾需要注入的類, 而類本身和類里含有set方法的屬性,字段將自動(dòng)注入缀壤。
示例代碼:

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

2.AOP

AOP及動(dòng)態(tài)代理的實(shí)現(xiàn)基于@Aspect,@PointCut,@Before,@After. @Aspect用于定義切面,用@Aspect修飾的類將自動(dòng)注入代理類,而需要被代理的方法用@PointCut修飾, @Before@After用于制定通知,處理代理函數(shù)樊拓。如果你對(duì)Spring非常熟悉,那么它的使用對(duì)你非常簡(jiǎn)單。
示例代碼:

@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.簡(jiǎn)化查詢語句

示例:

public class UserDao {
    @Pointcut
    public User login(User user){
        //第一個(gè)參數(shù)調(diào)整為查詢條件
        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.增加攔截器接口,用于實(shí)現(xiàn)權(quán)限管理

示例:

@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或正則表達(dá)式進(jìn)行url匹配, @Handle表示你想要攔截的url,@Except表示你要除去的url(不攔截的), 攔截器統(tǒng)一實(shí)現(xiàn)Interceptor接口,并通過重寫preHandle方法進(jìn)行攔截,若返回值為false表明攔截并跳過action(Controller)層方法,返回為true則正常執(zhí)行塘慕。

以上為Dump的基本功能以及用法介紹筋夏,Dump還有很多特性以及細(xì)節(jié)這里未能提及到。
想具體了解的可以fork本項(xiàng)目參與開發(fā)图呢,也可以瀏覽用于本項(xiàng)目完成的Demo實(shí)例条篷,喜歡的可以給我點(diǎn)個(gè)star給予支持,歡迎大家提出寶貴意見岳瞭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拥娄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞳筏,更是在濱河造成了極大的恐慌稚瘾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姚炕,死亡現(xiàn)場(chǎng)離奇詭異摊欠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柱宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門些椒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掸刊,你說我怎么就攤上這事免糕。” “怎么了忧侧?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵石窑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蚓炬,道長(zhǎng)松逊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任肯夏,我火速辦了婚禮经宏,結(jié)果婚禮上犀暑,老公的妹妹穿的比我還像新娘。我一直安慰自己烁兰,他們只是感情好耐亏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缚柏,像睡著了一般苹熏。 火紅的嫁衣襯著肌膚如雪碟贾。 梳的紋絲不亂的頭發(fā)上币喧,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音袱耽,去河邊找鬼杀餐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朱巨,可吹牛的內(nèi)容都是我干的史翘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冀续,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼琼讽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洪唐,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤钻蹬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凭需,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體问欠,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年粒蜈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顺献。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枯怖,死狀恐怖注整,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情度硝,我是刑警寧澤肿轨,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站塘淑,受9級(jí)特大地震影響萝招,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜存捺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一槐沼、第九天 我趴在偏房一處隱蔽的房頂上張望曙蒸。 院中可真熱鬧,春花似錦岗钩、人聲如沸纽窟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臂港。三九已至,卻和暖如春视搏,著一層夾襖步出監(jiān)牢的瞬間审孽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工浑娜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佑力,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓筋遭,卻偏偏與公主長(zhǎng)得像打颤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漓滔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容