1.Servlet中是哪个实例调用doGet()和doPost()方法
Servlet中doGet() 和doPost()都是非静态的方法,正常来说应该写成 对象名.doGet() 来调用。但实际上经常会写成下面这样:
public void doPost (HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ doGet(request, response); /*为何这里不写成 对像名.doGet(request, response); ???*/ }
这里在调用 doGet() 方法时没有使用对像名,而是直接调用。经过测试,如果写成 this.doGet() 也是可以的。 想知道这里this实例究竟是哪个对像? 开始一直以为是Servlet的实例,Servlet的实例初始化后调用service()方法,service()方法判断是请求类型是Get或Post,然后转向doGet()或doPost()方法。但把web.xml中Servlet实例名写进去,比如写成 DemoServlet.doGet() 是不对的。那么究竟对象是哪个呢?为何这里能省掉实例名或this而直接调用一个非静态的方法?
2.
首先Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类. 在javax.servlet.http包中定义了采用HTTP通信协议的HttpServlet类. 所以当你要使用Servlet框架时,必须创建一个继承了HttpServlet的实现类(即你在web.xml中设置的<servlet-class>接收http请求的处理类,如 DemoServlet);因为是HttpServlet抽象类,主要方法有 doGet, doPost, doPut, doDelete, doTrace等等请求处理的方法,同时也继承于GenericServlet,而GenericServlet 是implements了Servlet接口,所以他其中就有3个方法代表了Servlet的声明周期(init,service,destory);
综上所述:①:这些方法都不是静态方法,所以无论在那里都不能直接用该(类名)直接调用这些方法;
②:而至于“this”,因为当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。因此,this只能在类中的“非静态方法”中使用,静态方法和静态的代码块中绝对不能出现this;
③:而直接写“doGet()“,就更简单了,因为这些都是HttpServlet中存在的方法,当然可以直接在本类中直接使用了啊!
3.
一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全。而且doGet方法只能提交256个字符。通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了,例如在doGet方法中这样写
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }
再把业务逻辑直接写在doPost方法中。servlet碰到doGet方法调用直接就会去调用doPost因为他们的参数都一样。而且doGet方法处理中文问题很困难,要写过滤器之类的。
原文地址: https://wenwen.sogou.com/z/q829346941.htm?ch=ww.xqy.xgzs&pid=ww.xqy.xgzs