如何从java调用servlet

如何从java调用servlet,java,servlets,Java,Servlets,我在JAR中有一个第三方servlet,我无法更改它。我已经扩展了这个servlet,并将其作为应该使用的servlet正常使用,客户端发出一个HTTP请求来调用我的servlet 但是现在客户端需要一个自动服务,也就是说,我需要从servlet所在的同一个webapp向第三方servlet发出一些请求 我查看了第三方servlet代码,但没有找到绕过servlet的地方,因为HttpServletRequest和HttpServletResponse对象是从一个方法传递到另一个方法的。。。基本

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

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

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

我找到了解决方案,但没有让我满意:

使用HttpURLConnection从URL调用servlet:我的常识是,从URL调用第三方servlet不是最好的方法 去吧,除了额外的开销,我不想暴露第三方 servlet。从url调用我的servlet也会带来以下问题: 会议和其他事情

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

使用jMock或类似的东西:还没有探索这个解决方案,但在实际应用中使用测试驱动库是错误的 环境

有人知道如何与第三方servlet交互吗

编辑:

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


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

您可以尝试将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(无论什么)来做您想做的事情,然后使用响应来做您想做的事情。如果返回字符串还不够,您可以创建任何想要的返回类型,可能包含标题列表、响应代码和内容模板

从url调用我的servlet也会带来会话和其他问题

如果这是唯一的问题,那么只需在后续的
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();
// ...
另见:

如果我正确理解了您的问题,您已经实现或拥有一个为您生成报告的第三方servlet

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


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

您想对servlet做什么?答案将取决于它。既然你没有说这一点,我认为没有一个通用的解决方案适合你。“自动服务”是什么?将请求转发到该servlet不是一个选项?@gigadot该servlet是一个复杂的第三方解决方案,可以做很多事情,基本上就像一个报表实用程序。在这种情况下,我需要要求servlet在某一时刻为特定的报告类型(以及其他参数)生成一份报告,然后我不需要结果,但它们将保持在会话中,然后我将再次调用servlet,要求在会话中生成一个包含结果的xls文件。我不知道我是否解释得很好,但这是一个非常复杂的系统。您可以尝试使用ServletAPI类的现有存根实现。有很多这样的实现,尽管它们通常是大型项目的一部分,比如Spring测试。问题是,在第三方包中完成的部分我无法更改…是这样的,但与我找到的第一个解决方案类似,我必须公开servlet(我不太想这么做,因为它没有实现任何类型的操作系统安全性)对请求进行环回似乎是非常正确的。但这似乎是唯一的方法。写一个过滤器来拒绝所有不是来自您自己的servlet的请求如何?如果您想使用会话,也请阅读BalusC的答案,因为用户可能看不到它。但是如果必须这样做,过滤器也会拒绝我的请求一个环回。我将不得不更多地考虑你的想法,它可以引导我做一些事情。你可以制作一个过滤器,只拒绝不是来自你自己的ip的请求。这是有用的信息。它不能完全解决问题,但我可以使用一些知识。我与会话有关的问题更深,因为我不关心http会话但系统会话也必须与用户名关联。可能必须为此鼠海豚创建特定用户。是否要将当前运行的
HttpSession
也用于该其他servlet?换句话说,您正在从servlet内部调用该其他servlet?(这是我最初理解的,另请参见编辑历史记录,但当我重新解释您问题中的“自动服务”短语时,我改变了想法和答案;自动服务当然不能(应该)从servlet内部启动)。不,我正在尝试自己调用第三方servlet。第三方servlet没有映射(我的是,但它运行了很多在本例中不必要的代码),我可以将其映射为最后一个资源。但是,由于没有对服务器的请求(因为运行的代码已经在服务器内部),我首先从哪里获取请求.//见sch