2

以下は、XML ファイルを生成しようとしているコードです。XML を生成したらすぐに、この XML ファイルを、ボックスでローカルに実行されている独自のサーブレットの 1 つに送信する必要があります。XML ファイルを生成することはできますが、その XML ファイルをサーブレットの 1 つに送信して、doGet メソッドでその XML ファイルを解析できるようにする方法がわかりません。

public static void main(String[] args) throws SAXException, XPathExpressionException, ParserConfigurationException, IOException,
    TransformerException {

String xml = generateXML();
send("http://localhost:8080/ServletExample/SampleServlet", xml);
}


/**
 * A simple method to generate an XML file
 *
 */  
public static String generateXML(String conn, String funcAddr) throws ParserConfigurationException, SAXException, IOException,
    XPathExpressionException, TransformerException {

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

// Some code here to make an XML file

String xmlString = sw.toString();

// print xml
System.out.println("Here's the xml:\n" + xmlString);

return xmlString;
}


/**
 * A simple method to send the XML to servlet class
 *
 */
public static void send(String urladdress, String file) throws MalformedURLException, IOException {
String charset = "UTF-8";
String s = URLEncoder.encode(file, charset);

// I am not sure what should I do here so that I can pass the 
//  above XML file that I made to my servlet class.

}

私のサーブレットは 8080 でローカルに実行されています。以下は、私のサーブレット クラスのスニペットです。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    BufferedReader reader = request.getReader();

    //Parse the XML file here?

    System.out.println(reader.readLine());

}

更新されたコード:-

SampleServletnew で名前が付けられたサーブレット クラスを作成しましたdynamic web project。サーバーをデバッグモードで起動しました。以下は私のサーブレットのコードです-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    BufferedReader reader = request.getReader();
    System.out.println(reader.readLine());

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    BufferedReader b = new BufferedReader(request.getReader());  
    System.out.println(reader.readLine());

}

そして、私の web.xml ファイルは次のようなものです-

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletExample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>SampleServlet</display-name>
    <servlet-name>SampleServlet</servlet-name>
    <servlet-class>com.servlet.example.SampleServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SampleServlet</servlet-name>
    <url-pattern>/SampleServlet</url-pattern>
  </servlet-mapping>
</web-app>

上記の両方の方法にブレークポイントを設定しました。ブラウザからこのURLにアクセスするとすぐに-

http://localhost:8080/ServletExample/SampleServlet

私のブレークポイントは常に doGet メソッドでヒットします。

これで、クライアントであり、サーブレットに XML ファイルをリクエストとして渡す必要があるため、サーブレットの doPost メソッドを呼び出す新しい Java プロジェクトを Eclipse で作成しました。

以下は私のコードです-

public static void main(String[] args) {

    HttpPost post = new HttpPost("http://localhost:8080/ServletExample/SampleServlet");
    post.setHeader("Content-Type", "application/xml");
    post.setEntity(new StringEntity(generateNewXML()));
    HttpClient client = new DefaultHttpClient();
    HttpResponse response = client.execute(post);
}

しかし、どういうわけか、上記のメイン プログラムを Java アプリケーションとして実行するとすぐに、サーブレット クラスに設定したブレークポイントに到達しません。なぜそれが起こっているのかわからず、例外はスローされません。なぜそれが起こっているのですか?

4

3 に答える 3

1

「安全な」方法でない場合は、代わりに POST を使用することをお勧めします。次に、以下のように投稿の本文で xml を送信できます。

HttpPost post = new HttpPost("http://localhost:8080/ServletExample/SampleServlet");
post.setHeader("Content-Type", "application/xml");
post.setEntity(new StringEntity(generateXML()));
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);

GET を使用したい場合、これを行う 1 つの方法は、クエリ文字列で xml をエンコードすることです。

String xml = generateXML();
HttpGet get = new HttpGet("http://localhost:8080/ServletExample/SampleServlet?xml=" + URLEncoder.encode(xml, "UTF-8"));
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(get);

サーブレットで xml を解析します。

String xml = request.getParameter("xml"); 
于 2013-07-02T01:12:32.180 に答える
1

すべて問題ないようです。コードを新しいプロジェクトにコピーしました

public class SampleServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost is called");
    }
}

クライアントを実行します。

public class PostClient {

    public static void main(String[] args) throws ClientProtocolException, IOException {
        HttpPost post = new HttpPost("http://localhost:8080/ServletExample/SampleServlet");
        post.setHeader("Content-Type", "application/xml");
        post.setEntity(new StringEntity("<xml></xml>"));
        HttpClient client = new DefaultHttpClient();
        HttpResponse response = client.execute(post);
    }

}

「doPostが呼び出されました」というメッセージがcosoleに出力され、すべてが期待どおりに機能します

于 2013-07-02T02:23:37.663 に答える
1

何かをサーブレットに投稿するには、HTTP POST/doPost を使用する方が適切なオプションです。GET/doGet はリソースを取得することです。これに関連するコードは次のとおりです。

サーブレット doPost

public void doPost(HttpServletRequest req,  
                    HttpServletResponse res)  
      throws ServletException, IOException {  
      try {  
            BufferedReader b = new BufferedReader(req.getReader());  
            StringBuffer xmlBuffer = new StringBuffer();    
            String xmlString = "";          
            while((xmlString = b.readLine()) != null) {  
                   xmlBuffer.append(xmlString);  
            }  
            xmlString = xmlBuffer.toString();  
            if (workBuffer.length() > 0) {  
              System.out.println("Got XML: " + workString);  
            }      
            else {  
                 System.out.println("No XML document received");  
            }  
      }   

HTTP POST クライアント コード:

private void postMessage(TextMessage xmlMsg, String urlString)  
                throws Exception  
{  
  try  
  {  
    URL url = new URL(urlString);  
    URLConnection uc = url.openConnection();  
    HttpURLConnection conn = (HttpURLConnection) uc;  
    conn.setDoInput(true);  
    conn.setDoOutput(true);  
    conn.setRequestMethod("POST");  
    conn.setRequestProperty("Content-type", "text/xml");          
    PrintWriter pw = new PrintWriter(conn.getOutputStream());  
    pw.write(xmlMsg.getText());  
    pw.close();  
    BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());  
    bis.close();  

  }  
  catch (Exception e)  
  {  
    e.printStackTrace();  
  }  
}   
于 2013-07-02T00:55:49.187 に答える