2011-11-18 45 views
-2

正常的java文件只執行main中調用的那些方法。但是,servlet做了什麼?我想也許它執行文件,但我試圖分裂一個HTTP servlets請求和響應,但它不起作用。使用servlet來讀取輸入流,然後執行一些可以調用響應寫入器方法的函數是一種很好的方式?使用Servlets?

這裏是我的試用代碼:

public void requestReader(HttpServletRequest req) { 
    try { 
     int len = req.getContentLength(); 
     byte[] input = new byte[len]; 

     ServletInputStream sin = req.getInputStream(); 
     int c, count = 0 ; 
     while ((c = sin.read(input, count, input.length-count)) != -1) { 
      count +=c; 
     } 

     sin.close();   
     String inString = new String(input); 
     int index = inString.indexOf("=");    
     String value = inString.substring(index + 1);       
     inputStream = URLDecoder.decode(value, "UTF-8");   

    } catch (IOException e) { 

    } 

}//end of requestReader 

public void responseWriter(HttpServletResponse resp) { 
    try{ 
      resp.setStatus(HttpServletResponse.SC_OK); 
      OutputStreamWriter writer = new OutputStreamWriter(resp.getOutputStream()); 
      writer.write("Working");  
      writer.flush(); 
      writer.close();    

    } catch (IOException e) { 

    } 


}//end of responseWriter  
+1

不再擔心servlet和輸入流一分鐘,你究竟想要做什麼?你只是想顯示一個頁面或什麼? – aishwarya

回答

0

感興趣的人,這裏是一個更新的代碼,通過將ServletResponse的另一個類做的工作:

public void doPost(HttpServletRequest req, HttpServletResponse resp) { 
    try { 
     int len = req.getContentLength(); 
     byte[] input = new byte[len]; 

     ServletInputStream sin = req.getInputStream(); 
     int c, count = 0 ; 
     while ((c = sin.read(input, count, input.length-count)) != -1) { 
      count +=c; 
     } 

     sin.close();   
     String inString = new String(input); 
     int index = inString.indexOf("=");    
     String value = inString.substring(index + 1);       
     inputStream = URLDecoder.decode(value, "UTF-8");   

    } catch (IOException e) { 

    } 
    responseWriter(resp); 
}//end of requestReader 

public void responseWriter(HttpServletResponse resp) { 
    try{ 
      resp.setStatus(HttpServletResponse.SC_OK); 
      OutputStreamWriter writer = new OutputStreamWriter(resp.getOutputStream()); 
      writer.write("Working");  
      writer.flush(); 
      writer.close();    

    } catch (IOException e) { 

    } 


}//end of responseWriter 

這是所有我試圖實現當我問的問題。

0

沒有 Java類簡單的順序執行的方法。

如果你想使用多種方法,你必須打破你的功能,並明確地調用你想要使用的其他方法,就像你在一個獨立的程序中一樣。

Servlet執行從請求處理程序開始,通常爲doPost or doGet

這是一個tutorial to read through,但也有無數其他人 - 只需搜索「servlet教程」。

0

方法永遠不會順序執行。他們在被調用時執行。

servlet的功能是爲來自Web瀏覽器的HTTP請求提供服務。爲此,您的servlet必須實現一個service()方法,然後從其中調用您的方法。

您也可以實施doPost()doGet(),但它們只響應POST和GET命令。

您可以通過查看here

0

的Servlet啓動Web服務器的情況下,通常使用。這與通常從命令行執行並以main方法開始的「普通Java文件」形成對照。

爲了使您的servlet正常工作,您需要將它設置爲Java Web應用程序的一部分。如果你以前從未這樣做過,最好遵循關於Java Web應用程序的教程。

簡言之,HttpServlet中的doPostdoGet,或者service方法是大致相當於main方法(儘管如main方法的一些重要區別被輸入一次,而service可以輸入多次)。

0

當一個GET HTTP請求進來,並且該servlet被映射到該請求的路徑時,那麼將調用該servlet的方法doGet。如果是POST,則調用doPost。您需要重寫這些方法中的一個(或兩個)以根據請求和響應執行所需操作。

閱讀HttpServlet的javadoc以瞭解更多信息。

3

一個普通的java文件只執行main中調用的那些方法。

「Java文件」不執行任何操作。JVM由java命令行工具啓動,執行主要方法。

但是,servlet做什麼?我想也許它執行文件

一個servlet運行在一個Servlet容器內, Apache Tomcat或Jetty。容器本身是通過主要方法啓動的,它學習了其web.xml文件中的servlet類,並在請求到達時調用servlet的service()方法。

什麼是使用servlet來讀取輸入流,然後執行一些可以調用響應寫入器方法的函數的簡潔方法?

這正是servlet所做的事情(雖然HTTP請求的標頭由servlet容器解析並作爲請求對象的一部分傳遞給servlet)。你真的想做什麼?

如果您沒有運行servlet容器,那麼使用servlet是沒有意義的。

+0

是的,我正在使用Apache Tomcat。 我真正想做的是有一個類來處理輸入。然後有一個類,該類使用由前一個類生成的字符串。這對它有用,然後將它發送給第三個類,該字符串將字符串返回給客戶端程序。而不是讓一個班級去做所有事情。 –

+0

@Eric Banderhide:當然,你可以做到這一切。 servlet代碼可以調用各種其他類。事實上,這是通常的情況。 –

0

的HttpServlet已經確定可以實現對不同類型的HTTP請求的方法:

doGet() 
doPost() 
doDelete() 
doPut() 

等等

這些方法都有一個請求和響應參數。

您可以讀取請求的數據,調用您想要的任何服務,然後使用參數中的httpServletResponse寫入響應。

您不必像您在問題中那樣定義自己的方法。