一个小项目中的问题:
处理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> </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());
}
}
处理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> </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());
}
}
解决方案 »
- 大家帮忙,这是什么错误:XML tag name mismatch (expected img)
- 在给word文档建立索引的时候报错
- 如何实现附件的下载
- fckeditor 上传大于10K的文件就提示没有足够的权限
- 求助 J2EE 业务模块 产品询价功能
- 由Thread类创建的进程在linux程序上运行,能不能用Linux命令查看进程是否在运行,同时怎么用命令终止该进程?
- 在jsp中实现很自如的c/s界面的那种控制和响应(.net里好像就可以随意做到),是不是只能用applet啊?
- 问题还未解决,高手仍需帮忙!!!!!!
- SmartUpload 问题,我在Windows平台下运行没有问题,在linux平台下出现问题,这是怎么回事?
- 有关JBuilder5和Tomcat4结合的问题
- 在jsp页面中已实现word显示打印,怎么插入分页符
- 请问在jsp中分页应该怎么做
这样就可以运行了但是1,我的环境变量已经设定好了,其次Main.java放在c盘下
不知道为什么写成
judge.setCommand("cmd.exe /c javac.exe c:/Main.java ");
是错的
我按照你的方法改了(见下面),确实是可以编译了,先谢过.
不过后面的运行的语句好像还有问题,我采用了输入输出重定向,运行提交程序的输入数据在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());