Java 一个以前可以工作的servlet,现在神奇地不工作了
我已经很久没有接触过这个项目了,但我可以发誓,上次我尝试它的时候,它是有效的。现在,当然不是了 这是一个java servlet,它接受一些java代码,编译它并返回一些html,结果要么编译成功,要么在第xxx行出现编译错误。它只包含两个类:从HttpServlet扩展的编译器和从SimpleJavaFileObject扩展的JavaObjectFromString 类JavaObjectFromString如下所示:Java 一个以前可以工作的servlet,现在神奇地不工作了,java,tomcat,servlets,Java,Tomcat,Servlets,我已经很久没有接触过这个项目了,但我可以发誓,上次我尝试它的时候,它是有效的。现在,当然不是了 这是一个java servlet,它接受一些java代码,编译它并返回一些html,结果要么编译成功,要么在第xxx行出现编译错误。它只包含两个类:从HttpServlet扩展的编译器和从SimpleJavaFileObject扩展的JavaObjectFromString 类JavaObjectFromString如下所示: package servlet; import java.io.IOExc
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版本,有些东西不匹配吗?嗯。。。也许我解释错了,但我就是这么做的。还是不走运: