簡體   English   中英

我的Spring-Flex項目如何通過Java使用普通的HttpServlet?

[英]How can my Spring-Flex project use a vanilla HttpServlet via Java?

我有一個棘手的問題。 我試圖從我正在研究的S​​pring-Flex(帶有BlazeDS)項目中找出利用香草HttpServlet的最佳方法。 我的團隊擁有一個他們過去使用過的HttpServlet(由其他團隊構建),它通過給定一些通過HTTP GET傳遞的鍵/值對來處理請求。 我想使用該HttpServlet類來完成相同的工作,但是當我的Flex客戶端在Service上調用方法時,我想在Java中調用它。 理想情況下,調用HttpServlet的類可以使用標准的@Service@RemotingDestination批注( 請參見此處 )。

因此,這是HttpServlet:

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SomeServlet extends HttpServlet {

    private int responseCode;
    private String responseMsg;
    private String dynamicValue;

    public void processRequest(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    try {

        res.setContentType("text/html");
        res.setHeader("Cache-Control", "no-cache");
        PrintWriter out = res.getWriter();

        StringBuffer postdata = new StringBuffer();
        StringBuffer parameterssb = new StringBuffer();
        HttpURLConnection conn = null;

        if (req.getParameter("dynamicValue") != null)
        dynamicValue = req.getParameter("dynamicValue").toString();

        parameterssb.append("key=value&key2=" + dynamicValue);

        postdata.append("GET /wr/ProcessIt.asp HTTP/1.0\n");
        postdata.append("Pragma: no-cache\n");
        postdata.append("Content-Type: application/x-www-form-urlencoded\n");
        postdata.append("Content-Length: " + parameterssb.length() + "\n");
        postdata.append("\n");
        postdata.append(parameterssb.toString());
        postdata.append("\n\n");

        String urlString = "";
        urlString = "http://domain.com/wr/ASP_processing_page.asp";
        URL url = new URL(urlString);
        HttpURLConnection.setFollowRedirects(true);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setDoOutput(true);
        conn.connect();

        OutputStreamWriter osw = new OutputStreamWriter(
            conn.getOutputStream());
        osw.write(postdata.toString());
        osw.flush();
        responseCode = conn.getResponseCode();
        responseMsg = conn.getResponseMessage();

        String redirURL = conn.toString();

        if (redirURL.indexOf("success=yes") >= 0) {
        // Handle success
        } else {
        // Handle failure
        }

        if (conn != null) {
        conn.disconnect();
        }
        out.close();
    } catch (Exception e) {
        // Handle failure
    }
    }

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    processRequest(req, resp);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    processRequest(req, resp);
    }
}

我想弄清楚的是如何編寫我的@Service類。 我已經嘗試過走幾條路,但是運氣並不好。 到目前為止,我已經考慮並提出了有關此問題的次要問題(但我尚未制定解決方案):

  • 我需要@Controller來完成此類工作嗎?
  • 我需要一個Servlet Factory嗎?
  • HttpServlet可以是Spring托管的bean,可以用另一種方式調用ASP頁面嗎?
  • (我最不喜歡這個想法)我是否應該從Flex調用HttpServlet,並通過Remote Object利用Servlet需要的日志和數據?

我之所以想從Java中執行此操作,是因為我很固執,這是因為我想進行一些日志記錄,並且可能會利用@Service類范圍內的其他Singleton bean。 但是,無論如何我都想盡可能地接近“最佳做法”。 誰能提供任何幫助?

如果不對代碼進行一些重構,我認為沒有任何很好的方法可以從應用程序的服務層執行此操作。 讓服務層以任何方式依賴於Servlet API通常不是一個好主意,如果要嘗試通過模擬HTTP請求來調用Servlet,則需要這樣做。

實際上,如果您根本不想更改Servlet,我認為從Flex調用Servlet是最簡單的方法。 我沒有看到使用HttpService這樣做不是那么簡單的任何原因: http : //livedocs.adobe.com/blazeds/1/blazeds_devguide/rpc_httpws_06.html#1118029

否則,如果您確實必須從服務層的上下文中調用此ASP終結點,則建議將進行調用的位重構為一個獨立的@Service類,該類不依賴Servlet API。 您甚至可以通過使用Spring的RestTemplate進行調用並處理結果來稍微簡化代碼: http ://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/remoting 。 html#rest-client-access

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM