2016-11-06 77 views
0

我對這裏 - https://www.youtube.com/watch?v=63k560Livmg指一個簡短的視頻嘗試一個簡單的電影推薦。我正在嘗試比較而不是控制檯,我希望在瀏覽器上顯示建議,以便使用servlet。但問題是,當我在我的窗體中輸入一個值(用戶ID),顯示空白屏幕。請幫助我做錯了什麼。數據集來自這裏 - https://mahout.apache.org/users/recommender/userbased-5-minutes.html。請參閱web.xml和層次結構的附加屏幕截圖。行家在日食給filenotfound例外data.csv文件

的index.jsp

<html> 
    <body> 
    <h2>Hello World!</h2> 
    <form action="demo" method="post"> 
    loginID:<input type="text" name="name"/><br/> 
    <input type="submit" value="login"/> 

    </form> 
    </body> 
    </html> 

用於收集用戶的價值和顯示結果demo.java-的servlet。

package com.issac; 

    import java.io.IOException; 
    import java.io.PrintWriter; 
    import java.util.ArrayList; 
    import java.util.List; 

    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 


import org.apache.mahout.cf.taste.recommender.RecommendedItem; 

/** 
* Servlet implementation class demo 
*/ 
    public class demo extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
     public demo() { 
     super(); 
    // TODO Auto-generated constructor stub 
    } 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
     response.getWriter().append("Served at: ").append(request.getContextPath()); 
    } 

/** 
* @throws IOException 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { 
    // TODO Auto-generated method stub 

     String n = request.getParameter("name"); 
     int k = Integer.parseInt(n); 
     PrintWriter out = response.getWriter(); 
     List<RecommendedItem> recommendations = new ArrayList<RecommendedItem> (); 

     try { 
      recommendations = App.getRecommend(k); 
     } catch (Exception e) { 
     // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      for (RecommendedItem recommendation : recommendations) { 
      out.println(recommendation); 





    } 

}} 

app.java - 邏輯,用於產生建議蝕

 package com.issac; 

     import java.io.File; 
     import java.util.List; 

     import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; 
     import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood; 
     import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; 
     import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity; 
     import org.apache.mahout.cf.taste.model.DataModel; 
     import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; 
     import org.apache.mahout.cf.taste.recommender.RecommendedItem; 
     import org.apache.mahout.cf.taste.recommender.UserBasedRecommender; 
     import org.apache.mahout.cf.taste.similarity.UserSimilarity; 


     public class App 
{ 
    public static List<RecommendedItem> getRecommend(int k) throws Exception 
{ 
    DataModel model = new FileDataModel(new File("data/dataset.csv")); 
    UserSimilarity similarity = new PearsonCorrelationSimilarity(model); 
    UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); 
UserBasedRecommender recommender = new  GenericUserBasedRecommender(model, neighborhood, similarity); 
     List<RecommendedItem> recommendations = recommender.recommend(k, 3); 
     return recommendations; 
    } 
    } 

堆棧跟蹤控制檯 -

  INFO: Server startup in 15288 ms 
      SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
      SLF4J: Defaulting to no-operation (NOP) logger implementation 
     SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
     java.io.FileNotFoundException: data\dataset.csv 
     at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<init> (FileDataModel.java:182) 
     at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<init>(FileDataModel.java:169) 
     at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<init>(FileDataModel.java:149) 
     at com.issac.App.getRecommend(App.java:24) 
     at com.issac.demo.doPost(demo.java:51) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilt erChain.java:292) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 

enter image description here

+0

控制檯似乎有崩潰的堆棧跟蹤它。你需要看整個堆棧跟蹤和工作出了什麼毛病 –

+0

我檢查堆棧跟蹤和它顯示這個 - */SLF4J:無法加載類「org.slf4j.impl.StaticLoggerBinder」。 SLF4J:默認到無操作(NOP)記錄執行 SLF4J:見http://www.slf4j.org/codes.html#StaticLoggerBinder進一步的細節。 java.io.FileNotFoundException:data \ dataset.csv * /。 dataset.csv的位置是不正確的,因爲服務器無法找到dataset.csv,儘管它存在於數據文件夾中? – techvigil

回答

0

所以這就是它爲我制定的。得到FileNotFound異常後,我想這個 - >

ClassLoader classLoader = App.class.getClassLoader(); 
DataModel model = new FileDataModel(new File(classLoader.getResource("data/dataset.csv").getFile())); 

代替

DataModel model = new FileDataModel(new File("data/dataset.csv")); 

我沒有,爲什麼它的工作只是覺得互聯網上的深入瞭解,有事情做與類FileDataModel的參數。任何人誰可以給解釋是受歡迎的。

0

在一個JEE應用,文件應通過讀取getResourceAsStream方法:

try(InputStream input=getClass().getClassLoader().getResourceAsStream("data/dataset.csv")){ 
    ... 
} 

data文件夾應立即放置在src/main/resources之內。

在你的情況下,一個更復雜存在:由於缺乏DataModel中的從InputStream構造的,我們需要先InputStream中的內容保存到(臨時)文件:

try(InputStream input=getClass().getClassLoader().getResourceAsStream("data/dataset.csv")){ 
    // Copy the contents of the inputStream to a File, to fix the constructor FileDataModel(file): 
    File tmp=File.createTempFile("model-", ""); 
    tmp.deleteOnExit(); 
    InputStream input=new ByteArrayInputStream("enero".getBytes("ISO-8859-1")); 
    Files.copy(input, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING); 
    DataModel model = new FileDataModel(new File("data/dataset.csv")); 
    ... 
} 
+0

仍無輸出及列明java.io.FileNotFoundException:Java的資源的\ src \主\資源\ DATA \ dataset.csv – techvigil

+0

構造FileDataModel(InputStream的)是不確定的 – techvigil

+0

哎。那麼我太快了。好;現在閱讀我的完整解決方案 –