写一个servlet如果不重写service方法那么会调用哪个类的service方法来调用doGet/doPost

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一个servlet如果不重写service方法那么会调用哪个类的service方法来调用doGet/doPost相关的知识,希望对你有一定的参考价值。

在写一个servlet的时候,如果不重写service方法,那么当一个请求发送过来的时候,会调用哪个类的service方法来根据请求的方式不同来调用对应的doGet或者doPost方法进行处理?

首先你得搞清楚,service方法是由javax.servlet.Servlet申明,HttpServlet实现的。
HttpServlet不仅实现了service方法,还重写了service方法。
当用户访问你的Servlet时,request和response会通过HttpServlet的service方法判断用户提交的方式,然后交给相应的DoXXX处理。
而一般提交的方式为doGet()或者doPost(),所以我们只需要重写这两个方法就行了。

所以说,那么当一个请求发送过来的时候,会调用HttpServlet的service方法来根据请求的方式不同来调用对应的doGet或者doPost方法进行处理。

如果我们的Servlet重写了service方法而不判断,反而让服务器不能分辨出用户提交的方式。
那样就通通以get方式提交。
参考技术A 你在发送请求时不都需要制定一个action吗,其会去xml中匹配对应的servlet,其就会进去那个class里面,那个类就是请求要连接的类了,默认是会调用这个类里面的doGet方法,如果你知道post发送类型就给调用doPost,也可以自定义调用其它方法。追问

估计你没理解我问的意思,我是说,默认写一个servlet的时候是会继承HttpServlet这个类的,但是我不重写其service方法,我只重写doGet和doPost方法,那么系统时会调用哪个类的service方法来调用我重写的doGet或者doPost方法呢?

追答

不重写除了父类哪还有其它类的

追问

那你告诉我是哪个类,我没搞清楚,我在父类那里调式了发现没进去service方法,所以说我不知道是怎么回事

Servlet中service方法

在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏??

正如上文中所说的,Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像HttpServlet等具体的 servlet都是直接或者间接实现了这个接口)里面就有这个方法,所以不管是怎样的servlet类,都有service方法,没有service就不 能称为一个Servlet了。
而对于service方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现, 它会根据请求的方式,调用doGet,doPos以及其他的doXXXt方法,也就是说service是用来转向的,所以我们一般写一个servlet, 只需要重写doGet或者doPost就可以了。如果重写了service方法,那么servlet容器就会把请求交给这个方法来处理,倘若你重写的 service方法没有调用doXXX,即使你在Servlet中又重写了其他doGet doPost等也是不回被调用的 因为Servlet的service被自动调用(就像init destory一样),所以如果你由于某种需要,需要重写service方法,并且更具不同的method调用doPost doGet等时,就要在末尾加上一句super.service(),这样就可以解决问题了。

通过API可以看到在HttpServlet类中的两个service方法:service(ServletRequest, ServletResponse)方法是重写的其父类GenericServlet类的方法,这个方法是公共的(public),其作用是接受客户端的请 求并将其传递给service(HttpServletRequest, HttpServletResponse)方法;service(HttpServletRequest, HttpServletResponse)方法是HttpServlet类定义的方法,是受保护的(protected),主要作用是接受标准的Http 请求(HttpServletRequest),并根据请求方式不同分发到不同的doXXX(HttpServletRequest, HttpServletResponse)方法。 这就是HttpServlet有两个service方法的原因了。一般情况下我们的Servlet只需重写受保护的service方法就够了。

 

1、service一定要用吗?作用是什么?是不是在程序开始运行时,自动装载执行的系统方法(类似于main)?请介绍一下它的基本情况及用途。  
 
2、doGet和doPost方法的具体应用?即在什么时候程序调用doGet方法,什么时候程序执行doPost方法;  
 
3、doGet、doPost方法和service方法有何关系,他们在程序中的执行顺序是怎样的?  

