【问题标题】:How can compile I `.java file` in jsp?如何在jsp中编译我的`.java文件`?
【发布时间】:2016-08-03 15:45:26
【问题描述】:

使用java compiler API 我想在jsp 中编译一个java file。我创建了一个 html 文件并使用它的textArea 元素将其文本(预计是用户输入的 java 中的代码)发送到服务器上的 JSP,并在将其收集到字符串中后,我制作了一个带有 .java 扩展名的文件和用textArea 内容编写它然后我使用了编译器API,但它没有编译文件。我想做类似this

index.html

  <form action="formAction.jsp" method="post">
        Please enter your text:
        <br/>
        <textarea name="textarea1" rows="5"></textarea>
        <br/>
        <input type="SUBMIT" value="Submit"/>
    </form>     

formAction.jsp

 <%

        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");
        }




     %>   

【问题讨论】:

  • 这在各个层面都是错误的。你不应该这样做。
  • Scriptlet 是一个坏主意。您是否试图允许人们发布源代码并在您的 JSP 中编译它?抱歉,从来没有那样使用过 JSP。我根本不再使用 JSP - 也是 90 年代。
  • 第一个教训:不要指导客户做任何繁重的工作。
  • 我曾经有一个在线编译器。一位深入维护 Java 编译器的人警告说,有一些简短的代码示例可能会使编译器占用 30 分钟或更长时间。我把它从公众视野中删除了。我认为 @duffymo 和 cmets 中其他人的观点是一个很好的引导。 不要这样做。
  • “请打开问题中提到的链接..” 我没有关注 SO 外部的链接。顺便说一句 - 仅仅因为某人做了某事,并不一定使它成为一个“好主意”。

标签: java jsp java-compiler-api online-compilation


【解决方案1】:
  1. 请不要使用 scriptlet,编写可以从 jsp 调用的 java 代码。
  2. Java 需要一个带有类名的文件名,这可能是您的主要问题。
  3. 用户可以输入的 java 代码的预期格式是什么?方法、类还是方法中的一个脚本?
  4. 以您的 Java 知识水平,请不要让未知用户输入代码,否则您的服务器很快就会被黑客入侵

以下代码编译变量转换中的代码。它会自动检测输入的类的名称。如果没有找到类,它会创建一个类名为 MyClass 的模板。

      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");
  }

【讨论】:

    【解决方案2】:

    有几种方法可以实现这个场景,但我们不能在 JSP 中包含 Java 代码,而是使用表达式语言 (EL) 来实现相同的功能,或者我们甚至可以为我们的自定义功能编写自定义 jsp 标签。这个链接会详细解释这个过程。

    http://www.journaldev.com/2099/jsp-custom-tags-example-tutorial

    即使您喜欢阅读教科书,Head First Servlet 和 JSP 也会详细而优雅地解释整个概念。因此,为了获得适当的功能信息,这本书是一本必备的书。

    快乐学习..

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2011-01-17
      • 2017-09-15
      • 2015-08-15
      • 1970-01-01
      相关资源
      最近更新 更多