简单实现JFinal注解配置Controller,Model

本人小菜一枚,表达能力也不是很好,哪里写了不好的地方请大神评论下。

首先写Controller对映的注解,这里我将其命名为C

这个注解现在比较简单些

net.zz.annotation;
java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@C {
    String value();
}
首先写Model对映的注解,这里我将其命名为M这个注解现在也是比较简单些,呵呵!
net.zz.annotation;

java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@M
{
    String value() ;String id() ;
}
注解写好了,接下来得写一个对类的扫描器.这里我写了也比较简单,主要只是为了实现这个Demo
net.zz.plugin;

javax.servlet.http.HttpServletRequest;
java.io.File;
java.io.FileFilter;
java.io.IOException;
java.net.JarURLConnection;
java.net.URL;
java.net.URLDecoder;
java.util.Enumeration;
java.util.LinkedHashSet;
java.util.Set;
java.util.jar.JarEntry;
java.util.jar.JarFile;

Scan {
    HttpServletRequest request;
    Scan() {
    }

    Scan(HttpServletRequest request) {
        .request = request;
    }

    Set<Class<?>> getClasses(String pack) {
        
           Set<Class<?>> classes = LinkedHashSet<Class<?>>();  
           recursive = ;  
           String packageName = pack;  
           String packageDirName = packageName.replace(, ); 
           
           Enumeration<URL> dirs;  
           {  
               dirs = Thread.currentThread().getContextClassLoader().getResources(  
                       packageDirName);  
               (dirs.hasMoreElements()) {  
                   URL url = dirs.nextElement();  
                   String protocol = url.getProtocol();  
                   (.equals(protocol)) {  

                       String filePath = URLDecoder.decode(url.getFile(), );  
                       findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);  
                   } (.equals(protocol)) {  
                       JarFile jar;  
                       {  
                           jar = ((JarURLConnection) url.openConnection())  
                                   .getJarFile();  
                           Enumeration<JarEntry> entries = jar.entries();  
                           (entries.hasMoreElements()) {  
                               JarEntry entry = entries.nextElement();  
                               String name = entry.getName();  
                               (name.charAt() == ) {  
                                   name = name.substring();  
                               }  
                               (name.startsWith(packageDirName)) {  
                                   idx = name.lastIndexOf();  
                                   (idx != -) {  
                                       packageName = name.substring(, idx)  
                                               .replace(, );  
                                   }  
                                   ((idx != -) || recursive) {  
                                       (name.endsWith()  
                                               && !entry.isDirectory()) {  
                                           String className = name.substring(  
                                                   packageName.length() + , name  
                                                           .length() - );  
                                           {  
                                               classes.add(Class  
                                                       .forName(packageName + + className));  
                                           } (ClassNotFoundException e) {  
                                               e.printStackTrace();  
                                           }  
                                       }  
                                   }  
                               }  
                           }  
                       } (IOException e) {  
                           e.printStackTrace();  
                       }  
                   }  
               }  
           } (IOException e) {  
               e.printStackTrace();  
           }  
     
           classes;  
       }  
    
    
    
      findAndAddClassesInPackageByFile(String packageName,  
               String packagePath, recursive, Set<Class<?>> classes) {  
           File dir = File(packagePath);  
           (!dir.exists() || !dir.isDirectory()) {  
               ;  
           }  
           File[] dirfiles = dir.listFiles(FileFilter() {  
               accept(File file) {  
                   (recursive && file.isDirectory())  
                           || (file.getName().endsWith());  
               }  
           });  
           (File file : dirfiles) {  
               (file.isDirectory()) {  
                   findAndAddClassesInPackageByFile(packageName + + file.getName(), file.getAbsolutePath(), recursive,  
                           classes);  
               } {  
                   String className = file.getName().substring(,  
                           file.getName().length() - );  
                   {  
                       Class<?> cls=Thread.currentThread().getContextClassLoader().loadClass(packageName + + className);
                            
                                           classes.add(cls);    
                                   } (ClassNotFoundException e) {  
                       e.printStackTrace();  
                   }  
               }  
           }  
       }  
      
      
        
   getName(String path) {  
          File file = File(path);  
              (file.isDirectory()) {  
                  File[] dirFile = file.listFiles();  
                  (File f : dirFile) {  
                      (f.isDirectory())  
                          getName(f.getAbsolutePath());  
                      {  
                          (f.getName().endsWith())  
                              System.out.println(f.getAbsolutePath());  
                      }  
                  }  
              }  
          }  

}
这个简单的扫描起就这样写完了,接下来就是最重要的JFinal配置的部分,实现注解处理适配的部分
编写一个抽象类JFinalConfig,这个配置类跟之前写的差不多,我们继承com.jfinal.config.JFinalConfig这个类,并实现下面这几个方法
public void configRoute(Routes me) public void configPlugin(Plugins me) 编写三个抽象方法
controlSscan(List<String> controlPackage);

