doGet()和doPost()方法


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM