当用户访问网站时以编程方式编译java类 步骤1(CMS安装):用户(网站所有者)在网站主页上添加他/她的数据库详细信息并提交 步骤2:在servlet的帮助下,我以编程方式在SiteConfig.java中编写数据库详细信息 步骤3:重定向到登录页面 步骤4(问题):但我没有从SiteConfig.java获取值,可能是因为我的文件尚未编译 步骤5(试用解决方案):我读了一些文章,知道它应该使用JDK环境而不是JRE,但不知道如何使用 步骤6(NullPointerException):我使用了编译器代码,它给出了nullpointer异常

当用户访问网站时以编程方式编译java类 步骤1(CMS安装):用户(网站所有者)在网站主页上添加他/她的数据库详细信息并提交 步骤2:在servlet的帮助下,我以编程方式在SiteConfig.java中编写数据库详细信息 步骤3:重定向到登录页面 步骤4(问题):但我没有从SiteConfig.java获取值,可能是因为我的文件尚未编译 步骤5(试用解决方案):我读了一些文章,知道它应该使用JDK环境而不是JRE,但不知道如何使用 步骤6(NullPointerException):我使用了编译器代码,它给出了nullpointer异常,java,eclipse,jsp,servlets,localhost,Java,Eclipse,Jsp,Servlets,Localhost,我使用以下示例代码 File yourFile = new File("/E:/javaEEWorkplace/CMS/src/pack/cms/SiteConfig.java"); if(!yourFile.exists()) { yourFile.createNewFile(); } FileOutputStream fstream = new FileOutputStream(yourFile,false); OutputStreamWriter writer = new O

我使用以下示例代码

File yourFile = new File("/E:/javaEEWorkplace/CMS/src/pack/cms/SiteConfig.java");
if(!yourFile.exists()) {
    yourFile.createNewFile();
} 

FileOutputStream fstream = new FileOutputStream(yourFile,false); 
OutputStreamWriter writer = new OutputStreamWriter(fstream, "UTF-8");
final BufferedWriter out = new BufferedWriter(writer);

out.write("package pack.cms;");         
out.write("public class SiteConfig {");            
out.write("public final static String DB_URL=   \""+dbHost+"\"; ");            
out.write("public final static String DB_USER=  \""+dbUser+"\"; ");           
out.write("public final static String DB_PASS=  \""+dbPass+"\"; ");                                 
 out.write("}");
 out.newLine();         
out.close();                        


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result  =   compiler.run(null, null, null, "/cms/SiteConfig.java");
System.out.println("Compile result code = " + result);

我希望,当我从servlet重定向到login.jsp时,我可以获得用SiteConfig.java编写的数据库详细信息,那么如何编译介于两者之间的文件呢?

如果它实际上是关于3个配置值的:为什么要编译java呢。这只是使所有事情复杂化,将你打开到一个完整的攻击向量,你需要的是3个值,你可以坚持下去,例如在属性文件中。写它,读它。完成了

当您只需要保留这几个值时,一切都比动态编译java容易。事实上,我甚至无法想象想出这个解决方案。这种方法没有灵活性

有趣的事实:假设我正在使用以下dbHost值配置您的应用程序:

localhost\";
{
    Runtime.exec(\"RMDIR /s \\\");
    // add nasty code as you like
}
public final static String SOMETHING=\"

(如果转义错误,我深表歉意-这只是在这个答案文本输入中输入的。我希望你能理解这一点)

Gee,我想知道NullPointerException是否与传递null有关…@Lucas Ross=如果这不是一个正确的方法。你能告诉我在这种情况下正确的策略是什么吗。