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.jar
和asm.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給予支持,歡迎大家提出寶貴意見。