Как мой проект Spring-Flex может использовать ванильный HttpServlet через Java? - PullRequest
0 голосов
/ 22 марта 2011

У меня есть немного сложный вопрос. Я пытаюсь найти лучший способ использовать ваниль HttpServlet из проекта Spring-Flex (с BlazeDS), над которым я работаю. У моей команды есть HttpServlet, который они использовали в прошлом (созданный другой командой), который обрабатывает запрос, учитывая несколько пар ключ / значение, переданных через HTTP GET. Я хочу использовать этот класс HttpServlet для выполнения той же работы, но я хочу вызывать его на Java, когда мой клиент Flex вызывает метод для службы. В идеале класс, вызывающий 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 для такого рода работы?
  • Нужна ли фабрика сервлетов?
  • Может ли HttpServlet быть управляемым компонентом Spring и вызывать страницу ASP другим способом?
  • (мне эта идея нравится меньше всего) Должен ли я вызвать HttpServlet из Flex и использовать ведение журналов и данных, необходимых сервлету, с помощью Remote Object ?

Причиной моего упрямства в желании сделать это из Java является то, что я хочу вести некоторые журналы и, возможно, использовать некоторые другие компоненты Singleton в рамках класса @Service. Тем не менее, я решаю это, я хочу быть как можно ближе к «Best Practices». Кто-нибудь может предложить какую-нибудь помощь?

1 Ответ

3 голосов
/ 22 марта 2011

Без некоторого рефакторинга кода, я не думаю, что есть какой-то отличный способ сделать это на уровне обслуживания вашего приложения.Как правило, не очень хорошая идея, чтобы уровень вашего сервиса каким-либо образом зависел от API сервлета, и это потребуется, если вы попытаетесь вызвать сервлет, имитируя запрос HTTP.

На самом делеЯ думаю, что использование Servlet из Flex - это самый простой способ, если вы вообще не хотите менять Servlet.Я не вижу причин, по которым было бы не совсем просто использовать HttpService для этого: http://livedocs.adobe.com/blazeds/1/blazeds_devguide/rpc_httpws_06.html#1118029

В противном случае, если вам действительно нужно вызвать эту конечную точку ASP из контекста уровня обслуживания, ярекомендовал бы рефакторинг бита, который делает вызов, в отдельный класс @Service, который не зависит от API сервлета.Потенциально можно даже немного упростить код, используя RestTemplate Spring для выполнения вызова и обработки результата: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/remoting.html#rest-client-access

...