如何在另一个servlet的init()方法内使用一个servlet的输出?

问题描述:

这里就是我想要做的事:如何在另一个servlet的init()方法内使用一个servlet的输出?

public void init(ServletConfig config) { 
    // ... 
    URL url = new URL("http://myhost:port/path/to/otherservlet"); 
    // ... do stuff with contents of url 
} 

这工作得很好,但为myhost和端口进行硬编码,我想避免这种情况。我想

URL url = new URL("/path/to/otherservlet"); 

但这是无效的。我也试过

config.getServletContext().getResource("/path/to/otherservlet"); 

但这只适用于静态文件。

如何使用获取一个servlet来初始化另一个servlet的结果?我不想使用RequestDispatcher的forward()或include()方法 - 其他的servlet的结果是用于init()方法的,而不是在响应中发送的。

我不会惊讶地发现它无法完成。我认为toby的答案(将代码分成普通类)是最好的方法,但如果实在不可能,请尝试编码用于本地请求的主机和端口作为服务器的web.xml文件中的上下文参数:

<context-param> 
    <param-name>localhost</param-name> 
    <param-value>localhost</param-value> 
</context-param> 
<context-param> 
    <param-name>localport</param-name> 
    <param-value>8080</param-value> 
</context-param> 

并获取值为context.getInitParameter("localhost")等您也可以尝试动态确定值,但您可能必须等待请求进来,因此您可以使用像HttpUtils.getRequestURL(req)之类的东西 - 我不知道任何其他方式去做吧。

+0

这也是我得到的结论,但我希望它不会如此。 – 2009-02-12 02:53:35

如果可能的话,我认为更好的方法是将另一个servlet的代码重构为某个可以直接调用所需输出的某个类。

+0

让我们说这是不可能的。 – 2009-02-12 00:33:27

也许它会工作,如果你预先在servlet上下文的URL。

我同意重构听起来像是一个更好的主意。如果它是一个初始化操作,并且两个servlet都处于相同的上下文中,那么参数可以外部化为文件或数据库,这样两者都可以将它们提取出来。

我不希望init太广泛。