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