Page 1 of 1

Output directory αρχείων σε Dynamic Web Project

Posted: Wed Nov 06, 2013 2:58 am
by michalis
Καλησπέρα παιδιά.
Θέλω να ρωτήσω κάτι σχετικό με ένα jsp project που φτιάχνω. Έχω πάρει κλάσεις με Copy από ένα άλλο απλό project (στo οποίo τις έτρεχα πειραματικά) και αυτές οι κλάσεις θέλω τώρα να είναι java resources στο dynamic web project μου. Το πρόβλημα είναι ότι δημιουργούν κάποια αρχεία που χρειάζονται μετά στα jsp μου αλλά πάνε και τα αποθηκεύουν στο directory του αρχικού project των κλάσεων, οπότε προφανώς τα jsp δεν θα τα δουν. Δεν ξέρω αν μου ξεφεύγουν βασικά πράγματα του Eclipse αλλά μου φαίνεται αρκετά περίεργο, δεδομένου ότι δοκίμασα απλά να πάρω τον κώδικα με cp και να φτιάξω εντελώς νέα κλάση στο dynamic web project αλλά πάει πάλι και αποθηκεύει τα output files στο directory του άλλου project....

O κώδικας για το Write:

Code: Select all

TransformerFactory transformerFactory = TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         StreamResult result = new StreamResult(new File("file"+friendsOfUser.getUserId()+".xml"));

         // Output to console for testing
         // StreamResult result = new StreamResult(System.out);
         transformer.setOutputProperty(OutputKeys.INDENT, "yes");   //pretty printer
         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
         transformer.transform(source, result);


Είμαι σχεδόν βέβαιος ότι για κάποιο λόγο γίνεται κλήση της αρχικής κλάσης που είχα στο απλό project, αντί για την τοπική που έχω στο Dynamic Web project.
Thanks in advance!

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Wed Nov 06, 2013 3:12 am
by rexes
Πήρες μήπως και κανα config file μαζί σου κατά την αντιγραφή;


EDIT: Αμα παίζει τέτοιο θέμα δοκίμασες να κάνεις clean ;;;

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Wed Nov 06, 2013 3:17 am
by michalis
Όχι μόνο κώδικα, γι'αυτό έχω σκαλώσει...Πάει και καλεί την κλάση του αρχικού project αντί για την τοπική.

Edit: SOLVED. Απλά είμαι ηλίθιος.....anyway. Παρ'ολα αυτά keep topic alive and stay on γιατί σίγουρα αν κρίνω απ'το πόσο jsp ξέρω, θα επανέλθω σύντομα.... :roll:


Question2: Επίσης κάτι άλλο αν γνωρίζει κάποιος. Έχω παρατηρήσει ότι για να χρησιμοποιήσουν τα jsp μου αρχεία τρέχοντας κλάσεις από java resources, αυτά θα πρέπει να είναι τόσο έξω-έξω στον directory, όσο και μέσα στο WebContent, αλλά και στο WebContent/WEB-INF. Μέχρι τώρα ό,τι έχω δοκιμάσει δεν έχει τρέξει αν το αρχείο δεν είναι και στις 3 αυτές τοποθεσίες. Γνωρίζει κάποιος γιατί συμβαίνει αυτό και πως λύνεται; Γιατί να πρέπει να γίνεται έτσι το βρίσκω λίγο χαζό...Οπότε μάλλον εγώ κάνω κάτι λάθος.

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Wed Nov 06, 2013 5:20 pm
by nachos

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Thu Nov 07, 2013 3:07 am
by michalis
Με τα class δεν έχω θέμα, τα αφήνω στη default θέση που τα βγάζει ο compiler. Με τα files που χρησιμοποιώ σε input streams έχω θέμα....Απλά αν πετάξω τα .class στο web-inf και βάλω και τα input files εκεί...Thanks όπως και να χει, θα το κοιτάξω!

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Thu Nov 07, 2013 1:11 pm
by nachos
Κατάλαβα τι εννοείς. Ουσιαστικά το πρόβλημά σου είναι ότι γράφεις/διαβάζεις αρχεία με relative path, μέσα από java κώδικα, και σου είναι δύσκολο να προσδιορίσεις που στο καλό καταλήγουν αυτά τα αρχεία.

Θα πρέπει να αλλάξεις την προσέγγισή σου, γιατί είναι εξαρχής λάθος. Θα πρέπει να παίξεις με absolute paths, ώστε ανά πάσα στιγμή, άσχετα από το context του κώδικα, να κατασκευάζεις τα αρχεία σου στο σωστό σημείο. Αυτό γίνεται μέσω της μεθόδου getRealPath(string path) του interface ServletContext.

