[英]How can my Spring-Flex project use a vanilla HttpServlet via Java?
我有一個棘手的問題。 我試圖從我正在研究的Spring-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
來完成此類工作嗎? 我之所以想從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.