如何在jsp中编译I`.java文件`?
我想使用java编译器API在jsp中编译一个java文件。我创建了一个html文件,并使用其textArea元素将其文本(预期是用户输入的java代码)发送到服务器上的JSP,在以字符串形式收集后,我创建了一个扩展名为.java的文件,并使用textArea内容编写了该文件,然后我使用了编译器API,但它没有编译该文件。我想做一些像 index.html 请不要使用Scriptlet,编写可以从jsp调用的java代码。 Java需要一个带有类名的文件名,这可能是您的主要问题。 用户可以输入的java代码的预期格式是什么?方法、类还是仅方法内的脚本? 以您的java知识水平,请不要让未知用户输入代码,否则您的服务器很快就会被黑客攻击! 下面的代码编译变量convert中的代码。它自动检测输入的类的名称。如果没有找到类,它将创建一个类名为MyClass的模板如何在jsp中编译I`.java文件`?,java,jsp,java-compiler-api,online-compilation,Java,Jsp,Java Compiler Api,Online Compilation,我想使用java编译器API在jsp中编译一个java文件。我创建了一个html文件,并使用其textArea元素将其文本(预期是用户输入的java代码)发送到服务器上的JSP,在以字符串形式收集后,我创建了一个扩展名为.java的文件,并使用textArea内容编写了该文件,然后我使用了编译器API,但它没有编译该文件。我想做一些像 index.html 请不要使用Scriptlet,编写可以从jsp调用的java代码。 Java需要一个带有类名的文件名,这可能是您的主要问题。 用户可以输入的
String convert = "public class NewClass { public static void main(String[] args) { System.out.println(\"test\"); }}";
String filename = "MyClass.java";
int i = convert.indexOf(" class ");
if(i == -1) {
convert = "public class MyClass { " + convert + " } ";
} else {
int classNameIndex = convert.indexOf(" ", i+1);
int classNameIndexEnd = convert.indexOf(" ", classNameIndex+1);
filename = convert.substring(classNameIndex+1, classNameIndexEnd) + ".java";
}
PrintWriter wr = response.getWriter();
File f = new File(filename);
if (!f.exists()) {
f.createNewFile();
wr.println("File is created\n");
}
FileWriter write = new FileWriter(f);
BufferedWriter bf = new BufferedWriter(write);
bf.write(convert);
bf.close();
wr.println("File writing done\n");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, filename);
if (result == 0) {
wr.println("Compilation Successful");
} else {
wr.println("Compilation Failed");
}
有几种方法可以实现这个场景,但是我们不能在jsp中包含Java代码,而应该使用表达式语言EL实现同样的功能,或者我们甚至可以为自定义功能编写自定义jsp标记。这个链接将解释很多关于这个过程的内容 尽管您喜欢阅读课本,但HeadFirstServlet和JSP详细而优雅地解释了整个概念。因此,为了获得正确的功能信息,这本书是一本必备书
快乐学习..这在各个层面都是错误的。你不应该这样做。比如说,脚本是个坏主意。您是否试图允许人们发布源代码并在JSP中编译它?对不起,从来没有这样使用过JSP。我再也不使用JSP了——太90年代了。学到的第一课:不要指导客户机做任何繁重的工作。我曾经有一个在线编译器。一位深入维护Java编译器的人士警告说,有一些短代码示例可能会占用编译器30分钟或更长时间。我把它从公众视线中移开了。我认为@duffymo和其他人在评论中的观点是一个很好的线索。不要这样做。请打开问题中提到的链接。。我不是在跟踪一个与SO无关的链接。顺便说一句,仅仅因为有人做了某事,并不一定就是一个“好主意”。
<%
String convert = request.getParameter("textarea1");
PrintWriter wr = response.getWriter();
File f =new File("file121.java");
if(!f.exists())
{
f.createNewFile();
wr.println("File is created\n");
}
FileWriter write = new FileWriter(f);
BufferedWriter bf = new BufferedWriter(write);
bf.write(convert);
bf.close();
wr.println("File writing done\n");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null,null,null,"file121.java");
if(result==0){
wr.println("Compilation Successful");
}
else{
wr.println("Compilation Failed");
}
%>
String convert = "public class NewClass { public static void main(String[] args) { System.out.println(\"test\"); }}";
String filename = "MyClass.java";
int i = convert.indexOf(" class ");
if(i == -1) {
convert = "public class MyClass { " + convert + " } ";
} else {
int classNameIndex = convert.indexOf(" ", i+1);
int classNameIndexEnd = convert.indexOf(" ", classNameIndex+1);
filename = convert.substring(classNameIndex+1, classNameIndexEnd) + ".java";
}
PrintWriter wr = response.getWriter();
File f = new File(filename);
if (!f.exists()) {
f.createNewFile();
wr.println("File is created\n");
}
FileWriter write = new FileWriter(f);
BufferedWriter bf = new BufferedWriter(write);
bf.write(convert);
bf.close();
wr.println("File writing done\n");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, filename);
if (result == 0) {
wr.println("Compilation Successful");
} else {
wr.println("Compilation Failed");
}