Java 一个以前可以工作的servlet,现在神奇地不工作了

Java 一个以前可以工作的servlet,现在神奇地不工作了,java,tomcat,servlets,Java,Tomcat,Servlets,我已经很久没有接触过这个项目了,但我可以发誓,上次我尝试它的时候,它是有效的。现在,当然不是了 这是一个java servlet,它接受一些java代码,编译它并返回一些html,结果要么编译成功,要么在第xxx行出现编译错误。它只包含两个类:从HttpServlet扩展的编译器和从SimpleJavaFileObject扩展的JavaObjectFromString 类JavaObjectFromString如下所示: package servlet; import java.io.IOExc

我已经很久没有接触过这个项目了,但我可以发誓,上次我尝试它的时候,它是有效的。现在,当然不是了

这是一个java servlet,它接受一些java代码,编译它并返回一些html,结果要么编译成功,要么在第xxx行出现编译错误。它只包含两个类:从HttpServlet扩展的编译器和从SimpleJavaFileObject扩展的JavaObjectFromString

类JavaObjectFromString如下所示:

package servlet;
import java.io.IOException;
import java.net.URI;
import javax.tools.SimpleJavaFileObject;

public class JavaObjectFromString extends SimpleJavaFileObject{

    private String contents;
    private String name;

    public JavaObjectDesdeString(String className, String cont){
        super(URI.create(className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
        contents=cont);
        name=className);
    }

    public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
        return contents;
    }
}
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
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 javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;


@WebServlet("/compiler")
public class Compiler extends HttpServlet {

    private static final long serialVersionUID = 1L;

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        StringBuffer sb = new StringBuffer();
        String code = request.getParameter("usercodefromhtml").toString();
        String results = this.compileCode(code);
        sb.append("<html><body bgcolor=pink text=black>");
        sb.append("<h1 align=center>" + results + "</h1>");
        sb.append("<body></html>");
        out.println(sb);
    }



    private String compileCode(String codeToCompile){
        String results = null;

        /*Creating dynamic java source code file object*/
        SimpleJavaFileObject fileObject = new JavaObjectFromString ("userclass", codeToCompile);
        JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject} ;

        /*Instantiating the java compiler*/
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        /*Create a diagnostic controller, which holds the compilation problems*/
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

        /*get a standard file manager from compiler, this file manager helps us to customize how a compiler reads and writes to files*/
        StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(diagnostics, null, null);

        /* Prepare a list of compilation units (java source code file objects) to input to compilation task*/
        Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects);

        /*Prepare any compilation options to be used during compilation
        //In this example, we are asking the compiler to place the output files under bin folder.*/
        String[] compileOptions = new String[]{"-d", "c:"} ;
        Iterable<String> compilationOptions = Arrays.asList(compileOptions);

        /*Create a compilation task from compiler by passing in the required input objects prepared above*/
        CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, compilationOptions, null, compilationUnits) ;
        /*Perform the compilation by calling the call method on compilerTask object.*/
        boolean status = compilerTask.call();
        /*On compilation failure, we can use the diagnostic collector to read the error messages and log them in specific format.*/
        if (!status){//If compilation error occurs
            /*Iterate through each compilation problem and print it*/
            for (@SuppressWarnings("rawtypes") Diagnostic diagnostic : diagnostics.getDiagnostics()){
                results = "Error en la línea "+diagnostic.getLineNumber();
            }
        }
        else
            results = "Compilación exitosa";

        /*Finally close the fileManager instance to flush out anything that is there in the buffer.*/
        try {
            stdFileManager.close() ;//Close the file manager
        } catch (IOException e) {
            e.printStackTrace();
        }

        return results;
    }   
}
类编译器如下所示:

package servlet;
import java.io.IOException;
import java.net.URI;
import javax.tools.SimpleJavaFileObject;

public class JavaObjectFromString extends SimpleJavaFileObject{

    private String contents;
    private String name;

    public JavaObjectDesdeString(String className, String cont){
        super(URI.create(className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
        contents=cont);
        name=className);
    }

    public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
        return contents;
    }
}
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
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 javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;


@WebServlet("/compiler")
public class Compiler extends HttpServlet {