componentSscan(List<String> basePackage);

IDataSourceProvider setDataSource ();controlSscan方法主要用于设置controller的扫描,componentSscan也是一样的意思。setDataSource 这个方法配置数据源。接下来一个是用于开发者进行需要时覆盖的方法,用于活动记录的插件添加addActiveRecord(ActiveRecordPlugin arp){}下面是对应的具体代码。net.zz.config;

com.jfinal.config.*;
com.jfinal.core.Controller;
com.jfinal.plugin.IPlugin;
com.jfinal.plugin.activerecord.ActiveRecordPlugin;
com.jfinal.plugin.activerecord.IDataSourceProvider;
com.jfinal.plugin.activerecord.Model;
com.jfinal.plugin.c3p0.C3p0Plugin;
net.zz.annotation.C;
net.zz.annotation.M;
net.zz.plugin.Scan;

java.util.ArrayList;
java.util.List;
java.util.Set;

JFinalConfig  com.jfinal.config.JFinalConfig{

    List<String> controlPackage = ArrayList<String>();
    List<String> basePackage = ArrayList<String>();

    controlSscan(List<String> controlPackage);

    componentSscan(List<String> basePackage);

    IDataSourceProvider setDataSource (showSql);

    @Override
    configRoute(Routes me) {

controlSscan(controlPackage);Scan driven = Scan();
        (String pake : controlPackage){
            Set<Class<?>> clazzs = driven.getClasses(pake);
            (Class<?> clazz : clazzs) {
                System.out.println(clazz.getName());
               (clazz.isAssignableFrom(com.jfinal.core.Controller.)) {
                   C con = clazz.getAnnotation(C.);
                   (!= con) {
                       me.add(con.value(), (Class<? Controller>) clazz);
                   }
               }
            }
        }
    }

    @Override
    configPlugin(Plugins me) {

         componentSscan(basePackage);
       
        IDataSourceProvider iDataSourceProvider = setDataSource();
        {
            me.add((IPlugin) iDataSourceProvider);
        }(Exception e){
            RuntimeException();
        }
        ActiveRecordPlugin arp = ActiveRecordPlugin(iDataSourceProvider);
        addActiveRecord(arp); Scan driven = Scan();
        (String pake : controlPackage){
            Set<Class<?>> clazzs = driven.getClasses(pake);

            (Class<?> clazz : clazzs) {
                System.out.println(clazz.getName());
                (clazz.isAssignableFrom(com.jfinal.plugin.activerecord.Model.)) {
                   M model = clazz.getAnnotation(M.);
                    (!= model) {
                        arp.addMapping(model.value(), model.id(), (Class<? Model<?>>) clazz);
                    }
                }
            }
        }
        me.add(arp);
    }

    addActiveRecord(ActiveRecordPlugin arp){       // arp.setShowSql(true);//设置是sql显示开关
        }

}



接下来是简单实现Config配置的例子
package net.zz.config;
import com.jfinal.plugin.activerecord.IDataSourceProvider;
import net.mzzo.inter.JsonCrossDomain;
import net.mzzo.inter.Login;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import net.zz.config.JFinalConfig;
import java.util.List;
public class ZZConfig extends JFinalConfig {
   public void configConstant(Constants me) {
      loadPropertyFile("config.properties");
      me.setDevMode(getPropertyToBoolean("devMode", false));
   }
   public void configHandler(Handlers me) {
      
   }
    @Override
    public void controlSscan(List<String> list) {
        list.add("net.zz.controler");
        list.add("net.zz.util");
    }
    @Override
    public void componentSscan(List<String> list) {
        list.add("net.mzzo.model");
    }
    @Override
    public IDataSourceProvider setDataSource() {
        showSql = true;
        C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"), getProperty("driverClass"), getPropertyToInt("maxPoolSize"), getPropertyToInt("minPoolSize"), getPropertyToInt("initialPoolSize"), getPropertyToInt("maxIdleTime"), getPropertyToInt("acquireIncrement"));
        return c3p0Plugin;
    }
    public void configInterceptor(Interceptors me) {
      me.add(new JsonCrossDomain());
      me.add(new Login());
   }
}
//接下来就是Controller的例子

@C("/users")
public class UsersControl extends Controller {

}
下面就是Model的例子

@M("users")
public class Users extends Model<Users> {

}

再次说下表达不是很好。
接下来的想法是将JFinal的Model部分稍微包装一下,github地址:https://github.com/cnzzs/zjf
时间: 2024-10-13 11:47:02

简单实现JFinal注解配置Controller,Model的相关文章

SpringMVC 基于注解的Controller @RequestMapping @RequestParam

概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.如今你无须让 Controller 继承不论什么接口.无需在 XML 配置文件里定义请求和 Controller 的映射关系.只使用注解就能够让一个 POJO 具有 Controller 的绝大部分功能 -- Spring MVC 框架的易用性得到了进一步的增强.在框架灵活性.易用性和扩展性上.Spring MVC 已经全面超越了其他的 MVC 框架.伴

SpringMVC 基于注解的Controller详解

本文出处 http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller 的映射关系,仅仅使用注解就可以让一个 POJO 具有 Controller 的绝大部分功能 —— Spring MVC 框架的易

基于注解配置的Spring MVC 简单的HelloWorld实例应用

2.1 问题 使用注解的方式重构helloworld应用案例. 2.2 方案 1. @RequestMapping注解应用 @RequestMapping可以用在类定义和方法定义上,它标明这个类或方法与哪一个客户请求对应.实例代码如下: @RequestMapping("/day01") public class HelloController { @RequestMapping("/hello.form") public String execute() thro

增加mvc:resources后访问不了注解配置的controller的问题

刚开始没有配置mvc:resourcescontroller能够正确访问,但是由于web.xml使用/拦截了所有的请求,所以静态资源访问不上增加mvc:resources之后,静态资源是能访问上了,但是注解配置的controller却又找不到了 原因是少了 <mvc:annotation-driven />的配置在没有配置mvc:resources的时候没有问题一旦配置了mvc:resources,注解方式的url就没有加载 这种情况下 补上 <mvc:annotation-driven

Spring MVC注解配置结合Hibernate的入门教程及其代码实例

原文:Spring MVC注解配置结合Hibernate的入门教程及其代码实例 源代码下载地址:http://www.zuidaima.com/share/1787210045197312.htm 1.概述 本文旨在搭建Spring MVC+Hibernate开发框架,通过一个简单的demo讲解Spring MVC的相关配置文件,以及通过注解方式实现简单功能. 开发框架:Spring+Spring MVC+Hibernate(Spring所用的版本为3.0.5). 数据库:MySQL(数据库名称

注解配置的Spring MVC

基于注解配置的Spring MVC 简单的HelloWorld实例应用 2.1 问题 使用注解的方式重构helloworld应用案例. 2.2 方案 1. @RequestMapping注解应用 @RequestMapping可以用在类定义和方法定义上,它标明这个类或方法与哪一个客户请求对应.实例代码如下: @RequestMapping("/day01") public class HelloController { @RequestMapping("/hello.form

spring mvc jfreechar注解配置及数据库访问

1.action类,使用注解配置的: package com.t5.manage.action;import java.awt.Font;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map; import javax.annotation.Resource;import javax.servl

注解配置springMvc及向作用域中赋值

1.在applicationContext.xml中配置包扫描器 <!-- 使用注解配置扫描器 --> <context:component-scan base-package="cn.cnsdhzzl.controller" /> 2.配置controller /*处理器*/ @Controller /* 命名空间 */ @RequestMapping("/annotation") public class AnnotationContro

Spring MVC中基于注解的 Controller

终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMethodNameResolver) 就已经可以在很大程度上帮助我们省去不少的 XML 配置,谁让