在自己看SpringMvc源码之前 ,我也看过很多其他关于springMvc的文章,
这里只是想动手写一下 自己看源码的过程 方便之后记录下来
我先盗一张图。
都说springMvc使用前端控制器 dispatcherServerlet做控制处理
那么看下dispathcerServerlet 继承树
准备工作
接口一个一个来
从 javax.servlet; 下开始 (也就是右上角)
1.Servlet
doc上的文档
定义所有servlet必须实现的方法。
servlet是一个在Web服务器中运行的小型Java程序。伺服装置
*接收和响应来自Web客户端的请求,通常是通过HTTP
*超文本传输协议。
要实现这个接口,可以编写一个扩展 javax.servlet.genericservlet 或者扩展的HTTP servlet
此接口定义初始化servlet的方法,以服务请求 ,从服务器中删除servlet。这些被称为生命周期 。
方法和按以下顺序调用:
构建servlet ->
然后用 init初始化方法 ->
service 客户机对服务的任何调用都会被处理->
servlet停止使用->
然后用destroy 进行资源回收和结束。
init method 方法:servlet容器仅调用一次 , 必须在接收请求之前完成init方法。 否则会抛出ServletException ,参数servletConfig 包含servlet的对象 配置和初始化参数。
service方法:在init成功之后接收用户请求, 返回值为Void但是会抛出异常.
ServletException(如果发生干扰servlet的异常 正常运行),
IOException(如果发生输入或输出异常);
响应的状态代码应该始终为 抛出或发送错误。
destory :由servlet容器调用,以向servlet指示servlet 正在停止服务。 servlet的 service 方法中的线程已退出或 超时期限过后,此方法仅调用一次 。 servlet容器调用它之后 方法,它不会再次调用 service 方法 servlet。
2.ServletConfig
2.1 getServletName:返回此servlet实例的名称。 该名称可以通过提供 服务器管理,在Web应用程序部署中分配 描述符,或者用于未注册的(因此未命名的)servlet实例 将是servlet的类名。
2.2 getServletContext: 返回调用者所在的ServletContext上下文的引用
2.3 getInitParameter(String): 类似map 如果没有则返回null
2.4 getInitPararmeterNames(): 基本上同上 一次拿所有
3.Serializable
3.1为什么要学序列化
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。
java中:虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
3.2什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3.3当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
Foo myFoo = new Foo();
myFoo .setWidth(37);
myFoo.setHeight(70);
当通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myFoo);
java序列化接口
对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化。而创建的字节流是与平台无关的,在一个平台上序列化的对象可以在不同的平台上反序列化。
吃个饭回来更