Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 将System.out重定向到第页_Java_Jsp_Redirect - Fatal编程技术网

Java 将System.out重定向到第页

Java 将System.out重定向到第页,java,jsp,redirect,Java,Jsp,Redirect,我正在通过JSP页面运行Java应用程序。 是否可以将Java应用程序打印到System.out的所有内容重定向到我的页面 编辑: 我有一个包含main函数的包pkg。此函数有许多System.out.println调用。e、 g package pkg; public class pkg { public static void main(String[] args) { System.out.println("Hello"); } } 在我的index.js

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

编辑: 我有一个包含main函数的包pkg。此函数有许多System.out.println调用。e、 g

package pkg;
public class pkg {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}
在我的index.jsp中,我调用:


一种天真的方法是使用适当包装的。但是,一旦多个并发请求启动,这将不起作用,因为不同线程的输出之间没有区别


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

一种简单的方法是使用适当的包装调用。但是,一旦多个并发请求启动,这将不起作用,因为不同线程的输出之间没有区别


您可以创建自己的输出流子类,在对每个请求调用
pkgmain()
方法之前,将其委托给另一个线程本地输出流,并将其设置为响应的输出流。如果您的
pkgmain()
生成了额外的线程,则此方法可能不起作用(尽管您可以尝试在本例中使用)。

重构被调用类的代码,使其以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):


重构被调用类的代码,使其以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):


如果您无法编辑要执行的类的源代码,另一种方法是使用
运行时#exec()
使用
java
命令以编程方式执行该类,就像您在命令提示符下执行它一样,然后通过
进程捕获它的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 35; exec()
,我强烈建议您阅读(全部4页),了解并理解其中的注意事项

最后但并非最不重要的一点是,请记住Java/JSP代码在Web服务器运行的机器(服务器端)中物理运行,而不是在Web浏览器运行的机器(客户端)中运行,而且Web服务器的Java运行时安全管理器应该允许从Web应用程序内部执行
Runtime 35; exec()
。如果您打算将此应用部署到您无法控制security manager的第三方主机上,则
运行时#exec()
调用将被阻止并抛出
安全异常


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

如果无法编辑要执行的类的源代码,则另一种方法是使用
运行时#exec()
使用
java
命令以编程方式执行该类,方法与在命令提示符下执行该类一样,然后通过
过程捕获其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 35; exec()
,我强烈建议您阅读(全部4页),了解并理解其中的注意事项

最后但并非最不重要的一点是,请记住Java/JSP代码在Web服务器运行的机器(服务器端)中物理运行,而不是在Web浏览器运行的机器(客户端)中运行,而且Web服务器的Java运行时安全管理器应该允许从Web应用程序内部执行
Runtime 35; exec()
。如果您打算将此应用部署到您无法控制security manager的第三方主机上,则
运行时#exec()
调用将被阻止并抛出
安全异常


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

为什么要这样做?您在什么上下文中调用System.out?如果在页面中,请使用out.println()而不是System.out.println()。尽管如此,以这种方式将输出写入页面似乎是一个糟糕的想法。可能是的。如果你发布代码并解释如何运行这个Java应用程序,你会得到更好的答案。你为什么要这么做?您在什么上下文中调用System.out?如果在页面中,请使用out.println()而不是System.out.println()。尽管如此,以这种方式将输出写入页面似乎是一个糟糕的想法。可能是的。如果你发布代码并解释如何运行这个Java应用程序,你会得到更好的答案。是否每次需要列表时都编写java.util.List?我不是在给System.out写信。代码是这样的。这不是我的密码。有什么不清楚的地方可以打印给作者,而不是System.out?同意out与
response.getWriter()
。关键是该类仍然可以用作常规Java应用程序,它可以写入System.out。如果目标是完全忘记这种启动应用程序的方式,那么主方法当然应该完全删除。是否每次需要列表时都编写java.util.List?我不是在给System.out写信。代码是这样的。这不是我的密码。有什么不清楚的地方可以打印给作者,而不是System.out?同意out与
response.getWriter()
。关键是该类仍然可以用作常规Java应用程序,它可以写入System.out。如果目标是完全忘记一件事
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.