关于在 servlet 中,service 以及 doGet、doPost应用的问题?!------------请进:)

cleverfish 2002-03-29 11:31:25
各位大虾帮帮忙!

在servlet中,常常看到service的方法,还有doGet和doPost;对此一直很迷惑:

1、service一定要用吗?作用是什么?是不是在程序开始运行时,自动装载执行的系统方法(类似于main)?请介绍一下它的基本情况及用途。

2、doGet和doPost方法的具体应用?即在什么时候程序调用doGet方法,什么时候程序执行doPost方法;

3、doGet、doPost方法和service方法有何关系,他们在程序中的执行顺序是怎样的?

谢谢了!!

...全文
1269 点赞 收藏 18
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cleverfish 2002-04-15
还是迷糊!不知该听谁的!不过给了我一定的启发!最后谢谢大家!给分,如果有补充的,请继续!
回复
cleverfish 2002-04-11
谢谢大家的捧场!还有一个小问题:

如果按大家所说,不用再写service方法,即直接写doGet{ }和doPost{ };那么当有请求不属于表单,比如:一个或多个button的点击,怎么处理这个事件?它的响应方法在servlet中又应该写在什么地方呢?

----不好意思,有点迂腐。太菜了,还是有点迷糊!:)

很快结账!想多要分的,跟我说,我再加。
再次谢谢大家!
回复
zskllj 2002-04-02
当编写一个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类型的请求时调用

以上是个人观点,希望各位同僚指正
回复
jsyx 2002-03-29
service 方法判断客户段所使用的http方法,然后选择调用doget还是dopost.
浏览器默认的方法是doget,但他有很大的局限性,因为是把内容放在url上传输,所以最多只能传输240个字节。而dopost是提交表单,所以理论上其提交内容的长度可以无限。
回复
ctrlpower 2002-03-29
楼上的对!
url的参数也在Doget里面处理!
sevice方法是servlet的标准方法!
可以看看javadoc
回复
gdsean 2002-03-29
service我不清楚
doGet:servlet在接受get方法表单提交请求时做处理的方法
doPost:servlet在接受Post方法表单提交请求时做处理的方法
回复
whitenshen 2002-03-29
我的第三种写法怎么样?
如下:
public void doTask(HttpServletRequest request,HttpServletResponse response) {
}

public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{
}

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{
}

这个Servlet类当然要继承httpServlet,然后你要Create一个类的时候,就只要实现doTask()就行了。
BTW,在那个Servlet类中,还可先加一些东西,比方说在里面加上一些数据库的连接,然后起个名字叫dbServlet,不是蛮好的:)
回复
jimjxr 2002-03-29
写法二,写法一没必要,因为HttpServlet已经有实现了。
回复
zhipop 2002-03-29
不用理解得那么透彻吧。。。。
回复
willzjy 2002-03-29
问题一:
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;这种区别当用在密码传输时就显的更为重要。

以上只是我个人的一些看法,不见得全对,但应该能够说明一定的问题,希望大家继续探讨!
回复
cleverfish 2002-03-29
to jimjxr(宝宝猫) 以及各位大虾:

通常用哪种写法??

写法一:
------------------------------------------------------
public class AA{

public void service(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{
String myMethod = request.getMethod();
if (myMethod.equals("GET")){
doGet(request,response);
}
else if (myMethod.equals("POST")){
doPost(request,response);
}
else return;
}

public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{

}

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{

}
}

-----------------------------------------------------------


写法二:
-----------------------------------------------------------
public class AA{

public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{

}

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException
{

}
}
回复
cleverfish 2002-03-29
关于service,还是没有人说的很明白!
继续!!
回复
jimjxr 2002-03-29
service由Servlet引擎运行。当有http请求来的时候,Servlet引擎会将请求包装成HttpServletRequest并以其为参数调用相应servlet的service方法。在servlet的父类HttpServlet中实现了service方法,对不同的http请求(get/post/put...)调用不同的do方法,所以一般情况下程序员不需要实现service方法。
回复
VacantFish 2002-03-29
1. If you just want to implement the standard HTTP methods, you needn't override serveice(). Because your servlet's base class, HttpServlet, has dispatch all standard HTTP methods to some protected methods, such as doGet, doPost... If you need implement some extending method, for example, implement WebDAV servlet, you need override the service() which dispatch the request with new method key word to your new methods.

2. If you don't know the difference between doPost and doGet, I think you should learn HTTP first.
回复
zskllj 2002-03-29
我知道,明天说,今天太忙..
回复
ahbill 2002-03-29
习惯上的用法是:
删除service()方法
将处理方法写在doGet()方法中
在doPost()方法中调用doGet()方法
这样,即可以处理doGet又可以处理doPost()
回复
wes109 2002-03-29
service方法是自动执行的吧
回复
cleverfish 2002-03-29
还有详细的吗?有关service.
service方法是怎么被调用的?自动执行还是...??
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告