我正在通过JSP页面运行Java应用程序。 是否可以将Java应用程序打印到System.out的所有内容重定向到我的页面?
修改 我有一个包 pkg ,其中包含一个main函数。这个函数有很多System.out.println调用。 e.g。
package pkg;
public class pkg {
public static void main(String[] args) {
System.out.println("Hello");
}
}
在我的 index.jsp 中,我致电:
<%
pkg.pkg.main(new String[] {});
%>
我需要在页面上看到 pkg.pkg.main 的所有内容。 e.g。
Hello
答案 0 :(得分:2)
一种天真的方法是使用适当包装的System.setOut()来呼叫response output stream。但是,一旦多个并发请求启动,这将无法工作,因为不同线程的输出之间不会有区别。
您可以创建自己的输出流子类,该子类委托给另一个线程本地输出流,您在每个请求上调用pkgmain()
方法之前将其设置为响应的输出流。如果您的pkgmain()
生成其他线程,则此方法可能无效(尽管在这种情况下您可以尝试使用InheritableThreadLocal)。
答案 1 :(得分:1)
重构被调用类的代码,使其以Writer作为参数,并打印到此Writer而不是System.out:
package pkg;
public class pkg {
public static void main(String[] args) {
main(new OutputStreamWriter(System.out), args);
}
public static void main(Writer writer, String[] args) {
PrintWriter out = new PrintWriter(writer);
out.println("Hello");
}
}
并从JSP(应该是一个servlet)调用第二个main方法:
<%
pkg.main(out, new String[] {});
%>
答案 2 :(得分:0)
另一种方法,如果你不能编辑要执行的类的源代码,那就是使用Runtime#exec()
以通常的方式使用java
命令以编程方式执行类。在命令提示符下执行它,然后通过Process
捕获它的stdout(和stderr!)。
Process process = Runtime.getRuntime().exec("java -cp /path/to/your/pkg pkg.pkg");
InputStream stdout = process.getInputStream();
InputStream stderr = process.getErrorStream();
// Read and write it to response.getOutputStream() the usual way.
如果您之前从未真正使用Runtime#exec()
,我强烈建议您阅读this well known JavaWorld article(所有4页)以了解并了解其警告。
最后但同样重要的是,请记住,Java / JSP代码在运行Web服务器的机器(服务器端)中运行,而不是运行webbrowser的位置(客户端)以及Web服务器的Java运行时安全性经理应该允许从webapp中执行Runtime#exec()
。如果您打算将此应用程序部署到您无法控制安全管理器的第三方主机上,那么Runtime#exec()
调用将被阻止并抛出SecurityException
的可能性很大。
毋庸置疑,这一切都很臭。如果这些类涉及用户控制的代码,那么您可能会打开巨大的安全漏洞。