2013-08-21 28 views
1

我正在用Java編寫一個Servlet,它基本上在請求主體中獲得一個帶有XML的請求,然後在XML中改變一些東西,並用新的XML重定向/前言請求到位於同一臺服務器上的不同Servlet,但它位於不同的Web應用程序中。Java-重定向一個請求

如何使用新的XML重定向/前言請求?我可以在任何地方找到代碼示例嗎?

這是我到目前爲止有:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    String body = getBody(request); 
    MapXml mapXml = new MapXml(body, 
       "C:\\Projects\\XmlMapper\\output.xml","C:\\Projects\\XmlMapper\\output\\"); 
    String outputXml = mapXml.getOutputXml(); 
} 
public static String getBody(HttpServletRequest request) throws IOException { 
    String body = null; 
    StringBuilder stringBuilder = new StringBuilder(); 
    BufferedReader bufferedReader = null; 
    try { 
     InputStream inputStream = request.getInputStream(); 
     if (inputStream != null) { 
      bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      char[] charBuffer = new char[128]; 
      int bytesRead = -1; 
      while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
       stringBuilder.append(charBuffer, 0, bytesRead); 
      } 
     } else { 
      stringBuilder.append(""); 
     } 
    } catch (IOException ex) { 
     throw ex; 
    } finally { 
     if (bufferedReader != null) { 
      try { 
       bufferedReader.close(); 
      } catch (IOException ex) { 
       throw ex; 
      } 
     } 
    } 
    body = stringBuilder.toString(); 
    return body; 
} 

,我不知道如何從這裏繼續。我是新來的servlet世界..謝謝!乾杯:)

+0

您是否想過使用過濾器? http://stackoverflow.com/questions/2957165/servlet-vs-filter – Multithreader

+0

[使用此](http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/PostXML.java ?視圖=標記)。 –

回答

1

如果雙方的webapps在同一臺服務器上,即Tomcat的

in its META-INF/context.xml set <Context crossContext="true" /> 

getServletContext().getContext("/app").getRequestDispatcher("f.jsp").forward(..);, 

其中app是另一個應用程序的名稱。

或者你應該做的是使用URLConnection向任何URL發送請求。

URLConnection connection = new URL(url + "?" + query).openConnection(); 
connection.setRequestProperty("Accept-Charset", charset); 
InputStream response = connection.getInputStream(); 
// ... 

關於如何在請求中設置XML,可以在POST請求中攜帶相對較大數量的數據。您還可以找到POST數據的最大限制。

剛纔讀的組成(使用的FileInputStream) XML文件的字節數(如果你沒有在XML文件中,使用字符串創建UR XML)和POST體發送 他們。確保相應地設置編碼爲 的內容。

我正在編輯這第四次,以添加更多的細節。 如果您難以使用Java的HTTP客戶端,則可以使用Apache HTTP Client輕鬆發佈XML。

String xml = "your xml"; 
PostMethod post = new PostMethod(strURL);  
try { 
    StringRequestEntity requestEntity = new StringRequestEntity(xml); 
    post.setRequestEntity(requestEntity); .. 
    .... 
    ... 
+0

和我在哪裏設置它使用新的XML? – DasDas

+0

我沒有涉及該部分。我想告訴你的是你想問的問題。你應該在請求中設置xml,然後轉發它..或者你應該使用URLConnection並設置請求中的所有參數並將該請求提交到URL .... –

+0

但這是我的問題:如何設置XML在請求? – DasDas

0

因爲xml不會是一個小的請求體,所以你必須讓客戶端爲你發佈新的xml。或者您可以這樣做:

  1. 與遠程Web服務共享相同的數據庫或緩存,並將數據的密鑰轉發到數據庫或緩存中。

  2. 使用HttpClient使用修改後的XML發佈客戶端請求,並將遠程服務的響應返回給客戶端。

,如果你能確保XML身體小,你可以使用GET方法,將請求轉發到遠程服務器

+0

這對我沒有幫助 - 沒有涉及數據庫 – DasDas

+0

如何使用HttpClient向客戶端發佈請求?並返回響應。 – Lookis

+0

例如?我不確定你的意思 – DasDas

0

讓我們先排除一些可能性:

  1. 你不能做response.sendRedirect("/otherapp/servlet.do"),因爲它不允許你發送POST數據到另一個webapp。
  2. 您不能使用session,因爲您要將數據發送到其他web應用程序。
  3. 你顯然不能使用GET在查詢字符串中傳遞完整的XML。

一旦這些可能性都排除了唯一可行的辦法,我能想到的是這樣的:

  1. 返回到已修改了XML和其他的web應用的的URL調用頁面的servelt響應
  2. 讓調用頁面立即發佈修改後的XML到其他的web應用的使用的servelt簡單的Javascript
+0

做了提問不同的Webapp?我猜它只是在同一臺服務器上不同的Servlet/JSP。 –

+0

這是OP寫道:「新的XML到不同的Servlet,它在同一個服務器上,''',但它在不同的Web應用程序上。** – anubhava

+0

@anubhava你有這樣的代碼示例嗎? – DasDas