本帖最后由 大山哥哥 于 2017-3-31 09:50 编辑
【济南中心】实现一个Servlet类的三种方式
对于JavaEE开发者来说,一般企业开发中不会使用Servlet,但是对于一个初学者来说Web初级阶段的核心知识点就是Servlet。所谓Servlet其实就是Server + let,意为:运行在服务器端的小程序。主要作用就是接受用户发送的请求,进行处理最后将处理结果返回给用户。 编写一个Servlet需要实现Servlet接口,并实现里面的所有方法,如下图:
这些方法在Servlet运行的过程中主要涉及到三个,首先是创建的时候,会调用init方法。Servlet只会创建一次,所以这个方法只会调用一次。Servlet是用来处理客户端的请求,所以每次请求都会调用service方法进行处理。当项目被移除或者被关闭的时候会销毁Servlet,当然这里的关闭是正常关闭的情况,销毁Servlet会调用destroy方法,也只会调用一次。 除了实现Servlet接口之外,我们也可以直接继承Servlet的实现类GenericServlet,根据源码也可以看到GenericServlet其实就是一个“空壳”,里面没有具体的实现代码,所以如果继承了GenericServlet就需要我们重写里面的方法。所以在实际应用中实现一个Servlet常用另一种方式就是继承HttpServlet。HttpServlet继承了GenericServlet,重写了GenericServlet里面的方法,并在service方法中将ServletRequest和ServletResponse转换成了带有http协议的HttpServletRequest和HttpServletResponse,如下源码
同时,我们在处理前端的请求时也不需要直接重写service方法,因为在HttpServlet中对service方法进行了处理,看下面源码截图:
通过上面的代码我们可以看到,HttpServlet中的service方法会判断客户端的请求方法,根据不同的请求方式来决定调用某个方法。一般情况下我们使用的是get或者post方式请求,所以一般情况下我们只需要重写get和post对应的方法即可(即doGet和doPost方法)。当客户端发送请求会调用GenericServlet中的service方法,service方法根据不同的请求方法分别调用对应的方法执行。例如客户端请求的方法是get则会在service方法中进行判断,最终调用doGet方法执行。所以一般情况下,我们实现HttpServlet之后只需要重写doGet或者doPost方法,为了简化代码一般会在doGet中调用doPost(或者反过来)。 为什么中间会有GenericServlet这个实现类呢?这个恐怕是sun公司当初考虑的问题,其实可以理解为当初设计的时候sun公司认为未来互联网的协议不止http,所以为了将来更好的扩充所以有了GenericServlet。 通过刚才的介绍可以总结为,实现一个Servlet有三种方式:一个接口两个类。即一个Servlet接口,两个实现类GenericServlet和HttpServlet,通常情况下我们只需要实现HttpServlet即可。 当然这只是介绍了类的实现,如果想要真正实现一个Servlet,还需要进行xml配置或者使用注解的方式,这两种方式后面再给大家介绍。
|