Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以从Java类调用servlet?_Java_Class_Servlets_Jakarta Ee - Fatal编程技术网

是否可以从Java类调用servlet?

是否可以从Java类调用servlet?,java,class,servlets,jakarta-ee,Java,Class,Servlets,Jakarta Ee,我使用ibmwebsphere作为servlet容器。我的应用程序有几个servlet和Java类。我的意图是直接从Java类调用其中一个servlet。通过一些研究,我发现可以使用RequestDispatcher接口来实现这一点。但是有必要将对象ServletRequest和ServletResponse作为参数传递给方法forward()。有什么方法可以安全地“很好地”绕过这个问题?我所说的“很好”是指保留好的编程和设计模式。做到这一点的唯一方法是将所需的逻辑与servlet解耦。这一要求

我使用ibmwebsphere作为servlet容器。我的应用程序有几个servlet和Java类。我的意图是直接从Java类调用其中一个servlet。通过一些研究,我发现可以使用RequestDispatcher接口来实现这一点。但是有必要将对象ServletRequest和ServletResponse作为参数传递给方法forward()。有什么方法可以安全地“很好地”绕过这个问题?我所说的“很好”是指保留好的编程和设计模式。

做到这一点的唯一方法是将所需的逻辑与servlet解耦。这一要求表明servlet与业务/域代码逻辑的耦合过于紧密,显然也需要在webapplication上下文之外使用这些逻辑


将原始servlet代码重构为可重用的Java类和方法(反过来,不使用
javax.servlet
包中的任何内容),以便最终可以从servlet类和“普通”包导入和调用它Java类。

实现这一点的唯一方法是将所需的逻辑与servlet解耦。这一要求表明servlet与业务/域代码逻辑的耦合过于紧密,显然也需要在webapplication上下文之外使用这些逻辑


将原始servlet代码重构为可重用的Java类和方法(反过来,不使用
javax.servlet
包中的任何内容),以便最终可以从servlet类和“普通”包导入和调用它Java类。

您可以编写一个过滤器,将当前请求和响应存储在static
ThreadLocal
中,以便以后可以在同一请求中使用它们。然后,您可以实现自己的静态方法
forward
,该方法使用它们并分派到另一个页面

这就是JSF中采用的方法,可以随时访问
FacesContext.getCurrentInstance


但我不认为这是一个优雅的设计。相反,尝试遵循@BalusC的建议,重构您的逻辑

您可以编写一个过滤器,将当前请求和响应存储在static
ThreadLocal
中,以便以后可以在同一请求中使用它们。然后,您可以实现自己的静态方法
forward
,该方法使用它们并分派到另一个页面

这就是JSF中采用的方法,可以随时访问
FacesContext.getCurrentInstance


但我不认为这是一个优雅的设计。相反,尝试遵循@BalusC的建议,重构您的逻辑

这将有助于了解更多关于你为什么要这么做的背景信息。我假设您希望调用servlet中的某些业务逻辑。这表明应用程序的设计很差


你熟悉吗?如果您的“模型”代码是松散耦合的,那么您可以直接调用它。

这将有助于了解您为什么要尝试这样做。我假设您希望调用servlet中的某些业务逻辑。这表明应用程序的设计很差


你熟悉吗?如果您的“模型”代码是松散耦合的,那么您就可以直接调用它。

就是这样,应用程序的设计非常糟糕,这就是我遇到困难的原因。但是我不能重构这个servlet背后的业务逻辑,至少现在不能。要调用的servlet是由另一家公司提供的,它提供了一个专有遗留系统的接口。一个稍微体面的IDE(Eclipse、Netbeans、IntelliJ等)可以在几次单击中重构代码。你会比发布这个问题所需的时间更早做好准备,等待答案并发明一种行不通的破解/解决方法。我完全理解并同意你的观点。但是,不幸的是,有一些政治问题阻止我现在进行任何重构。我只是不想在同一个应用程序中使用HTTP调用servlet。然后我会尝试一下ewernli的想法。老实说,ewernli的想法是不可行的。在这种情况下,应用程序的设计真的很糟糕,这就是我苦苦挣扎的原因。但是我不能重构这个servlet背后的业务逻辑,至少现在不能。要调用的servlet是由另一家公司提供的,它提供了一个专有遗留系统的接口。一个稍微体面的IDE(Eclipse、Netbeans、IntelliJ等)可以在几次单击中重构代码。你会比发布这个问题所需的时间更早做好准备,等待答案并发明一种行不通的破解/解决方法。我完全理解并同意你的观点。但是,不幸的是,有一些政治问题阻止我现在进行任何重构。我只是不想在同一个应用程序中使用HTTP调用servlet。然后我会尝试一下ewernli的想法。老实说,ewernli的想法是不可行的。re:
FacesContext.getCurrentInstance
可以随时访问。-这是因为
FacesServlet
(或类似控制器)在调用生命周期之前将其初始化为
ThreadLocal
变量。您将无法在另一个线程中获得相同的面上下文。@McDowell确定。这正是我在第一节中描述的过滤器和
ThreadLocal
。我的回答不清楚吗?不,我的评论很愚蠢。我一定是浏览了你的答案,错过了显而易见的答案。我想我已经多次尝试解释ThreadLocal/FacesContext的事情了,我对这个话题有了自动的回应。道歉!回复:
FacesContext.getCurrentInstance
可以随时访问。-这是因为
FacesServlet
(或类似控制器)在调用生命周期之前将其初始化为
ThreadLocal
变量。您将无法在上下文中获得相同的面