Service是类GenericServlet中最重要的方法,每次客户向服务器发出请求时,服务器就会调用这个方法。程序员如果想对客户的请求进行响 应的话就必须覆盖这个方法,并在这个方法中加入自己的代码来实现对客户的响应。Service有两个参数(ServletRequest和 ServletResponse),ServletRequest保存了客户向服务器发送的请求,而ServletResponse用来设置如何对客户进 行响应。有一个问题我们应当注意:就是init()方法(Servlet的两个生命周期函数之一,另一个是destroy())和service()方法 的区别,当我们改变源程序而重新生成一个新的.class文件的时候,此时如果再次执行该Servlet,会发现执行的结果跟没做更改的时候一样,原因就 是因为相同的Servlet的init只执行一次,所以当我们在调试Servlet的时候要不断改变文件名和类名,或者重新启动服务(Tomcat或者 JWS等)。就是说,init()方法仅在服务器装载Servlet时才由服务器执行一次,而每次客户向服务器发请求时,服务器就会调用 Service()方法。

问题二、三:
HttpServlet是从GenericServlet继承而来,因此HttpServlet也有init和destroy这两个生命周期函数以及 Service方法,只是HttpServlet还有两个重要的doPost方法和doGet方法,并用他们来支持Http的post和get方法,就是 说如果要支持Http的get方法,就要覆盖doGet方法,如果要支持Http的post方法,就要覆盖doPost方法。而get方法和post方法 的主要区别在于:
post方法的数据传递方式比较安全,不会将传递的信息显示在浏览器的网址后,而get方法则会将传递的信息显示在浏览器的网址后,例如用post方法的 浏览器网址:http://127.0.0.1:8080/Response.jsp?name=myself;而用get方法则为:http: //127.0.0.1:8080/Response.jsp;这种区别当用在密码传输时就显的更为重要。

当编写一个Servlet时,必须直接或间接实现Servlet接口,最可能实现的方法就是扩展 javax.servlet.GenericServlet或javax.servlet.http.HttpServlet当实现 javax.servlet.Servlet接口时必须实现5个方法

init(ServletConfig config)
service(ServletRequest req,ServletResponse resp)
destroy()
getServletConfig()
getServletInfo()
别的方法就不说了
service是执行应用逻辑的入口点,包容器调用此方法来响应进来得请求,只是在servlet被成功初始化后才能调用它
其实servlet和applet差不多,当一个servlet被实例化后,包容器自动去调用固定的方法首先是init(),然后是service().....
所以service必须有.

GenericServlet类提供了Servlet接口的基本实现,所以他的子类都必须实现service()方法
HttpServlet类扩展了GenericServlet并且提供了Servlet接口中具体于HTTP的实现它更 象一个其他所有的servlet都要扩展的类,其中他定义了两种形式的service方法:

service(Servirequest req,Servletresponse resp)
此方法是GenericServlet的service()方法的实现,他把resquest,response对象分别转化为 HttpServletRequest和HttpServletResponse并且调用下面重载的service()方法,所以不应当重载上面的 service()方法:

protect void service(HttpServirequest req,HttpServletresponse resp)
他用HTTP的request,response对象作为参数,并且由上面的方法调用,HttpServlet实现这个方法后就成为一个HTTP请求的分发者,他把请求代理给doGet(),doPost().....等doXXXX()方法,因此不应当重载他.
当包容器为一个servlet收到一个请求时,包容器调用公共的service方法在把参数转换为HttpServirequest,HttpServletresponse 后,这个公共的方法调用保护的service根据HTTP请求方法的类型,保护的service方法调用doXXXX()方法之一.
doGet()方法是当得到一个GET类型的请求时调用
doPost()方法是当得到一个POST类型的请求时调用

以上是关于写一个servlet如果不重写service方法那么会调用哪个类的service方法来调用doGet/doPost的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 Servlet 体系结构

继承了httpservlet重写service()与重写doget()dopost()区别

Servlet之生命周期入门版(刚開始学习的人必看)

Servlet中service方法

service方法doGet方法doPost方法的区别和一些常见错误 Servlet的生命周期

重写GenericServlet源代码并实现登录用户名密码的匹配