我正在尝试构建一个Prediciton-Servlet。但我无法将以前构建的分类器加载到servlet中。 这是我的代码:
public class SucessPrediction extends HttpServlet {
private static final long serialVersionUID = 1L;
public SucessPrediction() {
super();
// TODO Auto-generated constructor stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// Get formula input
...
// Read Classifier and predict Success
ServletContext context = getServletContext();
InputStream resourceContent = context.getResourceAsStream("/WEB-INF/J48.model");
try {
Classifier J48 = (Classifier) weka.core.SerializationHelper.read(resourceContent);
if (klassifizierer != null) {out.println("KLASSIFIZIERER IS LOADED");}
predictionResult = J48.classifyInstance(DATA.firstInstance());
DATA.classAttribute().value((int) ergebnis);
return PredicitonResult;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
问题是,当我构建一个普通的JAVA应用程序时,它可以工作。但是在我的servlet中它不起作用。我认为它与文件路径有关。 我还读到了这个提示:File path to resource in our war/WEB-INF folder? 但无论我做什么,我都无法加载我的分类器并对我的数据进行分类。
我的系统是一个Eclipse IDE,带有集成的Tomcat7和OS Ubuntu 14.04
感谢您的帮助!
答案 0 :(得分:1)
更改您的代码,以便您可以以不同方式加载分类器。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// Get formula input
...
// Read Classifier and predict Success
try {
Classifier J48 = getClassifier();
if (klassifizierer != null) {out.println("KLASSIFIZIERER IS LOADED");}
predictionResult = J48.classifyInstance(DATA.firstInstance());
DATA.classAttribute().value((int) ergebnis);
return PredicitonResult;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过这种方式,您可以尝试不同的加载策略。
首先,绝对路径在您的开发机器中首先尝试以下操作。 将您的模型文件放到某个目录并尝试通过绝对路径加载它。
// absolute path
private Classifier getClassifier() throws Exception
{
return (Classifier) weka.core.SerializationHelper.read("C:\J48.model");
}
第二,相对路径 将您的模型文件放在Web应用程序目录中,并尝试按绝对路径加载它。
// relative path in web.app
private Classifier getClassifier() throws Exception
{
String relativeWebPath = "/ModelFiles/J48.model";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
return (Classifier) weka.core.SerializationHelper.read(absoluteDiskPath);
}