ZolltyMVC框架是一款輕量級的Java應用程式設計框架(Java Application Framework),融合了常用的IOC/DI、MVC(註解、XML配置式、RESTful風格、模型驅動、檢視模板等)功能。雖說輕量、小巧(只有一個JAR包,幾百KB),但是常用功能一應俱全!!我們致力於幫助大家開發很高效、很靈活、很NICE的應用,並減輕工作量,提高產品質量。
一、功能簡介
1)IOC(DI)依賴注入
如果你用過Spring,你應該知道IOC這個概念。
引用書上的一個例子:
IOC是ZolltyMVC框架的基礎構件。其底層的實現原理,就是通過Java的反射機制,在這裡不詳細講解。
需要說明的是,ZolltyMVC的IOC遠遠沒有Spring的那麼複雜(但是日常應用應該是足夠了),而且還獨創一些很酷、很實用的用法。
關於其用法,我舉個例子:
寫一個JSP,然後寫一個Action,一個Service類,後面再寫一個DAO
即通常所說的三層結構,將DAO配置給Service,再把Service配置給Action。
這個功能比較流行的寫法是SSH(Struts+Spring+Hibernate),或者SpringMVC+JdbcTemplate。
傳統寫法,一個JSP,比如使用者註冊。程式碼略。
一個Action/Controller類。比如UserAction
public class UserAction{ private IUserService userService; public IUserService getUserService(){ return this.userService; } …… }
同理,還有UserServiceImpl類,裡面整合了UserDAO……然後UserDAO裡面又整合了資料來源……程式碼略。
用普通Struts+Spring的話,就要進行一些XML配置,使用SpringMVC的話,可以XML配置,也可以使用註解配置。
使用ZolltyMVC也很容易做到這一點,和SpringMVC類似,但是比SpringMVC乾脆直接。(Spring為了相容老版本,有許多冗餘的東西(所謂條條大路通羅馬,Spring中有多種方式可以通羅馬,而ZolltyMVC只提供最好的、最簡潔高效的那一、兩種方式)。
在ZolltyMVC中,推薦使用註解模式:
public class UserAction{ @Inject private IUserService userService; …… }
看到沒,多麼簡潔,連set/get方法都可以省了(因為我通過Java反射,直接將屬性值和物件繫結)。
當然,在ZolltyMVC中,也支援XML配置,例如:
<bean id="user" class="com.test.User" > <property name="name" >zollty</property> <property name="age" value="26" /> </bean> <bean id="user" class="com.test.UserDemo" > <property name="user" ref="user"/> </bean>
以上的這些,都是初級用法,ZolltyMVC的IOC還支援一些高階用法,比如給方法注入類的例項:
@Inject
public void setUser(User user) {
this.user = user;
}
還比如支援複合物件:
<bean id="user2" class="com.test.User > <property name="name" value="zollty" /> <property name="age" value="26" /> <property name="students" > <list> <value>jack</value> <value>lily</value> </list> </property> </bean>
還比如支援從方法中獲取一個物件例項:
<bean id="dataSource" class="org.test.JndiCreator#getDataSource" > <property name="jndiName" value="jdbc/web"/> </bean>
我參考了Spring的設計,頂層是定義了一個BeanFactory來容納這些bean例項的。
借用Spring的BeanFactory設計圖來讓大家看看:
這一套東西有點多,但卻是框架的基礎。從最基礎的簡陋模型,到參考Spring的設計,再到我自己重寫了兩遍,保證了這套東西的高效和高擴充套件性。
而且,從我的設計上,體現了一個基礎性的東西:
該IOC框架可以:
1,完全基於XML配置,或者完全基於註解配置,或者基於XML和註解的混合配置;
2,可以用於Web環境的專案,也可以用於純JavaSE的非Web專案。
3,高屋建瓴,頂層只實現了一些基礎性的、共有性的東西,外層可以擴充套件,實際上Web層也是IOC的一個擴充套件(WebApplicationContext)
2)控制器Action/Controller
控制器是MVC框架的核心,它連線了WEB的前端和後端。
ZolltyMVC的控制器,是基於原生Servlet進行設計的。有類似於SpringMVC的地方,但是效率比SpringMVC要高很多!
其實,最初我並沒有想寫一個MVC框架,我只是想基於Servlet寫一個“請求轉發控制器”,借鑑了OSChina創始人紅薯的寫法和RESTful的設計模式,以及Struts、Spring的具體實現方式,摸索出了一條極為便捷易用的道路。
下面是一個UserController
@Controller public class UserController{ @RequestMapping("/admin/logout") public View logout(HttpServletRequest request){ try { request.getSession().invalidate(); }catch (Exception e) {} return new RedirectView("/admin?info=bye"); } @RequestMapping("POST:/admin/login") public View login(@HttpParam("userName")String userName, @HttpParam("password")String password){ // ……省略 return new JspView("/admin/main.jsp"); } }
看上面的程式碼,登入的時候,訪問的URL為http://www.zollty.com/admin/login,ZolltyMVC框架會按照這個URL定位到login()這個方法,然後把引數自動賦值進去。然後login方法執行完會返回到一個檢視(View,檢視可以是JSP、HTML、XML、模板、靜態檔案等等)。這樣做會非常方便,程式設計更為靈活。
支援返回的型別包括(但不限於)如下型別:
JspView
HtmlView
TextView
JsonView
傳入的引數,也可以是一個POJO物件型別,比如寫一個VO,ZolltyMVC可以把頁面引數自動封裝成VO物件傳進來……這一切其實通過Java反射很容易實現。
對於URL的支援,ZolltyMVC支援原生RESTful,當然,你也可以不遵循RESTful風格,我個人覺得OSChina那種URL風格更簡潔、優雅,比如:
http://www.oschina.net/code
http://www.oschina.net/blog
http://www.oschina.net/code/tag/jquery
http://www.oschina.net/code/list?lang=java
其實你如果不想用任何框架,你可以像OSChina那樣,自己寫一個Servlet轉發控制器。不過,ZolltyMVC就是在簡單的Servlet轉發控制器的基礎上發展起來的,所以簡潔、高效。
ZolltyMVC可以和其他框架混合使用。不過,建議你使用ZolltyMVC代替SpringMVC、Struts等(前提是,你不需要用它們的那些高階功能)。
二、ZolltyMVC入門教程
1)新建一個動態web專案,引入zollty-mvc-1.0.7.jar包。
2)新建一個HelloController.java(假設包為com.zolltymvc.demo),內容如下:
@Controller public class UserController{ @RequestMapping("/admin/logout") public View logout(HttpServletRequest request){ try { request.getSession().invalidate(); }catch (Exception e) {} return new RedirectView("/admin?info=bye"); } @RequestMapping("POST:/admin/login") public View login(@HttpParam("userName")String userName, @HttpParam("password")String password){ // ……省略 return new JspView("/admin/main.jsp"); } }
然後,在/WEB-INF/pages目錄下,新建一個hello.jsp,內容大概如下
<html> <head> <metahttp-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <p>${msg}</p> </body> </html>
再弄一下配置,在classpath目錄下,新建一個zollty-mvc.xml,內容如下:
<?xmlversion="1.0" encoding="UTF-8"?> <beans xmlns="http://www.zollty.org/mvc/schema/beans"> <!-- 包的掃描路徑--> <component-scan base-package="com.zolltymvc.demo" /> <!-- 檢視路徑 --> <mvc view-path="/WEB-INF/pages" view-encoding="UTF-8" /> <!-- 指定日誌實現類 --> <logger class="ConsoleLogger" level="DEBUG" /> </beans>
這幾個配置很簡單吧,然後在找到web.xml,讓web容器啟動時載入ZolltyMVC框架,配置如下:
<listener> <listener-class>org.zollty.framework.mvc.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>zolltyMVC</servlet-name> <servlet-class>org.zollty.framework.mvc.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>zolltyMVC</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping>
OK,這樣專案釋出到伺服器上,訪問 http://www.zollty.com/app/hello 即可看到我們的輸出內容了!
稍後附上Demo下載,連專案帶jar一共大小才幾百kb!自己動手試試吧!從此,你就多了一種輕量級的MVC框架選擇。
ZolltyMVC專案開源地址:
http://code.google.com/p/zollty-mvc/
https://github.com/zollty-org/zollty-mvc