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
How To Use
jar包下載
你可以clone本項(xiàng)目到你的路徑下, 也可以導(dǎo)入jar包, 點(diǎn)此下載,除了項(xiàng)目本身的jar包,項(xiàng)目還依賴于cglib.jar
和asm.jar
用于實(shí)現(xiàn)動(dòng)態(tài)代理。其jar包文件在Github倉庫lib文件夾下,可直接下載。
配置文件
項(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給予支持,歡迎大家提出寶貴意見岳瞭。