2015-03-23 18 views
0

Le code fonctionnait bien avant que j'aie inclus le code de lecture d'un fichier texte dans mon programme servlet. En fait, j'ai besoin de lire le fichier texte et en utilisant la correspondance de modèle regex doivent rechercher le motif dans le fichier texte. J'ai essayé beaucoup mais je ne peux pas comprendre. Chaque fois que je le lance en utilisant localhost, il entre directement dans catch et avant que je mette try-catch il montre error:500 file not found "database.txt" alors que database.txt est dans le même endroit que mon programme de servlet webapps/myprogram/database.txt. J'utilise tomcat8. S'il vous plaît aidez-moi pourquoi il ne reçoit pas le fichier et entrer dans la prise ..Lire le fichier texte dans le servlet

Voici mon programme de servlet:

import java.io.IOException; 
 
import java.io.PrintWriter; 
 
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 java.util.regex.Matcher; 
 
import java.util.regex.Pattern; 
 
import javax.swing.JOptionPane; 
 
import java.io.*; 
 

 
/** 
 
* @author hp 
 
*/ 
 
@WebServlet(urlPatterns = {"/servlet1"}) 
 
public class servlet1 extends HttpServlet { 
 

 

 
    @Override 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
 
      throws ServletException, IOException { 
 
     response.setContentType("text/html"); 
 

 
     PrintWriter out = response.getWriter(); 
 
     String txt = request.getParameter("query"); 
 
     try { 
 

 
      FileInputStream fstream = new FileInputStream("database.txt"); 
 
      DataInputStream in = new DataInputStream(fstream); 
 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
 
      String strLine; 
 

 
      if (txt.matches("Who is the(.*)")) { 
 
       String re1 = ".*?"; 
 
       String re2 = "(?:[a-z][a-z]+)"; 
 
       String re3 = ".*?"; 
 
       String re4 = "(?:[a-z][a-z]+)"; 
 
       String re5 = ".*?"; 
 
       String re6 = "(?:[a-z][a-z]+)"; 
 
       String re7 = ".*?"; 
 
       String re8 = "((?:[a-z][a-z]+))"; 
 
       String re9 = ".*?"; 
 
       String re10 = "(?:[a-z][a-z]+)"; 
 
       String re11 = ".*?"; 
 
       String re12 = "((?:[a-z][a-z]+))"; 
 

 
       Pattern p = 
 
         Pattern.compile(re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9 + re10 + re11 + re12, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
 

 
       Matcher m = p.matcher(txt); 
 
       if (m.find()) { 
 
        String word1 = m.group(1); 
 
        String word2 = m.group(2); 
 
        String z = word2.toString() + "&&" + word1.toString() + "&&" + "name.*" + "\n"; 
 

 
        while ((strLine = br.readLine()) != null) { 
 
         if (Pattern.matches(z, strLine)) { 
 
          Pattern pattern = Pattern.compile("'(.*?)'"); 
 
          Matcher matcher = pattern.matcher(strLine); 
 
          if (matcher.find()) { 
 
           String a = matcher.group(1); 
 
           request.setAttribute("a", a); 
 
           request.getRequestDispatcher("/output.jsp").forward(request, response); 
 
          } 
 
         } 
 
        } 
 
       } 
 
      } else { 
 
       String z = "Sorry......Invalid query !!!"; 
 
       request.setAttribute("z", z); 
 
       request.getRequestDispatcher("/output.jsp").forward(request, response); 
 
      } 
 
     } catch (Exception e) { 
 
      throw new ServletException(e); 
 
     } 
 
    } 
 

 

 
    @Override 
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
 
      throws ServletException, IOException { 
 
     //processRequest(request, response); 
 
     doGet(request, response); 
 
    } 
 

 

 
    @Override 
 
    public String getServletInfo() { 
 
     return "Short description"; 
 
    }// </editor-fold> 
 
}

+0

Je pense que la plupart des gens ici apprécieraient que vous formiez votre code pour une meilleure lisibilité et que vous essayiez de vous concentrer sur le problème. –

+0

getRealPath() tel qu'utilisé dans la réponse ci-dessous est ** mauvaise pratique **. Voir aussi http://stackoverflow.com/q/12160639 Utilisez juste 'getResourceAsStream()' exactement sur le même chemin. – BalusC

Répondre

0

Si vous avez le fichier en vous racine web (I supposons que vous êtes) alors vous devez utiliser ServletContext.html#getRealPath(java.lang.String) cela vous donnera le chemin actuel du fichier. Donc, votre code pour créer FileInputStream devrait être.

FileInputStream fstream = 
       new FileInputStream(getServletContext().getRealPath("/database.txt")); 
+0

J'ai essayé, mais il ne fonctionne pas encore, il va à l'intérieur de catch pour montrer l'erreur et j'ai stocké à la fois le programme de servlet et database.txt dans webapps \ myprograms \ Je ne peux pas savoir où stocker le fichier s'il vous plaît! –

+0

@SoumyasreeBiswas s'il vous plaît envoyer votre structure de dossiers –

+0

Rapport d'exception description Le serveur a rencontré une erreur interne qui l'a empêché de répondre à cette demande. exception java.lang.NullPointerException \t java.io.FileInputStream. (FileInputStream.java:134) \t java.io.FileInputStream. (FileInputStream.java:97) \t servlet1.doGet (servlet1.java:54) \t servlet1.doPost (servlet1.java:604) \t javax.servlet.http.HttpServlet.service (HttpServlet.java:644) \t javax.servlet.http.HttpServlet.service (HttpServlet.java:725) \t org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:52) . "Ceci est l'im d'erreur se plz aide! " –