使用servlet显示java代码的输出

时间:2014-08-16 15:09:45

标签: java servlets

我正在构建一个项目,我将要求用户在提供的textarea中输入他的代码,然后按下编译按钮,在下一页显示生成的输出。在代码中,使用“String name”,我要求用户将使用的类的名称,并使用“字符串文本”,用户将输入的代码。首先我使用“javac class_name”编译代码(在try块“Process p”中)然后执行它使用“java class_name”(在try块“Process c”中)。使用它,在“C:\ Users \ ANGADPENNY1 \ workspace \ Project \ src \”位置创建.java文件和.class文件。现在的问题是如何在下一页显示生成的输出。

import java.awt.event.KeyEvent;
import java.io.*;
import javax.swing.JFileChooser;
import java.io.IOException;
import java.nio.file.Files;
import java.sql.*;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static java.nio.file.StandardCopyOption.*;

/**
 * Servlet implementation class FileCreater
 */
@WebServlet("/FileCreater")
public class FileCreater extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public FileCreater() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
 *      response)
 */


protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String title = "Database Result";
    String docType = "<!doctype html public\"-//w3c//dt html 4.0"
            + "transitional//en\">\n";
    String name = request.getParameter("text1");

    String text = request.getParameter("TEXTAREA1");

    // String file = application.getRealPath("/new10.java");
    // String file = "JCQProject\\src\\"+name+".java";
    // String file = System.getProperty("user.home")+"\\Desktop\\"
    // +name+".java";

    try {

        File file = new File(
                "C:\\Users\\ANGADPENNY1\\workspace\\Project\\src\\" + name
                        + ".java");

        if (file.delete()) {
            System.out.println(file.getName() + " is deleted!");
        } else {
            System.out.println("Delete operation is failed.");
        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    String file = "C:\\Users\\ANGADPENNY1\\workspace\\Project\\src\\"
            + name + ".java";
    FileWriter filewriter = new FileWriter(file, true);
    filewriter.write(text);

    filewriter.close();

    try {
        Process p = Runtime.getRuntime().exec(
                "javac  C:\\Users\\ANGADPENNY1\\workspace\\Project\\src\\"
                        + name + ".java");


        Process c = Runtime.getRuntime().exec(
                "java C:\\Users\\ANGADPENNY1\\workspace\\Project\\src\\"
                        + name);

    } catch (Exception e) {
        System.out.println(e.toString());
        e.printStackTrace();
    }


}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
 *      response)
 */
protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    // TODO Auto-generated method stub
    }

}

2 个答案:

答案 0 :(得分:1)

您可以按以下方式获取Process的输出流 -

Process p = Runtime.getRuntime().exec(
            "javac  C:\\Users\\ANGADPENNY1\\workspace\\Project\\src\\"
                    + name + ".java");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

然后你可以阅读Streams with

String readLine = null;
while ((readLine = stdInput.readLine()) != null) {
            //process readLine 
        }

答案 1 :(得分:0)

使用Runtime.exec并不容易,你必须非常小心。有关详细信息,请参阅this article

相反,我建议使用ProcessBuilder。它有简单的方法来重定向输入和输出(并且不要忘记重定向错误流!)。