how2j.cn


工具版本兼容问题
Servlet 需要提供对应的doGet() 与 doPost()方法


步骤 1 : doGet()   
步骤 2 : doPost()   
步骤 3 : service()   

当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法

哪些是get方式呢?

form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

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

	}

}
当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法

哪些是post方式呢?
在form上显示设置 method="post"的时候
ajax指定post方式的时候
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

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

	}

}
LoginServlet继承了HttpServlet,同时也继承了一个方法

service(HttpServletRequest , HttpServletResponse )


实际上,在执行doGet()或者doPost()之前,都会先执行service()

由service()方法进行判断,到底该调用doGet()还是doPost()

可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。

所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。

比如把前面的登录的LoginServlet,改为提供service方法,也可以达到相同的效果
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String password = request.getParameter("password"); String html = null; if ("admin".equals(name) && "123".equals(password)) html = "<div style='color:green'>success</div>"; else html = "<div style='color:red'>fail</div>"; PrintWriter pw = response.getWriter(); pw.println(html); } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-01-05 关于 service 的 见解
纯黑

关于 J2EE-Servlet-service() 的提问



对于service的问题,与站长所述有点出入,我个人的见解是 其实是在service中通过 req.getMethod() 对传过来的方法进行了判断,随后根据不同方法调用不同的doget,dopost等等, 而且在doget这些方法中,也并没有调用 service , 由于只能上传一张图片,其他部分源码写在了代码栏中。 不知道是不是版本不同导致的。
加载中
String method = req.getMethod();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String html;
        if ("admin".equals(username) && "admin".equals(password)) {
            html = "<h1>login Success</h1>->" + method;
        } else {
            html = "<h1> login fail</h1>->" + method;
        }

        PrintWriter pw = resp.getWriter();

        pw.println(html);

							


5 个答案

四方1
答案时间:2023-07-28
人家也没说是do方法调用service方法啊? 说的是在do之前会先执行service,你好好看清楚。。。

yang1010
答案时间:2020-04-25
站长的意思应该是:Servlet在执行doGet()或者doPost()之前,都会先执行service()

DarkADays
答案时间:2020-03-05
确实如此,这个地方我也是这么认为的

纯黑
答案时间:2020-01-05
纯黑
答案时间:2020-01-05



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-05-14 关于是否还用声明method问题
许华夕

关于 J2EE-Servlet-service() 的提问
请问站长,如果后面使用了service(),前面还用在xml中指定from method =get还是post吗?




9 个答案

sparksun007
答案时间:2020-09-20
不显示写method=post或其他,那就默认method是get方式了啊。

newbeeee
答案时间:2020-09-10
其实就是service方法本来要判断是get还是post的,但是你也可以不写这两个方法 直接把逻辑写在service方法里,但是html文件里的method还是要写的 这是规范的要求

JmsAllen
答案时间:2019-11-14
你的提问就有问题,你自己提供的表单,说明你应该清楚自己表单需要的业务是什么,显然你应该指明是用 post 还是 get 解决这个前提,那么这个问题从 Servlet 的生命周期谈起比较合适 显然 service() 方法是在 Servlet 提供服务时调用的,但它是作为 HttpServlet 抽象类所实现的方法,既然你继承了这个类,那么就代表这你知道需要将该方法对应业务进行具体实现(换句话说,你知道自己的 Servlet 需要做什么),因此你应该细节化 HTTP 方法(post或get等) 另外,不要随意重写 service() ,除非你有特殊的理由,否则继承 HttpServlet 意义何在?不就是为了具体实现你自己的业务吗?不要做南辕北辙的事情

how2jcxp
答案时间:2019-03-27
是要写的。时间会说真话说的比较对。规范中service根据method是post还是get调用相应的doget,dopost方法,这是无论如何也会做的,然后相应的处理逻辑在do方法中。 站长说可以不写,其实是说把处理逻辑转移到service方法中,这样do方法中不必再写,但是service还是会调用相应的方法,只不过没有相应的处理逻辑了,但返回的response会有所不同(根据get/post等)。 其实是不太规范的做法。所以还是得写。而且处理逻辑写在do方法里最好。

Cube
答案时间:2019-01-15
在service情况下,html中method是get,service则调用doGet;是post,service则调用doPost;form中没有指定method方法,则默认调用get。这些在浏览器的地址栏上可以看出来

Memory_123
答案时间:2018-12-06
他的意思是,还用不用在login.html中 指定method =get还是post? 是需要写的,然后到LoginServlet中,直接使用service方法,根据method = post 会去匹配service中的post方法

我会努力学JAVA的
答案时间:2018-12-04
站长说的很清楚,执行LoginServlet时,必然先调用service方法,这个是由tomcat内部业务逻辑决定的,如果LoginServlet中没有找到这个方法,就去他的父类找,这个LoginServlet继承了HttpServlet这个类,HttpServlet里面有service这个方法,你去看看这个方法的源码你就会发现,service方法是先获取请求类型,请求类型有八种,最常用的就是post和get,比如获取到请求类型是post,那就调用post,调用Post方法,是先去子类找post方法,找到子类的post方法执行就行了啊,这里子类如果post方法也没有,剩下你来编吧

时间会说真话
答案时间:2018-10-10
是在难以苟同虚实恒的说法,您请实践一下先。 我的理解: 是需要指定method的,当然你可以不指定,那就默认是get方法了,你传输的账户和密码都会显示在浏览器地址栏,所以依然需要手动指定method="post" 而service()的作用只局限于 不用你人为去判断需要写 doPost还是doGet了 ,我就写一个service()方法,html文件里指定get也好post也罢,我这边不需要再修改。 另外指出个小问题:题主说的不太对,form method="get/post" 是在login.html中,而非xml

虚实恒
答案时间:2018-06-15
你还不理解吗?这句话的意思已经表达了, “所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了”,重点是不用区分,你写不写没关系了。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-09-17 为什么我查看不了HttpServlet的源码?
2017-06-24 service方法的疑问
2017-06-16 service()这段写得很清楚




提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-Servlet-service() 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图