写了个简单的 MVC 框架

前言

前些日子写的轻量级 MVC 框架已经写得差不多了,基于 Servlet,同时我也封装了 JDBC 来提供对数据库的访问。当初写这个框架是为了了解 servlet 是如何工作的,同时也作为自己的一个小项目,思路参考了《架构探险:从零开始写 Java Web 框架》。虽然写这个框架只是作为学习之用,但后面还是会继续完善和优化。附上Github地址

快速使用

Maven

<dependency>
    <groupId>group.jbee</groupId>
    <artifactId>jbee-framework</artifactId>
    <version>1.0.1</version>
</dependency>

还未上传 Maven 仓库,找不到依赖可 clone 本项目,执行 mvn
install 打包到本地仓库。也可以直接下载 jar 包,点此下载

其他依赖

MySQL 驱动

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.33</version>
</dependency>

配置文件

在 resource 目录下新建 jbee.properties 配置文件,配置项如下

/***JDBC 驱动 */
jbee.framework.jdbc.driver=com.mysql.jdbc.Driver
/***JDBC URL*/
jbee.framework.jdbc.url=jdbc:mysql://localhost:3306/jbee
/***JDBC 用户名 */
jbee.framework.jdbc.username=root
/***JDBC 密码 */
jbee.framework.jdbc.password=123456
/***JDBC 连接池最大数量 */
jbee.framework.jdbc.max=5
/***JDBC 连接池最小数量 */
jbee.framework.jdbc.min=2
/*** 应用基础包名 */
jbee.framework.app.base_package=group.jbee.jbeedemo
/***JSP 路径 */
jbee.framework.app.jsp_path=/view/
/*** 静态资源路径 */
jbee.framework.app.static_path=/static/

当然,还有 web.xml 配置

<servlet-mapping>
    <servlet-name>defaultservlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>defaultservlet</servlet-name>
    <servlet-class>group.jbee.framework.DispatcherServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>

以上就是所有必要的配置,下面看如何使用

IOC

IOC 是 Spring 的核心,Jbee 也实现了一个简单的 IOC 容器。
使用注解 @Inject 修饰需要注入的类。

示例代码:

@Controller
public class HelloAction {

    @Inject
    private UserService userService;

    ......
}
@Service
public class UserService {

    @Inject
    UserMapper userMapper;

    public List<User> getUserInfo(User user){
        return userMapper.getUserInfo(user);
    }
    public void createUser(User user){
        userMapper.createUser(user);
    }
}

Controller

与 Spring MVC 差不多,使用 @Controller 注解来修饰控制器类,使用 @Action 注解来匹配 URL

示例代码:

@Controller
public class HelloAction {

    @Inject
    private UserService userService;

    // 返回 json 数据
    @Action("POST:/Action1")
    public Data action1(Param param){
        Map<String,Object> params = param.getMap();
        String name = (String) params.get("name");
        User user= new User();
        user.setName(name);
        Data data=new Data(userService.getUserInfo(user));
        return data;
    }
    // 返回 jsp 页面
    @Action("GET:/Action2")
    public View action1(){
        View view = new View("hello.jsp");
        // 使用 EL 表达式 ${data} 取值
        view.setModel("data","HelloJbee!";
        return view;
    }
}

DAO

持久层与 Mybatis 类似,只需编写 DAO 接口以及 SQL 语句,目前只支持静态 SQL,用占位符 #{} 来设置参数。接口用注解 @Repository 声明,方法用 @Select、@Insert、@Delete、@Update 来声明。

示例代码:

@Repository
public interface UserMapper {

    @Select("select * from users where name=#{name}")
    List<User> getUserInfo(User user);

    @Insert(value = "insert into users(name,password) values(#{name},#{password})")
    void createUser(User user);
}

最后

将项目打 war 包,放到 Tomcat 等 servlet 容器里就可以跑起来了。

寒假比较摸,AOP 还没写 -。-,会尽快写完吧,毕竟大三下又要很忙了。

框架实现原理后面我也会分享在博客里。