我在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进行交互?
编辑:
由于我的英语不是很好,我发现自己很难解释,这里有一个原理图,试图更好地解释
EDIT2:在与第三方制造商会面后,他们提出隔离我需要避免调用servlet的方法。如果您没有相同的运气,我会检查 gigadot 和 BalusC 答案。
答案 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(无论如何)来执行您想要的操作,然后使用响应执行您想要的操作。如果返回一个字符串是不够的,你可以创建你想要的任何返回类型,可能包含一个标题列表,响应代码和内容模板。