从零写一个JavaWEB框架的演进

上传人:m**** 文档编号:46125208 上传时间:2018-06-22 格式:DOCX 页数:13 大小:417.72KB
返回 下载 相关 举报
从零写一个JavaWEB框架的演进_第1页
第1页 / 共13页
从零写一个JavaWEB框架的演进_第2页
第2页 / 共13页
从零写一个JavaWEB框架的演进_第3页
第3页 / 共13页
从零写一个JavaWEB框架的演进_第4页
第4页 / 共13页
从零写一个JavaWEB框架的演进_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《从零写一个JavaWEB框架的演进》由会员分享,可在线阅读,更多相关《从零写一个JavaWEB框架的演进(13页珍藏版)》请在金锄头文库上搜索。

1、从零写一个从零写一个 JavaJava WEBWEB 框架的演进框架的演进从一个简单的 Servlet 项目开始起步,对每一层进行优化,然后形成一个轻量级的框架。 每一篇,都是针对项目的不足点进行优化的。 项目已放上 github。项目现在也跑起来了,而且 Server 和 Dao 层都已经封装好了,都可以专心处理各自的业务逻辑,耦合度也低了很多。但是项目还是有很多需要改进的地方。例如:Controller 层 的耦合度还是非常高。首先请求由 doGet()和 doPost()获取,然后从消息头里面获取 url 或者参数,然后进行逻辑判断是需要进行哪些业务。当业务多的时候,Controller

2、 层就会变得很臃肿,而且耦合度很高。层与层之间的调用还需要手动 New 对象,这里也可以实现”控制反转”的思想。框架实现框架实现项目结构我还是决定在原来的项目上进行开发。所以前期框架的封装代码会与业务代码放在同一个包下,等开发完成,再抽取出来,我觉得这样会更加容易理解。项目结构:annotation : 元注解。自定义的一些注解。 config:配置,主要存放定义了框架配置的Key.(根据 key 来获取 properties 文件的 values) Helper: 对工具类,配置类 的封装。Util : 工具类。ClassUtil 类一个类的加载器,该类主要根据类名,或者包名来加载类。? 1

3、 2 3 4 5 6 7 8 9 10 11public class ClassUtil private static final Logger log = LoggerFactory.getLogger(ClassUtil.class);/* 获取类加载器* */public static ClassLoader getClassLoader() return Thread.currentThread().getContextClassLoader();12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3

4、5 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55/* 加载类* */public static Class loadClass(String className, boolean isInitialized) Class cls=null;try cls = Class.forName(className, isInitialized, getClassLoader(); catch (ClassNotFoundException e) e.printStackTrace();return cls;/* 获取指定包名下的

5、所有类* */public static Set getClassSet(String packageName) Set classSet = new HashSet();try / 获取到包名下所有类的 URLEnumeration urls =getClassLoader().getResources(packageName.replace (“.“, “/“);/ 开始遍历while (urls.hasMoreElements() URL url=urls.nextElement();if (url != null) String protocol = url.getProtocol()

6、;if (protocol.equals(“file“) String packagePath = url.getPath().replaceAll(“%20“, “ “);addClass(classSet, packagePath, packageName); else if (protocol.equals(“jar“) JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

7、 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99if (jarURLConnection != null) JarFile jarFile = jarURLConnection.getJarFile();if (jarFile != null) Enumeration jarEntries = jarFile.entries();while (jarEntries.hasMoreElements() JarEntry jarEntry = jarEntries.nextElement();Strin

8、g name = jarEntry.getName();if (name.endsWith(“.class“) String className = name.substring(0, name.lastIndexOf(“.“).replaceAll(“/“, “.“);doAddClass(classSet,className ); catch (IOException e) log.error(“获取类失败“,e);e.printStackTrace();return classSet;private static void addClass(Set classSet, String pa

9、ckagePath, String packageName) /在该路径下获取所有文件/FileFilter 过滤器,只要 class 文件和文档。File files = new File(packagePath).listFiles(new FileFilter() Overridepublic boolean accept(File file) 10 0 10 1 10 2 10 3 10 4 10 5 10 6 10 7 10 8 10 9 11 0 11 1 11 2 11 3 11 4 11 5 11 6 11 7 11 8 11 9 12 0 12 1return (file.i

10、sFile() );/遍历每个文件for (File file : files) String fileName = file.getName();if (file.isFile() /去掉.class 后缀String className = fileName.substring(0, fileName.lastIndexOf(“.“);/如果包名不是空的 则加上包名if (StringUtils.isNotEmpty(packageName) className = packageName + “.“ + className;/加载类doAddClass(classSet, classNa

11、me); else /这里是对 file 是文件夹 进行的操作String subPackagePath = fileName;if (StringUtils.isNotEmpty(packagePath) subPackagePath = packagePath + “/“ + subPackagePath;String subPackageName = fileName;if (StringUtils.isNotEmpty(packageName) subPackageName = packageName + “.“ + subPackageName;addClass(classSet,s

12、ubPackagePath,subPackageName);/真正的加载类private static void doAddClass(Set classSet, String className) Class cls = loadClass(className, false);classSet.add(cls);12 2 12 3 12 4 12 5 12 6 12 7 12 8 12 9创建元注解Action 注解? 1 2 3 4 5 6/* Action 方法注解 * * */Target(ElementType.METHOD)7 8 9 10 11 12 13 14 15Retent

13、ion(RetentionPolicy.RUNTIME) public interface Action /* 请求类型与路径* */String value();定义配置文件的 key ConfigConstant定义这些 key,根据这些 key 去获取 properties 文件的 values;? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29/* * 定义配置文件的 key* */ public enum ConfigConstant CONFIG_FILE(“config.p

14、roperties“),JDBC_DRIVER(“jdbc.driver“),JDBC_URL(“jdbc.url“),JDBC_USERNAME(“jdbc.username“),JDBC_PASSWORD(“jdbc.password“),APP_BASE_PACKAGE(“base_package“),APP_JSP_PATH(“jsp_path“),ASSET_PATH(“asset_path“),;private final String value;ConfigConstant(String value) this.value = value;public String getVa

15、lue() return value;ClassHelper 类操作的组手类主要是将类根据注解来进行分类? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2/* 类操作 助手类* */ public class ClassHelper /* 定义类集合(用于存放所加载的类)* */private static final Set CLASS_SET;static String basePackage = ConfigHelper.getAppBasePackage();CLASS_SE

16、T = ClassUtil.getClassSet(basePackage);/* 获取应用包下的所有类* */public static Set getClassSet() return CLASS_SET;/* 获取应用包名下所有 Service 类* */public static Set getServiceClassSet() Set classSet = new HashSet();for (Class cls : CLASS_SET) if (cls.isAnnotationPresent(Service.class) classSet.add(cls);return classSet;/* 获取应用包下所有 Controller 类5 2 6 2 7 2 8 2 9 3 0 3

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > Web服务

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号