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类型的请求时调用

时间: 2024-10-19 06:57:10

Servlet中service方法的相关文章

使用junit4测试spring项目中service方法

使用junit4测试项目中service方法 1 import java.util.HashMap; 2 import java.util.List; 3 import java.util.Map; 4 5 import javax.annotation.Resource; 6 7 import org.junit.Test; 8 import org.junit.runner.RunWith; 9 import org.springframework.test.context.ContextC

servlet中service() doGet() doPost() 方法

HttpServlet 里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的区别和联系: 在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理

servlet中service doGet doPost 的关系

在servlet中默认情况下,无论你是get还是post 提交过来都会经过service()方法来处理,然后转向到doGet 或是doPost方法,可以看HttpServlet 类的service方法: protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if(

servlet的service方法吞异常问题

今天发现一个问题,编写代码向Servlet发送请求,接收响应报文,发出去之后"报服务器返回500"异常,然而从后台日志中没有发现异常记录.然后用浏览器发请求,发现日志中出现了异常记录. 思来想去,不知道怎么回事,之前也遇见过几个此种问题,但是都绕过去了,回头看代码,发现是IDE的问题. 之前的Servlet中的service方法在声明的时候都不会声明抛出异常,然而,如果用eclipse 的快捷键选择重写service方法的话,默认的会声明service方法抛出ServletExcept

转: servlet中的service, doGet, doPost方法的区别和联系

大家都知道在javax.servlet.Servlet接口中只有init, service, destroy方法 但是我们在继承HttpServlet的时候为何一般重写doGet和doPost方法呢 下面我们看一下Servlet源代码: 注意: JDK只是定义了servlet接口,而实现servlet接口的比如tomcat, jboss等服务器 下面我们找到tomcat源代码, 可以到官网下载, 目前最新版本是7.0.53 找到javax.servlet.http.HttpServlet类, 下

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

1.Service方法和doGet方法和doPost方法的区别 * Service方法:  可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理. * doGet方法:  处理get方式的请求 如果没有重写此方法,会调用父类,父类会返回405错误 * doPost方法:  处理post方式的请求 如果没有重写此方法,会调用父类,父类会返回405错误 * 注意: * 如果在覆写的service方法中调用了父类的service方法(

Java EE javax.servlet中的Servlet接口

Servlet接口 public interface Servlet 其实现类有:FaceServlet.GenericServlet.HttpServlet 一.介绍 Servlet接口定义了所有servlet(实现该接口的类)必须实现的方法. 我们通常所说的servlet,是指运行在服务器上的Java小程序,这里可以称为Servlet程序.他们通常是通过HTTP协议,从Web客户端接收请求并做出响应. 如果要实现这个接口,可以通过继承GenericServlet类创建一个通用的.协议无关的S

在servlet中出现service()、doGet()和doPost()方法时的执行问题

在建立一个继承了HttpServlet类并重写了该类的service().doPost()和doGet()方法时,java会如何执行?其实若是该三个方法都在存在的情况下,java只会执行service()方法,而其他的两种方法不会被执行.若是没有service() 方法,则是根据jsp传入方式选择对应的方法.比如说,若是jsp是以Post方式传入数据,则是调用doPost()方法处理数据.但是一般上在建立一个继承HttpServlet类时都会重写doPost()和doGet()方法,而且会在其中

一个Servlet中可以有多个处理请求的方法

BaseServlet 一个请求写一个Servlet太过复杂和麻烦,我们希望在一个Servlet中可以有多个处理请求的方法. 客户端发送请求时,必须给出一个参数,用来说明要调用的方法 方法的结构和service()方法的结构一样 初始版 当我们访问Servlet时,发生了那些操作? 首先是通过<url-pattern>找到<servlet-name>,通过<serlvet-name>最终找到<servlet-class>,也就是类名,在通过反射得到Serlv