    private static final long serialVersionUID = 1L;

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        StringBuffer sb = new StringBuffer();
        String code = request.getParameter("usercodefromhtml").toString();
        String results = this.compileCode(code);
        sb.append("<html><body bgcolor=pink text=black>");
        sb.append("<h1 align=center>" + results + "</h1>");
        sb.append("<body></html>");
        out.println(sb);
    }



    private String compileCode(String codeToCompile){
        String results = null;

        /*Creating dynamic java source code file object*/
        SimpleJavaFileObject fileObject = new JavaObjectFromString ("userclass", codeToCompile);
        JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject} ;

        /*Instantiating the java compiler*/
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        /*Create a diagnostic controller, which holds the compilation problems*/
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

        /*get a standard file manager from compiler, this file manager helps us to customize how a compiler reads and writes to files*/
        StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(diagnostics, null, null);

        /* Prepare a list of compilation units (java source code file objects) to input to compilation task*/
        Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects);

        /*Prepare any compilation options to be used during compilation
        //In this example, we are asking the compiler to place the output files under bin folder.*/
        String[] compileOptions = new String[]{"-d", "c:"} ;
        Iterable<String> compilationOptions = Arrays.asList(compileOptions);

        /*Create a compilation task from compiler by passing in the required input objects prepared above*/
        CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, compilationOptions, null, compilationUnits) ;
        /*Perform the compilation by calling the call method on compilerTask object.*/
        boolean status = compilerTask.call();
        /*On compilation failure, we can use the diagnostic collector to read the error messages and log them in specific format.*/
        if (!status){//If compilation error occurs
            /*Iterate through each compilation problem and print it*/
            for (@SuppressWarnings("rawtypes") Diagnostic diagnostic : diagnostics.getDiagnostics()){
                results = "Error en la línea "+diagnostic.getLineNumber();
            }
        }
        else
            results = "Compilación exitosa";

        /*Finally close the fileManager instance to flush out anything that is there in the buffer.*/
        try {
            stdFileManager.close() ;//Close the file manager
        } catch (IOException e) {
            e.printStackTrace();
        }

        return results;
    }   
}
我在一个较旧的Eclipse版本中将这两个文件编译成.class文件,从那时起我就没有重新编译过

我还将此表单保存在一个html文件中,我认为它调用servlet并将usercodefromhtml参数与用户在该文本区域中编写的代码一起传递给它:

<form action="compiler" method="post">
    <textarea rows="18" cols="70" name="usercodefromhtml"></textarea>
    <input type="submit">
</form>
我还尝试了/compiler和compiler作为操作值,但没有成功

以下是我安装和配置tomcat的方式:

我从下载了de 64位windows版本 我添加了两个环境变量: JAVA_HOME->JDK路径在我的例子中是C:\Program Files\JAVA\jdk1.7.0\u 40 CATALINA_HOME->path to tomcat在我的例子中是C:\apache-tomcat-7.0.53 我编辑了环境路径并添加了%JAVA\u HOME%\jre\bin。然后我从tomcat运行configtest.bat,它没有抛出任何错误。 在tomcat的webapps文件夹中,我为我的项目创建了一个文件夹,在那里我放置了包含表单代码的html,如上图所示。 在webapps内的项目文件夹中,我创建了一个WEB-INF文件夹,其中放置了WEB.xml和一个classes文件夹,其中包含一个名为servlet的子文件夹,其中包含我上面显示的2个编译的class.class文件。 我的web.xml如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
    <servlet-name>Compiler</servlet-name>
    <servlet-class>servlet.Compiler</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Compiler</servlet-name>
    <url-pattern>/Compiler</url-pattern>
</servlet-mapping>
</web-app>
然后,我从cmd运行tomcat文件夹中的startup.bat。我在浏览器中打开html文件,在文本区域输入一些随机代码,然后按下提交按钮。没有什么 也没有在c中创建作为编译任务结果的类文件

我相信这两个类在我上次测试它们时工作正常,所以我更倾向于认为这是一个配置问题。。。但是在哪里呢? 谢谢

第五是你的问题

您需要将类和web.xml放入html文件旁边的webapps目录

因此,它应该看起来像:

$tomcat/webapps/yourapp
           |
           +-----> your.html
           +-----> WEB-INF
                      |
                      +-----> web.xml
                      +-----> classes
                                 |
                                 +----> servlet
                                           |
                                           +-----> Compiler.class

那它应该对你有用。

你从来没有定义过它不起作用。令人担忧的是,贾罗德,我什么都没说,因为它实际上什么都没做。每当我点击提交按钮时,什么都不会发生。我检查了我的C:\文件夹,看看是否有一个编译过的.class被删除了,但是没有。我甚至不知道是否调用了servlet,因为我没有得到任何反馈。很久以前我创建了servlet,它是Eclipse的旧版本和JavaJDK的旧版本。我记得在创建项目时将eclipse编译器从JRE更改为JDK。可能是因为我现在有了一个更新的java版本,有些东西不匹配吗?嗯。。。也许我解释错了,但我就是这么做的。还是不走运: