《从零开始写JavaWeb框架》(1-3章)学到的东西

来源:互联网 发布:软件开发阶段 编辑:程序博客网 时间:2024/05/21 09:25
《写JavaWeb框架》学到的东西
1,ClassLoader.getResources(resource)方法取得“所有”符合指定的参数的资源。
如果指定的资源是个文件夹的话,并不是把文件夹下的所有文件和文件夹作为资源(URL)返回来,只是把这个文件夹做为资源返回来。如果要想取得这个文件夹下的所有文件和文件夹的话,需要通过这个返回的资源取得路径,再通过File类取得文件和文件夹。

还有一点,如果是在测试类中(Junit)使用这个方法的话,是先从测试路径下取得指定的资源,再从正常的源文件编译路径下取得资源。
例如:
如果指定资源为“com.myproject.abc”,测试类放在“test-classes”文件夹下,正常的编译类放在“classes”文件夹下,
使用ClassLoader.getResources(resource)的话,会返回下面两个资源:
 1,D:/myproject/target/test-classes/com/myproject/abc
 2,D:/myproject/target/classes/com/myproject/abc


2,Lambda表达式

用Lambda表达修改前:

File[] files = new File(packagePath).listFiles(new FileFilter() {    @Override    public boolean accept(File file) {        boolean acceptCondition = (file.isFile() && file.getName().endsWith(".class"))                || file.isDirectory();        return acceptCondition;    }});
修改后:
File[] files = new File(packagePath).listFiles((File file) ->        (file.isFile() && file.getName().endsWith(".class"))        || file.isDirectory());
感觉简洁了不少。


3,如何写注解,和如何判断类,方法,属性上是否有注解。

cls.isAnnotationPresent(Service.class)

4,Apache提供了一些实现Ojbect的基本方法的工具类,例如:

EqualsBuilder:提供了实现equals()方法的工具方法

HashCodeBuilder:提供了实现hashCode()方法的工具方法。如果把一个对象当成Map的Key保存数据的场合,如果想在别的地方使用一个新建的对象(属性值和先前的对象都一样)做为Key,取出刚才保存的数据的话,就需要实现hashCode方法了。具体关于hashCode方法的作用一些注意点,请参文章:http://www.cnblogs.com/dolphin0520/p/3681042.html


5,Servlet3.0的一些知识点。

1),Tomcat7和8,在实现Servlet3.0容器时,提供了两个默认的Servlet,ServletName分别是“jsp”,“default”。前者是用来处理JSP的,后者来处理其它请求。

2),注册完Servlet后,可以使用servletContext.getServletRegistration()方法取得相对应的ServletRegistration。这个类主要是用来设置Servlet的Mapping的(就是Servlet对哪些路请求进行处理)。




关于1-3章做框架的总结:

1,做一个配置工具类,加载框架所需要的那个配置。

2,做一个类加载器(ClassUtil),这个类加载器的作用的是,把所有类都管理起来,等需要实例化或注入的时候,取出相应的类(Class类型),然后成生实例。

这里有一点要注意的是,这个类加载器是通过包路径,把class文件路径取到,然后使用Class.forName来把class文件加载到JVM中,并不立刻实例化。在需要的时候进行实例化。

3,再自定义几个我们需要用的注解Action,Controller(Inject应该不做用,用Java的就行)

4,再做Bean容器,这个步骤分为几个小步:
  1),做个反射工具类,用Class类生成相应的实例
  2),再做个BeanHelper,把Class类和相应的实例连接起来
 
5,再实现注入功能。注入功能就是把所有Bean容器中保存的实例和相应的Class类取出来,通过Class类看看哪个属性有@Inject注解,就对再从Bean容器中取出实例进行注入。


6,加载Controller,把Request的方法名和路径,还有Controller类和具体的Method组织起来。
  1)定义Request类,这个类保存“请求方法”和“请求路径”
  2)把和Request相对应的Controller的实例和Method类保存到Handler中。
  (保存Method的原因是因为了快速取得请求路径所对应的Method,使用反射调用。
    保存Controller实例的原因是因为,Method在被反射调用时,需要被传入被调用方法所属的实例)

7,做一个初始化类,把上面的实现都调用一下,把类加载进来(上面的很多实现都是写到了Static块里的,所以需要使用Class.forName来把类加载进来。只要类被加载到JVM时,才能调用Static块代码)  

8,做一个Servlet,来处理所有请求,具体实现内容如下:
   1)把HttpServletRequest中的请求参数都收集起来(getParameter的参数,和Body里的(如果是Post请求的话,参数是放到Body里的))
   2)根据请求路径和请求方法,调用相应的Controller和方法。
   3)根据返回返回类型,决定是调用JSP还是直接返回Json。


0 0
原创粉丝点击