2011-09-05 111 views
1

我一直在閱讀關於servlet的知識,所有書籍都通過表單(POST請求)來調用servlet。 我想知道是否有其他方式來由客戶端調用servlet。從客戶端調用servlet

這裏是我的理解:對於POST請求到一個servlet,我們使用一個鏈接,從而在該servlet上進行GET請求,在servlet中,我們需要從doGet()調用doPost()。

+0

我重申我的問題:從客戶端頁面(比如JSP或HTML頁面)發出POST請求(到servlet)有哪些不同的方法? – John

+0

將鼠標放在問題下面的'servlets'標籤上方,直到彈出一個框,點擊其中的* info *鏈接,然後開啓自己。 – BalusC

+0

@BalusC從來不知道_info_中有那麼精緻的東西。謝謝 – John

回答

1

您可以編寫一個客戶端,該客戶端創建GETPOST HTTP消息並調用一個servlet。但是,您可以使用Apache Commons HTTP Client來做到這一點。

另外,從你的問題你似乎很薄,全部 Servlets通過POST請求處理GET請求。這是不正確的。它在您查看的servlet中完成的原因是因爲servlet對GETPOST請求都執行相同的操作。所以爲了最大限度地減少重複代碼的數量,它是這樣寫的。

更新:看來Apache Commons HTTP Client現在已經結束了,並且不再被開發。它已被其HttpClientHttpCore模塊中的Apache HttpComponents項目取代,該模塊提供更好的性能和更大的靈活性。

UPDATE2:我把你最初的問題作爲「我們如何從瀏覽器以外調用servlet」。那麼,瀏覽器只是一個客戶端,它可以高效,輕鬆地讓我們向服務器發送GETPOST請求[在我們的案例中爲Servlet]。我們也可以編寫一個Java proram來向我們的Servlet發送GETPOST請求,但是這將是單調乏味和繁瑣的。所以,我們可以使用上面指定的庫來做到這一點。這些庫不限於客戶端Java prorams,可以從任何可調用Java代碼的應用程序(包括JSP)使用。

+0

好的。我以前從未使用過它。所以我們你在JSP代碼中使用這些嗎? – John

+0

@John ...看到我的更新2. –

+0

你能列出不同的方式從瀏覽器調用一個servlet嗎? – John

0

您可以使用java.net.UrlConnectionjava.net.URL

2

POST請求到Servlet請求一個servlet,我們用這樣一個鏈接一個GET上的servlet

這不會讓 請求感覺和不正確。

客戶端請求GETPOST請求。在html表單中,您可以指定方法屬性中的哪一個,並且在使用ajax/javascript時還指定哪一個。

是的,在servlet中指定doGet和doPost。約定是使用POST向服務器發送(發佈)數據,而get則用於返回數據;然而這並不是被執行。

0

看看servlet api(http://download.oracle.com/javaee/1.2.1/api/javax/servlet/http/HttpServlet.html)。

支持四種方法(GET,POST,PUT,DELETE)。理論上你可以使用客戶端的任何一個。

但事實上,您的客戶端通常是瀏覽器或Web服務使用者。實際上,經常只使用GET和POST。

-1

有兩個是調用servlet,調用doGet()的HTTP GET和調用doPost()的HTTP POST。 HTTP協議很簡單,可以使用多個客戶端。你可以編寫你自己的,你可以使用現成的java庫,你可以使用像curl這樣的命令行實用程序。

doGet()和doPost()方法可以做同樣的事情或不同的事情。

有設計的servlet的兩種常用方法:

  1. 每個servlet做同樣的的doGet()和doPost(),有一個叫其他。

例子: FindCustomerServlet - 找到客戶記錄 UpdateCustomerServlet - 更新客戶記錄

  1. 該servlet做不同的事情中的doGet()和doPost()。

示例: CustomerServlet - 使用GET查找記錄,POST進行更新。

0

我會使用Apache的HttpClient庫。真的很容易使用和定製。
下面是一些代碼爲你上手:

HttpClient httpclient = new DefaultHttpClient(); 
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
HttpPost request = new HttpPost("YourServletURL"); 
List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
// Set your parameters here... 
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
request.setEntity(formEntity); 
HttpResponse response = httpclient.execute(request); 
HttpEntity resEntity = response.getEntity(); 
if (resEntity != null) 
    // Here you can read the response 
    EntityUtils.consume(resEntity); 
httpclient.getConnectionManager().shutdown(); 
0

你有8種HTTP 1.1方法:GET,POST,HEAD,TRACE,OPTIONS,PUT,DELETE和CONNECT。 servlet api只實現了其中的7個doXXXX():doGet(),doPost(),doOptions(),doHead(),doTrace(),doPut(),doDelete()。但是對於大多數servlet開發人員,您將使用doGet()(用於簡單請求)或doPost()(用於接受和處理表單數據)。

這是我的理解:對於POST請求給一個servlet,我們使用了一個鏈接從而對servlet和在servlet我們需要調用從的doGet的doPost()()GET請求

我不明白這個部分,但我認爲你錯了。 service()方法根據HTTP方法(例如GET,POST)計算出要調用的servlet方法。如果客戶端發送HTTP GET請求,則service()方法會調用doGet()方法,將請求和響應對象作爲參數傳遞。爲了方便起見,一些IDE設置servlet,以使它們的doPost()方法調用doGet(),因爲它們旨在相同地處理GET和POST請求。