Skip to content

100cm/thunder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

70 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

##Thunder是什么? 一个微型mvc 框架 轻巧,快速为一体。可以用作快速开发原型。

首先向所有开源作者表示尊敬

感谢以下同学的帮助:

王爵

kevin1999 ##Thunder有哪些功能?

  • 集成了轻量级的Aop 动态代理.
  • 集成了轻量级Ioc 不用再为 new 对象的另外一半而烦躁( =new duixiang() )
  • 路由型过滤器,无性能损耗,lamda表达式让你的代码时尚时尚更时尚
  • 集成了轻量级伪ActiveRecord 。对service厌烦的同学在原型里和Service层说88吧!(虽然这样做并不是很好)
  • Restful风格的路由。多路由自动生成。告别重复编程烦恼(目前还是残疾的 后续会优化)。
  • 支持jdk1.6 (AOP 只支持1.8+) 以及更高版本

##最新&准备更新(2016-5-8)

  • 解决了aop 和 路由冲突的问题
  • 解决了资源路由冲突的bug
  • 着手准备build型实体类的注解

##最新更新(2016-4-5)

  • 修复了ioc 和aop 不能共用的问题
  • 添加了一个restful接口(可以更快的生成路由功能)

##有问题反馈 在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

##开始使用 首先clone此源码,可以打包成jar或者直接在项目中使用 创建一个maven webapp 项目 并且在xml中添加如下配置

    <servlet>
        <servlet-name>thunder</servlet-name>
        <servlet-class>com.thunder.web.ThunderDispatcher</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>lighting</param-name>
            <param-value>App</param-value>
        </init-param>
    </servlet>

在根目录下创建App.java 并且继承lighing接口

public class App implements Lightning{
    @Override
    public void init(Thunder thunder) {
        
     }
}

这样我们第一个thunder应用就完成啦!

##增加路由 我们的应用目前还没有任何路由配置 接下来我们去给应用添加资源以及路由

首先我们增加welcome路由

  public class App implements Lightning{
    @Override
    public void init(Thunder thunder) {
      //这里会增加restful 7条路由
      //get -> /welcome  method:index
      //get -> /welcome/new  method:fresh
      //post -> /welcome/create  method:create
      //put  -> /welcome/:id/update method:update
      //get  -> /welcome/:id/edit   method:edit
      //delete  -> /welcome/:id/delete method:delete
      //get -> /welcome/:id   method:show
      
      //此资源调用welcom类下的方法
      thunder.addResource("welcome",new Welcome()); 
      
      //增加单独一条路由 执行welcome 类下index方法
      thunder.addRoute("/demo", Var.GET,"index",new Welcome());
     }
}

然后我们增加一条过滤路由

      thunder.before("/demo",Var.GET,(request,response)->{
         System.out.print("我拦截demo啦!");
      });

也可以以大家熟悉的注解方式增加路由

@Controller
public class test {

  //IOC 依赖注入
  @Inject
  Util util;

  @Action(value = "/demo",method = "GET")
  //Aop 拦截此方法
  @Check
  public void demo(Request request, Response response){
      System.out.print("hello world");
  }
}

##请求响应 看完以上 增加完路由之后 我们还要给它进行响应 首先我们有一张表单

<form method="post" action="/welcome/create">
<input type="text" name="username" />
<button type="submit">submit</button>
</form>

对应的java Welcome.java 类

public void create(Request request ,Response response){

        User user = (User)request.getModel(User.class);

        System.out.print(user.getUsername());

   }

当提交这个表单 会执行welcome类下的create方法

详见生成resource的注释。

#####如何跳转?

还是刚才那个方法

public void create(Request request ,Response response){

        User user = (User)request.getModel(User.class);

        System.out.print(user.getUsername());
       
        //进行页面渲染
        response.render("/hello");
        
        //进行重定向
        response.redirect_to("/welcome/3");
        
        

   }

######获取参数呢?发送参数呢?

//发送参数
request.sendParams("key",value);
//获取资源id
request.resourceId();
//获取参数
request.params("key");
request.paramsAsInt("key")

##IOC 使用

和spring使用方法大同小异 使用inject 注解即可

//将demo注入容器
@Inject
 Demo demo

##Aop的使用

Aop 通俗理解为动态代理 再通俗一点。就是再执行某件事之前 我要先交给小弟先准备工具

自己再做这件事 如果小弟那边出错 我就不用做了。

首先我们要建立一个注解 当作判断切入点。

现在我们拥有一个@check 注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Check {
}

现在我们要切入加过这个注解的方法

这里就是我们的小弟了

/**要代理的注解类 或注解方法
* 
*/
@Aspect(value = Check.class)
public class Aoptest extends AspectProxy {

/**
 * 重写父类代理方法 对应前置增强 后置增强 环绕增强
 * @param c 对应的代理类
 * @param method 代理执行方法
 * @param params 参数
 * @throws Throwable
 */
public void before(Class<?> c , Method method, Object[] params)throws Throwable{

    System.out.print(" i am in proxy");

}

/**
 * 环绕增强 如果返回true 则进行前后增强  false则只执行被切入方法
 * @param c
 * @param method
 * @param params
 * @return
 * @throws Throwable
 */
public boolean intercept(Class<?> c ,Method method,Object[] params)throws Throwable{
    //返回
    return true;
}

/**
 * 
 * @param c
 * @param method
 * @param params
 * @param o 代理对象
 * @throws Throwable
 */
public void after(Class<?> c ,Method method,Object[] params , Object o)throws Throwable{


}
}

接下来我们在大哥上面加标记(@Check)

@Controller
public class test {

  //IOC 依赖注入
  @Inject
  Util util;

  @Action(value = "/demo",method = "GET")
  //Aop 拦截此方法
  @Check
  public void demo(Request request, Response response){
      System.out.print("hello world");
  }
}

小弟执行顺序为 before -> 大哥方法 -> after

##伪ActiveRecord 首先我们先有一张user表

表结构对应实体类User (名字要对应一致!!!!) 这也是约定>配置的最重要的一点

创建user类之后 我们就可以开始愉快的crud了

  public static void main(String args[]){
      //数据库链接 这一部必须要加在初始化的thunder里。
      DB.open("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1/test", "root", "root");
      User user = new User();
      user.setAge(3);
      user.setId(34);
      user.setPassword("");
      
      Model.select("id","username").list(User.class);
      
      Model.where("id","26").list(User.class);
      //id=25并且根据id排序的user
      Model.where("id","25").orderBy("id").one(User.class);
      
      List<User> users = Model.find_by_sql("select * from user");
      
      Model.find_all(User.class);
      //id大于20的user
      Model.whereGt("id","20").list(User.class);
      
      Model.save(user);
      
      Model.where("id","28").update(user);
      
      //update的数据必须带id 否则会报错
      Model.update(user);
      
      //删除
      Model.delete(1,User.class);
  }
}

##其他

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages