繁体   English   中英

将System.out重定向到页面

[英]redirect System.out to page

我正在通过JSP页面运行Java应用程序。 是否可以将Java应用程序打印的所有内容重定向到System.out到我的页面中?

编辑:我有一个包pkg ,其中包含一个主要功能。 此函数有很多System.out.println调用。 例如

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打印在页面上的所有内容。 例如

Hello

天真的方法是使用适当包装的响应输出流调用System.setOut() 但是,一旦有多个并发请求进入,这将不起作用,因为来自不同线程的输出之间将没有区别。

您可以创建自己的输出流子类,该子类委派给另一个线程本地输出流,您在每个请求上调用pkgmain()方法之前,将其设置为响应的输出流。 如果您的pkgmain()产生了其他线程,则此方法可能不起作用(尽管在这种情况下,您可以尝试使用InheritableThreadLocal )。

重构被调用类的代码,以使其使用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)中调用第二个主要方法:

<%
    pkg.main(out, new String[] {});
%>

如果您无法编辑要执行的类的源代码,另一种方法是使用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() ,我强烈建议您阅读这篇著名的JavaWorld文章 (共4页),以了解和理解其警告。

最后但并非最不重要的一点是,请记住Java / JSP代码实际上在运行Web服务器的服务器(服务器端)上运行,而不是在运行Web浏览器的计算机(客户端)上运行,并且Web服务器的Java运行时安全管理器应允许从Web应用程序内部执行Runtime#exec() 如果您打算将此应用程序部署到您无法控制安全管理器的第三方主机,则很有可能会阻塞Runtime#exec()调用并抛出SecurityException

不用说,这一切都很臭。 如果这些类涉及用户控制的代码,则可能会带来巨大的安全漏洞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM