从零写一个JavaWEB框架的演进_第1页
从零写一个JavaWEB框架的演进_第2页
从零写一个JavaWEB框架的演进_第3页
从零写一个JavaWEB框架的演进_第4页
从零写一个JavaWEB框架的演进_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从零写一个JavaWEB框架的演进从•个简单的Servlet项目开始起步,对每一层进行优化,然后形成一个轻量级的框架。每一篇,都是针对项目的不足点进行优化的。项目已放上github。项目现在也跑起来了,而且Server和Dao层都已经封装好了,都可以专心处理各自的业务逻辑,耦合度也低了很多。但是项目还是有很多需要改进的地方。例如:Controller层的耦合度还是非常高。首先请求由doGet()和doPost()获取,然后从消息头里面获取url或者参数,然后进行逻辑判断是需要进行哪些业务。当业务多的时候,Controller层就会变得很臃肿,而且耦合度很高。@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)Stringmethod=req.getParameterQ"method");if(method!=null){if("getList".equaZs(method)){List<Customer>customerList=customerService.getCustomerLPrictty-iterwriter=resp.getWriterO;System..println(customerList);writer.ivrite(customerList.toStrin^());writer.flushQ');writer.close();)))层与层之间的调用还需要手动New对象,这里也可以实现“控制反转”的思想。框架实现项目结构我还是决定在原来的项目上进行开发。所以前期框架的封装代码会与业务代码放在同一个包下,等开发完成,再抽取出来,我觉得这样会更加容易理解。项目结构:java▼Acom.smart.mysimpleframeworE*annotationEkConfigBicontrollerElHelperE*modelE*serviceElUtilannotation:元注解。自定义的一些注解。config:配置,主要存放定义了框架配置的Key.(根据key来获取properties文件的values)Helper:对工具类,配置类的封装。Util:工具类。ClassUtil类一个类的加载器,该类主要根据类名,或者包名来加载类。2publicclassClassUtil{2privatestaticfinalLoggerlog=LoggerFactory.getLogger(ClassUtil.class);/** 获取类加载器*publicstaticClassLoadergetClassLoader(){returnThread.currentThread(),getContextClassLoader();)/**加载类**/17publicstaticClassloadClass(StringclassName,boolean19islnitialized){Classcls=null;try{cis=Class.forName(className,islnitialized,getClassLoader());}catch(ClassNotFoundExceptione){e.printStackTrace();)returncis;TOC\o"1-5"\h\z28 )29/**获取指定包名下的所有类* */33publicstaticSet<class<>>getClassSet(StringpackageName){35Set<class<>>classSet=newHashSet<>();37try{39 //获取到包名下所有类的URLEnumeration<url>urls=getClassLoader().getResources(packageName.replace42(“・”,“/”));4344 //开始遍历while(urls.hasMoreElements()){URLurl=urls.nextElement();if(url!=null){Stringprotocol=url.getProtocol();if(protocol.equals(Hfile")){StringpackagePath=51url.getPath().replaceAll("%20","");addClass(classSet,packagePath,packageName);}elseif(protocol.equals(njar")){JarURLConnectionjarURLConnection=(JarURLConnection)url.openConnection();57if(jarURLConnection!=null){57JarFilejarFile=jarURLConnection.getJarFile();if(jarFile!=null){Enumeration<jarentry>jarEntries=jarFile.entries();while(jarEntries.hasMoreElements()){JarEntryjarEntry=jarEntries.nextElement();Stringname=jarEntry.getName();if(name.endsWith(".class")){StringclassName=name.substning(0,name.lastlndexOfreplaceAll('7*\".");doAddClass(classSetjclassName71);)73)7576})79 )80}82}}catch(lOExceptione){log.error("获取类失败;e);e,printStackTrace();)returnclassSet;)90privatestaticvoidaddClass(Set<class<>>classSet,StringpackagePath,StringpackageName){93 〃在该路径下获取所有文件94 〃FileFilter过滤器,只要class文件和文档。File[]files=newFile(packagePath).listFiles(newFileFilter()96{97 @Overridepublicbooleanaccept(Filefile){return(file.isFile()&&file.getName().endsWith(".class"))||file.isDirectory();}});110 〃遍历每个文件for(Filefile:files){StringfileName=file.getName();if(file.isFile()){10 〃去掉.class后缀StringclassName=fileName.substring(0,fileName.lastlndexOf(".5 〃如果包名不是空的则加上包名if(StringUtils.isNotEmpty(packageName)){className=packageName+ +className;)710 〃加载类doAddClass(classSet,className);}else{9 〃这里是对file是文件夹进行的操作StringsubPackagePath=fileName;if(StringUtils.isNotEmpty(packagePath)){subPackagePath=packagePath+"/*'+subPackagePath;)11StringsubPackageName=fileName;if(StringUtils.isNotEmpty(packageName)){subPackageName=packageName+"."+subPackageName;}addClass(classSet,subPackagePath,subPackageName);))11}117 〃真正的加载类privatestaticvoiddoAddClass(Set<class<>>classSet^StringclassName){Classcis=loadclass(className,false);classSet.add(cls);}0121}</classo</class<></jarentryx/url></class<x/class<>123124125126127128129创建元注解▼EMannotation@Action@Controller©Inject©ServiceAction注解i/*2*Action方法注解3*4**/5@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceAction{9/**请求类型与路径**/Stringvalue();1415)定义配置文件的keyConfigConstant定义这些key,根据这些key去获取properties文件的values;1/*2*定义配置文件的key3**IpublicenumConfigConstant{CONFIG_FILE("perties")67:DBC_DRIVER("jdbc.driver"),JDBC^RLC'jdbc.url"),ODBC__USERNAME("jdbc.username"),3DBC_PASSWORD("jdbc.password"))12APP_BASE_PACKAGE("base_package"),APP_3SP__PATH("jsp_path"),ASSET_PATH(Hasset_path"),16 ;1718privatefinalStringvalue;20ConfigConstant(Stringvalue){this.value=value;)24publicStringgetValue(){returnvalue;)2829)ClassIIelper类操作的组手类主要是将类根据注解来进行分类1/**类操作助手类**/•publicclassClassHelper{/**定义类集合(用于存放所加载的类)**/privatestaticfinalSet<class<>>CLASS_SET;1static{StringbasePackage=ConfigHelper.getAppBasePackage();CLASS_SET=ClassUtil.getClassSet(basePackage);)213 /*1 *获取应用包下的所有类4 **/publicstaticSet<class<>>getClassSet(){returnCLASS_SET;)61/*7 *1 *获取应用包名下所有Service类8 * */publicstaticSet<class<>>getServiceClassSet(){Set<class<>>classSet=newHashSet<class<>>();for(Classcis:CLASS_SET){if(cis.isAnnotationPresent(Service.class)){classSet.add(cis);))returnclassSet;TOC\o"1-5"\h\z2 }324 /*2 * 获取应用包下所有Controller类5 * */publicstaticSet<class<>>getControllerClassSet(){Set<class<>>classSet=newHashSet<class<>>();for(Classcis:CLASS_SET){if(cis.isAnnotationPresent(Controller.class)){classSet.add(cls);)TOC\o"1-5"\h\z)returnclassSet;)0/*1 * 获取应用包下所有Bean类(包括:Service,Controller等)3 *2 * */publicstaticSet<class<>>getBeanClassSet(){Set<class<>>beanClassSet=newHashSet<>();beanClassSet.addAll(getServiceClassSet());beanClassSet.addAll(getControllerClassSet());returnbeanClassSet;5 )36}</class<x/class<></class<></class<></class<></class<></class<x/class<></classo</class<>3839404142434445464749505152535455565758596061626364Configllelper类获取配置文件的values1/*2*配置加载类3*加载属性文件4**/publicclassConfigHelper{6privatestaticfinalPropertiesCONFIG_PROPS=Propslltil.loadProps(ConfigConstant.CONFIG_FILE.getValue()9);0 /**获取:JDBC驱动**/1publicstaticStringgetJdbcDriver(){returnPropsUtil.getString(CONFIG_PROPSJConfigConstant.DDBC_DRIVER.getValue());}4/**获取JDBCURL*♦/6publicstaticStringget3dbcllrl(){returnPropsUtil.getString(CONFIG_PROPS,ConfigConstant.JDBJURL.getValue());TOC\o"1-5"\h\z}1/*2 *获取JDBC用户名0 * */publicstaticStringgetJdbcUsername(){returnPropsUtil.getString(CONFIG_PROPS,ConfigConstant.JDBC_USERNAME.getValue());}2/*** 获取JDBC密码2 * */5publics

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论