2012-05-26 2 views
0

으로 리디렉션합니다. JSP 페이지를 통해 Java 응용 프로그램을 실행하고 있습니다. 자바 앱이 System.out에 인쇄 한 모든 것을 내 페이지로 리디렉션 할 수 있습니까?System.out 페이지를

편집 : 나는 패키지 PKG 주요 기능을 포함 있습니다. 이 함수에는 많은 System.out.println 호출이 있습니다. 예 : 에서

package pkg; 
public class pkg { 
    public static void main(String[] args) { 
     System.out.println("Hello"); 
    } 
} 

index.jsp를 I 전화 :

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

내가 페이지에서 모두에게 pkg.pkg.main 인쇄를 참조 할 필요가있다. 예 :

Hello 
+0

왜 그렇게하고 싶습니까? 어떤 맥락에서 System.out을 호출합니까? 페이지 내에있는 경우 System.out.println() 대신 out.println()을 사용하십시오.여전히 이런 식으로 페이지에 출력을 쓰는 것은 끔찍한 생각처럼 보입니다. – toniedzwiedz

+0

아마도 그렇습니다. 코드를 게시하고 Java 응용 프로그램을 실행하는 방법을 설명하면 더 나은 대답을 얻을 수 있습니다. –

+0

감사, Q 편집 : – MBZ

답변

1

팩터는 호출 된 클래스의 코드는이 인수로 작가 소요되며, System.out에 대신이 작가로 인쇄 할 수 있도록 수 서블릿가) : 당신이 실행하는 클래스의 소스 코드를 편집 할 수없는 경우

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

어떻게 작동하지 않습니까? 코드를 보여주십시오. 어떤 일이 발생하는지 설명하십시오. –

+0

Err, 물론 클래스를 가져온 것으로 가정했습니다. List가 필요할 때마다 java.util.List를 작성합니까? 그리고 저는 System.out에 글을 쓰지 않을 것입니다. 코드가 않습니다. 그건 내 코드가 아니야. *에 대해 명확하지 않은 점이 무엇이며 System.out *이 아닌이 작성자에게 인쇄 하시겠습니까? 약'response.getWriter()'에 대해 동의했다. –

+0

요점은 클래스가 여전히 System.out에 쓰는 일반 Java 응용 프로그램으로 사용될 수 있다는 것입니다. 애플 리케이션을 시작하는 방법을 완전히 잊어 버리는 것이 목표라면, 메인 메소드는 물론 완전히 제거되어야한다. –

2

본래의 접근 방식은 적절하게 response output stream 포장과 System.setOut()를 호출하는 것입니다. 그러나 다른 스레드의 출력간에 차별화가 없으므로 여러 동시 요청이 시작되면 작동하지 않습니다.

각 요청에 대해 pkgmain() 메서드를 호출하기 전에 응답의 출력 스트림에 설정 한 다른 스레드 로컬 출력 스트림을 위임하는 자체 출력 스트림 하위 클래스를 만들 수 있습니다. pkgmain()이 추가 스레드를 생성하는 경우이 방법은 작동하지 않을 수 있습니다 (이 경우 InheritableThreadLocal을 사용해 볼 수도 있음). 어떤해야 (

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에서 두 번째 주요 메소드를 호출

0

또 다른 방법, 프로그래밍 등 같은 java 명령을 일반적인 방법을 사용하여 클래스를 실행하기 위해 Runtime#exec()을 사용하는 것입니다 당신 명령을 comm에서 실행합니다. 프롬프트를 표시 한 다음 stdout (및 stderr!)을 Process까지 캡처하십시오. 당신이 정말로 전에 Runtime#exec()을 사용하지 않은 경우

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. 

, 난 강력하게 배우고 그것의주의 사항을 이해하기 위해 this well known JavaWorld article (모두 4 페이지)을 읽는 것이 좋습니다.

자바/JSP 코드는 웹 서버가 실행되는 머신 (클라이언트 측)이 아닌 웹 서버가 실행되는 머신 (클라이언트 측)에서 물리적으로 실행되며 웹 서버의 자바 런타임 보안 관리자는 웹 응용 프로그램 내부에서 Runtime#exec()을 실행하도록 허용해야합니다. 보안 관리자를 제어 할 수없는 타사 호스트에이 응용 프로그램을 배포하려는 경우 Runtime#exec() 호출이 차단되고 SecurityException을 던질 확률이 큽니다.

말할 필요도없이, 이것은 모두 꽤 냄새가 난다. 이러한 클래스가 사용자가 제어하는 ​​코드에 관한 것이라면, 아마도 엄청난 보안 취약점을 열 수 있습니다.

관련 문제