`
lganggang131
  • 浏览: 15071 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

java web开发之Servlet

阅读更多

尽管还有许多烦心的事还没做,尽管还有许多思路没有理清,但我还是先把今天所学总结一下吧,对自己也有个交代,
也希望我的学习经验对看到这篇文章的初学java的爱好者们有所帮助,其实java web开发的内容自己早在两年前已经学过
,也用Servlet+jsp+javabean做过一些小型的诸如BBS、课程管理系统之类的提不起的小项目,但由于也只是很久没练了,
很多知识点似乎在大脑"内存"里被重写了一样,只有少量的记忆刻在了大脑"硬盘"里,好了废话也不多讲了,其实java web
开发的这些知识点也就那么些,我也没必要把所有的知识点全部罗列在此,我只能凭我的感觉把一些值得注意的地方提出来,
再系统的做一下总结,我想这样要比简单的告诉你有哪些知识点重要的多。
Servlet是java web开发的基础,对后面学习理解Struts框架有很好的帮助,所以一定要重视Servlet的学习,Servlet由
Servlet的容器Tomcat来管理,我们要做的是编写自己的Servlet来处理客户端的请求,自己编写的Servlet必须继承实现了Servlet
接口的诸如HttpServlet之类的类,Servlet容器的生命周期是必须要参透的:下面就来总结一下Servlet的生命周期(这里讲的是
Servlet已经被实例化好了),其实就是下面这三个方法
1、init
2、service
3、destroy
现在作如下分析:
一、Tomcat 加载 Servlet 并且实例化,有两种方法:

一种是根据 web.xml中 <load-on-startup>0</load-on-startup> 的配置,在Tomcat 一启动的时候就加载,并同时实例化,并马上调用 其 init( ) 方法,完成初始化过程。

第二种就是动态的加载,根据客户端的请求 URL 如: http://localhost:8080/accp/reqrep 中的accp/reqrep

去在 web.xml 中寻找指定的 Servlet 类,加载它并实例化,马上调用其 init( ) 方法完成初始化,由于是来自客户端的一个请求,那么自然要 调用 doGet( ) 方法来处理请求。

二、 Servlet 的初始化 ,即init( ) 方法是优于其它所有方法之前的,在处理任何响应之前就会调用的,并且在一个生命周期中有且只有一次!

Tomcat 一旦加载 Servlet ,实例化,就将其保存在内存中,以后不管多少次来自于客户端的请求都是由保存在Tomcat 容器池(即内存)里面的 Servlet 实例来处理,它不是开启了一个进程,而是实现了多线程操作,这也就是为什么要引用 Servlet 而不用 CGI 的优点。这个证据就是 我已经在 C:\apache-tomcat-5.5.20\webapps\ROOT\WEB-INF\classes 路径下删除了 这两个 Servlet .class 文件,但是请求一样处理,这就能证明,Tomcat 完成类加载是将他们保存在内存中,以便以后使用,效率很高。

三、.doGet( ) 和 doPost( ) 到底是怎么样来的,为什么没有 Service( ) 方法,里面的流程是什么?

上面只说明了 init( ) 有关的东西,现在来说 doGet( ) 和 doPost( ) ,

当Tomcat 容器收到一个消息,用户请求一个Servlet ,那么就生成了一个响应头,其实就是 HttpServletRequest 对象,根据 url 指定的 Servlet ,Tomcat 就让此 Servlet 来处理这个请求。

那么我们在 Java程序中其实实现的就是 HttpServelt ,重写了 doGet( ) 或者doPost( ) 方法,就可以处理这个请求了。但是 doGet( ) 或者 doPost( ) 方法是由 Service( ) 来调用的,我们怎么不重写Service( ) 方法呢?那是因为HttpServlet 继承了GenericServlet ,而GenericServlet 实现了Servlet 接口。在其中的一个类中,它的 Service( ) 其实就已经解析了 来自于 Http 请求头的内容,根据请求行的 method 来决定调用 doGet( ) 或者 doPost( ) 方法,同时把 HttpServletRequest 和 HttpServletResponse 以参数的形式传递给 doGet( ) 或者doPost( ),来进行我们的业务处理。

如果重写 Service( ) 方法,那么里面的很多工作可能就需要我们完成,其实这并不需要,我们只需要重写 doGet( ) 或者 doPost( ) 方法就可以了。这个重写的动作就是Servlet 生命周期中的 Service( ) 方法,里面调用了 doGet( ) 或者doPost( ) 方法。

四、处理请求结束,生成响应回发,销毁实例

处理请求结束,生成响应回发,这个在我上面所提到的文章里已经讲的很清楚了。

至于销毁实例 ,完成 destroy( ) 动作,一是只要把 tomcat 服务关闭就可以了。另外还有一种能实现 destroy( ) 的方法,可能是 Tomcat 里面的一些小BUG ,我正在找证据,已经发现一些端倪,今天有事暂时不写。重点就是前面的内容了。

Servlet的配置我就不在此啰嗦了,相当简单

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics