我有一个棘手的问题。我试图找出从我正在开发的Spring-Flex(使用BlazeDS)项目中利用vanilla HttpServlet
的最佳方式。我的团队有一个他们以前使用过的HttpServlet(也就是其他一些团队构建的),通过HTTP GET传递一些键/值对来处理请求。我想使用这个HttpServlet类来完成相同的工作,但是当我的Flex客户端调用Service上的方法时,我想用Java调用它。理想情况下,调用HttpServlet的类可以使用标准@Service
和@RemotingDestination
注释(see here)。我的Spring-Flex项目如何通过Java使用vanilla HttpServlet?
所以,这是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,并利用Servlet需要的日志和数据以及Remote Object?
原因我在想从Java做这个固执是我想要做一些记录,也许利用其他一些辛格尔顿豆在@Service
类的范围。不过,我努力解决这个问题,我希望尽可能接近“最佳实践”。任何人都可以提供帮助吗?
谢谢Jeremy!介意我是否要问一个后续问题?在实现第一个选项时(听起来这是最佳实践路线),这听起来是对的吗?我写了一个AS3函数:_ 01)设置HttpService(这可能是镀金)所需的任何动态元素。 2)调用HttpService。 3)使用[RemoteObject](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/rpc/remoting/mxml/RemoteObject.html)记录HttpService的结果和/或执行更多业务逻辑 您认为@Jeremy-Grelle怎么样? ** P.S。非常感谢!** – blong 2011-03-22 17:56:04
如果您需要坚持使用servlet端点,那么这种方法对我来说听起来是可行的。 – 2011-03-22 19:55:31
非常感谢您的帮助!这是我想出来的 - > [链接到pastebin.com](http://pastebin.com/0WFGLGnQ)。我不确定这是否是最佳做法,但现在它可行。最终,我想以“春天的方式”来做,但我还不确定如何去做。我认为如果我可以修改Servlet类来实现Spring的特定接口,我可以重构这个解决方案,使其更好。 – blong 2011-03-24 18:37:27