一个小项目中的问题:
处理submit页面提交的源码(用java语言所写),将源码保存,然后进行动态编译和运行.然而始终不能进行编译和运行.我试了几天了,用servlet和jsp分别处理过,都不行.编译和运行返回的结果都为1.
然而我独立再写个程序调用JudgeBean就可以进行编译和运行的(见后面的Judge.java程序).哪位高手帮忙看下,小弟感激不尽!submit.jsp如下:<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,java.io.*" errorPage="" %>
<html>
<head>
<title>无标题文档</title>
</head><body>
<div align="center">
  <p>Source</p>
  <form name="form1" method="post" action="submit2.jsp">
    <p>
      <textarea name="sourcearea" cols="50" rows="15"></textarea>
    </p>
    <p>      <input type="submit" name="Submit" value="submit">
      <input type="reset" name="Submit" value="reset">
        </p>
  </form>
  <p>&nbsp;</p>
</div>
<jsp:useBean id="judge" class="bean.JudgeBean" />
<%
         //保存源文件路径,也就是JudgeBean的路径,跟JudgeBean放在通一个目录下
String sourcepath="D:/Java/Tomcat5.5/webapps/AcmSystem/WEB-INF/classes/bean/"; String code=request.getParameter("sourcearea");

try{     //保存文件
File temp=new File(sourcepath+"Main.java");
PrintWriter pw = new PrintWriter(new FileOutputStream(temp));     
pw.println(code);
pw.close();
out.println(temp.getAbsolutePath());
}
catch(Exception ex){
out.println("yyy"+ex.toString());
ex.printStackTrace();
}

//编译和运行
judge.setCommand("cmd.exe /c javac Main.java >error.txt");//javac Add.java
judge.execute();
out.println(judge.getExitValue());
judge.setCommand("cmd.exe /c java Main <in.txt >out.txt");
judge.execute();
out.println(judge.getExitValue());
%>
</body>
</html>
JudgeBean的代码如下:package bean;
import java.lang.*;
import java.io.*;
public class JudgeBean
{
private String cmd="";
private Runtime rt=null;
private Process pc=null;
public JudgeBean()
{
}
public void setCommand(String cmd)
{
this.cmd=cmd;
}
public String getCommand()
{
return cmd;
}
public int getExitValue()
{
return pc.exitValue();
}
public InputStream getInputStream()
    {
        return pc.getInputStream();
    }
    public void kill()
    {
        if(pc!= null) pc.destroy();
    }
public void execute()
{
long t=System.currentTimeMillis();
        rt = Runtime.getRuntime();
        try{
            pc = rt.exec(cmd);
            pc.waitFor();
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        System.out.println (System.currentTimeMillis()-t+"ms");
}
}Judge.java源码:import bean.JudgeBean;
public class Judge
{
public static void main(String args[])
{
JudgeBean judge=new JudgeBean();
judge.setCommand("cmd.exe /c cl 2.cpp >1err.txt");//javac Add.java
judge.execute();
System.out.println (judge.getExitValue());
judge.setCommand("cmd.exe /c 2.exe <1.txt >1out.txt");
judge.execute();
System.out.println (judge.getExitValue());
}
}

解决方案 »

  1.   

    judge.setCommand("cmd.exe /c D:/Java/jdk1.5.0/bin/javac.exe c:/Main.java ");
    这样就可以运行了但是1,我的环境变量已经设定好了,其次Main.java放在c盘下
    不知道为什么写成
    judge.setCommand("cmd.exe /c javac.exe c:/Main.java ");
    是错的
      

  2.   

    好像servlet默认的路径也在c:/windows/system32下.我上次在servlet里的语句new File("a.txt");一直找不到a.txt在哪里,后来我输出它的绝对路径才知道在c盘.
      

  3.   

    To: jszhaochengming(SAMYOO) 
    我按照你的方法改了(见下面),确实是可以编译了,先谢过.
    不过后面的运行的语句好像还有问题,我采用了输入输出重定向,运行提交程序的输入数据在c:/in.txt 中,我想将输出结果存在c:/out.txt中,可是提交完发现out.txt是0字节的,这又是为什么呢?难道输入流没有关闭?
    我提交的代码是这样的:
    import java.io.*;
    import java.util.*;
    public class Main{
          public static void main(String args[]) throws Exception { int a=0,b=0;
             Scanner cin=new Scanner(System.in);
             while(cin.hasNextInt()){
                 a=cin.nextInt();
                 b=cin.nextInt();
                 System.out.println(a + b);
             }
         }
    }
    in.txt中的数据为:
    1 2
    3 4
    5 6
    4 8
    12 23
    0 0
    judge.setCommand("cmd.exe /c D:/Java/jdk1.5.0/bin/javac.exe c:/Main.java >error.txt");//javac Add.java
    judge.execute();
    out.println(judge.getExitValue());
    judge.setCommand("cmd.exe /c D:/Java/jdk1.5.0/bin/javac.exe Main<c:/in.txt >c:/out.txt");
    judge.execute();
    out.println(judge.getExitValue());