天天看點

doget和dopost的差別

當伺服器建立servlet對象後,該對象會調用init方法初始化自己,以後每當伺服器再接收到一個servlet請求時,就會産生一個新線程,在這個線程中讓servlet對象調用service對象檢查HTTP請求類型(get,post),并在service方法中根據請求類型對應的調用doGet ,doPost方法。
如果不論使用者請求類型是get還是post,伺服器處理過程完全相同,那麼可隻在doPost中編寫處理過程,在doGet中調用doPost就行了,反之也可以doGet中處理,doPost中調用doGet。如果根據請求類型不同而需要不同的處理,就需要在兩個方法中編寫不同的處理過程。get請求的東西(你頁面輸入的資訊)會在位址欄顯示是以不安全,post不顯示,會好一點。      
在使用表單送出資料到伺服器的時候有兩張方式可共選擇,一個是post一個是get。可在<form>中的method屬性中指定送出的方式。如:<formaction="inputForm"method="get">,如果不指定method屬性,則會預設該屬性為”get”方式。

Get和post都能夠送出資料,那麼他們有什麼不同呢?
        

不同點一:

通過get方式送出的資料有大小的限制,通常在1024位元組左右。也就是說如果送出的資料很大,用get方法就可需要小心;而post方式沒有資料大小的限制,理論上傳送多少資料都可以。

不同點二:

通過get傳遞資料,實際上是将傳遞的資料按照”key,value”的方式跟在URL的後面來達到傳送的目的的;而post傳遞資料是通過http請求的附件進行的,在URL中并沒有明文顯示。 下面舉一個例子來說明:

1.輸入表單input.html

[html]  view plain  copy
  1. <html>  
  2.   <head>  
  3.     <title>表單輸入</title>  
  4.   </head>  
  5.   <body>  
  6.   <form action="inputForm"  method="post">  
  7.     name:<input type="text"name="name"><br>  
  8.     sex:<input type="radio"value="男" name="sex" checked="checked">男  
  9.     <input type="radio"value="女" name="sex">女<br>  
  10.     <input type=submitvalue="送出" name="submit"><br>  
  11.     </form>  
  12.   </body>  
  13. </html>  

2.Serlvlet類InputServlet.java

[java]  view plain  copy
  1. packagecn.edu.jxau.servlet;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. importjavax.servlet.ServletException;  
  5. importjavax.servlet.http.*;   
  6. public class InputServletextends HttpServlet{  
  7.     @Override  
  8.     protected void doGet(HttpServletRequest req, HttpServletResponseresp)  
  9.             throws ServletException, IOException {  
  10.         String name =req.getParameter("name");  
  11.         String sex = req.getParameter("sex");  
  12.         PrintWriter out =resp.getWriter();  
  13.         out.println("<html>");  
  14.         out.println("<head><title>Servlet展示頁</title></head>");  
  15.         out.println("<body>name:" + name + "<br/> sex: " + sex +"</body>");  
  16.         out.println("</html>");       
  17.     }  
  18.     @Override  
  19.     protected void doPost(HttpServletRequest req, HttpServletResponseresp)  
  20.             throws ServletException, IOException {  
  21.         String name =req.getParameter("name");  
  22.         String sex =req.getParameter("sex");  
  23.         PrintWriter out =resp.getWriter();  
  24.         out.println("<html>");  
  25.         out.println("<head><title>Servlet展示頁</title></head>");  
  26.         out.println("<body>name:" + name + "<br/> sex: " + sex +"</body>");  
  27.         out.println("</html>");       
  28.     }  
  29.     public static void main(String args[]) {  
  30.         System.out.println("test");  
  31.     }  
  32. }  
3.xml 配置   [html]  view plain  copy
  1. <servlet>  
  2.     <servlet-name>input</servlet-name>  
  3.     <servlet-class>  
  4.         cn.edu.jxau.servlet.InputServlet  
  5.     </servlet-class>  
  6.   </servlet>  
  7.   <servlet-mapping>  
  8.     <servlet-name>input</servlet-name>  
  9.     <url-pattern>/inputForm</url-pattern>  
  10.   </servlet-mapping>  
  在浏覽器中位址欄中輸入:http://localhost:8080/WebTest/input.html 在表單中填寫内容後點”送出”,可以看到如下:
doget和dopost的差別
圖1 如果将input.html中的<formaction="inputForm" method="post">換成<formaction="inputForm" method="get">則,可以看到如下結果
doget和dopost的差別
圖2 注意位址欄的變化,圖2中”?”後面跟了表單名和對應的值,而圖1中沒有。  

Get和post方式的應用

作為web應用的使用者,并不太願意讓自己送出的資料被别人看到,而如果用get方式,則可以通過位址欄的曆史記錄被别人看到。是以在web開發中,表單的送出一般用post方式,而不用get方式。 是不是說get方式就沒有用武之地了呢?不是的,例如在網頁上指定<a href=””>、<frame src=””>的時候,實際上都是預設通過get方式去伺服器上取得資源。Get方式的一個優點在于,可以很友善地控制連結的目标位址。   注:當然,現在很多的web程式開發人員都喜歡一種”偷懶”的做法。如果需要同時實作doGet 和doPost方式的Servlet,通常會隻在doGet方法中實作處理過程,二在doPost方法直接調用doGet方法。如将InputServlet.Java改成如下: [java]  view plain  copy
  1. package cn.edu.jxau.servlet;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.*;  
  6. public class InputServlet extends HttpServlet{  
  7.     @Override  
  8.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  9.             throws ServletException, IOException {  
  10.         String name = req.getParameter("name");  
  11.         String sex = req.getParameter("sex");  
  12.         PrintWriter out = resp.getWriter();  
  13.         out.println("<html>");  
  14.         out.println("<head><title>Servlet 展示頁</title></head>");  
  15.         out.println("<body> name:" + name + "<br/> sex: " + sex + "</body>");  
  16.         out.println("</html>");         
  17.     }  
  18.     @Override  
  19.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  20.             throws ServletException, IOException {  
  21.         doGet(req, resp);  
  22.     }  
  23.     public static void main(String args[]) {  
  24.         System.out.println("test");  
  25.     }  
  26. }