码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-31 06:45:42      阅读:868      评论:0      收藏:0      [点我收藏+]

标签:jfinal   配置   注解   

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


首先写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

本文出自 “7031393” 博客,请务必保留此出处http://7041393.blog.51cto.com/7031393/1680314

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

标签:jfinal   配置   注解   

原文地址:http://7041393.blog.51cto.com/7031393/1680314

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!