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