Στην περίπτωση που ο κώδικας που γράφεις είναι jsp, ή κανονική κλάσση που κληρονομεί το HttpServlet, θα έχεις διαθέσιμο ένα ServletContext μέσω της μεθόοδυ getServletContext(). Αν από την άλλη είσαι σε μια οποιαδήποτε άλλη κλάσση που δεν κληρονομεί από την HttpServler (και δεν έχει νόημα να το κάνει), μπορείς να κατασκευάσεις μια static helper μέθοδο που θα μπορείς να καλείς για να κάνεις τη δουλειά σου. Τσέκαρε το παρακάτω παράδειγμα για να δείς πως θα το κάνεις:

http://javaevangelist.blogspot.gr/2011/06/determining-absolute-path-in-web.html

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Thu Nov 07, 2013 3:12 pm
by michalis
Ok ευχαριστώ! Κάτι τέτοιο έχω προσπαθήσει να κάνω αλλά προς το παρόν δε δουλεύει αρκετά καλά. Θα διαβάσω το link μήπως βγάλω κάτι.
Στην ουσία εγώ καλώ τη java μεθοδο του model μου απ'το jsp με παράμετρο το realPath του αρχείου (που παίρνω με τον τρόπο που είπες) ΑΛΛΑ για κάποιο λόγο αυτό το αρχείο δεν το βρίσκει ποτέ αν δεν είναι και στα 3 μέρη που έγραψα πιο πάνω. Αν λείπει έστω από μια τοποθεσία, θα χτυπήσει filenotfound και δεν καταλαβαίνω το λόγο.

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Thu Nov 07, 2013 9:22 pm
by nachos
Διπλοτσέκαρε ότι όντως έχεις δημιουργήσει σωστά το path των αρχείων. Από αυτό που μου λές, εμένα μου δίνει την εντύπωση ότι τα paths είναι relative. Για να το τσεκάρεις, δοκίμασε να τα τυπώνεις στη σελίδα σου. Επίσης άμα δε βαριέσαι, πόσταρε ακριβώς το σημείο του κώδικα που έχεις φτιάξει το path του αρχείου, και δημιουργείς το stream για να διαβάσεις/γράψεις.

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Fri Nov 08, 2013 12:28 am
by michalis
JSP:

Code: Select all

String fileName = getServletContext().getRealPath(
         "file.xml");
   feed = Collector.loadFriends(fileName);



java:Collector:loadFriends

Code: Select all

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
      List<Tweet> feed=null;   //list of tweets (from XML)
   
      try {
         
         SAXParser saxParser = saxParserFactory.newSAXParser();
         MyHandler2 handler = new MyHandler2();
         saxParser.parse(new File(fname), handler);
         //Get Tweets list
         feed = handler.getTwList();
         System.out.println("Retrieved:"+feed.size()+" tweets");
         //print friend information
         
      } catch (ParserConfigurationException | SAXException | IOException e) {
         e.printStackTrace();
      }
      return feed;



Βασικά ναι, έχω καταλάβει ότι όντως relative βάζω αλλα όπως και να χει αν το κοιτάξεις απάντησε κάτι να τα ξεκαθαρίσω καλυτερα.


Εάν πετάω απευθείας absolute paths του host υπολογιστή ως παράμετρο στα filestreams, χωρίς καν να παίξω με getRealPath, δε θα δουλέψει σωστά; Αν έχω δηλαδή προαποφασίσει να χρησιμοποιήσω πολύ συγκεκριμένα directories εγγραφής/αποθήκευσης (προφανώς προσβάσιμα) και δίνω απευθείας το path....

Re: Output directory αρχείων σε Dynamic Web Project

Posted: Fri Nov 08, 2013 10:27 am
by nachos
michalis wrote:Εάν πετάω απευθείας absolute paths του host υπολογιστή ως παράμετρο στα filestreams, χωρίς καν να παίξω με getRealPath


Σε καμμία περίπτωση. Αυτό είναι πολύ κακή πρακτική, καθώς στην παραμικρή αλλαγή στο deployment της εφαρμογής, θα έχεις runtime errors. Ουσιαστικά για κάθε διαφορετικό deployment μπορεί να χρειάζεται να αλλάζεις τον κώδικά σου. :smt018

Δοκίμασε στο σημείο που καλείς την getRealPath(), να δώσεις σαν παράμετρο την τιμή "/file.xml" (με slash στην αρχή δηλαδή). Επίσης, δοκίμασε να καλέσεις την parse του SAXParser που παίρνει String argument, αντί για File.

Ψάχνοντας λίγο, βρήκα δύο ενδιαφέροντα threads στο stackoverflow που μπορεί να σου χρησιμεύσουν (τσέκαρε και τι λένε σχετικά με το ότι αν γράψεις σε αρχεία, οι αλλαγές θα χαθούν αν/όταν γίνει redeploy το WAR):

http://stackoverflow.com/questions/12160639/what-does-mean-in-the-method-servletcontext-getrealpath

http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream

Συγνώμη που σε πάω ψάχνοντας, αλλά κι εγώ δεν έχω παίξει καθόλου με java web apps, οπότε και για μένα το τοπίο είναι θολό :-D