<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>J2EE.gr</title>
	<atom:link href="http://www.j2ee.gr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.j2ee.gr</link>
	<description>Ένα Java/J2EE Blog για όλους μας...</description>
	<lastBuildDate>Wed, 29 Feb 2012 12:41:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Missing indirectly referenced artifact javax.transaction:jta:jar:1.0.1B:compile</title>
		<link>http://www.j2ee.gr/2012/02/29/missing-indirectly-referenced-artifact-javax-transactionjtajar1-0-1bcompile/</link>
		<comments>http://www.j2ee.gr/2012/02/29/missing-indirectly-referenced-artifact-javax-transactionjtajar1-0-1bcompile/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 12:41:50 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[depentency]]></category>
		<category><![CDATA[jta]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=351</guid>
		<description><![CDATA[Λόγω της αλλαγής της αδειοδότησης το JTA δεν είναι διαθέσιμο στα κεντρικά αποθετήρια του maven. Οπότε αν έχουμε ένα dependency που το χρειάζεται όπως πχ το hibernate-annotations τότε πρέπει να το εγκαταστήσουμε με το χέρι. Κατεβάζουμε αρχικά απο το http://download.java.net/maven/2/javax/transaction/jta/1.0.1B/ το jta-1.0.1B.jar και το βάζουμε σε μια διαδρομή στο δίσκο, έστω ότι είναι η /tmp  [...]]]></description>
			<content:encoded><![CDATA[<p>Λόγω της αλλαγής της αδειοδότησης το <strong>JTA</strong> δεν είναι διαθέσιμο στα κεντρικά αποθετήρια του maven. Οπότε αν έχουμε ένα dependency που το χρειάζεται όπως πχ το hibernate-annotations τότε πρέπει να το εγκαταστήσουμε με το χέρι.</p>
<p>Κατεβάζουμε αρχικά απο το <a  href="http://download.java.net/maven/2/javax/transaction/jta/1.0.1B/%20το%20jta-1.0.1B.jar" target="_blank">http://download.java.net/maven/2/javax/transaction/jta/1.0.1B/ το jta-1.0.1B.jar</a> και το βάζουμε σε μια διαδρομή στο δίσκο, έστω ότι είναι η /tmp  (c:\temp στα windows)</p>
<p>Μετά τρέχουμε το</p>
<pre class="brush: bash; title: ; notranslate">

mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=/tmp/jta-1.0.1B.jar
</pre>
<p>ή στα windows</p>
<pre class="brush: bash; title: ; notranslate">

mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=c:/temp/jta-1.0.1B.jar
</pre>
<p>Αν δούμε το μαγικό</p>
<p><strong><span style="font-size: x-small;"> [INFO] &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></strong></p>
<p><strong><span style="font-size: x-small;">[INFO] BUILD SUCCESSFUL</span></strong></p>
<p><strong><span style="font-size: x-small;">[INFO] &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></strong></p>
<p>Τότε είμαστε έτοιμοι!</p>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2012%2F02%2F29%2Fmissing-indirectly-referenced-artifact-javax-transactionjtajar1-0-1bcompile%2F&#038;title=Missing%20indirectly%20referenced%20artifact%20javax.transaction%3Ajta%3Ajar%3A1.0.1B%3Acompile" id="wpa2a_2"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2012/02/29/missing-indirectly-referenced-artifact-javax-transactionjtajar1-0-1bcompile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Δημιουργία συμπιεσμένου ZIP αρχείου με Java</title>
		<link>http://www.j2ee.gr/2011/11/29/%ce%b4%ce%b7%ce%bc%ce%b9%ce%bf%cf%85%cf%81%ce%b3%ce%af%ce%b1-%cf%83%cf%85%ce%bc%cf%80%ce%b9%ce%b5%cf%83%ce%bc%ce%ad%ce%bd%ce%bf%cf%85-zip-%ce%b1%cf%81%cf%87%ce%b5%ce%af%ce%bf%cf%85-%ce%bc%ce%b5-java/</link>
		<comments>http://www.j2ee.gr/2011/11/29/%ce%b4%ce%b7%ce%bc%ce%b9%ce%bf%cf%85%cf%81%ce%b3%ce%af%ce%b1-%cf%83%cf%85%ce%bc%cf%80%ce%b9%ce%b5%cf%83%ce%bc%ce%ad%ce%bd%ce%bf%cf%85-zip-%ce%b1%cf%81%cf%87%ce%b5%ce%af%ce%bf%cf%85-%ce%bc%ce%b5-java/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 14:59:59 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Διάφορα]]></category>
		<category><![CDATA[archive]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[zip]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=344</guid>
		<description><![CDATA[Αυτό το χρειάστηκα σήμερα το πρωί. Η φιλοσοφία είναι ότι έχουμε να διαχειριστούμε κάποια αρχεία σε ένα ή παραπάνω φακέλους στο δίσκο και πρέπει να δημιουργήσουμε ένα συμπιεσμένο zip αρχείο με τα αρχεία αυτά. Η λύση είναι αρκετά απλή. Παίρνουμε τις διαδρομές των αρχείων και τις βάζουμε σε ένα collection (Array πχ) Ανοίγουμε ένα output [...]]]></description>
			<content:encoded><![CDATA[<p>Αυτό το χρειάστηκα σήμερα το πρωί. Η φιλοσοφία είναι ότι έχουμε να διαχειριστούμε κάποια αρχεία σε ένα ή παραπάνω φακέλους στο δίσκο και πρέπει να δημιουργήσουμε ένα συμπιεσμένο zip αρχείο με τα αρχεία αυτά.</p>
<p>Η λύση είναι αρκετά απλή.</p>
<ol>
<li>Παίρνουμε τις διαδρομές των αρχείων και τις βάζουμε σε ένα collection (Array πχ)</li>
<li>Ανοίγουμε ένα output stream στο δίσκο που του «δίνουμε zip ιδιότητες»</li>
<li>Διαβάζουμε ένα-ένα τα αρχεία και τα βάζουμε στο  output stream</li>
<li>Κλείνουμε το stream</li>
</ol>
<div><span id="more-344"></span>Παρακάτω είναι ένα παράδειγμα όπου η μέθοδος createZip της κλάσης Archive παίρνει ώς ορίσματα ενα String Array με τις διαδρομές των αρχείων και το όνομα του zip που θα δημιουργηθεί.</div>
<pre class="brush: java; title: ; notranslate">

public class Archive {

	/**
	 * @param filenames Files to be included in ZIP
	 * @param zipfile ZIP file name
	 */
	public static void createZip(String[] filenames, String zipfile){

		// Create a buffer for reading the files
		byte[] buf = new byte[1024];

		try {
		    // Create the ZIP file
		    String outFilename = zipfile;
		    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));

		    // Compress the files
		    for (int i=0; i&lt;filenames.length; i++) {
		        FileInputStream in = new FileInputStream(filenames[i]);

		        // Add ZIP entry to output stream.
		        out.putNextEntry(new ZipEntry(filenames[i]));

		        // Transfer bytes from the file to the ZIP file
		        int len;
		        while ((len = in.read(buf)) &gt; 0) {
		            out.write(buf, 0, len);
		        }

		        // Complete the entry
		        out.closeEntry();
		        in.close();
		    }

		    // Complete the ZIP file
		    out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
</pre>
<div><strong>Happy ZIPing&#8230;    </strong> <img src='http://www.j2ee.gr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2011%2F11%2F29%2F%25ce%25b4%25ce%25b7%25ce%25bc%25ce%25b9%25ce%25bf%25cf%2585%25cf%2581%25ce%25b3%25ce%25af%25ce%25b1-%25cf%2583%25cf%2585%25ce%25bc%25cf%2580%25ce%25b9%25ce%25b5%25cf%2583%25ce%25bc%25ce%25ad%25ce%25bd%25ce%25bf%25cf%2585-zip-%25ce%25b1%25cf%2581%25cf%2587%25ce%25b5%25ce%25af%25ce%25bf%25cf%2585-%25ce%25bc%25ce%25b5-java%2F&#038;title=%CE%94%CE%B7%CE%BC%CE%B9%CE%BF%CF%85%CF%81%CE%B3%CE%AF%CE%B1%20%CF%83%CF%85%CE%BC%CF%80%CE%B9%CE%B5%CF%83%CE%BC%CE%AD%CE%BD%CE%BF%CF%85%20ZIP%20%CE%B1%CF%81%CF%87%CE%B5%CE%AF%CE%BF%CF%85%20%CE%BC%CE%B5%20Java" id="wpa2a_4"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2011/11/29/%ce%b4%ce%b7%ce%bc%ce%b9%ce%bf%cf%85%cf%81%ce%b3%ce%af%ce%b1-%cf%83%cf%85%ce%bc%cf%80%ce%b9%ce%b5%cf%83%ce%bc%ce%ad%ce%bd%ce%bf%cf%85-zip-%ce%b1%cf%81%cf%87%ce%b5%ce%af%ce%bf%cf%85-%ce%bc%ce%b5-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 7 has released!</title>
		<link>http://www.j2ee.gr/2011/08/22/java-7-has-released/</link>
		<comments>http://www.j2ee.gr/2011/08/22/java-7-has-released/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 10:10:32 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JAVA 7]]></category>
		<category><![CDATA[New Releases]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=340</guid>
		<description><![CDATA[Και εγέννετω φώς! Μετά απο χρόνια έρευνας και προσπάθειας καθώς και μεγάλης βοήθειας απο την κοινότητα, η ORACLE (SUN) επιτέλους έθεσε σε την 28η Ιουλοίου 2011 κυκλοφορία την καινούργια έκδοση Java 7. Αυτό το release περιέχει νέα language features (JSR 334), υποστήριξη για dynamic languages (JSR 292), ένα νέο multicore-ready API (JSR 166), νέο I/O [...]]]></description>
			<content:encoded><![CDATA[<p>Και εγέννετω φώς! Μετά απο χρόνια έρευνας και προσπάθειας καθώς και μεγάλης βοήθειας απο την κοινότητα, η ORACLE (SUN) επιτέλους έθεσε σε την 28η Ιουλοίου 2011 κυκλοφορία την καινούργια έκδοση Java 7.</p>
<p>Αυτό το release περιέχει νέα language features (JSR 334), υποστήριξη για dynamic languages (JSR 292), ένα νέο multicore-ready API (JSR 166), νέο I/O APIs (JSR 203), και πολλά άλλα χαρακτηριστικά για τα οποία μπορείτε να διαβάσετε εδώ <a  title=" Java SE 7 Features and Enhancements" href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html">http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html</a></p>
<p>Τα release notes θα τα βρείτε εδώ <a  title=" JDK 7 Release Notes" href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-429209.html">http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-429209.html</a></p>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2011%2F08%2F22%2Fjava-7-has-released%2F&#038;title=Java%207%20has%20released%21" id="wpa2a_6"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2011/08/22/java-7-has-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Εγκατάσταση σε UBUNTU του Eclipse &#8211; Spring Tool Suite (STS)</title>
		<link>http://www.j2ee.gr/2011/04/07/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-%cf%83%ce%b5-ubuntu-%cf%84%ce%bf%cf%85-eclipse-spring-tool-suite-sts/</link>
		<comments>http://www.j2ee.gr/2011/04/07/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-%cf%83%ce%b5-ubuntu-%cf%84%ce%bf%cf%85-eclipse-spring-tool-suite-sts/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 19:29:28 +0000</pubDate>
		<dc:creator>George Moraitakis PhD</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Spring Tool Suite]]></category>
		<category><![CDATA[STS]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=307</guid>
		<description><![CDATA[Δε νομίζω ότι υπάρχει κάποιος από εμάς που να μην γνωρίζει για το Eclipse. Το συγκεκριμένο περιβάλλον ανάπτυξης ούτως ή άλλως δε χρειάζεται ιδιαίτερες συστάσεις. Οι γλώσσες προγραμματισμού που υποστηρίζει είναι πρακτικά απεριόριστες (χάρη σε αμέτρητα plugins που έχουν βγεί) ενώ τις δυνατότητες επεκτασιμότητάς του έχουν χρησιμοποιήσει διάφορες τεχνολογίες. Σε αυτό το πλαίσιο η Springsource [...]]]></description>
			<content:encoded><![CDATA[<p>Δε νομίζω ότι υπάρχει κάποιος από εμάς που να μην γνωρίζει για το <a  title="Eclipse" href="http://www.eclipse.org/">Eclipse</a>. Το συγκεκριμένο περιβάλλον ανάπτυξης ούτως ή άλλως δε χρειάζεται ιδιαίτερες συστάσεις. Οι γλώσσες προγραμματισμού που υποστηρίζει είναι πρακτικά απεριόριστες (χάρη σε αμέτρητα plugins που έχουν βγεί) ενώ τις δυνατότητες επεκτασιμότητάς του έχουν χρησιμοποιήσει διάφορες τεχνολογίες. Σε αυτό το πλαίσιο η Springsource δημιούργησε ένα ξεχωριστό περιβάλλον ανάπτυξης για όλη τη γκάμα των τεχνολογιών της, το <a  title="Spring Tool Suite" href="http://www.springsource.com/developer/sts">Spring Tool Suite</a> (STS), που κουμπώνει πάνω στο Eclipse.</p>
<p>Το STS το έχουμε δει και σε προηγούμενα άρθρα μας. Εδώ θα δούμε πώς εγκαθίσταται σε ένα περιβάλλον Ubuntu σε λίγα, απλά βήματα.</p>
<p><span id="more-307"></span></p>
<h3><strong>1. Προαπαιτούμενα</strong></h3>
<ul>
<li>Γραφικό περιβάλλον στο Ubuntu (Χ Server / GTK φτάνει)</li>
<li>STS: Κατεβάζετε την τελευταία έκδοση του STS από το <a  title="Download Site του STS" href="http://www.springsource.com/downloads/sts">site της SpringSource </a>και επιλέγουμε τον springsource-tool-suite-x.x.x.RELEASE-ex.x.x-linux-gtk-installer.sh.</li>
<li>JDK version &gt; 5. Προτείνω την έκδοση της Sun/Oracle αν και θεωρητικά μπορεί να λειτουργεί και σε άλλες version. Ελέγξτε την έκδοση κάνοτντας</li>
</ul>
<pre class="brush: bash; title: ; notranslate">

george@hephaestus:~$ java -version
java version &quot;1.6.0_24&quot;
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
</pre>
<p>Αν δεν υπάρχει java ή η κδοση που έχετε δεν είναι Sun/Oracle JDK και θέλετε να το εγκαταστήσετε στο Ubuntu σας ακολουθείστε τις οδηγίες στο αντίστοιχο <a href="../2011/03/30/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-apache-directory-server-apacheds-%cf%83%ce%b5-ubuntu/">άρθρο του Αλέξιου για το ApacheDS</a>.</p>
<h3><strong> </strong><strong>2. Εγκατάσταση<br />
</strong></h3>
<h4>Βήμα 1: Εκτελούμε την εντολή εγκατάστασης</h4>
<p>Πηγαίνουμε στο φάκελο που κατέβηκε το αρχείο και το κάνουμε εκτελέσιμο με την εντολή</p>
<pre class="brush: bash; title: ; notranslate">

chmod u+x springsource-tool-suite-2.6.0.RELEASE-e3.6.2-linux-gtk-installer.sh
</pre>
<h4>Βήμα 2: Τρέχουμε το αρχείο.</h4>
<p>Aν όλα έχουν πάει καλά με το περιβάλλον JDK και GTK θα δούμε κάτι σαν το παρακάτω</p>
<pre class="brush: bash; title: ; notranslate">

./springsource-tool-suite-2.6.0.RELEASE-e3.6.2-linux-gtk-x86_64-installer.sh
*************************************************
*             Welcome to the                    *
*    SpringSource Tool Suite 2.6.0.RELEASE      *
*                Installer                      *
*************************************************

 preparing the installer... done
 starting UI installer. please follow instructions on screen...
</pre>
<h4>Βημα 3: Ακoλουθούμε τα βήματα του Wizard</h4>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step1.png" alt="Step 1" width="419" height="315" /></p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step2.png" alt="step 2" width="419" height="315" /></p>
<p>Επιλέγουμε το φάκελο εγκατάστασης, όπου x.x.x η έκδοση του STS.</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step3.png" alt="step 3" width="419" height="315" /></p>
<p>Επιλέγουμε όλα τα πακέτα.</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step4.png" alt="Step 4" width="419" height="315" /></p>
<p>Το JDK Path βγαίνει μόνο του και αν δε θέλουμε κάτι άλλο το αποδεχόμαστε ως έχει</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step5.png" alt="step 5" width="419" height="315" /></p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step6.png" alt="Step 6" width="419" height="315" /></p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_step7.png" alt="step 7" width="417" height="335" />﻿</p>
<p>Αυτό ήταν !!! Για ευκολία προτείνω να το βάλετε και στο Tool Bar ή το μενου του περιβάλλοντος στο οποίο δουλεύετε κάνοντας right-click στο top panel και επιλέγοντας το «Add to Panel» επιλέγουμε Custom Application Launcher όπως  παρακάτω. Το εικονίδιο βρίσκεται επίσης στον ίδιο φάκελο και ονομάζεται icon.xpm.</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_menu.png" alt="sts_menu" width="514" height="375" /></p>
<h3>3. Παραμετροποίηση</h3>
<p>To πρώτο πράγμα που μας ζητάει η εφαρμογή όταν σηκώνεται για την πρώτη φορά είναι η τοποθεσία του workspace δηλαδη που θα αποθηκεύονται τα διάφορα projects</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_ws-300x153.png" alt="sts_ws" width="300" height="153" /></p>
<p>Αφου επιλέξουμε workspace, η εφαρμογή ανοίγει και είμαστε έτοιμοι να προχωρήσουμε στην τελική παραμετροποίηση.</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_fp.png" alt="sts_fp" width="570" height="414" /></p>
<p>Επιλέγουμε Open Dashbioard από την πρώτη οθόνη για να πάμε στο περιβάλλον ανάπτυξης.</p>
<p><strong>Εγκατάσταση Source Control</strong></p>
<p>Το IDE έρχεται με προεγκατεστημένη τη δυνατότητα σύνδεση με CVS. Αν θέλουμε να βάλουμε κάποιον άλλο Source Controller τότε πρέπει να κατεβάσουμε τα αντίστοιχα plugins. Ας δούμε πως γίνεται αυτό για το SVN.</p>
<p>Από το μενου επιλέγουμε Help =&gt; Install New Software και κάνουμε Add και εισάγουμε το link που αναφέρεται στο <a  href="http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA">download site του Tigris Subclipse</a> για το Eclipse και το προσθέτουμε όπως φαίνεται παρακάτω .</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_svn.png" alt="sts_svn" width="652" height="466" /></p>
<p>Επιλέγουμε όλα τα πακέτα (βάζουμε τικ) και πατάμε Next και πάλι Next. Κατόπιν κάνουμε αποδοχή σους όρους. Αν μας ζητηθεί η επιβεβαιώση για κάποιο warning σε Unsigned Content πατάμε ΟΚ. Κατόπιν του restart που μας ζητείται και το κάνουμε είμαστε ΟΚ για να χρησιμοποιήσουμε το SVN.</p>
<p>Για να βεβαιωθούμε ότι έχει γίνει κάνουμε File =&gt; New =&gt; Other και το popup που ανοίγει βάζουμε στο Search τη λέξη svn. Θα δούμε κάτι σαν το παρακάτω:</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2011/04/sts_svnopen.png" alt="sts_svnopen" width="429" height="350" /></p>
<p>Από εκεί και πέρα σε επόμενο άρθρο θα δούμε περισσότερες λεπτομέρειες για τη σύνδεση του STS / Eclipse με κάποιο repository.</p>
<p><strong>Tuning</strong></p>
<p>Αν θέλουμε να έχουμε επηρεάσουμε το JVM που τρέχει το STS μπορούμε να αλλάξουμε τις παραμέτρους στο STS.ini αρχείο που βρίσκεται στον ίδιο φάκελο με το STS executable</p>
<pre class="brush: bash; title: ; notranslate">

-vm
/app/Software/jdk1.6.0_20/bin/java
-startup
plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.2.R36x_v20101019_1345
-product
com.springsource.sts.ide
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx768m
-XX:MaxPermSize=256m

&amp;nbsp;
</pre>
<p>Αυτά προς το παρόν σε επόμενα άρθρα θα δούμε και άλλες λειτουργίες του STS/Eclipse όπως το Maven build, άλλες τεχνολογίες Spring μέσα από το εργαλείο αυτό κτλ.</p>
<p>Για τώρα&#8230;. ENJOY !</p>
<div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 4252px; width: 1px; height: 1px; overflow: hidden;"><a  href="http://subclipse.tigris.org/update_1.6.x">http://subclipse.tigris.org/update_1.6.x</a></div>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2011%2F04%2F07%2F%25ce%25b5%25ce%25b3%25ce%25ba%25ce%25b1%25cf%2584%25ce%25ac%25cf%2583%25cf%2584%25ce%25b1%25cf%2583%25ce%25b7-%25cf%2583%25ce%25b5-ubuntu-%25cf%2584%25ce%25bf%25cf%2585-eclipse-spring-tool-suite-sts%2F&#038;title=%CE%95%CE%B3%CE%BA%CE%B1%CF%84%CE%AC%CF%83%CF%84%CE%B1%CF%83%CE%B7%20%CF%83%CE%B5%20UBUNTU%20%CF%84%CE%BF%CF%85%20Eclipse%20%26%238211%3B%20Spring%20Tool%20Suite%20%28STS%29" id="wpa2a_8"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2011/04/07/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-%cf%83%ce%b5-ubuntu-%cf%84%ce%bf%cf%85-eclipse-spring-tool-suite-sts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Εγκατάσταση Apache Directory Server (ApacheDS) σε UBUNTU</title>
		<link>http://www.j2ee.gr/2011/03/30/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-apache-directory-server-apacheds-%cf%83%ce%b5-ubuntu/</link>
		<comments>http://www.j2ee.gr/2011/03/30/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-apache-directory-server-apacheds-%cf%83%ce%b5-ubuntu/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 06:23:03 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Directory Studio]]></category>
		<category><![CDATA[ApacheDS]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=255</guid>
		<description><![CDATA[Ο ApacheSD είναι μια ανερχόμενη δύναμη στους Directory Servers, είναι Java based και χρησημοποιεί το γνωστό framework Spring για την λειτουργεία του. Η Εγκαταστασή του στο Ubuntu είναι αρκετά εύκολή υπόθεση. Προαπαιτούμενα Πρέπει να υπάρχει στο σύστημα Java έκδοση 5 ή μεγαλύτερη. Προτείνω την SUN-JAVA και ότι το OpenJDK Για να το ελενξουμε αυτό δίνουμε [...]]]></description>
			<content:encoded><![CDATA[<p>Ο <a  title="ApachDS" href="http://directory.apache.org/">ApacheSD</a> είναι μια ανερχόμενη δύναμη στους Directory Servers, είναι Java based και χρησημοποιεί το γνωστό framework <a  title="Spring" href="http://www.springsource.com/developer/spring">Spring </a>για την λειτουργεία του.</p>
<p>Η Εγκαταστασή του στο Ubuntu είναι αρκετά εύκολή υπόθεση.</p>
<p><strong>Προαπαιτούμενα</strong></p>
<p>Πρέπει να υπάρχει στο σύστημα Java έκδοση 5 ή μεγαλύτερη. Προτείνω την SUN-JAVA και ότι το OpenJDK</p>
<p>Για να το ελενξουμε αυτό δίνουμε</p>
<pre class="brush: bash; title: ; notranslate">
java -version
</pre>
<p>και περιμένουμε να δούμε κάτι παρόμοιο με το παρακάτω</p>
<pre class="brush: plain; title: ; notranslate">
java version &quot;1.5.0_06&quot;
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
</pre>
<p>Αν λοιπον δεν είναι εγκατεστημένη τότε δίνουμε το παρακάτω στην κονσόλα</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get -y install maven2 sun-java6-jdk java-common
</pre>
<p><span id="more-255"></span>Μετά κάνουμε το σύστημα μας να έχει ως προεπιλεγμένη VM αυτή του JDK της SUN και όχι του OPENJDK. Δίνουμε λοιπόν</p>
<pre class="brush: bash; title: ; notranslate">
sudo update-alternatives --config java
</pre>
<p>και επιλέγουμε το νούμερο που αναφέρει τη SUN Java</p>
<p><img title="Πατάμε το νουμερο που δείχνει την έκδοση της SUN" src="http://www.j2ee.gr/wp-content/uploads/2010/10/select-java-ubuntu.png" alt="SUN JAVA SELECTION" width="797" height="541" /></p>
<p>Είμαστε έτοιμοι να προχωρήσουμε στην εγκατάσταση</p>
<p>Πηγαίνουμε στην διεύθηνση <a  href="http://directory.apache.org/apacheds/1.5/download/download-linux-deb.html">http://directory.apache.org/apacheds/1.5/download/download-linux-deb.html</a> και κατεβάζουμε την έκδοση ανάλογα με την αρχιτεκτονική του συστήματός μας. (32bit, 64bit)</p>
<p>ή εναλακτικά απο κονσόλα</p>
<pre class="brush: bash; title: ; notranslate">

cd /tmp
wget http://apache.ntua.gr//directory/apacheds/unstable/1.5/1.5.7/apacheds-1.5.7-amd64.deb
</pre>
<p>και κατεβάζουμε πχ εδώ στο φάκελο /tmp την έκδοση 1.5.7 για 64bit επεξεργαστή.</p>
<p>Μετά δίνουμε στην κονσόλα</p>
<pre class="brush: bash; title: ; notranslate">

sudo dpkg -i apacheds-1.5.7-amd64.deb
</pre>
<p>Κάνουμε μετά ένα restart το μηχάνημα για να γίνει ένα auto configuration</p>
<pre class="brush: bash; title: ; notranslate">

sudo shutdown -r now
</pre>
<p>Αφού κάνουμε πάλι login τρέχουμε</p>
<pre class="brush: bash; title: ; notranslate">

sudo /etc/init.d/apacheds-1.5.7-default start
</pre>
<p>και είμαστε έτοιμοι!</p>
<p><strong>Tips</strong></p>
<ul>
<li>Ο ApacheDS βρίσκεται στο φάκελο /var/lib/apacheds-1.5.7/default/</li>
<li>Τα configuration αρχεια /var/lib/apacheds-1.5.7/default/conf</li>
<li>Χρησημοποιείστε το <a  title="Apache Directory Studio" href="http://directory.apache.org/studio/">Apache Directory Studio</a> για τη διαχείρηση του (και οχι μονο για αυτον, εμενα με εχει βολέψει πολυ για ολους τους LDAP)</li>
</ul>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2011%2F03%2F30%2F%25ce%25b5%25ce%25b3%25ce%25ba%25ce%25b1%25cf%2584%25ce%25ac%25cf%2583%25cf%2584%25ce%25b1%25cf%2583%25ce%25b7-apache-directory-server-apacheds-%25cf%2583%25ce%25b5-ubuntu%2F&#038;title=%CE%95%CE%B3%CE%BA%CE%B1%CF%84%CE%AC%CF%83%CF%84%CE%B1%CF%83%CE%B7%20Apache%20Directory%20Server%20%28ApacheDS%29%20%CF%83%CE%B5%20UBUNTU" id="wpa2a_10"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2011/03/30/%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-apache-directory-server-apacheds-%cf%83%ce%b5-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to reference Spring Beans from Everywhere!</title>
		<link>http://www.j2ee.gr/2011/02/15/how-to-reference-spring-beans-from-everywhere/</link>
		<comments>http://www.j2ee.gr/2011/02/15/how-to-reference-spring-beans-from-everywhere/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 11:06:34 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[pojo]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[Spring MVC]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=225</guid>
		<description><![CDATA[Λοπόν, με αφορμή κάτι που με ταλαιπωρούσε γράφω τον παρακάτω οδηγό έτσι ώστε να δείξω πως μπορείς να καλέσεις ενα Spring Bean απο πρακτικά οπουδήποτε. Ουσιαστικά έχουμε τις εξής περιπτώσεις περιπτώσεις για να καλέσουμε ένα bean Σε Spring non Web Application Σε Spring Web Application Μέσα απο κάποιον controller Μέσα σε κάποιο servlet Μέσα σε [...]]]></description>
			<content:encoded><![CDATA[<p>Λοπόν, με αφορμή κάτι που με ταλαιπωρούσε γράφω τον παρακάτω οδηγό έτσι ώστε να δείξω πως μπορείς να καλέσεις ενα Spring Bean απο πρακτικά οπουδήποτε.</p>
<p>Ουσιαστικά έχουμε τις εξής περιπτώσεις περιπτώσεις για να καλέσουμε ένα bean</p>
<ol>
<li>Σε Spring non Web Application</li>
<li>Σε Spring Web Application
<ol>
<li>Μέσα απο κάποιον controller</li>
<li>Μέσα σε κάποιο servlet</li>
<li>Μέσα σε κάποιο implementation ή οποιαδήποτε άλλη Business Logic Class (aka μια απλή java class)</li>
</ol>
</li>
</ol>
<p>Θα τις πάρουμε λοιπόν μία-μία για να δούμε πως θα δουλέψουμε.</p>
<p>Πρώτα όμως θα φτιάξουμε ένα Bean το οποίο και θα καλούμε κάθε φορά μέσα στο κώδικά μας.</p>
<p style="text-align: justify;">Το Spring Bean δεν είναι τίποτε άλλο απο ένα POJO (Plain Old Java Object) το οποίο με το που γίνεται initialize το Spring Context οι setters του «γεμίζουν» με ό,τι ορίζουμε εμείς στο context.xml (το κύριο xml που ορίζοντε όλοι οι παράμετροι του Spring, θα μπορούσε να λέγεται και διαφορετικά)</p>
<p>Στο παράδειγμά μας θα φτιάξω ένα Constants Bean το οποίο θα περιέχει πχ «σταθερές» που θέλω να χρησημοποιώ παντού και να τις ελέγχω απο το XML</p>
<p><span id="more-225"></span></p>
<p>Επι του προκειμένου θα γεμίζω 3εις μεταβλητές με τις μαθηματικές σταθερές</p>
<ul>
<li>π = 3,14</li>
<li>e = 2,71</li>
<li>γ = 0,57 (σταθερα Euler)</li>
</ul>
<p>Φτιάχνω λοιπόν το Constants.java (το Bean μου)</p>
<pre class="brush: java; title: ; notranslate">

package gr.zenika.j2eegr.examples

public class Constants {

 private String pi;
 private String epsilon;
 private String gamma;

 private String pi;
 private String epsilon;
 private String gamma;

 public String getPi() {
   return pi;
 }
 public void setPi(String pi) {
   this.pi = pi;
 }
 public String getEpsilon() {
   return epsilon;
 }
 public void setEpsilon(String epsilon) {
   this.epsilon = epsilon;
 }
 public String getGamma() {
   return gamma;
 }
 public void setGamma(String gamma) {
   this.gamma = gamma;
 }

}
</pre>
<p>Τώρα θα ορίσουμε το Bean αυτό στο context.xml</p>
<pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;constants&quot; class=&quot;gr.zenika.j2eegr.examples.Constants&quot; &gt;
 &lt;property name=&quot;pi&quot; value=&quot;3,14&quot; /&gt;
 &lt;property name=&quot;epsilon&quot; value=&quot;2,71&quot; /&gt;
 &lt;property name=&quot;gamma&quot; value=&quot;0,57&quot; /&gt;
&lt;/bean&gt;
</pre>
<p>Περισσότερα για τα Spring Beans θα βρείτε <a  title="Introduction to the Spring IoC container and beans" href="http://static.springsource.org/spring/docs/3.0.x/reference/beans.html" target="_blank">έδω&#8230;</a><br />
<strong>Οπότε είμαστε έτοιμοι να ξεκινήσουμε&#8230;!</strong></p>
<p><strong>1. Σε Spring Application</strong></p>
<p>Έχοντας τη διαδρομή (path) του context.xml στο classpath κάνουμε το εξής</p>
<pre class="brush: java; title: ; notranslate">
// Αρχικοποιούμε το application context, μπορούμε με κόμματα να έχουμε πολλα xml
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {&quot;context.xml&quot;});

// παίρνουμε το bean
Constants constants = context.getBean(&quot;constants&quot;, Constants.class);
</pre>
<p>Τόσο απλά!</p>
<p>Οπότε μπορούμε να χρησημοποιήσουμε το Spring με όλα τα καλούδια απο οποιαδήποτε stand alone εφαρμογή!</p>
<p><strong>2.A. Σε Spring Web Application μέσα σε Controller<br />
</strong></p>
<p>Εδώ είναι πολύ εύκολα τα πράγματα γιατι θα χρησημοποιήσουμε το @Autowired annotation που υπάρχει απο το spring 2.5 και μετα</p>
<pre class="brush: java; title: ; notranslate">
@Controller
public class tokenService {

 @Autowired
 private Constants constants;

...

}
</pre>
<p>Και έτσι έχουμε το constants διαθέσημο σε όλη τη Class. ΠΡΟΣΟΧΗ το όνομα της μεταβλητής να είναι το ίδιο με το id στο όρισμα του Bean στο XML!</p>
<p><strong>2.Β. Σε Spring Web Application μέσα σε Servlet</strong></p>
<p>Βέβαια δε μπορώ να καταλάβω γιατι κάποιος να χρησημοποιήσει servlet σε Spring MVC εφαρμογή αλλά αυτό είναι άλλο θέμα&#8230; <img src='http://www.j2ee.gr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Το μόνο που έχουμε να κάνουμε εαι να βάλουμε μέσα στη doGet() ή την doPost() κλπ τις γραμμές</p>
<pre class="brush: java; title: ; notranslate">
//Παίρνουμε το servlet Context
ServletContext context = getServletConfig().getServletContext();

//απο εκεί παίρνουμε το Spring Application context
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

//και στο τέλος το Bean το οποίο επειδή γυρνάει τύπου Object το κάνουμε cast στο τύπο που το έχουμε ορίσει (Constants)
Constants constants (Constants) = context.getBean(&quot;constants&quot;);
</pre>
<p style="text-align: justify;"><strong>2.C. Σε Spring Web Application μέσα σε κάποιο implementation ή οποιαδήποτε άλλη Business Logic Class</strong><strong> ακόμα και Legacy code<br />
</strong>Εδώ λοιπόν είναι λίγο περίπλοκα τα πράγματα γιατί</p>
<ol style="text-align: justify;">
<li>Δεν είναι stand alone εφαρμογη οπότε αφενός δε ξέρουμε το path που βρίσκεται και αφετέρου δεν είμαστε και πολυ σίγουροι ότι το XML είναι μέσα στο classpath</li>
<li>Επειδή είναι deployed σε κάποιο application server και ανάλογα με τις ρυθμίσεις του και το λειτουργικό στο οποίο είναι επάνω μπορεί το XML να είναι LOCKED for Reading οπότε και να βρούμε το path που βρίσκεται, μπορεί να μη μπορεί το thread που θα ανοίξουμε να το διαβάσει!</li>
</ol>
<p style="text-align: justify;">Οπότε η στρατηγική που θα ακολουθήσουμε είναι η εξής.</p>
<p style="text-align: justify;">Μια και ενα Bean είναι απλα ένα pojo το οποίο μπορούμε να το αρχικοποιήσουμε μέσα απο το XML, on load του Spring Web App, θα φτιάξουμε ένα άλλο Bean το οποίο, το μόνο που θα κάνει είναι ότι θα δέχεται μέσα του το Spring Context (το οποίο θα περνάμε σα παράμετρο για την αρχικοποίησή του μέσα απο το XML) και θα έχει μια μέθοδο που απο αυτό το context θα φέρνει το Bean που θέλω! Αυτό το Bean (ας το ονομάσουμε SpringApplicationContext) θα μπορούν μετά να το χρησημοποιήσουν όλα τα implementations!</p>
<p>Το SpringApplicationContext.java είναι ώς εξής</p>
<pre class="brush: java; title: ; notranslate">
package gr.zenika.j2eegr.examples

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringApplicationContext implements ApplicationContextAware {

 private static ApplicationContext CONTEXT;

 public void setApplicationContext(ApplicationContext context) throws BeansException {
 CONTEXT = context;
 }

 public static Object getBean(String beanName) {
 return CONTEXT.getBean(beanName);
 }

}
</pre>
<p>Στο context.xml αρχικοποιούμε το Bean βάζοντας</p>
<pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;springApplicationContext&quot; class =&quot;gr.zenika.j2eegr.examples.SpringApplicationContext&quot; /&gt;
</pre>
<p>Οπότε μέσα στη Class που θέλουμε να το καλέσουμε γράφουμε</p>
<pre class="brush: java; title: ; notranslate">
package gr.zenika.j2eegr.examples

public class MyMethodImpl {

 Constants constants = (Constants) SpringApplicationContext.getBean(&quot;constants&quot;);

 public String myFoo(){
 ... do something ...
 }

}
</pre>
<p>Και αυτό ήταν!</p>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2011%2F02%2F15%2Fhow-to-reference-spring-beans-from-everywhere%2F&#038;title=How%20to%20reference%20Spring%20Beans%20from%20Everywhere%21" id="wpa2a_12"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2011/02/15/how-to-reference-spring-beans-from-everywhere/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ο Πούτιν επιβάλει το Linux στους κυβερνητικούς οργανισμούς!</title>
		<link>http://www.j2ee.gr/2010/12/30/%ce%bf-%cf%80%ce%bf%cf%8d%cf%84%ce%b9%ce%bd-%ce%b5%cf%80%ce%b9%ce%b2%ce%ac%ce%bb%ce%b5%ce%b9-%cf%84%ce%bf-linux-%cf%83%cf%84%ce%bf%cf%85%cf%82-%ce%ba%cf%85%ce%b2%ce%b5%cf%81%ce%bd%ce%b7%cf%84%ce%b9/</link>
		<comments>http://www.j2ee.gr/2010/12/30/%ce%bf-%cf%80%ce%bf%cf%8d%cf%84%ce%b9%ce%bd-%ce%b5%cf%80%ce%b9%ce%b2%ce%ac%ce%bb%ce%b5%ce%b9-%cf%84%ce%bf-linux-%cf%83%cf%84%ce%bf%cf%85%cf%82-%ce%ba%cf%85%ce%b2%ce%b5%cf%81%ce%bd%ce%b7%cf%84%ce%b9/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 08:24:37 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=222</guid>
		<description><![CDATA[Ο πρωθυπουργός της Ρωσίας Βλαντιμίρ Πούτιν και ο Ρώσος πρόεδρος Ντμίτρι Μεντβέντεφ έχουν εκφράσει τη συμπάθεια τους για το ανοικτό λογισμικό και απ’ οτι φαίνεται έχουν σκοπό να αποκλείσουν οποιαδήποτε εξάρτηση μπορεί να έχει η Ρωσία με ξένους κατασκευαστές software. Έτσι λοιπόν η Ρωσική Κυβέρνηση, δημοσίευσε ένα χρονοδιάγραμμα για τη μετάβαση όλων των κρατικών συστημάτων [...]]]></description>
			<content:encoded><![CDATA[<p>Ο πρωθυπουργός της Ρωσίας Βλαντιμίρ Πούτιν και ο Ρώσος πρόεδρος Ντμίτρι Μεντβέντεφ έχουν εκφράσει τη συμπάθεια τους για το ανοικτό λογισμικό και απ’ οτι φαίνεται έχουν σκοπό να αποκλείσουν οποιαδήποτε εξάρτηση μπορεί να έχει η Ρωσία με ξένους κατασκευαστές software. </p>
<p>Έτσι λοιπόν η Ρωσική Κυβέρνηση, δημοσίευσε ένα χρονοδιάγραμμα για τη μετάβαση όλων των κρατικών συστημάτων μηχανογράφησης σε Open Source λογισμικό, ένα είδος ρωσικού Linux εγκαταλείποντας με αυτό τον τρόπο τα Windows.</p>
<p>Έτσι μέχρι το 2015 πρόκειται να απομακρυνθούν τα Windows από όλους τους κυβερνητικούς υπολογιστές και να εγκατασταθεί σε όλους ανοικτό λογισμικό.</p>
<p>Ο βασικότερος λόγος της μετάβασης αυτής είναι οτι φέτος λήγουν αρκετές από τις άδειες χρήσης των Windows σε πολλούς κυβερνητικούς οργανισμούς, αλλά και σε σχολεία της Μόσχας.</p>
<p>Με αυτό τον τρόπο η Ρωσία σκοπεύει να εξοικονομήσει αρκετά εκατομμύρια ευρώ από τις άδειες χρήσης αλλά και να κάνει τη χώρα ανεξάρτητη από ξένους κατασκευαστές software. </p>
<p>πηγή newsit.gr</p>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2010%2F12%2F30%2F%25ce%25bf-%25cf%2580%25ce%25bf%25cf%258d%25cf%2584%25ce%25b9%25ce%25bd-%25ce%25b5%25cf%2580%25ce%25b9%25ce%25b2%25ce%25ac%25ce%25bb%25ce%25b5%25ce%25b9-%25cf%2584%25ce%25bf-linux-%25cf%2583%25cf%2584%25ce%25bf%25cf%2585%25cf%2582-%25ce%25ba%25cf%2585%25ce%25b2%25ce%25b5%25cf%2581%25ce%25bd%25ce%25b7%25cf%2584%25ce%25b9%2F&#038;title=%CE%9F%20%CE%A0%CE%BF%CF%8D%CF%84%CE%B9%CE%BD%20%CE%B5%CF%80%CE%B9%CE%B2%CE%AC%CE%BB%CE%B5%CE%B9%20%CF%84%CE%BF%20Linux%20%CF%83%CF%84%CE%BF%CF%85%CF%82%20%CE%BA%CF%85%CE%B2%CE%B5%CF%81%CE%BD%CE%B7%CF%84%CE%B9%CE%BA%CE%BF%CF%8D%CF%82%20%CE%BF%CF%81%CE%B3%CE%B1%CE%BD%CE%B9%CF%83%CE%BC%CE%BF%CF%8D%CF%82%21" id="wpa2a_14"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2010/12/30/%ce%bf-%cf%80%ce%bf%cf%8d%cf%84%ce%b9%ce%bd-%ce%b5%cf%80%ce%b9%ce%b2%ce%ac%ce%bb%ce%b5%ce%b9-%cf%84%ce%bf-linux-%cf%83%cf%84%ce%bf%cf%85%cf%82-%ce%ba%cf%85%ce%b2%ce%b5%cf%81%ce%bd%ce%b7%cf%84%ce%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring Framework Series: Μερος 4ο &#8211; Spring Webflow</title>
		<link>http://www.j2ee.gr/2010/12/05/spring-framework-series-%ce%bc%ce%b5%cf%81%ce%bf%cf%82-4%ce%bf-spring-webflow/</link>
		<comments>http://www.j2ee.gr/2010/12/05/spring-framework-series-%ce%bc%ce%b5%cf%81%ce%bf%cf%82-4%ce%bf-spring-webflow/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 06:35:46 +0000</pubDate>
		<dc:creator>George Moraitakis PhD</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[Online Wizards]]></category>
		<category><![CDATA[Spring MVC]]></category>
		<category><![CDATA[Spring Webflow]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=195</guid>
		<description><![CDATA[Φτάσαμε αισίως στο 4ο μέρος της σειράς μας για το Spring. Στο προηγούμενο κομμάτι του αφιερώματος μας είδαμε την αρχιτεκτονική του Spring MVC και τις δυνατότητες που προσφέρει το framework στον προγραμματιστή για να υλοποιήσει μία εφαρμογή στηριζόμενη σε αυτό το J2EE pattern. Σto σημερινό μας άρθρο θα δούμε μια εξελιγμένη μεθοδολογία που εισήγαγε η [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Φτάσαμε αισίως στο 4ο μέρος της σειράς μας για το Spring. Στο προηγούμενο κομμάτι του αφιερώματος μας είδαμε την αρχιτεκτονική του Spring MVC και τις δυνατότητες που προσφέρει το framework στον προγραμματιστή για να υλοποιήσει μία εφαρμογή στηριζόμενη σε αυτό το J2EE pattern.</p>
<p>Σto σημερινό μας άρθρο θα δούμε μια εξελιγμένη μεθοδολογία που εισήγαγε η ομάδα του Spring που απλοποιεί τη διαδικασία κατασκευής εφαρμογών MVC ιδιαίτερα εκείνες που απαιτούν πολύπλοκες αλληλουχίες φορμών όπως για παράδειγμα ένας wizard, ένα shopping cart κτλ. Η τεχνική αυτή είναι το Spring Webflow.</p>
<p style="text-align: justify;"><strong>1. ΕΙΣΑΓΩΓΗ</strong></p>
<p>Φτάσαμε αισίως στο 4ο μέρος της σειράς μας για το Spring. Στο προηγούμενο κομμάτι του αφιερώματος μας είδαμε την αρχιτεκτονική του Spring MVC και τις δυνατότητες που προσφέρει το framework στον προγραμματιστή για να υλοποιήσει μία εφαρμογή στηριζόμενη σε αυτό το J2EE pattern.</p>
<p>Σto σημερινό μας άρθρο θα δούμε μια εξελιγμένη μεθοδολογία που εισήγαγε η ομάδα του Spring που απλοποιεί τη διαδικασία κατασκευής εφαρμογών MVC ιδιαίτερα εκείνες που απαιτούν πολύπλοκες αλληλουχίες φορμών όπως για παράδειγμα ένας wizard, ένα shopping cart κτλ. Η τεχνική αυτή είναι το Spring Webflow.</p>
<p><span id="more-195"></span></p>
<p style="text-align: justify;"><strong>2. ΤΙ ΕΙΝΑΙ ΤΟ SPRING WEBFLOW</strong></p>
<p>Για να καταλάβουμε το Spring Webflow ας δούμε καταρχάς το κενό που πάει να καλύψει. Τα frameworks βασισμένα σε MVC τα χρησιμοποιούμε εδώ και πολλά χρόνια. Από τα πολλά πλεονεκτήματα που προσφέρουν, σε σύγκριση με την απλή χρήση servlets είναι ότι μας δίνουν τη δυνατότητα ελέγχου της ροής. Ένα τέτοιο απλό παράδειγμα ελέγχου πάνω στη ροή είναι η εμφάνιση μίας σελίδας για την επιτυχή εκτέλεση ενός request από κάποια φόρμα και μια άλλη σελίδα για την αποτυχημένη εκτέλεση.<br />
Σαφώς όμως υπάρχουν και πιο σύνθετα παραδείγματα ροών από σελίδα σε σελίδα όπως για παράδειγμα ένας wizard που εκτείνεται σε πολλές σελίδες (αλληλουχίες σελίδων) και ο οποίος ενδεχόμενος να επαναχρησιμοποιείται σε διάφορα μέρη μίας εφαρμογής ώστε, για παράδειγμα, να δημιουργήσει μια σχέση μεταξύ δύο ή περισσοτέρων οντοτήτων στη βάση δεδομένων (ένα shopping cart πρέπει να συσχετίσει τα στοιχεία του βιβλίου, με τα στοιχεία παράδοσης κτλ.). Παρόλο που αυτά τα σενάρια μπορούν να εφαρμοστούν με οποιοδήποτε MVC framework, η κλασική προσέγγιση MVC έχει μια σειρά από μειονεκτήματα.<br />
Ένα από τα ποιο σημαντικά είναι ότι δεν διαχειρίζονται αυτόματα την κατάσταση (state) των σελίδων που συνιστούν μία αλληλουχία. Aν ορίσουμε ως κατάσταση σελίδας το σύνολο των παραμέτρων με τις τιμές τους σε μία ορισμένη φάση, τότε καθώς μετακινούμαστε από σελίδα σε σελίδα στην αλληλουχία, θα πρέπει να έχουμε έναν κεντρικό τρόπο παρακολούθησης, διατήρησης ή και μεταβολής της κατάστασης καθώς πάμε από request σε request. Πχ. στη σελίδα 1 του wizard έχω ένα checkbox η τιμή του οποίου μπορεί να καθορίζει άλλες σελίδες ή και να αλλάζει η ίδια κάτω από ορισμένες προϋποθέσεις σε επόμενες σελίδες. Σε ένα κλασικό MVC θα πρέπει να γράφουμε κώδικα για κάθε τέτοια κατάσταση μέσα στους handlers ή στα actions αλλά προφανώς αυτό γίνεται αρκετά πολύπλοκο όταν σε ένα wizard πάμε μπρος και πίσω.<br />
Αυτό ακριβώς το πρόβλημα έρχεται να επιλύσει το Spring Webflow. Πρόκειται για ένα extension του Spring MVC το οποίο δίνει την απάντηση στην περιορισμένες λειτουργικές δυνατότητες που υπάρχουν στη ροή από σελίδα σε σελίδα των κλασικών MVC framework καθώς είναι δυνατό με ένα τυποποιημένο τρόπο, να διαχειριζόμαστε κεντρικά τις καταστάσεις σελίδων και ανά πάσα στιγμή να είναι εύκολη η πρόσβαση στις τιμές των παραμέτρων οποιασδήποτε σελίδας (είτε από μία άλλη σελίδα ή ακόμη και προς εκτέλεση κάποιου κώδικα πχ. για εξαγωγή/καταχώρηση δεδομένων)</p>
<p style="text-align: justify;"><strong>3. Η ΦΙΛΟΣΟΦΙΑ ΕΝΟΣ WEBFLOW</strong></p>
<p>Η λογική του Webflow λέει ότι κάθε ροή σελίδων μπορεί να αναπαρασταθεί ως ένα απλό διάγραμμα ροής (τα γνωστά flowcharts) όπου το κάθε state (δηλαδή τα παραλληλόγραμμα ή οι ρόμβοι στο flowchart) είναι είτε μια οθόνη (ένα View ) ή η εκτέλεση κώδικα (ένα Action). Έτσι το Webflow διαχειρίζεται τη μετάβαση μεταξύ των states απαιτώντας ένα input από τις Actions ή τα Views (δηλαδή από τον χρήστη σε μία φόρμα) για να καθορίσει το επόμενο βήμα στην πορεία εκτέλεσης της ροής.<br />
Για να καταλάβουμε καλύτερα τι σημαίνουν πρακτικά τα παραπάνω ας πάρουμε πάλι το παράδειγμα μιας σελίδας με μια φόρμα που με την υποβολή της θα οδηγούμαστε είτε σε μία σελίδα με ένα μήνυμα για την επιτυχή ολοκλήρωση ή μία σελίδα με ένα μήνυμα σφάλματος. Σε αυτή την περίπτωση υπάρχουν 4 διακριτά States:</p>
<ol>
<li>To Αρχικό state (Initial State) όπου ο χρήστης φορτώνει η σελίδα με τη φόρμα. Φορτώνει τη σελίδα και πιθανώς τη προ-συμπληρώνει με δεδομένα από τη βάση</li>
<li>To state υποβολής (Submit State) όπου ο χρήστης υποβάλλει τη φόρμα. Εδώ γίνεται το validation των δεδομένων της φόρμας και από το αποτέλεσμα καθορίζεται ποιο θα είναι το επόμενο βήμα</li>
<li>To state επιτυχούς υποβολής (Successful State). Εμφάνιση ενός μηνύματος στον χρήστη ότι όλα πήγαν καλά !</li>
<li>To state ανεπιτυχούς υποβολής (Unsuccessful State). Εμφάνιση ενός μηνύματος στον χρήστη ότι κάτι πήγε στραβά !</li>
</ol>
<p>Θα πρέπει να τονιστεί εδώ ότι παρόλο που όλα τα states μπορούν να αντιστοιχούν στην ίδια σελίδα (πχ. το μήνυμα λάθους μπορεί να εμφανίζεται πάνω στη φόρμα υποβολής), αυτό δε σημαίνει ότι αλληλεπικαλύπτονται. Αντίθετα ο συνδυασμός των παραγόντων μιας ροής σε κάθε στιγμή καθορίζει σε ποιο state είμαστε.<br />
Είπαμε νωρίτερα ότι το Webflow είναι μία extension του Spring MVC. Όπως είχαμε δει στο 3ο μέρος του αφιερώματός μας, το MVC στηρίζεται στο Front Controller J2EE pattern. Αυτό συνεχίζει να ισχύει και στην περίπτωση αυτή. Ο front controller παραμένει o DispatcherServlet ο οπόιος όμως μεταβιβάζει το request, στην περίπτωση ενός webflow , στον εξειδικευμένο Controller που ονομάζεται FrontController. Αυτό φαίνεται διαγραμματικά ως εξής</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2010/12/frontcontroller_webflow.png" alt="Front Controller with FlowController" width="576" height="312" /></p>
<p>Παρακάτω θα δούμε τι κρύβεται πίσω από τον Webflow Controller και πώς παραμετροποιείται.</p>
<p style="text-align: justify;"><strong>4. ΑΠΟ ΤΗ ΘΕΩΡΙΑ ΣΤΗΝ ΠΡΑΞΗ</strong></p>
<p>Είδαμε τη θεωρία του Webflow. Για να κατανοήσουμε όμως καλύτερα το Webflow ας δούμε ένα παράδειγμα. Ως μέρος μίας εφαρμογής διαχείρισης προσωπικού, θα πρέπει να φτιάξουμε μία διαδικασία για την εισαγωγή νέων υπαλλήλων. Μας έχει δοθεί ρητά η απαίτηση για κάθε κατηγορία στοιχείων (Προσωπικά στοιχεία, Μισθολόγιο, Ρόλος)να υπάρχει ξεχωριστή σελίδα και να μπορούν οι χείριστες να πλοηγούνται μπρος και πίσω από μία σελίδα σε μία άλλη. Το μαντέψατε σωστά: ένας wizard.</p>
<p style="text-align: justify;"><strong>A. Στήσιμο Σκελετού Εφαρμογής</strong></p>
<p>Για το στήσιμο της εφαρμογής θα χρησιμοποιήσω, όπως και στα προηγούμενα άρθρα, το Springsource Tool Suite (2.5.1). Ξεκινάμε λοιπόν το project μας από το MVC Template του Springsource Tool Suite (το άρθρο αναφέρεται σε template της συγκεκριμένης version. Σε προηγούμενες version υπήρχε Webflow Template με διαφορετική μορφή).</p>
<p>Αφού φτιάξουμε τα POJO Beans μας για την κάθε κατηγορία στοιχείων του υπαλλήλου (πχ τις class EmployeePersonalInfo, EmployeeSalary, EmployeeRole) και τις προσθέσουμε μέσα στο src/main/java είμαστε έτοιμοι για να προσθέσουμε τα κομμάτια για το webflow. Επίσης φτιάξτε μία class DataHandler με μία μέθοδο που θα καλούμε για να γίνεται καταχώρηση δεδομένων και βάλτε μία κενή μέθοδο public boolean addEmployee(EmployeePersonalInfo personalInfo, EmployeeSalary salary, EmployeeRole role).</p>
<p><em>Προσοχή: τα 3 POJOs πρέπει να είναι Serializable για να τα χρησιμοποίησουμε μέσα στο webflow.</em></p>
<p><em> </em></p>
<p style="text-align: justify;"><strong>B. Υποδομή για Webflows</strong></p>
<p>Καταρχήν θα πρέπει να προετοιμάσουμε την MVC εφαρμογή μας να για να διαχειρίζεται webflows. Πάμε να δούμε αναλυτικά τα βήματα που απαιτούνται για αυτό.</p>
<ul>
<li>Βιβλιοθήκες: Προσθέτουμε το artefact του webflow στο pom.xml</li>
</ul>
<pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
			&lt;groupId&gt;org.springframework.webflow&lt;/groupId&gt;
			&lt;artifactId&gt;spring-webflow&lt;/artifactId&gt;
			&lt;version&gt;2.2.1.RELEASE&lt;/version&gt;
		&lt;/dependency&gt;
</pre>
<ul>
<li>Spring setup: Προσθήκες στο servlet-context.xml</li>
</ul>
<p>Ας δηλώσουμε καταρχήν τον Controller (θυμίζουμε ότι το webflow είναι ένα MVC) ο οποίος μπορεί να χειριστεί όλα τα flows της εφαρμογής. Του περνάμε την παράμετρο flowExecutor που θα δούμε σε λίγο. Επίσης δηλώνουμε και ένα και έναν adapter που επιτρέπει τη δυνατότητα χρησιμοποίησης plain controllers δηλαδή του FlowController.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;flowController&quot; class=&quot;org.springframework.webflow.mvc.servlet.FlowController&quot;&gt;
		&lt;property name=&quot;flowExecutor&quot; ref=&quot;flowExecutor&quot;/&gt;
	&lt;/bean&gt;
&lt;!-- Enables plain Controllers (e.g. FlowController) --&gt;
	&lt; bean class=&quot;org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter&quot;/&gt;
</pre>
<p>Επίσης δηλώνουμε ποια URL θα γίνουν handled από τον Webflow Controller</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!—Define the mappings for URLs corresponding to webflows  --&gt;
&lt;bean class=&quot;org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&quot;&gt;
		&lt;property name=&quot;mappings&quot;&gt;
			&lt;value&gt;
				/employeewizard=flowController
			&lt;/value&gt;
		&lt;/property&gt;
		&lt;property name=&quot;alwaysUseFullPath&quot; value=&quot;true&quot;/&gt;
	&lt;/ bean&gt;
</pre>
<p>Θέλουμε να χρησιμοποιήσουμε τον κλασικό viewResolver ώστε να κάνουμε το mapping των views που αναφέρονται στο webflow με τα αντίστοιχα jsp</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- Resolves view names to protected .jsp resources within the /WEB-INF directory --&gt;
	&lt;bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
	&lt;property name=&quot;prefix&quot; value=&quot;/WEB-INF/view/jsp/&quot;/&gt;
	&lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot;/&gt;
&lt;/bean&gt;
&lt;!-- To use the already defined resolvers   --&gt;
&lt;bean id=&quot;viewFactoryCreator&quot; class=&quot;org.springframework.webflow.mvc.builder.MvcViewFactoryCreator&quot;&gt;
	&lt;property name=&quot;viewResolvers&quot;&gt;
		&lt;list&gt;
			&lt;ref bean=&quot;viewResolver&quot;/&gt;
		&lt;/list&gt;
	&lt;/property&gt;
&lt;/ bean&gt;
</pre>
<p>Θα βάλουμε την παραμετροποίηση του webflow σε άλλο xml οπότε ας το συμπεριλάβουμε και αυτό:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;beans:import resource=&quot;webflow.xml&quot; /&gt;
</pre>
<p>Ας δηλώσουμε επίσης και τον DataHandler που θα τον χρειαστούμε για να αποθηκεύουμε δεδομένα</p>
<pre class="brush: xml; title: ; notranslate">
&lt; bean id=&quot;dataHandler&quot; class=&quot;gr.zenika.web.app.example.webflow.DataHandler&quot;&gt;
</pre>
<ul>
<li>Ειδικές παράμετροι για το webflow: Προσθήκη αρχείου webflow.xml</li>
</ul>
<p>Ξεκινάμε τώρα να ορίζουμε τους παραμέτρους του webflow<br />
A) Τον flowExecutor που είναι ουσιαστικά η πύλη για τον κόσμο του web flow.<br />
B) To flow-Registry δηλαδή ένα registry των flows που έχουμε. Εκεί ορίζουμε και το path των αρχείων webflow<br />
Γ) Ένα builder-Services που παραμετροποιεί περαιτέρω το σύστημα και συνδέοντάς το με το ViewResolver που είδαμε πριν ουσιαστικά συνδέει τα states του flow με τις αντίστοιχες jsp</p>
<pre class="brush: xml; title: ; notranslate">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:webflow=&quot;http://www.springframework.org/schema/webflow-config&quot;
	xsi:schemaLocation=&quot;

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/webflow-config

http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd&quot;&gt;

	&lt;!-- Configures the engine that executes web flows in this application --&gt;
	&lt;webflow:flow-executor id=&quot;flowExecutor&quot; flow-registry=&quot;flowRegistry&quot; /&gt;

	&lt;!-- Registers the web flows that can be executed --&gt;
	&lt;webflow:flow-registry id=&quot;flowRegistry&quot; base-path=&quot;/WEB-INF/flows&quot; flow-builder-services=&quot;flowBuilderServices&quot;&gt;
		&lt;!-- Register all flow definitions within the /WEB-INF directory ending in &quot;-flow.xml&quot; --&gt;
		&lt;webflow:flow-location-pattern value=&quot;**/*.xml&quot; /&gt;
	&lt;/webflow:flow-registry&gt;

	&lt;!-- Configures settings used to build web flow definitions; development=true enables flow definition refresh on change --&gt;
	&lt;webflow:flow-builder-services id=&quot;flowBuilderServices&quot; development=&quot;true&quot; view-factory-creator=&quot;viewFactoryCreator&quot; /&gt;

&lt;/beans&gt;
</pre>
<p>Εδώ ολοκληρώνεται η υποδομή για τα webflows. Αξίζει να δούμε σε αυτό το σημείο διαγραμματικά πώς θα γίνεται η επεξεργασία των requests. Αυτό το βλέπουμε από τον Spring Explorer του STS</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2010/12/webflow_beans.png" alt="Spring Beans flow in Webflow" width="487" height="480" /></p>
<p style="text-align: justify;"><strong>Γ. Φτιάχνοντας ένα flow </strong></p>
<p>Πάμε τώρα να δούμε πώς φτιάχνεται ένα flow. Καταρχήν το XML αρχείο μέσα στο οποίο ορίζουμε το flow θα πρέπει να βρίσκεται μέσα στο φάκελο WEB-INF/flows (έτσι τον δηλώσαμε ποιο πάνω) και το ποιο σημαντικό να έχει όνομα αρχείου employeewizard.xml δηλαδή το όνομα που κάναμε assigned στον flowController ποιο πάνω.<br />
Ας το δούμε αναλυτικά λοιπόν:<br />
Δηλώνουμε καταρχήν τα beans που θα κρατάνε τις μεταβλητές από τις jsp’s</p>
<pre class="brush: xml; title: ; notranslate">
&lt;var name=&quot;personalinfo&quot; class=&quot;gr.zenika.web.app.example.webflow.beans.EmployeePersonal&quot;/&gt;
	&lt;var name=&quot;salary&quot; class=&quot;gr.zenika.web.app.example.webflow.beans.EmployeeSalary&quot;/&gt;
	&lt;var name=&quot;role&quot; class=&quot;gr.zenika.web.app.example.webflow.beans.EmployeeRole&quot;/&gt;
</pre>
<p>Το αρχείο διαβάζεται σειριακά και έτσι όποιο view είναι πρώτο καθιστάτε ως η πρώτη σελίδα του flow. Οπότε αν θέλουμε o wizard να ξεκινάει με την employeepersonal βάζουμε αυτό το view πρώτο (θα πρέπει να έχουμε αντίστοιχη employeepersonal.jsp στο WEB-INF/views/employeepersonal.jsp ή να δηλώσουμε ποιο είναι το view με την παράμετρο view=”myjsp.jsp”). Επίσης δηλώνουμε ποιο είναι το bean που κάθεται πίσω από τη σελίδα.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;view-state id=&quot;employeepersonal&quot; model=&quot;personalinfo&quot;&gt;
</pre>
<p>Δηλώνουμε τι θα κάνει αν λάβει εντολή για να κάνει transition.Εδώ αναμένει να δει στο request μία παράμετρο που ονομάζεται _eventId. Αυτή θα πρέπει να τη δηλώσουμε σε κάθε jsp του flow για παράδειγμα ως:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;input type=&quot;hidden&quot; neme=&quot;_eventId&quot; value=&quot;proceedToSalary&quot;&gt;
</pre>
<p>Αν αυτή έχει την τιμή proceedToSalary, όπως παραπάνω, τότε προχωράει στην employeesalary.<br />
Έτσι έχουμε:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;view-state id=&quot;employeepersonal&quot; model=&quot;personalinfo&quot;&gt;

		&lt;transition on=&quot;proceedToSalary&quot; to=&quot;employeesalary&quot; history=&quot;preserve&quot;/&gt;

	&lt;/view-state&gt;
</pre>
<p>Αντίστοιχα φτιάχνουμε και τα επόμενα 2 βήματα</p>
<pre class="brush: xml; title: ; notranslate">

		&lt;view-state id=&quot;employeesalary&quot; model=&quot;salary&quot;&gt;

		&lt;transition on=&quot;proceedToRole&quot; to=&quot;employeerole&quot; history=&quot;preserve&quot; /&gt;

	&lt;/view-state&gt;
	&lt;view-state id=&quot;employeerole&quot; model=&quot;role&quot;&gt;

		&lt;transition on=&quot;proceedToSave&quot; to=&quot;employeesave&quot; history=&quot;preserve&quot; /&gt;

	&lt;/view-state&gt;
</pre>
<p>Τέλος κατασκευάζουμε το τέταρτο και τελικό βήμα πού θέλουμε να εμφανιστεί μετά την ολική επεξεργασία όλων των δεδομένων.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;view-state id=&quot;employeesave&quot; &gt;
		&lt;on-entry&gt;
			&lt;evaluate expression=&quot;dataHandler.addEmployee(personalinfo, salary, role)&quot; result=&quot;flowScope.isSuccessful&quot; /&gt;
		&lt;/on-entry&gt;

	&lt;/view-state&gt;
</pre>
<p>Παρατηρήστε το on-entry το οποίο χρησιμοποιείται για να τρέξει μία μέθοδος του dataHandler μας και να επιστρέψει true αν ήταν επιτυχής η καταχώρηση ή false αν δεν ήταν. Αυτό γίνεται assigned σε μία variable isSuccessful που έχει scοpe μόνο μέσα στο flow.<br />
Το ποιο σημαντικό σημείο εδώ είναι ότι όλες οι μεταβλητες του flow είναι ταυτόχρονα και implicit variables προσβάσιμες από το jsp. Πχ ${personalinfo.Name} για να δείξουμε το όνομα του υπαλλήλου.<br />
Έτσι έχουμε για το αρχείο αυτό συνολικά:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;flow xmlns=&quot;http://www.springframework.org/schema/webflow&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/webflow

http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd&quot;&gt;

	&lt;var name=&quot;personalinfo&quot; class=&quot;gr.zenika.web.app.example.webflow.beans.EmployeePersonal&quot;/&gt;
	&lt;var name=&quot;salary&quot; class=&quot;gr.zenika.web.app.example.webflow.beans.EmployeeSalary&quot;/&gt;
	&lt;var name=&quot;role&quot; class=&quot;gr.zenika.web.app.example.webflow.beans.EmployeeRole&quot;/&gt;

	&lt;view-state id=&quot;employeepersonal&quot; model=&quot;personalinfo&quot;&gt;

		&lt;transition on=&quot;proceedToSalary&quot; to=&quot;employeesalary&quot; history=&quot;preserve&quot;/&gt;

	&lt;/view-state&gt;

	&lt;view-state id=&quot;employeesalary&quot; redirect=&quot;false&quot; popup=&quot;false&quot; model=&quot;salary&quot;&gt;

		&lt;transition on=&quot;proceedToRole&quot; to=&quot;employeerole&quot; history=&quot;preserve&quot; /&gt;

	&lt;/view-state&gt;
	&lt;view-state id=&quot;employeerole&quot; redirect=&quot;false&quot; popup=&quot;false&quot; model=&quot;role&quot;&gt;

		&lt;transition on=&quot;proceedToSave&quot; to=&quot;employeesave&quot; history=&quot;preserve&quot; /&gt;

	&lt;/view-state&gt;
	&lt;view-state id=&quot;employeesave&quot; redirect=&quot;false&quot; popup=&quot;false&quot;&gt;
		&lt;on-entry&gt;
			&lt;evaluate expression=&quot;dataHandler.showEmployee(personalinfo, salary, role)&quot; result=&quot;flowScope.isSuccessful&quot; /&gt;
		&lt;/on-entry&gt;

	&lt;/view-state&gt;

&lt;/flow&gt;
</pre>
<p>Το παραπάνω flow μπορούμε να το απεικονίσουμε διαγραμματικά με τη βοήθεια του STS σας flowchart πάλι από το Spring Explorer</p>
<p>Παρατηρήστε ότι το STS μας δίνει τη δυνατότητα να κατασκευάσουμε αυτό το flow σχεδιαστικά !!!</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2010/12/webflow3.png" alt="webflow1" width="640" height="443" /></p>
<p style="text-align: justify;"><strong>Δ. Συμπληρώνοντας τα υπόλοιπα κομμάτια </strong></p>
<p>Μας μένει τώρα να φτιάξουμε τα jsp τα οποία θα πρέπει<br />
1) Να έχουν την ίδια ονομασία με τα view-state που ορίσαμε ποιο πάνω μέσα στο WEB-INF/views (αφου εκεί ορίζει ο viewResolver μας) δηλαδή employeepersonal.jsp, employeesalary.jsp, employeerole.jsp, employeesave.jsp</p>
<p>2) Να χρησιμοποιούν τα implicit variables που έχουμε ορίσει στο employeewizard.xml που είναι personalinfo, salary, role, isSuccessful</p>
<p>3) Να έχουμε beans και jsp με properties και input names που να έχουν ίδια ονόματα</p>
<pre class="brush: java; title: ; notranslate">
package gr.zenika.web.app.example.webflow.beans;
import java.io.Serializable;

public class EmployeePersonal implements Serializable{

private static final long serialVersionUID = 1L;

private String employeeName;
private String dob;

public String getEmployeeName() {
return employeeName;
}

public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}

public String getDob() {
return dob;
}

public void setDob(String dob) {
this.dob = dob;
}

}
</pre>
<p>και το αντίστοιχο jsp είναι το employeepersonal.jsp</p>
<pre class="brush: xml; title: ; notranslate">

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=ISO-8859-7&quot; pageEncoding=&quot;ISO-8859-7&quot;%&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&gt;
&lt;%@ page session=&quot;false&quot; %&gt;

&lt;html&gt;

&lt;head&gt;

&lt;title&gt;Home&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;h1&gt;
ΠΡΟΣΩΠΙΚΑ ΔΕΔΟΜΕΝΑ
&lt;/h1&gt;

&lt;form action=&quot;employeewizard&quot; method=&quot;post&quot;&gt;
Όνομα: &lt;input name=&quot;employeeName&quot; value=&quot;${personalinfo.employeeName}&quot; /&gt;&lt;br/&gt;
Ημ. Γεννησης: &lt;input name=&quot;dob&quot; value=&quot;${personalinfo.dob}&quot; /&gt;

&lt;BR&gt;

&lt;input type=&quot;Submit&quot; value=&quot;Βήμα 2: Μισθός&quot;/&gt;
&lt;input type=&quot;Submit&quot; value=&quot;Έξοδος&quot;/&gt;
&lt;input type=&quot;hidden&quot; name=&quot;_eventId&quot; value=&quot;proceedToSalary&quot; /&gt;

&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p style="text-align: justify;"><strong>Ε. Έτοιμοι για δοκιμή</strong></p>
<p>Σηκώνουμε το project στον TC server (ή σε άλλον της αρεσκείας μας) πηγαίνοντας απευθείας στο URL http://localhost:8080/WebflowExample/employeewizard<br />
Αν όλα δούλεψαν ΟΚ πρέπει να βλέπουμε κάτι σαν το παρακάτω</p>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2010/12/webflow6.png" alt="webflow page" width="522" height="295" /></p>
<p style="text-align: justify;"><strong>ΣΤ. Βάζοντας επιπλέον δυνατότητες</strong></p>
<p>Τώρα που έχουμε μία ροή που τρέχει μπορούμε να προσθέσουμε και τα ακόλουθα</p>
<ul>
<li>Ένα view employeecancel στο οποίο θα μπορούν να πηγαίνουν όλα τα βήματα του wizard πατώνταςτο κουμπί “Ακύρωση” και πηγαίνοντας με _event_id=”proceedToCancel”</li>
</ul>
<p><img src="http://www.j2ee.gr/wp-content/uploads/2010/12/webflow5.png" alt="webflow2" width="640" height="433" /></p>
<ul>
<li>Δυνατότητα να πηγαίνουμε από οποιοδήποτε βήμα σε ένα άλλο εκτός από το Βημα 4 δηλαδή την καταχώρηση (αυτόι να παραμένει ως δυνατότητα μόνο για το Βήμα 3). Πάλι μετο_event_id βλέπουμε σε ποιο view θα πάει. Αν έχουμε ήδη πάει στο βήμα αυτό τα στοιχεία που συμπληρώσαμε θα εμφανιστούν αν έχουμε βάλει το implicit parameter μέσα στο value του πεδίου πχ</li>
</ul>
<pre class="brush: xml; title: ; notranslate">
&lt;input name=”employeeName” value=”${personalinfo.employeeName}” /&gt;
</pre>
<p style="text-align: justify;"><strong>4. ΣΥΜΠΕΡΑΣΜΑΤΙΚΑ</strong></p>
<p>Σε αυτό το άρθρο παρέθεσα τις γενικές έννοιες του Spring Webflow και, μέσα από το παράδειγμά μας, προσπάθησα να αποτυπώσω κάποιες τεχνικές λεπτομέρειες της τεχνολογίας αυτής. Υπάρχουν βέβαια πολύ περισσότερες δυνατότητες και αξίζει να αφιερώσετε περισσότερο χρόνο διαβάζοντας σχετικά με αυτήν και πειραματιστείτε.</p>
<p>Για μένα η πραγματική δύναμη του Spring Webflow κρύβεται στο γεγονός ότι μπορώ να ξαναχρησιμοποιήσω τα flows που έχω φτιάξει, είτε στην ίδια εφαρμογή είτε σε άλλες, με μία τυποποιημένη διαδικασία η οποία τελικά μειώνει το χρόνο δημιουργία πολύπλοκων αλληλουχιών από φόρμες όπως αυτή των wizards, ερωτηματολογίων κτλ. Και το κερασάκι στην τούρτα είναι ότι τα definitions των flows μπορώ να τα παράγω σχεδιαστικά μέσα από το STS, κρατώντας μία πλήρη εικόνα της αρχιτεκτονικής τους και χωρίς να γράψω γραμμή XML κώδικα !</p>
<p>Κλείνωντας να προσθέσω ότι αν θέλουμε οπωσδήποτε να χρησιμοποιήσουμε και άλλες μεθοδολογίες στην εφαρμογή μας πχ. το Spring MVC, το JSF, το Struts, το ΖΚ και άλλα, το Webflow ενσωματώνεται πανεύκολα με αυτά.</p>
<p>Περιμένω τα σχόλιά σας αφού το χρησιμοποιήσετε.</p>
<p style="text-align: justify;"><strong>5. REFERENCES </strong></p>
<ul>
<li>Η <a title=" http://www.springsource.org/webflow" href=" http://www.springsource.org/webflow">homepage </a>του Spring Webflow</li>
<li>Το επίσημο (και εξαιρετικά περιεκτικό) <a title=" http://static.springframework.org/spring-webflow/docs/2.2.x/reference/html/index.html " href=" http://static.springframework.org/spring-webflow/docs/2.2.x/reference/html/index.html">documentation</a></li>
<li>Εξαιρετικό tutorial <a title=" http://www.javabeat.net/articles/72-spring-web-flow-introduction-1.html " href=" http://www.javabeat.net/articles/72-spring-web-flow-introduction-1.html ">στο Java Beat</a></li>
</ul>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2010%2F12%2F05%2Fspring-framework-series-%25ce%25bc%25ce%25b5%25cf%2581%25ce%25bf%25cf%2582-4%25ce%25bf-spring-webflow%2F&#038;title=Spring%20Framework%20Series%3A%20%CE%9C%CE%B5%CF%81%CE%BF%CF%82%204%CE%BF%20%26%238211%3B%20Spring%20Webflow" id="wpa2a_16"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2010/12/05/spring-framework-series-%ce%bc%ce%b5%cf%81%ce%bf%cf%82-4%ce%bf-spring-webflow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Πως να κάνετε εγκατάσταση Tomcat 6 σε Ubuntu</title>
		<link>http://www.j2ee.gr/2010/12/02/%cf%80%cf%89%cf%82-%ce%bd%ce%b1-%ce%ba%ce%ac%ce%bd%ce%b5%cf%84%ce%b5-%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-tomcat-6-%cf%83%ce%b5-ubuntu/</link>
		<comments>http://www.j2ee.gr/2010/12/02/%cf%80%cf%89%cf%82-%ce%bd%ce%b1-%ce%ba%ce%ac%ce%bd%ce%b5%cf%84%ce%b5-%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-tomcat-6-%cf%83%ce%b5-ubuntu/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 14:16:32 +0000</pubDate>
		<dc:creator>Alexius Dionysius Diakogiannis</dc:creator>
				<category><![CDATA[Application Servers]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=182</guid>
		<description><![CDATA[Ο Tomcat είναι απο τους αγαπημένους μου application servers για ένα εκκατομύριο λόγους. Ας τον εγκατάστείσουμε λοιπόν στο αγαπημένο OS μου! Αρχικά ΜΗΝ ΕΓΚΑΤΑΣΤΗΣΕΤΕ Tomcat απο τα REPOSITORIES!! Κάθε φορά που το κάνω το μετανιώνω γιατί μου σπάει τα paths και μαζί με αυτό και τα νεύρα! Ξεκινάμε λοιπόν, γινόμαστε root και κατεβάζουμε τον Tomcat [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ο Tomcat είναι απο τους αγαπημένους μου application servers για ένα εκκατομύριο λόγους. Ας τον εγκατάστείσουμε λοιπόν στο αγαπημένο OS μου!</p>
<p style="text-align: justify;">Αρχικά <strong>ΜΗΝ ΕΓΚΑΤΑΣΤΗΣΕΤΕ</strong> Tomcat απο τα <strong>REPOSITORIES</strong>!! Κάθε φορά που το κάνω το μετανιώνω γιατί μου σπάει τα paths και μαζί με αυτό και τα νεύρα!</p>
<p style="text-align: justify;">Ξεκινάμε λοιπόν, γινόμαστε root και κατεβάζουμε τον Tomcat στη τελευταία έκδοσή του (επι του προκειμένου 6.0.29) στο /var (που με βολεύει εμένα συνήθως <img src='http://www.j2ee.gr/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  ), κάνουμε αποσυμπίεση και του δίνουμε το «φιλικό» όνομα φακέλου tomcat6<span id="more-182"></span></p>
<pre class="brush: bash; title: ; notranslate">

sudo -i

cd /var

wget http://apache.ntua.gr/tomcat/tomcat-6/v6.0.29/bin/apache-tomcat-6.0.29.tar.gz

tar xvzf apache-tomcat-6.0.29.tar.gz

mv apache-tomcat-6.0.29.tar.gz tomcat6
</pre>
<p>Μετά ελέγχουμε ότι έχουμε εγκατεστημένη την Java6 της <strong>SUN</strong> δίνοντας</p>
<pre class="brush: bash; title: ; notranslate">

java -version
</pre>
<p>Αν το παραπάνω μας δώσει κάτι της μορφής</p>
<pre class="brush: bash; title: ; notranslate">

java version &quot;1.6.0_07&quot;
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
</pre>
<p style="text-align: justify;">Τότε όλα είναι οκ, αλλιώς πρέπει να εγκαταστήσουμε τη Java6-sun <strong>ΚΑΙ</strong> να την κάνουμε την default java του συστήματος δίνοντας</p>
<pre class="brush: bash; title: ; notranslate">
apt-get -y install maven2 sun-java6-jdk java-common
</pre>
<p style="text-align: justify;">Μετά κάνουμε το σύστημα μας να έχει ως προεπιλεγμένη VM αυτή του JDK της SUN και <strong>όχι του OPENJDK</strong>, <em>και γενικά αυτό είναι καλύτερη επιλογή αφού το OPENJDK έχει αρκετό δρόμο ακόμα για να καλύψει όλα τα standarts που έχει το JDK της SUN. Δίνουμε λοιπόν<br />
</em></p>
<pre class="brush: bash; title: ; notranslate">
update-alternatives --config java
</pre>
<p>και επιλέγουμε το νούμερο που αναφέρει τη SUN Java<br />
<img src="http://www.j2ee.gr/wp-content/uploads/2010/10/select-java-ubuntu.png" alt="select java ubuntu" width="470" height="319" align="middle" /><br />
Είμαστε σχεδόν έτοιμοι!</p>
<p style="text-align: justify;">Το μόνο που μένει είναι να πούμε στο σύστημα (αν θέλουμε) να ξεκινάει ο Tomcat να ξεκινάει μαζί του.<br />
Φτιάχνουμε λοιπόν ένα αρχεί εκκίνησης</p>
<pre class="brush: bash; title: ; notranslate">
pico /etc/init.d/tomcat6
</pre>
<p>Και μέσα βάζουμε</p>
<pre class="brush: bash; title: ; notranslate">
# Tomcat auto-start
#
# description: Auto-starts tomcat
# processname: tomcat
# pidfile: /var/run/tomcat.pid
export JAVA_HOME=/usr/lib/jvm/java-6-sun
case $1 in
start)
sh /var/tomcat6/bin/startup.sh
;;
stop)
sh /var/tomcat6/bin/shutdown.sh
;;
restart)
sh /var/tomcat6/bin/shutdown.sh
sh /var/tomcat6/bin/startup.sh
;;
esac
exit 0
</pre>
<p style="text-align: justify;">&nbsp;</p>
<p>Αυτό που του λέμε είναι απλά ότι τρέξε τα (<strong>startup.sh, shutdown.sh</strong>) που είναι τα script εκκίνησης του tomcat ανάλογα με το τι εντολή θα λάβεις (<strong>start, stop, restart</strong>)</p>
<p style="text-align: justify;">Τέλος κάνουμε link το παραπάνω script στα startup folders</p>
<pre class="brush: bash; title: ; notranslate">
sudo ln -s /etc/init.d/tomcat6 /etc/rc1.d/K99tomcat6
sudo ln -s /etc/init.d/tomcat6 /etc/rc2.d/S99tomcat6
</pre>
<p style="text-align: justify;">Και ναί είμαστε έτοιμοι!<br />
Ας δοκιμάσουμε όμως&#8230;<br />
Τρέχουμε</p>
<pre class="brush: bash; title: ; notranslate">
/etc/init.d/tomcat6 start
</pre>
<p>Ανοίγουμε ένα broswer και πηγαίνουμε στο <a  href="http://localhost:8080/">http://localhost:8080/</a><br />
Και &#8230;<br />
<a  href="http://www.j2ee.gr/wp-content/uploads/2010/12/tomcatscreen.png" class="thickbox no_icon" rel="gallery-182" title="tomcat"><img class="size-medium wp-image-183    aligncenter" title="tomcat" src="http://www.j2ee.gr/wp-content/uploads/2010/12/tomcatscreen-300x283.png" alt="" width="300" height="283" /></a></p>
<p>Καλή διασκέδαση!</p>
<p><a  class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.j2ee.gr%2F2010%2F12%2F02%2F%25cf%2580%25cf%2589%25cf%2582-%25ce%25bd%25ce%25b1-%25ce%25ba%25ce%25ac%25ce%25bd%25ce%25b5%25cf%2584%25ce%25b5-%25ce%25b5%25ce%25b3%25ce%25ba%25ce%25b1%25cf%2584%25ce%25ac%25cf%2583%25cf%2584%25ce%25b1%25cf%2583%25ce%25b7-tomcat-6-%25cf%2583%25ce%25b5-ubuntu%2F&#038;title=%CE%A0%CF%89%CF%82%20%CE%BD%CE%B1%20%CE%BA%CE%AC%CE%BD%CE%B5%CF%84%CE%B5%20%CE%B5%CE%B3%CE%BA%CE%B1%CF%84%CE%AC%CF%83%CF%84%CE%B1%CF%83%CE%B7%20Tomcat%206%20%CF%83%CE%B5%20Ubuntu" id="wpa2a_18"><img src="http://www.j2ee.gr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2010/12/02/%cf%80%cf%89%cf%82-%ce%bd%ce%b1-%ce%ba%ce%ac%ce%bd%ce%b5%cf%84%ce%b5-%ce%b5%ce%b3%ce%ba%ce%b1%cf%84%ce%ac%cf%83%cf%84%ce%b1%cf%83%ce%b7-tomcat-6-%cf%83%ce%b5-ubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Εκμηδενίστε το χρόνο υλοποίησης web εφαρμογών με το Spring Roo</title>
		<link>http://www.j2ee.gr/2010/10/17/%ce%b5%ce%ba%ce%bc%ce%b7%ce%b4%ce%b5%ce%bd%ce%af%cf%83%cf%84%ce%b5-%cf%84%ce%bf-%cf%87%cf%81%cf%8c%ce%bd%ce%bf-%cf%85%ce%bb%ce%bf%cf%80%ce%bf%ce%af%ce%b7%cf%83%ce%b7%cf%82-web-%ce%b5%cf%86%ce%b1%cf%81/</link>
		<comments>http://www.j2ee.gr/2010/10/17/%ce%b5%ce%ba%ce%bc%ce%b7%ce%b4%ce%b5%ce%bd%ce%af%cf%83%cf%84%ce%b5-%cf%84%ce%bf-%cf%87%cf%81%cf%8c%ce%bd%ce%bf-%cf%85%ce%bb%ce%bf%cf%80%ce%bf%ce%af%ce%b7%cf%83%ce%b7%cf%82-web-%ce%b5%cf%86%ce%b1%cf%81/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 05:28:15 +0000</pubDate>
		<dc:creator>George Moraitakis PhD</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[Roo]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.j2ee.gr/?p=150</guid>
		<description><![CDATA[Η υλοποίηση ενός Java project είναι μία δημιουργική διαδικασία που όμως όπως όλοι μας γνωρίζουμε αρκετές φορές εμπεριέχει κάποιες επαναλαμβανόμενες εργασίες  που μειώνουν τον ρυθμό ανάπτυξης και συνήθως τείνουν να είναι κουραστικές για τον προγραμματιστή. Αυτό ακριβώς το θέμα έρχεται να επιλύσει μία πολύ δυναμική τεχνολογία, το Roo από την Springsource.  Σκοπός του είναι να επιτρέψει στον developer να οικοδομήει υψηλής ποιότητας και υψηλής απόδοσης συστήματα σε λίγα μόνο λεπτά. Σε αυτό το άρθρο θα περιγράφεται αναλυτικά τι είναι αυτή η τεχνολογία και παράλληλα θα διαπιστώσουμε μαζί πώς μπορούμε να χτίσουμε μία πλήρως λειτουργική enterprise εφαρμογή σε λιγότερο απο ένα τέταρτο της ώρας.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Η υλοποίηση ενός Java project είναι μία δημιουργική διαδικασία που όμως όπως όλοι μας γνωρίζουμε αρκετές φορές εμπεριέχει κάποιες επαναλαμβανόμενες εργασίες  που μειώνουν τον ρυθμό ανάπτυξης και συνήθως τείνουν να είναι κουραστικές για τον προγραμματιστή. Αυτό ακριβώς το θέμα έρχεται να επιλύσει μία πολύ δυναμική τεχνολογία, το Roo από την Springsource.  Σκοπός του είναι να επιτρέψει στον developer να οικοδομήει υψηλής ποιότητας και υψηλής απόδοσης συστήματα σε λίγα μόνο λεπτά. Σε αυτό το άρθρο θα περιγράφεται αναλυτικά τι είναι αυτή η τεχνολογία και παράλληλα θα διαπιστώσουμε μαζί πώς μπορούμε να χτίσουμε μία πλήρως λειτουργική enterprise εφαρμογή σε λιγότερο απο ένα τέταρτο της ώρας.</p>
<p style="text-align: justify;"><strong>1. ΕΙΣΑΓΩΓΗ</strong></p>
<p style="text-align: justify;"><strong> </strong></p>
<div id="_mcePaste">Η υλοποίηση ενός Java project είναι μία δημιουργική διαδικασία που όμως όπως όλοι μας γνωρίζουμε αρκετές φορές εμπεριέχει κάποιες επαναλαμβανόμενες εργασίες  που μειώνουν τον ρυθμό ανάπτυξης και συνήθως τείνουν να είναι κουραστικές για τον προγραμματιστή. Πόσες φορές για παράδειγμα δεν αγανακτούμε με το POJO που πρέπει να γράψουμε για να αντιστοιχήσουμε τις 100 στήλες ενός πίνακα σε Java πεδία, ή για την για την JSP που πρέπει να εμφανίζει σε φόρμα τα πεδία αυτά για input KAI με τα απαραίτητα validations. Για να μη μιλήσω για το plumbing που πρέπει να γίνει μεταξύ των components ενός τυπικού MVC. Όλα αυτά παίρνουν χρόνο και αποσπούν τη προσοχή από το core της εφαρμογής, δηλαδή το καθεαυτό business logic και μειώνουν, εν τέλει, την παραγωγικότητα.</div>
<div><span id="more-150"></span></div>
<div id="_mcePaste">Αυτό ακριβώς το θέμα έρχεται να επιλύσει μία πολύ δυναμική τεχνολογία, το Roo από την Springsource. Το Roo είναι ένα εύκολο στη χρήση εργαλείο παραγωγικότητας για την ταχεία ανάπτυξη επιχειρηματικών εφαρμογών βασισμένα σε Java. Σκοπός του είναι να επιτρέψει στον developer να οικοδομήει υψηλής ποιότητας και υψηλής απόδοσης συστήματα σε λίγα μόνο λεπτά !</div>
<div id="_mcePaste">Σε αυτό το άρθρο θα περιγράφεται αναλυτικά τι είναι αυτή η τεχνολογία και παράλληλα θα διαπιστώσουμε μαζί πώς μπορούμε να χτίσουμε μία πλήρως λειτουργική enterprise εφαρμογή σε λιγότερο απο ένα τέταρτο της ώρας.</div>
<p style="text-align: justify;"><strong>2. ΤΙ (ΔΕΝ) ΕΙΝΑΙ ΤΟ ROO</strong></p>
<p style="text-align: justify;"><strong> </strong></p>
<p>Ας δούμε λοιπόν τι είναι το Roo. Πρόκειται για ένα εργαλείο το οποίο ανοίγει μέσα σε ένα command line shell εντελώς έξω και ανεξάρτητα από το περιβάλλον ανάπτυξης (πχ Eclipse) και το οποίο τρέχει παράλληλα καθώς προγραμματίζουμε. Καθώς κάνουμε τις αλλαγές μας, αυτό είναι αρκετά έξυπνο για να αντιλαμβάνεται τι προσπαθούμε να κάνουμε και το κάνει για εμάς αυτόματα δηλαδή αναλαμβάνει την διαχείριση του κώδικα  «για μας πριν από εμάς».</p>
<p>Όλα αυτά θα τα δούμε αναλυτικά αλλά πριν προχωρήσουμε ας ξεκαθαρίσουμε ότι δεν πρόκειται για κάποιο runtime ούτε για κάποιο plugin του αγαπημένου μας IDE. Δεν υπάρχουν κάποια jars που βάζουμε στον κώδικα και επομένως αν χρειαστεί να το αφαιρέσουμε δεν αλλάζει τίποτα ουσιαστικό στον κώδικά μας και εξαφανίζεται σαν να μην υπήρχε ποτέ ! Τέλος δεν καθυστερεί την εκτέλεση του υπό υλοποίηση λογισμικού και δεν επιβάλει οποιαδήποτε αλλαγή στην αρχιτεκτονική προκειμένου να χρησιμοποιηθεί.</p>
<p>Αντίθετα, με τη χρήση του Roo επιτυγχάνονται μια σειρά από πολύ σημαντικούς στόχους.</p>
<ol>
<li>Αυξάνει τη παραγωγικότητα: Γίνεται εφικτή η ταχύτατη υλοποίηση ενός ολοκληρωμένου και λειτουργικού Java έργου ακόμη και σε ελάχιστα λεπτά</li>
<li>Ενσωμάτωση των καλύτερων τεχνολογιών: Η νέα εφαρμογή σας θα στηρίζεται σε καταξιωμένες και ευρέως διαδεδομένες τεχνολογίες  (Spring, Maven, JSP, Hibernate κτλ.)</li>
<li>Πανεύκολη εκμάθηση και χρήση: Τρέχει από ένα εξαιρετικά εύχρηστο command line περιβάλλον με τεχνολογίες που πιθανώς γνωρίζεται ήδη παρέχοντας ταυτόχρονα hints σε κάθε βήμα.</li>
<li>Απλότητα στην αρχιτεκτονική:  Εύκαμπτος κώδικας που είναι εύκολο να τροποποιηθεί . Το τελικό αποτέλεσμα χρησιμοποιεί λιγότερη υπολογιστική δύναμη και μνήμη</li>
<li>Ταχύτατη απεγκατάσταση: Με λίγα απλά βήματα ο προγραμματιστής μπορεί να αφαιρέσει το Roo χωρίς ρίσκο και χωρίς αλλαγή του βασικού κώδικα (το πολύ κάποια @Roo annotations).</li>
</ol>
<p style="text-align: justify;"><strong>3. Το ROO στην πράξη</strong></p>
<p style="text-align: justify;"><strong> </strong></p>
<p>Πάμε να δούμε λοιπόν πώς το ROO χρησιμοποιείται μέσα από ένα συγκεκριμένο παράδειγμα. Πριν από αυτό όμως ας δούμε τα βήματα που πρέπει να ακολουθήσουμε για την εγκατάστασή του.</p>
<ol>
<li>Προ-εγκατεστημένο λογισμικό
<ol>
<li>Κλασικά έχουμε, Windows, Mac ή Linux και οπουδήποτε αλλού «παίζει» η Java</li>
<li>Ένα οποιοδήποτε JVM (Sun, JRockit, IBM, OpenJDK κτλ.) αλλά με την environment variable <span style="font-family: 'andale mono', times;">JAVA_HOME</span> σεταρισμένη.</li>
<li>Το Apache Maven</li>
</ol>
</li>
<li>Κατεβάστε το Roo από <a  title="http://www.springsource.com/download/community?project=Spring%20Roo." href="http://www.springsource.com/download/community?project=Spring%20Roo.">εδώ</a>:</li>
<li>Κάνουμε Unzip στο φάκελο που θέλουμε να εγκατασταθεί. Αυτό θα είναι και το <span style="font-family: 'andale mono', times;">ROO_HOME</span> μας</li>
<li>Σετάρουμε το <span style="font-family: 'andale mono', times;">ROO_HOME</span></li>
</ol>
<ul>
<li>
<ul>
<li><em>Windows</em>:
<ul>
<li><span style="font-family: 'andale mono', times;">SET ROO_HOME=C:\roohome</span> (για παράδειγμα)</li>
<li><span style="font-family: 'andale mono', times;">SET PATH=%PATH%;%ROO_HOME%\bin</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>
<ul>
<li><em>Linux</em> (και παρόμοια σε Mac)
<ul>
<li><span style="font-family: 'andale mono', times;">ROO_HOME=/app/Software/roohome (για παράδειγμα)</span></li>
<li><span style="font-family: 'andale mono', times;">sudo ln –s $ROO_HOME/bin/roo.sh /usr/bin/roo</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<p style="padding-left: 30px;">5.<span style="white-space: pre;"> </span>Για να επιβεβαιώσετε τη σωστή εγκατάσταση κάνουμε:</p>
<pre class="brush: diff; title: ; notranslate">
$ roo
    ____  ____  ____
   / __ \/ __ \/ __ \
  / /_/ / / / / / / /
 / _, _/ /_/ / /_/ /
/_/ |_|\____/\____/    1.0.2.RELEASE [rev 638]

Welcome to Spring Roo. For assistance press TAB or type &quot;hint&quot; then hit ENTER.
roo&gt; quit
$
</pre>
<p>Ας υποθέσουμε, λοιπόν ότι μας έχει ανατεθεί η υλοποίηση του μηχανογραφικού συστήματος μίας δημοτικής βιβλιοθήκης. Πρόκειται για μία intranet εφαρμογή όπου οι υπάλληλοι θα μπορούν να καταχωρούν στο σύστημα βιβλία και στη συνέχεια, πάλι μέσα από την εφαρμογή, θα καταγράφουν που έχουν δανειστεί τα βιβλία. Το project πρέπει να είναι έτοιμο χτες !<br />
Με το ROO θα φτιάξουμε την εφαρμογή το πολύ σε 15 λεπτά. Έτοιμοι; Το χρονόμετρο ξεκινάει τώρα.</p>
<ol>
<li><span style="text-decoration: underline;">Δημιουργία του project</span></li>
</ol>
<p>Φτιάχνουμε ένα φάκελο μέσα στο οποίο θα δημιουργηθεί το project και ξεκινάμε το Roo</p>
<pre class="brush: diff; title: ; notranslate">
$ mkdir librarymanager
$ cd librarymanager
$ roo
    ____  ____  ____
   / __ \/ __ \/ __ \
  / /_/ / / / / / / /
 / _, _/ /_/ / /_/ /
/_/ |_|\____/\____/    1.0.2.RELEASE [rev 638]

Welcome to Spring Roo. For assistance press TAB or type &quot;hint&quot; then hit ENTER.
</pre>
<p>Όπως ανέφερα και πριν, το Roo διευκολύνει τον χρήστη με την εντολή hint. Θα τη χρησιμοποιήσουμε κατά κόρον στη συνέχεια. Πάμε να δούμε πώς:</p>
<pre class="brush: diff; title: ; notranslate">
roo&gt; hint
Welcome to Roo! We hope you enjoy your stay!

Before you can use many features of Roo, you need to start a new project.

To do this, type 'project' (without the quotes) and then hit TAB.

Enter a --topLevelPackage like 'com.mycompany.projectname' (no quotes).
When you've finished completing your --topLevelPackage, press ENTER.
Your new project will then be created in the current working directory.

Note that Roo frequently allows the use of TAB, so press TAB regularly.
Once your project is created, type 'hint' and ENTER for the next suggestion.
You're also welcome to visit http://forum.springframework.org for Roo help.
roo&gt; project --topLevelPackage gr.zenika.librarymanager
Created /app/Development/librarymanager/pom.xml
Created SRC_MAIN_JAVA
Created SRC_MAIN_RESOURCES
Created SRC_TEST_JAVA
Created SRC_TEST_RESOURCES
Created SRC_MAIN_WEBAPP
Created SRC_MAIN_RESOURCES/META-INF/spring
Created SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xml
Created SRC_MAIN_RESOURCES/META-INF/spring/log4j.properties
</pre>
<p>Το project μας δημιουργήθηκε και είναι ένα πολύ απλό κέλυφος μίας spring εφαρμογής.</p>
<p style="padding-left: 30px;">2.  <span style="text-decoration: underline;">Βάση δεδομένων</span></p>
<p>Πάμε τώρα να φτιάξουμε τη βάση δεδομένων. Ξαναπατώντας hint μας ενημερώνει το ίδιο το Roo σχετικά με αυτό το βήμα.. Δημιουργούμε μία in-memory βάση αλλά σαφώς θα μπορούσε να είναι μία οποιαδήποτε βάση (πχ. PostgreSQL).</p>
<pre class="brush: diff; title: ; notranslate">
gr.zenika.librarymanager roo&gt; hint
Roo requires the installation of a JPA provider and associated database.

Type 'persistence setup' and then hit TAB three times.
We suggest you type 'H' then TAB to complete &quot;HIBERNATE&quot;.
After the --provider, press TAB twice for database choices.
For testing purposes, type (or TAB) HYPERSONIC_IN_MEMORY.
If you press TAB again, you'll see there are no more options.
As such, you're ready to press ENTER to execute the command.

Once JPA is installed, type 'hint' and ENTER for the next suggestion.
gr.zenika.librarymanager roo&gt; persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
Created SRC_MAIN_RESOURCES/META-INF/persistence.xml
Created SRC_MAIN_RESOURCES/META-INF/spring/database.properties
Managed SRC_MAIN_RESOURCES/META-INF/spring/applicationContext.xml
Managed ROOT/pom.xml
</pre>
<p style="padding-left: 30px;">3.   <span style="text-decoration: underline;">Δημιουργία του 2 entities</span></p>
<p>Το επόμενα βήμα είναι να φτιάξουμε ένα  persistence Entity για τα βιβλία και το οποίο θα ονομάζεται Books και ένα για τους εγγεγραμμένους χρήστες RegisteredUsers. Και στα δύο θα προστεθούν τα απαραίτητα πεδία. Θα έχουμε:<br />
<strong>BOOK</strong></p>
<table style="border-color: #940412; border-width: 0px;" border="0">
<tbody>
<tr>
<td>Title</td>
<td>String</td>
<td>not null</td>
</tr>
<tr>
<td>Authors</td>
<td>String</td>
<td>not null</td>
</tr>
<tr>
<td>ISBN</td>
<td>String</td>
<td></td>
</tr>
<tr>
<td>Max Loan Days</td>
<td>String</td>
<td></td>
</tr>
<tr>
<td>Copy ID</td>
<td>Integer</td>
<td>not null</td>
</tr>
<tr>
<td>LoanedTo</td>
<td>Integer</td>
<td></td>
</tr>
<tr>
<td>ReturnDate</td>
<td>Date</td>
<td></td>
</tr>
</tbody>
</table>
<p><strong>RegisteredUser</strong></p>
<table style="border-color: #940412; border-width: 0px;" border="0">
<tbody>
<tr>
<td>Name</td>
<td>String</td>
<td>not null</td>
</tr>
<tr>
<td>Surname</td>
<td>String</td>
<td>not null</td>
</tr>
<tr>
<td>DOB</td>
<td>Date</td>
<td></td>
</tr>
<tr>
<td>Registration Date</td>
<td>Date</td>
<td></td>
</tr>
<tr>
<td>Activated</td>
<td>Boolean</td>
<td>not null</td>
</tr>
</tbody>
</table>
<pre class="brush: diff; title: ; notranslate">
gr.zenika.librarymanager roo&gt; hint
You can create entities either via Roo or your IDE.
Using the Roo shell is fast and easy, especially thanks to the TAB completion.

Start by typing 'ent' and then hitting TAB twice.
Enter the --class in the form '~.domain.MyEntityClassName'
In Roo, '~' means the --topLevelPackage you specified via 'create project'.

After specify a --class argument, press SPACE then TAB. Note nothing appears.
Because nothing appears, it means you've entered all mandatory arguments.
However, optional arguments do exist for this command (and most others in Roo).
To see the optional arguments, type '--' and then hit TAB. Mostly you won't
need any optional arguments, but let's select the --testAutomatically option
and hit ENTER. You can always use this approach to view optional arguments.

After creating an entity, use 'hint' for the next suggestion.
gr.zenika.librarymanager roo&gt; entity --class ~.domain.Books --testAutomatically
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/domain
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books.java
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksDataOnDemand.java
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksIntegrationTest.java
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_Entity.aj
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_ToString.aj
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_Configurable.aj
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksIntegrationTest_Roo_Configurable.aj
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksDataOnDemand_Roo_DataOnDemand.aj
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksIntegrationTest_Roo_IntegrationTest.aj
Created SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksDataOnDemand_Roo_Configurable.aj
~.domain.Books roo&gt; hint
You can add fields to your entities using either Roo or your IDE.

To add a new field, type 'field' and then hit TAB. Be sure to select
your entity and provide a legal Java field name. Use TAB to find an entity
name, and '~' to refer to the top level package. Also remember to use TAB
to access each mandatory argument for the command.

After completing the mandatory arguments, press SPACE, type '--' and then TAB.
The optional arguments shown reflect official JSR 303 Validation constraints.
Feel free to use an optional argument, or delete '--' and hit ENTER.

If creating multiple fields, use the UP arrow to access command history.

After adding your fields, type 'hint' for the next suggestion.
To learn about setting up many-to-one fields, type 'hint relationships'.
~.domain.Books roo&gt; field string --fieldName title
field string --fieldName title
required --fieldName: The name of the field to add; no default value
~.domain.Books roo&gt; field string --fieldName title --notNull
Managed SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books.java
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_JavaBean.aj
Managed SRC_TEST_JAVA/gr/zenika/librarymanager/domain/BooksDataOnDemand_Roo_DataOnDemand.aj
Managed SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_ToString.aj
</pre>
<p>Κάνουμε το ίδιο και για τα υπόλοιπα πεδία (δεν περιλαμβάνω όλο το output μόνο τις εντολές).</p>
<pre class="brush: diff; title: ; notranslate">

~.domain.Books roo&gt; field string --fieldName author –notNull
....
~.domain.Books roo&gt; field string --fieldName isbn --notNull
....
~.domain.Books roo&gt; field number --fieldName maxLoanDays --
notNull --type java.lang.Integer
....
~.domain.Books roo&gt; field number --fieldName copyid --type java.lang.Integer
....
~.domain.Books roo&gt; field date --fieldName returnDate --type java.util.Calendar
....
</pre>
<p>Προσθέτουμε τώρα το RegisteredUser</p>
<pre class="brush: diff; title: ; notranslate">
~.domain.Books roo&gt; entity --class ~.domain.RegisteredUser --testAutomatically
....
</pre>
<p>&#8230; και τα πεδία του</p>
<pre class="brush: diff; title: ; notranslate">
~.domain.RegisteredUser roo&gt; field string --fieldName name --notNull
....
~.domain.RegisteredUser roo&gt; field string --fieldName surname –notNull
....
~.domain.RegisteredUser roo&gt; field date --fieldName dob --type java.util.Calendar --dateFormat SHORT –notNull
....
~.domain.RegisteredUser roo&gt; field date --fieldName regdate --type java.util.Calendar --dateFormat SHORT
....
~.domain.Books roo&gt; field boolean --fieldName activated --notNull
....
</pre>
<p>Παρατηρήστε πόσο απλό είναι να προστεθούν entities και πεδία. Επίσης βλέπουμε ότι κάθε στιγμή το Roo μας δίνει τη δυνατότητα να δούμε ποιο είναι το context (πχ. ~.domain.RegisteredUser), οπότε ξέρουμε που θα προστεθούνε τα πεδία.</p>
<p style="padding-left: 30px;">4.   <span style="text-decoration: underline;">Δημιουργία σχέσης πινάκων</span></p>
<p>Στον πίνακα Book δεν έχουμε δηλώσει ακόμη το πεδίο LoanedTo. Ξέρουμε ότι το κάθε copy βιβλίου μπορεί να δανειστεί από ένα και μόνο χρήστη. Άρα έχουμε μία σχέση 1:1. Αυτό το πεδίο το δηλώνουμε λοιπόν ως εξής:</p>
<pre class="brush: diff; title: ; notranslate">
~.domain.RegisteredUser roo&gt; field reference --fieldName loanTo --type ~.domain.RegisteredUser --class ~.domain.Books
Managed SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books.java
Managed SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_JavaBean.aj
Managed SRC_MAIN_JAVA/gr/zenika/librarymanager/domain/Books_Roo_ToString.aj
</pre>
<p>Παρατηρήστε ότι έβαλα το  &#8211;class ~.domain.Books για να δηλώσω ότι αυτό το πεδίο ανήκει στο Books. Το Roo το βάζει σε αυτή την class και αλλάζει το context στο command prompt.</p>
<p style="padding-left: 30px;">5.   <span style="text-decoration: underline;">Web front end</span></p>
<p>Με ολοκληρωμένο το back-end της εφαρμογής πάμε να φτιάξουμε το web layer. Αρκεί μία και μόνο εντολή:</p>
<pre class="brush: diff; title: ; notranslate">
roo&gt; controller all --package ~.web
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/web
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/web/RegisteredUserController.java
Created SRC_MAIN_WEBAPP/WEB-INF/spring
Created SRC_MAIN_WEBAPP/WEB-INF/spring/webmvc-config.xml
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/web/RegisteredUserController_Roo_Controller.aj
Created SRC_MAIN_WEBAPP/images
Created SRC_MAIN_WEBAPP/images/nl.png
Created SRC_MAIN_WEBAPP/images/update.png
Created SRC_MAIN_WEBAPP/images/es.png
Created SRC_MAIN_WEBAPP/images/delete.png
Created SRC_MAIN_WEBAPP/images/add.png
Created SRC_MAIN_WEBAPP/images/resultset_previous.png
Created SRC_MAIN_WEBAPP/images/resultset_next.png
Created SRC_MAIN_WEBAPP/images/favicon.ico
Created SRC_MAIN_WEBAPP/images/banner-graphic.png
Created SRC_MAIN_WEBAPP/images/resultset_last.png
Created SRC_MAIN_WEBAPP/images/gb.png
Created SRC_MAIN_WEBAPP/images/springsource-logo.png
Created SRC_MAIN_WEBAPP/images/it.png
Created SRC_MAIN_WEBAPP/images/show.png
Created SRC_MAIN_WEBAPP/images/sv.png
Created SRC_MAIN_WEBAPP/images/list.png
Created SRC_MAIN_WEBAPP/images/resultset_first.png
Created SRC_MAIN_WEBAPP/images/de.png
Created SRC_MAIN_WEBAPP/styles
Created SRC_MAIN_WEBAPP/styles/standard.css
Created SRC_MAIN_WEBAPP/styles/alt.css
Created SRC_MAIN_WEBAPP/WEB-INF/classes
Created SRC_MAIN_WEBAPP/WEB-INF/classes/standard.properties
Created SRC_MAIN_WEBAPP/WEB-INF/classes/alt.properties
Created SRC_MAIN_WEBAPP/WEB-INF/layouts
Created SRC_MAIN_WEBAPP/WEB-INF/layouts/default.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/layouts/layouts.xml
Created SRC_MAIN_WEBAPP/WEB-INF/views
Created SRC_MAIN_WEBAPP/WEB-INF/views/views.xml
Created SRC_MAIN_WEBAPP/WEB-INF/views/resourceNotFound.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/index.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/uncaughtException.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/dataAccessFailure.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/controller-index.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/tags
Created SRC_MAIN_WEBAPP/WEB-INF/tags/language.tagx
Created SRC_MAIN_WEBAPP/WEB-INF/tags/theme.tagx
Created SRC_MAIN_WEBAPP/WEB-INF/tags/pagination.tagx
Created SRC_MAIN_WEBAPP/WEB-INF/i18n
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/messages_sv.properties
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/messages.properties
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/messages_nl.properties
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/messages_it.properties
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/messages_es.properties
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/messages_de.properties
Created SRC_MAIN_WEBAPP/WEB-INF/i18n/application.properties
Managed SRC_MAIN_WEBAPP/WEB-INF/i18n/application.properties
Created SRC_MAIN_WEBAPP/WEB-INF/views/registereduser
Created SRC_MAIN_WEBAPP/WEB-INF/views/registereduser/list.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/registereduser/show.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/registereduser/create.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/menu.jspx
Managed SRC_MAIN_WEBAPP/WEB-INF/i18n/application.properties
Managed SRC_MAIN_WEBAPP/WEB-INF/views/menu.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/registereduser/update.jspx
Managed SRC_MAIN_WEBAPP/WEB-INF/i18n/application.properties
Managed SRC_MAIN_WEBAPP/WEB-INF/views/menu.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/registereduser/views.xml
Created SRC_MAIN_WEBAPP/WEB-INF/urlrewrite.xml
Created SRC_MAIN_WEBAPP/WEB-INF/web.xml
Managed SRC_MAIN_WEBAPP/WEB-INF/web.xml
Managed ROOT/pom.xml
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/web/BooksController.java
Managed SRC_MAIN_WEBAPP/WEB-INF/web.xml
Managed ROOT/pom.xml
Created SRC_MAIN_JAVA/gr/zenika/librarymanager/web/BooksController_Roo_Controller.aj
Created SRC_MAIN_WEBAPP/WEB-INF/views/books
Created SRC_MAIN_WEBAPP/WEB-INF/views/books/list.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/books/show.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/books/create.jspx
Managed SRC_MAIN_WEBAPP/WEB-INF/i18n/application.properties
Managed SRC_MAIN_WEBAPP/WEB-INF/views/menu.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/books/update.jspx
Managed SRC_MAIN_WEBAPP/WEB-INF/i18n/application.properties
Managed SRC_MAIN_WEBAPP/WEB-INF/views/menu.jspx
Created SRC_MAIN_WEBAPP/WEB-INF/views/books/views.xml
gr.zenika.librarymanager.web roo&gt;
</pre>
<p>Η εντολή αυτή σαρώνει το project για entities και δημιουργεί αντίστοιχους controllers και views (jsp).<br />
Το project μας τώρα είναι ένα web Java project και βασίζεται στο Spring MVC (βλέπε το προηγούμενο άρθρο μου) και οι Controllers ακολουθούν το REST (βλέπε άρθρου του καλού συναδέλφου Αλέξιου).</p>
<p style="padding-left: 30px;">6.  <span style="text-decoration: underline;">Φόρτωμα σε IDE</span></p>
<p><span style="text-decoration: underline;"> </span><br />
Το project μας έχει ολοκληρωθεί. Πριν προχωρήσουμε, ας το φορτώσουμε σε ένα IDE. Μιας και το project δεν περιέχει οποιαδήποτε αρχεία παραμέτρων για IDE  μπορούμε να τα δημιουργήσουμε με την εντολή:</p>
<pre class="brush: diff; title: ; notranslate">
gr.zenika.librarymanager.web roo&gt; perform eclipse
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building librarymanager
[INFO]    task-segment: [eclipse:clean, eclipse:eclipse]
[INFO] ------------------------------------------------------------------------
[INFO] [eclipse:clean {execution: default-cli}]
[INFO] Deleting file: .project
[INFO] Deleting file: .classpath
[INFO] Deleting file: .wtpmodules
[INFO] Deleting file: .component
[INFO] Deleting file: org.eclipse.wst.common.component
[INFO] Deleting file: org.eclipse.wst.common.project.facet.core.xml
[INFO] Deleting file: org.eclipse.jdt.core.prefs
[INFO] Deleting file: org.eclipse.ajdt.ui.prefs
[INFO] Preparing eclipse:eclipse
[INFO] [aspectj:compile {execution: default}]
[WARNING] advice defined in org.springframework.mock.staticmock.AnnotationDrivenStaticEntityMockingControl has not been applied [Xlint:adviceDidNotMatch]
[WARNING] advice defined in org.springframework.mock.staticmock.AbstractMethodMockingControl has not been applied [Xlint:adviceDidNotMatch]
[INFO] [eclipse:eclipse {execution: default-cli}]
[INFO] Adding support for WTP version 2.0.
[INFO] Using Eclipse Workspace: null
[INFO] Adding default classpath container: org.eclipse.jdt.launching.JRE_CONTAINER
[INFO] Wrote settings to /app/Development/librarymanager/.settings/org.eclipse.jdt.core.prefs
[INFO] Wrote Eclipse project for &quot;librarymanager&quot; to /app/Development/librarymanager.
[INFO]
       Javadoc for some artifacts is not available.
       Please run the same goal with the -DdownloadJavadocs=true parameter in order to check remote repositories for javadoc.
       List of artifacts without a javadoc archive:
         o edu.emory.mathcs.backport:com.springsource.edu.emory.mathcs.backport:3.1.0
         o javax.persistence:com.springsource.javax.persistence:1.0.0
         o javax.servlet:com.springsource.javax.servlet:2.5.0
         o javax.servlet:com.springsource.javax.servlet.jsp.jstl:1.2.0
         o org.apache.taglibs:com.springsource.org.apache.taglibs.standard:1.1.2
         o javax.transaction:com.springsource.javax.transaction:1.1.0
         o javax.validation:com.springsource.javax.validation:1.0.0.GA
         o net.sourceforge.ehcache:com.springsource.net.sf.ehcache:1.4.1
         o net.sourceforge.jsr107cache:com.springsource.net.sf.jsr107cache:1.0.0
         o org.apache.commons:com.springsource.org.apache.commons.collections:3.2.0
         o org.apache.commons:com.springsource.org.apache.commons.logging:1.1.1
         o org.apache.commons:com.springsource.org.apache.commons.dbcp:1.2.2.osgi
         o org.apache.commons:com.springsource.org.apache.commons.pool:1.3.0
         o org.apache.commons:com.springsource.org.apache.commons.fileupload:1.2.0
         o org.apache.commons:com.springsource.org.apache.commons.io:1.4.0
         o org.apache.el:com.springsource.org.apache.el:6.0.20
         o org.apache.log4j:com.springsource.org.apache.log4j:1.2.15
         o org.apache.tiles:com.springsource.org.apache.tiles:2.1.3
         o org.apache.tiles:com.springsource.org.apache.tiles.core:2.1.3
         o org.apache.commons:com.springsource.org.apache.commons.digester:1.8.1
         o org.apache.commons:com.springsource.org.apache.commons.beanutils:1.8.0
         o org.apache.tiles:com.springsource.org.apache.tiles.jsp:2.1.3
         o org.apache.tiles:com.springsource.org.apache.tiles.servlet:2.1.3
         o org.aspectj:com.springsource.org.aspectj.runtime:1.6.6.RELEASE
         o org.hibernate:com.springsource.org.hibernate.annotations:3.3.1.ga
         o org.dom4j:com.springsource.org.dom4j:1.6.1
         o org.hibernate:com.springsource.org.hibernate.annotations.common:3.3.0.ga
         o org.hibernate:com.springsource.org.hibernate:3.2.6.ga
         o org.antlr:com.springsource.antlr:2.7.6
         o org.jboss.javassist:com.springsource.javassist:3.3.0.ga
         o net.sourceforge.cglib:com.springsource.net.sf.cglib:2.1.3
         o org.objectweb.asm:com.springsource.org.objectweb.asm:1.5.3
         o org.objectweb.asm:com.springsource.org.objectweb.asm.attrs:1.5.3
         o org.hibernate:com.springsource.org.hibernate.ejb:3.3.2.GA
         o org.jboss.util:com.springsource.org.jboss.util:2.0.4.GA
         o edu.oswego.cs.concurrent:com.springsource.edu.oswego.cs.dl.util.concurrent:1.3.4
         o org.hibernate:com.springsource.org.hibernate.validator:4.0.0.GA
         o org.slf4j:com.springsource.slf4j.api:1.5.6
         o org.hsqldb:com.springsource.org.hsqldb:1.8.0.9
         o org.joda:com.springsource.org.joda.time:1.6.0
         o org.junit:com.springsource.org.junit:4.7.0
         o org.slf4j:com.springsource.slf4j.log4j:1.5.6
         o org.springframework:org.springframework.aop:3.0.0.RELEASE
         o org.aopalliance:com.springsource.org.aopalliance:1.0.0
         o org.springframework:org.springframework.beans:3.0.0.RELEASE
         o org.springframework:org.springframework.core:3.0.0.RELEASE
         o org.springframework:org.springframework.asm:3.0.0.RELEASE
         o org.springframework:org.springframework.aspects:3.0.0.RELEASE
         o org.springframework:org.springframework.context:3.0.0.RELEASE
         o org.springframework:org.springframework.expression:3.0.0.RELEASE
         o org.springframework:org.springframework.jdbc:3.0.0.RELEASE
         o org.springframework:org.springframework.transaction:3.0.0.RELEASE
         o org.springframework:org.springframework.orm:3.0.0.RELEASE
         o org.springframework:org.springframework.test:3.0.0.RELEASE
         o org.springframework:org.springframework.web:3.0.0.RELEASE
         o org.springframework:org.springframework.web.servlet:3.0.0.RELEASE
         o org.springframework.roo:org.springframework.roo.annotations:1.0.2.RELEASE
         o org.springframework.webflow:org.springframework.js:2.0.8.RELEASE
         o org.tuckey:com.springsource.org.tuckey.web.filters.urlrewrite:3.1.0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26 seconds
[INFO] Finished at: Sun Sep 19 08:58:05 EEST 2010
[INFO] Final Memory: 28M/77M
[INFO] ------------------------------------------------------------------------
gr.zenika.librarymanager.web roo&gt;
</pre>
<p>Το project μας είναι έτοιμο για φόρτωμα στο Eclipse. Κάνουμε:<br />
File =&gt; Import =&gt; Import existing Project into Workspace και πηγαίνουμε στο φάκελο librarymanager.<br />
Ρίχνοντας μια γρήγορη ματιά στη δομή του project βλέπουμε ότι έχει τη γνωστη δομή ενός Spring MVC Template που χρησιμοποιεί το STS (βλέπε το σχετικό άρθρο μου).<br />
<img src="http://www.j2ee.gr/wp-content/uploads/2010/10/roo_pic1.jpg" alt="Roo on IDE" /></p>
<p style="padding-left: 30px;">7.   <span style="text-decoration: underline;">Φόρτωμα σε server</span></p>
<p><span style="text-decoration: underline;"> </span><br />
Έφτασε η στιγμή να δούμε τους κόπους της δουλείας μας. Φορτώνουμε το Project στον Tomcat (για παράδειγμα) μέσα (ή έξω) από το IDE μας et voila…  μία έτοιμη εφαρμογή σε ελάχιστη ώρα.<br />
<img src="http://www.j2ee.gr/wp-content/uploads/2010/10/roo_pic2.jpg" alt="Roo on IDE" /></p>
<p style="padding-left: 30px;">8.  <span style="text-decoration: underline;">Χρήση της εφαρμογής</span></p>
<p><span style="text-decoration: underline;"> </span><br />
Βάλτε μερικά δεδομένα τώρα. Ξεκινήστε από τα βιβλία χρησιμοποιώντας το Create New Book. Όπως βλέπουμε το Roo έφτιαξε την εφαρμογή πλήρης με validation, tips και ακόμη με calendar για πεδία με ημερομηνίες.<br />
<img src="http://www.j2ee.gr/wp-content/uploads/2010/10/roo_pic3.jpg" alt="Roo on IDE" /><br />
Βάλτε τώρα ένα χρήστη από Create new Registered User. Τα βιβλία που έχουμε βάλει εμφανίζονται σαν multi choice λίστα. Επίσης υπάρχει αυτόματο paging για τις καταχωρήσεις<br />
Παρατηρήστε επίσης ότι το site μας είναι και Multilingual ! Δοκιμάστε μερικές από τις σημαιούλες. Επίσης έχουμε τη δυνατότητα εναλλαγής του theme.<br />
Συνοψίζοντας λοιπόν τις βασικές λειτουργίες που έχει η εφαρμογή έχουμε:</p>
<ol>
<li>Καταχώρηση / επεξεργασία εγγραφών
<ol>
<li>Validation</li>
<li>Tips</li>
<li>Popup Calendar</li>
</ol>
</li>
<li>Λίστα εγγραφών
<ol>
<li>Σύνοψη πεδίων</li>
<li>Σελιδοποίηση</li>
<li>Κουμπάκια για επεξεργασία / διαγραφή</li>
</ol>
</li>
<li>Πόλυ-γλωσσικότητα</li>
<li>Themes</li>
<li>Έτοιμο σχήμα στη βάση δεδομένων</li>
</ol>
<p><strong>4. ΣΥΜΠΕΡΑΣΜΑ</strong></p>
<p>Σε αυτό το άρθρο είδαμε πως κατασκευάζεται μία εφαρμογή με το Roo χωρίς να γράψουμε ούτε γραμμή κώδικα, μέσα σε λίγα λεπτά. Στην πράξη, για να είναι ολοκληρωμένη η εφαρμογή θα βάλουμε τα δικά μας stylesheet, θα αλλάξουμε τα λεκτικά (θα γίνουν ελληνικά ίσως)  και θα κάνουμε κάποιες τελευταίες τελειοποιήσεις. Ο βασικός κορμός της εφαρμογής (και αυτός που συνήθως παίρνει 90% της υλοποίησης) είναι έτοιμος.<br />
Από την άλλη, έχοντας πλέον χρησιμοποιήσει το Roo σε διάφορα project σίγουρα δεν αποτελεί πανάκεια. Αν η εφαρμογή έχει πολύ business logic και πρόκειται να κάνετε πολλές επεμβάσεις στο front-end για να τελειοποιηθεί ίσως να μην ενδείκνυται (αλλά πάλι εξαρτάται).<br />
Συμπερασματικά, θα έλεγα ότι το Roo αποτελεί ένα πολύ δυνατό εργαλείο για τη γρήγορη δόμηση εφαρμογών ιδιαίτερα σε εφαρμογές με μεγάλο πλήθος πεδίων όπου καταναλώνεται μεγάλος χρόνος για την κατασκευή αντίστοιχων φορμών, διαχείρισης entities και το validation.<br />
Περιμένω τα σχόλιά σας αφού το χρησιμοποιήσετε.</p>
<p><strong>5. REFERENCES</strong></p>
<ul>
<li>Η <a  title="http://www.springsource.org/roo/" href="http://www.springsource.org/roo/">homepage </a>του Spring Roo</li>
<li>Το επίσημο (και εξαιρετικά περιεκτικό) <a  title="http://static.springsource.org/spring-roo/reference/html/index.html" href="http://static.springsource.org/spring-roo/reference/html/index.html">documentation</a> με 2 πολύ καλά tutorials</li>
<li>Ένα ακόμη καλό <a  title="http://developers-blog.org/blog/default/2010/02/16/Spring-Roo" href="http://developers-blog.org/blog/default/2010/02/16/Spring-Roo">tutorial</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.j2ee.gr/2010/10/17/%ce%b5%ce%ba%ce%bc%ce%b7%ce%b4%ce%b5%ce%bd%ce%af%cf%83%cf%84%ce%b5-%cf%84%ce%bf-%cf%87%cf%81%cf%8c%ce%bd%ce%bf-%cf%85%ce%bb%ce%bf%cf%80%ce%bf%ce%af%ce%b7%cf%83%ce%b7%cf%82-web-%ce%b5%cf%86%ce%b1%cf%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

