ZolltyMVC Framework Introduction
2013年10月09日

ZolltyMVC框架简介

 

版本信息:

版本号

日期

操作

内容

操作人

V1.0

2013-10-09

新建

新建版本1.0

zollty

V1.2

2013-11-19

新建

新建版本1.2

zollty

 

 

 

 

 

 

 

 

 

 

 

 

ZolltyMVC框架是一款轻量级的Java应用编程框架(Java Application Framework)。

 

1. Web层:它是一个通用纯Servlet请求控制转发器(RESTful URL 路由,代码简洁、效率非常高),基于原生RESTful设计,且支持各种定制化URL方案。扩展功能支持拦截器配置,支持ModelDriven(视图层VO自动封装),支持多视图模板(Jsp View、JSON View等,SeeDEMO)。

2. Bean:它是一个轻量级IOC/DI框架,可以独立应用于Standard Java,强大的支持各种形式加载Bean,强大的可扩展性。(只支持单实例,功能比Spring的要精简很多,但是一般够用了)

3. 对于中小型项目,它完全可以替代SpringMVC、Spring+Struts,已经经过多个企业级生产项目的考验,高效稳定运行于Tomcat、Jetty、WebSphere、JBOSS服务器。

4. 小巧,无外部依赖。只有一个jar包,200多kb,比Spring要精简很多,而且常用功能一应俱全,并增加了一些nice的功能。

 

ZolltyMVC融合了常用的IOC/DIMVC(注解、XML配置、RESTful API、模型驱动、视图模板等)功能。目的就是帮助大家开发高效、灵活、高质量的应用,并减轻开发工作量!

 

但它不是Spring的继承者,它是一个有个性、有思考的简易实用型框架。

 

一、功能简介

 

1IOCDI)依赖注入

 

IOC/DI不容易理解,引用书上的一个例子,感受一下IOC/DI的好处:

 

 

IOCZolltyMVC框架的基础构件。其底层的实现原理,就是通过Java的反射机制,在这里不详细讲解。

需要说明的是,ZolltyMVCIOC远远没有Spring的那么复杂(但是日常应用应该是足够了),而且还独创一些很酷、很实用的用法。

 

关于其用法,我举个例子:(传统SSH写法)

 

一个JSP,然后写一个Action,一个Service类,后面再写一个DAO

即通常所说的三层结构,将DAO注入给Service,再把Service注入Action

这个功能比较流行的写法是SSHStruts+Spring+Hibernate),或者SpringMVC+JdbcTemplate

 

传统写法:

1、一个JSP,比如用户注册,代码略。

2、一个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>

 

以上的这些,都是初级用法,ZolltyMVCIOC还支持一些高级用法,比如给方法注入类的实例:

@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实例的。

 

借用SpringBeanFactory设计图来让大家看看:

 

 

这一套东西是框架的基础。从最基础的简陋模型,到参考Spring的设计,再到我重写两遍,保证了这套东西的高效、高扩展性。

 

而且,从我的设计上,体现了几个基础性的东西:

IOC框架可以:

1,完全基于XML配置,或者完全基于注解配置,或者基于XML和注解的混合配置;

2,可以用于Web环境的项目,也可以用于纯JavaSE的非Web项目。

3,高屋建瓴,顶层只实现了一些基础性的、共有性的东西,外层可以扩展,实际上Web层也是IOC的一个扩展(WebApplicationContext

 

 

2)控制器Action/Controller

 

控制器是MVC框架的核心,它连接了WEB的前端和后端。

 

ZolltyMVC的控制器,是基于原生Servlet进行设计的。有类似于SpringMVC的地方,但是效率比SpringMVC要高很多!(比如,因为SpringMVC要支持多文件上传,其逻辑就比ZolltyMVC的HTTP请求处理逻辑要复杂许多了。我对比了一下两者的算法复杂度,SpringMVC的算法复杂度至少是ZolltyMVC的n*10^2倍。而且还有一点,SpringMVC采用的是AntPathMatcher,是ANT的URL路径匹配算法,ZolltyMVC采用的是自己写的一个简洁的递归算法,实测它的匹配效率是ANT的几十倍,参见org.zollty.util.match.ZolltyPathMatcher.java, 及其单元测试用例。)

 

其实,最初我并没有想写一个MVC框架,我只是想基于Servlet写一个“请求转发控制器”,借鉴了OSChina创始人红薯的写法和RESTful的设计模式,以及StrutsSpring的具体实现方式,摸索出了一条极为便捷易用的道路。请看下面的用法示例:

 

下面是一个UserController

@Controller

public class UserController{

   @RequestMapping("/admin/logout") // RESTful风格URL路由

   public View logout(HttpServletRequest request){

                // ……省略

                return new RedirectView("/admin?info=bye"); //跳转到另一个URL

   }

   @RequestMapping("POST:/admin/login") // RESTful风格URL路由-限定为POST方式

   public View login(@HttpParam("userName")String userName,

                             @HttpParam("password")String password){

                // ……省略

                return new JspView("/admin/main.jsp"); // 返回到JSP 视图层

   }

}

看上面的代码,登录的时候,访问的URLhttp://www.zollty.com/admin/loginZolltyMVC框架会按照这个URL定位到login()这个方法,然后把参数自动赋值进去。然后login方法执行完会返回到一个视图View视图可以是JSPHTMLXML、模板、静态文件等等,甚至可以扩展自定义的View,例如我写了个ResourceView,读取jar包中META-INF目录下的html页面)。这样做会非常方便,编程更为灵活。

 

支持返回的类型包括(但不限于)如下类型:

JspView

HtmlView

TextView

JsonView

 

传入的参数,也可以是一个POJO对象类型,比如写一个VOZolltyMVC可以把页面参数自动封装成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可以和其他框架混合使用(我曾轻松把它和Struts 2集成,只需要在Servlet转发的时候处理一下即可)。不过,建议你使用ZolltyMVC代替SpringMVCStruts等(前提是,你不需要用它们的那些高级功能)

 

二、ZolltyMVC入门教程

 

1)新建一个动态web项目,引入zollty-mvc-1.0.7.jar包。

 

2)新建一个HelloController.java(假设包为com.zolltymvc.demo),内容如下:

import org.zollty.framework.mvc.View;

import org.zollty.framework.mvc.annotation.Controller;

import org.zollty.framework.mvc.annotation.RequestMapping;

import org.zollty.framework.mvc.view.JspView;

@Controller

public class HelloController {

       @RequestMapping("/hello")

       public View index(HttpServletRequest request) {

        request.setAttribute("msg","hello, welcome to zollty mvc demo project!");

        return new JspView("/hello.jsp");

       }

}

然后,在/WEB-INF/pages目录下,新建一个hello.jsp,内容大概如下

<%@ pagelanguage="java" pageEncoding="UTF-8"%>

<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下载,自己动手试试吧!丢掉SpringMVCStruts,拥抱ZolltyMVC吧!

 

 

ZolltyMVC项目会逐渐开源,地址如下,敬请关注:

https://github.com/zollty-org/zollty-mvc

http://code.google.com/p/zollty-mvc/

 

 

Published on: 2013-10-09 20:17:51
Author: Zollty Tsou
Orginal Article. Licensed under the CC BY-NC-SA      3.0 CN
Email: zollty@163.com (blog: blog.zollty.com)