2011-03-22 46 views
0

我有一个棘手的问题。我试图找出从我正在开发的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类的范围。不过,我努力解决这个问题,我希望尽可能接近“最佳实践”。任何人都可以提供帮助吗?

回答

3

如果不做一些代码重构,我认为没有什么好的方法可以从你的应用程序的服务层做到这一点。以任何方式让服务层依赖于Servlet API通常不是一个好主意,如果您要通过模拟HTTP请求来尝试调用Servlet,那么这将是必需的。

实际上,我认为从Flex调用Servlet是最简单的方法,如果你不想改变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

+0

谢谢Jeremy!介意我是否要问一个后续问题?在实现第一个选项时(听起来这是最佳实践路线),这听起来是对的吗?我写了一个AS3函数:_ 0​​1)设置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

+0

如果您需要坚持使用servlet端点,那么这种方法对我来说听起来是可行的。 – 2011-03-22 19:55:31

+0

非常感谢您的帮助!这是我想出来的 - > [链接到pastebin.com](http://pastebin.com/0WFGLGnQ)。我不确定这是否是最佳做法,但现在它可行。最终,我想以“春天的方式”来做,但我还不确定如何去做。我认为如果我可以修改Servlet类来实现Spring的特定接口,我可以重构这个解决方案,使其更好。 – blong 2011-03-24 18:37:27

相关问题