當伺服器建立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
- <html>
- <head>
- <title>表單輸入</title>
- </head>
- <body>
- <form action="inputForm" method="post">
- name:<input type="text"name="name"><br>
- sex:<input type="radio"value="男" name="sex" checked="checked">男
- <input type="radio"value="女" name="sex">女<br>
- <input type=submitvalue="送出" name="submit"><br>
- </form>
- </body>
- </html>
2.Serlvlet類InputServlet.java
[java]
view plain
copy
- packagecn.edu.jxau.servlet;
- import java.io.IOException;
- import java.io.PrintWriter;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.*;
- public class InputServletextends HttpServlet{
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponseresp)
- throws ServletException, IOException {
- String name =req.getParameter("name");
- String sex = req.getParameter("sex");
- PrintWriter out =resp.getWriter();
- out.println("<html>");
- out.println("<head><title>Servlet展示頁</title></head>");
- out.println("<body>name:" + name + "<br/> sex: " + sex +"</body>");
- out.println("</html>");
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponseresp)
- throws ServletException, IOException {
- String name =req.getParameter("name");
- String sex =req.getParameter("sex");
- PrintWriter out =resp.getWriter();
- out.println("<html>");
- out.println("<head><title>Servlet展示頁</title></head>");
- out.println("<body>name:" + name + "<br/> sex: " + sex +"</body>");
- out.println("</html>");
- }
- public static void main(String args[]) {
- System.out.println("test");
- }
- }
3.xml 配置
[html]
view plain
copy
- <servlet>
- <servlet-name>input</servlet-name>
- <servlet-class>
- cn.edu.jxau.servlet.InputServlet
- </servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>input</servlet-name>
- <url-pattern>/inputForm</url-pattern>
- </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
- package cn.edu.jxau.servlet;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.*;
- public class InputServlet extends HttpServlet{
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- String name = req.getParameter("name");
- String sex = req.getParameter("sex");
- PrintWriter out = resp.getWriter();
- out.println("<html>");
- out.println("<head><title>Servlet 展示頁</title></head>");
- out.println("<body> name:" + name + "<br/> sex: " + sex + "</body>");
- out.println("</html>");
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req, resp);
- }
- public static void main(String args[]) {
- System.out.println("test");
- }
- }