如何从java调用servlet

时间:2011-11-29 18:20:18

标签: java servlets

我在JAR中有一个我无法改变的第三方servlet。我已经扩展了该servlet并且正常使用它,因为应该使用servlet,客户端发出一个调用我的servlet的HTTP请求。

但是现在客户端想要一个自动服务,也就是说,我需要从servlet所在的同一个webapp对该第三方servlet做一些请求。

我查看了第三方servlet代码,但是我找不到绕过servlet的地方因为HttpServletRequest和HttpServletResponse对象从一个方法传递给另一个方法......基本上我似乎需要重新实现所有第三方代码。

  

我找到的解决方案,但不满足我:

     

使用HttpURLConnection从URL调用servlet:我的常识说从网址调用第三方servlet不是最好的方法   去,除了增加的开销,我不想暴露第三方   servlet的。从URL调用我的servlet也会带来问题   会议和其他事情。

     

直接调用doGet:这似乎是不可能的,因为没有HttpServletRequest的实现和   HttpServletResponse的。

     

使用jMock或类似的东西:尚未探索此解决方案,但在实际使用测试驱动的库时接收错误   环境。

任何人都知道如何与第三方servlet进行交互?

编辑:

由于我的英语不是很好,我发现自己很难解释,这里有一个原理图,试图更好地解释

Schematic

EDIT2:在与第三方制造商会面后,他们提出隔离我需要避免调用servlet的方法。如果您没有相同的运气,我会检查 gigadot BalusC 答案。

3 个答案:

答案 0 :(得分:1)

  

从网址调用我的servlet也会带来会话和其他方面的问题。

如果这是唯一的问题,那么只需使用CookieManager在后续URLConnection次来电中维护Cookie(以及会话)。

// First set the default cookie manager.
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

// All the following subsequent URLConnections will use the same cookie manager.
URLConnection connection = new URL(url).openConnection();
// ...

connection = new URL(url).openConnection();
// ...

connection = new URL(url).openConnection();
// ...

另见:

答案 1 :(得分:1)

如果我正确理解您的问题,您已实施或拥有为您生成报告的第三方servlet。

现在您要做的是定期生成报告并存储在会话中,以便当用户想要获取报告时,他们可以使用另一个servlet检索报告。

如果是这种情况,那么您希望在服务器上定期运行该任务。您需要某种任务调度程序才能在您的服务器上运行,而该任务的作用只是向您的servlet发出http请求(这可以是http GET或POST)。

答案 2 :(得分:0)

您可以尝试将servlet逻辑分成几个阶段。获取请求/结果的入口点,处理参数发送的操作并生成输出。

public void doGet(HttpServletRequest req, HttpServletResponse rsp){
    relay(rsp,act(req.getParameter("a"));
}

public static String act(String a){
    return "You provided: " + a;
}

public static void relay(HttpServletResponse rsp, String content){
    rsp.setResponseCode(200);
    rsp.getOutputStream().write(content.getBytes());
}

这使您可以调用act(无论如何)来执行您想要的操作,然后使用响应执行您想要的操作。如果返回一个字符串是不够的,你可以创建你想要的任何返回类型,可能包含一个标题列表,响应代码和内容模板。