<?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>My IT-blog &#187; java</title>
	<atom:link href="http://dev.eek.be/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.eek.be</link>
	<description>IT knowledge exchange</description>
	<lastBuildDate>Fri, 04 Jun 2010 05:34:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Backing up Mysql with Java and PHP</title>
		<link>http://dev.eek.be/2010/04/backing-up-mysql-with-java-and-php/</link>
		<comments>http://dev.eek.be/2010/04/backing-up-mysql-with-java-and-php/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 09:35:26 +0000</pubDate>
		<dc:creator>Wim</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[dump]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://dev.eek.be/?p=310</guid>
		<description><![CDATA[mysqldump is an effective tool to backup MySQL databases. In normal cases, it&#8217;s done trough a command line commando but it can be used programmatically.
It&#8217;s a very easy script and it could be useful. (don&#8217;t have to log in into console to take a backup, create an auto backup on deployment, &#8230;)
It will work on [...]]]></description>
			<content:encoded><![CDATA[<p>mysqldump is an effective tool to backup MySQL databases. In normal cases, it&#8217;s done trough a command line commando but it can be used programmatically.<br />
It&#8217;s a very easy script and it could be useful. (don&#8217;t have to log in into console to take a backup, create an auto backup on deployment, &#8230;)<br />
It will work on Windows and Linux as long as mysql is in your PATH.</p>
<pre class="prettyprint">
package be.eek.test.mysql;

import java.io.IOException;
import java.io.InputStream;

public class MysqlBackup {

    /**
    main method is just to create a working example
    **/
    public static void main(String[] args) throws IOException {
        new MysqlBackup().MakeBackup();
    }

    public void MakeBackup() throws IOException {
        String dump = "mysqldump "      //Path to mysql
                + "--host=localhost "       //Mysql hostname
                + "--port=3306 "            //Mysql portnumber
                + "--user=root "            //Mysql username
                + "--password=test "        //Mysql password
                + "--add-drop-table "       //Add a DROP TABLE statement before each CREATE TABLE statement
                + "--add-drop-database "    //Add a DROP DATABASE statement before each CREATE DATABASE statement
                + "--complete-insert "      //Use complete INSERT statements that include column names.
                + "--extended-insert "      //Use multiple-row INSERT syntax that include several VALUES lists
                + "test";                   //Mysql databasename

        Process run = Runtime.getRuntime().exec(dump);

        InputStream in = run.getInputStream();

        int nextChar;
        StringBuffer sb = new StringBuffer();

        while ((nextChar = in.read()) != -1) {
            sb.append((char) nextChar);
        }

        //Here, you can for example write it to a file and save it
        System.out.println(sb);
    }
}
</pre>
<p>The same thing is also possible in php:</p>
<pre class="prettyprint lang-php">
$dump = "mysqldump "
        . "--host=localhost "       //Mysql hostname
        . "--port=3306 "            //Mysql portnumber
        . "--user=root "            //Mysql username
        . "--password=test "        //Mysql password
        . "--add-drop-table "       //Add a DROP TABLE statement before each CREATE TABLE statement
        . "--add-drop-database "    //Add a DROP DATABASE statement before each CREATE DATABASE statement
        . "--complete-insert "      //Use complete INSERT statements that include column names.
        . "--extended-insert "      //Use multiple-row INSERT syntax that include several VALUES lists
        . "test";                   //databasename

$backup = system($dump);
echo $backup;
die();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://dev.eek.be/2010/04/backing-up-mysql-with-java-and-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devoxx University 2009</title>
		<link>http://dev.eek.be/2009/11/devoxx-university-2009/</link>
		<comments>http://dev.eek.be/2009/11/devoxx-university-2009/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 21:10:35 +0000</pubDate>
		<dc:creator>Wim</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[Devoxx]]></category>
		<category><![CDATA[presentation]]></category>

		<guid isPermaLink="false">http://dev.eek.be/?p=248</guid>
		<description><![CDATA[Devoxx is one of the largest Java Conferences in Europe. The first 2 days consists of Universitytalks and the other 3 days are conferences.
Since I live in Belgium, approximately 30km of Devoxx, and have a great interest in Java, I was able to attend the 2 Universitydays.
When I&#8217;ve entered the room on Monday morning, the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://devoxx.com/display/DV09/Home" target="_blank">Devoxx</a> is one of the largest Java Conferences in Europe. The first 2 days consists of Universitytalks and the other 3 days are conferences.<br />
Since I live in Belgium, approximately 30km of Devoxx, and have a great interest in Java, I was able to attend the 2 Universitydays.</p>
<p>When I&#8217;ve entered the room on Monday morning, the first thing I&#8217;ve noticed was that there where no stands with Java-companies or products. We all got a bag with a T-shirt which is really cool <img src='http://dev.eek.be/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>The first event of the day in which I&#8217;ve attended was an introduction to <a href="http://devoxx.com/display/DV09/Introduction+to+Java+Generics">Java Generics</a> by Prof. Eric Steegmans. He explained during this 3 hours class all about Java Generics. He started with a very basic example used in in ArrayList and build his presentation up to more advanced features like generics in classes, generics with wildcards,&#8230;<br />
He explained everything very well but the example in his demo was not really good. He was trying to show us a class which used generics but he implemented like 6 other classes which made the example a little bit to difficult to follow. </p>
<p>Next on the menu was another 3 hours class about <a href="http://devoxx.com/display/DV09/JSF+2+and+beyond" target="_blank">JSF2</a> by Dan Allen, Peter Muir and Andy Schwartz. The course was divided into 3 sections: View(Andy), Controller (Dan) and Model (Peter). What I liked about there presentation style was the fact that they showed how something was in JSF 1.x, how they improved it in JSF2.0 en what they should improve in JSF 2.next.<br />
The presentation given by Peter Muir was the best of the 3. He was very enthusiastic and explained why JSF shouldn&#8217;t concern (very much) about the model.<br />
I&#8217;ve learned a lot in this presentation.</p>
<p>Next was a presentation about <a href="http://devoxx.com/display/DV09/Easing+JPA+data+access+with+Hades" target="_blank">Hades</a> by Oliver Gierke. It was a short presentation about implementing data access layers with JPA which is a lot easier with Hades.<br />
I&#8217;m not quite sure if I will ever use Hades but it looked promising.</p>
<p>Last presentation of the day was about <a href="http://devoxx.com/display/DV09/NoSQL+with+Cassandra+and+Hadoop" target="_blank">NoSQL with Cassandra and Hadoop</a> by Steven Noels. He told us that his company developed a CMS which had some problems with scaling if it was deployed at big companies. As a solution they threw out the rational databases and went to another way of working. He explained which frameworks they compared (Googles Bigtables, Cassandra,Hades,..) and why they ultimately choosed Hades above Cassandra.<br />
I like this way of thinking and will look to it in the (near) future.</p>
<p>It was a very interesting day.</p>
<p>The second day when I&#8217;ve entered the building, I&#8217;ve saw that the stands have arrived: Time to get me some nice goodies!!! <img src='http://dev.eek.be/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
The big companies where all present (IBM,Oracle,Adobe,Springsource,..) and also a few minor companies (Atlassian, Jetbrains,..). There was one company absent&#8230;Sun, which is in my opinion a little bit strange since they don&#8217;t belong to Oracle yet.</p>
<p>The first presentation was again a 3 hours during class about <a href="http://devoxx.com/display/DV09/The+Java+EE+6++Platform">the Java EE6 platform</a> by Antonio Goncalves and Alexis Moussine-Pouchkine. I was in doubt if I would follow this course at first because a colleague of mine said he once saw a presentation by Antonia Goncalves which was kinda boring. Not this time!! It was the best presentation I&#8217;ve seen on Devoxx this year. They explained most of the new features in EE6 (validation, jsf, EJB3.1,EJB Lite, JSF2.0, Servlet3.0,JAX-RS 1.1,JPA2.0,..) and gave an example for each feature.<br />
I&#8217;m very excited about JavaEE6. It&#8217;s a lot easier and has a lot of cool features.<br />
They told us that Java EE6 (and GlassfishV3) will be released in December. I can&#8217;t wait.</p>
<p>The next course I&#8217;ve attented was about <a href="http://devoxx.com/display/DV09/SOA+in+Practice" target=_blank">SOA in practice</a> by Nicolai Josuttis. I had heard a few things about SOA but wasn&#8217;t very sure what it was so I was very curious about this presentation.<br />
Nicolai explained how and when a company should setup a SOA architecture. It was very clear explained and what I&#8217;ve liked was the fact that the speaker wasn&#8217;t someone who would use SOA always. He explained that it isn&#8217;t necessary for many companies. A really good presentation which gave me the insights into SOA which I didn&#8217;t had before.</p>
<p>After that, there was a short presentation about  <a href="http://devoxx.com/display/DV09/A+Year+of+Monitoring+with+Java-monitor">a year of monitoring with Java-Monitor</a> by Kees Jan Koster. He explained a few different techniques how you can monitor your JVM and how to detect and fix some issues. The presentation was a little bit to short but was very interesting.</p>
<p>The last course I&#8217;ve attended was about <a href="http://devoxx.com/display/DV09/Lookup+-+A+new+OSGi+Service+Registry">lookup, a new OSGi Service Registry</a>. I have no experience with OSGi and this course was sadly a little bit to abstract for me.</p>
<p>The conclusion of these 2 days at Devoxx is that I&#8217;ve learned a lot and there will come some exciting times for Java in the near future. I wish I could also attend the 3 other days but sadly that&#8217;s not the case. I&#8217;ve enjoyed the Devoxx-time and hope to attend again next year!!</p>
<p><script type="text/javascript">var dzone_url = 'http://dev.eek.be/2009/11/devoxx-university-2009/';</script><br />
<script type="text/javascript">var dzone_title = 'Devoxx university 2009';</script><br />
<script type="text/javascript">var dzone_blurb = 'An expression of the first 2 days of Devoxx and an overview of the courses I've attended';</script><br />
<script type="text/javascript">var dzone_style = '1';</script><br />
<script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.eek.be/2009/11/devoxx-university-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The lifecycle of a Spring bean</title>
		<link>http://dev.eek.be/2009/11/the-lifecycle-of-a-spring-bean/</link>
		<comments>http://dev.eek.be/2009/11/the-lifecycle-of-a-spring-bean/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 17:30:42 +0000</pubDate>
		<dc:creator>Wim</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[annotations]]></category>
		<category><![CDATA[Dependency injection]]></category>
		<category><![CDATA[di]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Inversion of control]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dev.eek.be/?p=218</guid>
		<description><![CDATA[
In this blogpost, I&#8217;ll talk and give a few examples of the lifecycle of a bean in a Spring container.
The examples are tested with Spring 3.0RC1 but should work with Spring 2.5+
Xml Attributes
In this first example, I&#8217;ll show you how the lifecycle of a bean happens within the xml-configfile.
In the xml-file, we can define an [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://dev.eek.be/wp-content/uploads/2009/11/beans-150x150.jpg" alt="Beans" title="beans" width="150" height="150" class="size-thumbnail wp-image-228" /><br />
In this blogpost, I&#8217;ll talk and give a few examples of the lifecycle of a bean in a Spring container.<br />
The examples are tested with Spring 3.0RC1 but should work with Spring 2.5+</p>
<p><h1>Xml Attributes</h1>
<p>In this first example, I&#8217;ll show you how the lifecycle of a bean happens within the xml-configfile.</p>
<p>In the xml-file, we can define an init- and destroy-method to the bean, which will be called automatically by Spring.<br />
<b>Config.xml</b></p>
<pre class="prettyprint" lang-xml>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&gt;

    &lt;bean id="attributesTest" class="a.Test" init-method="initMethod" destroy-method="destroyMethod"&gt;
    &lt;/bean&gt;
&lt;/beans&gt;
</pre>
<p><b>Main program</b><br />
In this case, I&#8217;ll use AbstractApplicationContext because this Context has a function to destroy the Context which a normal ApplicationContext doesn&#8217;t have.</p>
<pre class="prettyprint" lang-java>
package a;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class XmlAttributesTest {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("Config.xml");
        ctx.registerShutdownHook();
        Test test =  ctx.getBean("attributesTest",Test.class);
    }
}
</pre>
<p><b>Test.java</b></p>
<pre class="prettyprint" lang-java>
package a;

public class Test{

    public Test(){
        System.out.println("We are in the constructor of Test");
    }

    public void initMethod(){
        System.out.println("We are in initMethod of Test");
    }

    public void destroyMethod(){
        System.out.println("We are in destroyMethod of Test");
    }

}
</pre>
<p>The output will be:</p>
<pre class="prettyprint" lang-java>
We are in the constructor of Test
We are in initMethod of Test
We are in destroyMethod of Test
</pre>
<p>It&#8217;s also possible to declare default init- and destroy-methods in the xml-file. This is done in the beans-tag:</p>
<pre class="prettyprint" lang-xml>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-init-method="initMethod"
       default-destroy-method="destroyMethod"&gt;
...
</pre>
</p>
<p><h1>LifeCycles with interfaces</h1>
<p>It&#8217;s possible to call the lifecyclemethods by implemnting a Spring interface.<br />
It&#8217;s very easy to do but I don&#8217;t recommend this because when you use the interfaces, your code will be highly coupled to the Spring Framework which isn&#8217;t always a good case.<br />
<b>Config.xml</b><br />
You don&#8217;t have to set an init and destroy method in the xml-file</p>
<pre class="prettyprint" lang-xml>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&gt;

    &lt;bean id="interfacesTest" class="b.Test"&gt;
    &lt;/bean&gt;
&lt;/beans&gt;
</pre>
<p><b>Main program</b><br />
This is always the same&#8230;</p>
<pre class="prettyprint" lang-java>
package b;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InterfaceTest {

    public static void main(String[] args) {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("Config.xml");
        ctx.registerShutdownHook();
        Test test =  ctx.getBean("interfacesTest",Test.class);
    }
}
</pre>
<p><b>Test.java</b><br />
We have to implement InitializingBean for init-methods and DisposableBean for destroy-methods</p>
<pre class="prettyprint" lang-java>
package b;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Test implements InitializingBean, DisposableBean {

    public Test(){
        System.out.println("We are in the constructor of Test");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("We are in afterPropertiesSet of Test");
    }

    public void destroy() throws Exception {
        System.out.println("We are in destroy of Test");
    }
}
</pre>
</p>
<p><h1>Lifecycle with annotations</h1>
<p><b>Config.xml</b><br />
Don&#8217;t forget to include to enable annotations with the Contextparameters in the xml-file</p>
<pre class="prettyprint" lang-xml>
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 

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

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

            http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;
   &lt;context:annotation-config/&gt;

    &lt;bean id="annotationsTest" class="c.Test"&gt;
    &lt;/bean&gt;

&lt;/beans&gt;
</pre>
<p><b>Main program</b><br />
Still the same&#8230;</p>
<pre class="prettyprint" lang-java>
package c;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AnnotationsTest {

    public static void main(String[] args) {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("Config.xml");
        ctx.registerShutdownHook();
        Test test = ctx.getBean("annotationsTest", Test.class);
    }
}
</pre>
<p><b>Test.java</b><br />
We can use the lifecyclemethods with the annotations @PostConstruct for init-methods and @PostDestroy for destroy-methods.</p>
<pre class="prettyprint" lang-java>
package c;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class Test {

    public Test() {
        System.out.println("We are in the constructor of Test");
    }

    @PostConstruct
    public void start(){
        System.out.println("We are in the start-method of Test");
    }

    @PreDestroy
    public void stop(){
        System.out.println("We are in the stop-method of Test");
    }
}
</pre>
</p>
<p><h1>Putting them all together</h1>
<p>It&#8217;s possible to use the 3 methods all together<br />
<b>Config.xml</b></p>
<pre class="prettyprint" lang-xml>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 

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

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

            http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;
   &lt;context:annotation-config/&gt;

    &lt;bean id="allTogether" class="d.Test" init-method="initMethod" destroy-method="destroyMethod"&gt;
    &lt;/bean&gt;
&lt;/beans&gt;
</pre>
<p><b>Main program</b></p>
<pre class="prettyprint" lang-java>
package d;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AllTogetherTest {

    public static void main(String[] args) {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("Config.xml");
        ctx.registerShutdownHook();
        Test test = ctx.getBean("allTogether", Test.class);
    }
}
</pre>
<p><b>Test.java</b><br />
We are using interfaces AND annotations.<br />
It&#8217;s even possible to use multiple times the same annotation:</p>
<pre class="prettyprint" lang-java>
package d;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Test implements DisposableBean,InitializingBean {

    public void destroy() throws Exception {
        System.out.println("DisposableBean-Interface");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean-Interface");
    }

    @PostConstruct
    public void start(){
        System.out.println("First PostConstruct");
    }

    @PostConstruct
    public void start2(){
        System.out.println("Second PostConstruct");
    }

    @PostConstruct
    public void start3(){
        System.out.println("Third PostConstruct");
    }

    @PreDestroy
    public void stop(){
        System.out.println("PreDestroy");
    }

    public void initMethod(){
        System.out.println("initMethod");
    }

    public void destroyMethod(){
        System.out.println("destroyMethod");
    }
}
</pre>
<p>The output is:</p>
<pre class="prettyprint" lang-text>
Third PostConstruct
Second PostConstruct
First PostConstruct
InitializingBean-Interface
initMethod
PreDestroy
DisposableBean-Interface
destroyMethod
</pre>
<p>So we can conclude that the annotations are processed first, followed by the interfaces and at last the methods from the xml-file.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.eek.be/2009/11/the-lifecycle-of-a-spring-bean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>servletconfig vs servletcontext</title>
		<link>http://dev.eek.be/2009/10/servletconfig-vs-servletcontext/</link>
		<comments>http://dev.eek.be/2009/10/servletconfig-vs-servletcontext/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 20:15:58 +0000</pubDate>
		<dc:creator>Wim</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[server management]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dev.eek.be/?p=80</guid>
		<description><![CDATA[
In this little blogpost, I&#8217;ll try to explain the differences between ServletConfig and ServletContext and when you can use them into a Java Web Application.


ServletConfig
ServletContext


Access deploy-time servlet parameters
Access web application parameters


One per servlet
One per web application


ServletConfig
ServletConfig is actually very simple. Like stated above, you can retrieve parameters for the servlet which are set at deployment [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://dev.eek.be/wp-content/uploads/2009/10/java2.jpg" alt="java2" title="java2" width="300" height="225" class="aligncenter size-full wp-image-151" />
<p>In this little blogpost, I&#8217;ll try to explain the differences between ServletConfig and ServletContext and when you can use them into a Java Web Application.</p>
<table cellpadding="2" cellspacing="0" border="1">
<tr>
<td><b>ServletConfig</b></td>
<td><b>ServletContext</b></td>
</tr>
<tr>
<td>Access deploy-time servlet parameters</td>
<td>Access web application parameters</td>
</tr>
<tr>
<td>One per servlet</td>
<td>One per web application</td>
</tr>
</table>
<p><b>ServletConfig</b></p>
<p>ServletConfig is actually very simple. Like stated above, you can retrieve parameters for the servlet which are set at deployment time.<br />
I&#8217;ll explain this with a very simple example.
</p>
<p>
If you have created a servlet with the name &#8220;MyServlet&#8221; you can add the following 2 variables into the servlet:</p>
<pre class="prettyprint" lang-xml>
    &lt;servlet&gt;
         &lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt;
         &lt;servlet-class&gt;servlets.MyServlet&lt;/servlet-class&gt;
         &lt;init-param&gt;
             &lt;param-name&gt;variable1&lt;/param-name&gt;
             &lt;param-value&gt;I'm var1&lt;/param-value&gt;
         &lt;/init-param&gt;
         &lt;init-param&gt;
             &lt;param-name&gt;variable2&lt;/param-name&gt;
             &lt;param-value&gt;I'm var2&lt;/param-value&gt;
         &lt;/init-param&gt;
     &lt;/servlet&gt;
     &lt;servlet-mapping&gt;
         &lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt;
         &lt;url-pattern&gt;/MyServlet&lt;/url-pattern&gt;
     &lt;/servlet-mapping&gt;
</pre>
</p>
<p>
You can retrieve variable2 with the following code:</p>
<pre class="prettyprint" lang-java>
getServletConfig().getInitParameter("variable2");
</pre>
</p>
<p>
Retrieve all the variables of the servlet and loop over them:</p>
<pre class="prettyprint" lang-java>
Enumeration allvars = getServletConfig().getInitParameterNames();
while (allvars.hasMoreElements()) {
     String next = (String) allvars.nextElement();
     out.println(next + " has the value " + getServletConfig().getInitParameter(next));
}
</pre>
</p>
<p>
It&#8217;s also possible to retrieve the servlets name through getServletconfig</p>
<pre class="prettyprint" lang-java>
out.println("The name of the servlet is: " + getServletConfig().getServletName());
</pre>
</p>
<p><b>ServletContext</b></p>
<p>
ServletContext can be used to retrieve application-wide parameters, get serverparameters and store/retrieve/remove application-wide attributes.
</p>
<p>It is possible to call the ServletContext right on or through the ServletConfig. Both are the same so you can choose between them.</p>
<pre class="prettyprint" lang-java>
if (getServletContext().equals(getServletConfig().getServletContext())) {
       out.println("both calls retrieve the same Context");
}
</pre>
</p>
<p>
Just like with ServletConfig, you can set parameters in the Deployment Descriptor. They are initialized on compile time. It&#8217;s not possible to remove or add them on runtime.</p>
<pre class="prettyprint" lang-xml>
&lt;context-param&gt;
        &lt;param-name&gt;variable3&lt;/param-name&gt;
        &lt;param-value&gt;Im var 3&lt;/param-value&gt;
&lt;/context-param&gt;
</pre>
<p>And call them in your servlet just like the ServletConfig parameters:</p>
<pre class="prettyprint" lang-java>
getServletContext().getInitParameter("variable3")
</pre>
</p>
<p>
Unlike ServletConfig, ServletContext can work with attributes. These are parameters or objects which you can set into the servlet and retrieve in every other servlet of your Web Application:</p>
<pre class="prettyprint" lang-java>
getServletContext().setAttribute("test", "I'm an application-wide String");
..
out.println(getServletContext().getAttribute("test"));
..
getServletContext().removeAttribute("test");
</pre>
</p>
<p>
I&#8217;ll end this little short tutorial with an example of how you can retrieve serversettings through the Context:</p>
<pre class="prettyprint" lang-java>
out.println(getServletContext().getContextPath());
out.println(getServletContext().getMajorVersion());
out.println(getServletContext().getRealPath(""));
out.println(getServletContext().getServerInfo());
</pre>
</p>
<p>If there are any more questions, just shoot them <img src='http://dev.eek.be/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.eek.be/2009/10/servletconfig-vs-servletcontext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Injection with Google Guice by example</title>
		<link>http://dev.eek.be/2009/09/dependency-injection-with-google-guice/</link>
		<comments>http://dev.eek.be/2009/09/dependency-injection-with-google-guice/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 19:22:20 +0000</pubDate>
		<dc:creator>Wim</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[annotations]]></category>
		<category><![CDATA[bindings]]></category>
		<category><![CDATA[Dependency injection]]></category>
		<category><![CDATA[di]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Guice]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Inversion of control]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[providers]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dev.eek.be/?p=66</guid>
		<description><![CDATA[
In this blogpost, I&#8217;ll explain Dependency Injection with Google Guice through a lot of examples. Hope you like it.
Annotation based DI
It&#8217;s possible in Guice to inject a class with the help of annotations. In this example, I create a mainclass which creates an order. Inside the order there will be a payment done. There are [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://dev.eek.be/wp-content/uploads/2009/09/guice2.jpg" alt="guice2" title="guice2" width="300" height="171" class="aligncenter size-full wp-image-149" /><br />
In this blogpost, I&#8217;ll explain <a href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank">Dependency Injection</a> with <a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> through a lot of examples. Hope you like it.</p>
<p><u>Annotation based DI</u><br />
It&#8217;s possible in Guice to inject a class with the help of annotations. In this example, I create a mainclass which creates an order. Inside the order there will be a payment done. There are 2 types of payments (by card or cash) and they will be injected by Guice.<br />
<b>Payment</b></p>
<pre class="prettyprint" lang-java>
public interface Payment {
    public void pay();
}
</pre>
<p><b>PaymentCash</b></p>
<pre class="prettyprint" lang-java>
public class PaymentCashImpl implements Payment {
    public void pay() {
        System.out.println("I'll pay just plain cash");
    }
}
</pre>
<p><b>PaymentCard</b></p>
<pre class="prettyprint" lang-java>
public class PaymentCardImpl implements Payment{
    public void pay() {
        System.out.println("I'll pay with a credit card");
    }
}
</pre>
<p><b>Order</b></p>
<pre class="prettyprint" lang-java>
public class Order {

    private Payment payment;

    public Payment getPayment() {
        return payment;
    }

    public void setPayment(Payment payment) {
        this.payment = payment;
    }

    public void finishOrder(){
        this.payment.pay();
    }
}
</pre>
<p><b>Main</b></p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        Order order = new Order();
        Payment payment = new PaymentCardImpl();
        order.setPayment(payment);
        order.finishOrder();
    }
}
</pre>
<p>There isn&#8217;t any Dependency injection in the code above. All the classes are highly coupled into each other. So it&#8217;s time to do some magic:<br />
<b>Payment</b><br />
You can tell through the use of annotations which Payment type is the default implemented class</p>
<pre class="prettyprint" lang-java>
@ImplementedBy(PaymentCardImpl.class)
public interface Payment {
    public void pay();
}
</pre>
<p><b>Order</b><br />
Inject the payment type in the order. What we here say is: Inject the default paymentimplementation, which is set by the @implementedby annotation, into the payment field.</p>
<pre class="prettyprint" lang-java>
public class Order {
    @Inject
    private Payment payment;
....
</pre>
<p><b>Main</b><br />
Lastly, we have to rewrite the main class. In this example, we get an order which uses the PaymentCard as payment type</p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
       Injector injector = Guice.createInjector();
        Order order = injector.getInstance(Order.class);
        order.finishOrder();
    }
}
</pre>
<p>You can run this code. The output should be -I&#8217;ll pay with a credit card-. This code is so cool because if we want to switch to payment with cash at a later point, we just have to change the @implementedBy annotation in the interface and we are done.</p>
<div style="border: 1px solid silver; padding: 8px; background-color: rgb(249, 249, 249); text-align: left;">
<script type="text/javascript"><!--
google_ad_client = "pub-1041875485625119";
/* 160x90, gemaakt 3-6-10 */
google_ad_slot = "3673564135";
google_ad_width = 160;
google_ad_height = 90;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<p><u>Injection types</u><br />
Guice knows different types of injection. The 3 most used are constructor, field and method injection (Examples are based on the above example)<br />
<b>Constructor injection</b></p>
<pre class="prettyprint" lang-java>
import com.google.inject.Inject;

public class Order {
    private Payment payment;

    @Inject
    public Order(Payment payment){
        this.payment=payment;
    }
   ...
}
</pre>
<p><b>Method injection</b></p>
<pre class="prettyprint" lang-java>
import com.google.inject.Inject;

public class Order {
    private Payment payment;

    @Inject
    public void setPayment(Payment payment) {
        this.payment = payment;
    }
   ...
}
</pre>
<p><b>Field injection</b></p>
<pre class="prettyprint" lang-java>
public class Order {
    @Inject
    private Payment payment;
   ...
}
</pre>
<p><u>Module based DI</u><br />
It&#8217;s also possible to use Modules for injecting data. It&#8217;s maybe a little more work but I like it because all the configuration is in the same file. You can compare this with the xml-file in Spring applications.<br />
<b>Payment</b><br />
Remove the @ImplementedBy annotation in the paymentinterface</p>
<pre class="prettyprint" lang-java>
public interface Payment {
    public void pay();
}
</pre>
<p><b>MyModule</b><br />
Next, create the Module class. It has to implement Module, which has one method: configure.<br />
The code speaks for its self. You say nothing more than bind Payment to PaymentCard.</p>
<pre class="prettyprint" lang-java>
public class MyModule implements Module {
    public void configure(Binder arg0) {
        arg0.bind(Payment.class).to(PaymentCardImpl.class);
    }
}
</pre>
<p>Instead of implementing Module, you can also extend AbstractModule. It&#8217;s just a matter of choice.</p>
<pre class="prettyprint" lang-java>
public class MyModule extends AbstractModule {
    public void configure() {
        bind(Payment.class).to(PaymentCardImpl.class);
    }
}
</pre>
<p><b>Main</b><br />
Lastly, we have to put the module into our injector and we are done.</p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        MyModule module = new MyModule();
        Injector injector = Guice.createInjector(module);
        Order order = injector.getInstance(Order.class);
        order.finishOrder();
    }
}
</pre>
<p>The 4 lines in the main class can be written into 1 single line:</p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        Guice.createInjector(new MyModule()).getInstance(Order.class).finishOrder();
    }
}
</pre>
<p><u>Subclassing</u><br />
In Guice, it&#8217;s easy to subclass an implementation.<br />
<b>Payment</b></p>
<pre class="prettyprint" lang-java>
public interface Payment {
    public void pay();
}
</pre>
<p><b>PaymentCardImpl</b></p>
<pre class="prettyprint" lang-java>
public class PaymentCardImpl implements Payment{
    public void pay() {
        System.out.println("I'll pay with a credit card");
    }
}
</pre>
<p><b>PaymentVisaCard</b><br />
extend payment card with paymentvisacard</p>
<pre class="prettyprint" lang-java>
public class PaymentVisaCard extends PaymentCardImpl {
    public void pay() {
        System.out.println("I'll pay with a card from Visa");
    }
}
</pre>
<p>Nothing special in the Main class<br />
<b>Main</b></p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        Guice.createInjector(new MyModule()).getInstance(Payment.class).pay();
    }
}
</pre>
<p><b>MyModule</b><br />
You can specify the hierarchy in the moduleclass</p>
<pre class="prettyprint" lang-java>
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Payment.class).to(PaymentCardImpl.class);
        bind(PaymentCardImpl.class).to(PaymentVisaCard.class);
    }
}
</pre>
<p>If you run this code, the Visa Card will be used.<br />
<u>Annotationbindings</u><br />
It&#8217;s also possible to use annotations for injection<br />
<b>Payment</b><br />
There&#8217;s nothing special in the interface and implementations:</p>
<pre class="prettyprint" lang-java>
public interface Payment {
    public void pay();
}
</pre>
<p><b>PaymentCardImpl</b></p>
<pre class="prettyprint" lang-java>
public class PaymentCardImpl implements PaymentCashImpl{
    public void pay() {
        System.out.println("I pay with a card");
    }
}
</pre>
<p><b>PaymentCashImpl</b></p>
<pre class="prettyprint" lang-java>
public class PaymentCashImpl implements Payment {
    public void pay() {
        System.out.println("I pay cash");
    }
}
</pre>
<p>Next, we have to created the annotations @cash and @Card<br />
<b>Cash</b></p>
<pre class="prettyprint" lang-java>
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

import com.google.inject.BindingAnnotation;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Cash { }
</pre>
<p><b>Card</b></p>
<pre class="prettyprint" lang-java>
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

import com.google.inject.BindingAnnotation;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Card { }
</pre>
<p><b>Main</b></p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        Guice.createInjector(new PayModule()).getInstance(Order.class).finishOrder();
    }
}
</pre>
<p><b>Module</b><br />
You have to specify which annotations refers to which implementation in the moduleclass</p>
<pre class="prettyprint" lang-java>
public class PayModule extends AbstractModule{
    @Override
    protected void configure() {
        bind(Payment.class).annotatedWith(Cash.class).to(PaymentCashImpl.class);
        bind(Payment.class).annotatedWith(Card.class).to(PaymentCardImpl.class);
    }
}
</pre>
<p><b>Order</b><br />
Now you can use the annotation in your code to inject the right class</p>
<pre class="prettyprint" lang-java>
public class Order {

    @Inject
    private @Card Payment payment;
   ...
</pre>
<p>If you want to chane Cardpayments to Cashpayments, just change the @Card annotation to @Cash</p>
<p><u>Namedannotationbindings</u><br />
You can also use named annotations. This is a Guice annotation where the value is specified inside the moduleclass.<br />
The paymentinterface, the Main and the Cash and Card implementations are the same as the previous example.<br />
<b>Module</b><br />
Give the annotations a name (&#8220;Cash&#8221; and &#8220;Card&#8221;)</p>
<pre class="prettyprint" lang-java>
public class PayModule extends AbstractModule{
    @Override
    protected void configure() {
        bind(Payment.class).annotatedWith(Names.named("Cash")).to(CashPayment.class);
        bind(Payment.class).annotatedWith(Names.named("Card")).to(CardPayment.class);
    }
}
</pre>
<p><b>Main</b></p>
<pre class="prettyprint" lang-java>
 * @author wim
 */
public class Main {
    public static void main(String[] args) {
        Injector inj = Guice.createInjector(new PayModule());
        Order order = inj.getInstance(Order.class);
        order.getPaymentCard().pay();

        Guice.createInjector(new PayModule()).getInstance(Order.class).getPaymentCash().pay();
    }
}
</pre>
<p><b>Order</b><br />
Now you can use them in your order</p>
<pre class="prettyprint" lang-java>
public class Order {

    private Payment paymentCash;
    private Payment paymentCard;

    @Inject
    public void setPaymentCash(@Named("Cash") Payment payment){
        this.paymentCash=payment;
    }

    public Payment getPaymentCash(){
        return paymentCash;
    }

    @Inject
    public void setPaymentCard(@Named("Card") Payment payment){
        this.paymentCard=payment;
    }

    public Payment getPaymentCard(){
        return paymentCard;
    }
}
</pre>
<p>These annotations are very simple but I don&#8217;t recommend them. Guice doesn&#8217;t check them on spelling or validity so they are kinda error prone.<br />
<u>Instancebinding</u><br />
With instancebinding, you can easily give a value to an instance<br />
<b>Module</b><br />
Give a value to a name inside the module</p>
<pre class="prettyprint" lang-java>
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(String.class)
        .annotatedWith(Names.named("PaymentType"))
        .toInstance("...I'm a Visa Card...");
    }
}
</pre>
<p><b>Main</b></p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        String text = Guice.createInjector(new MyModule()).getInstance(Order.class).getText();
        System.out.println(text);
    }
}
</pre>
<p><b>Order</b><br />
Use the annotation.  The String text will be injected with &#8220;&#8230;I&#8217;m a Visa Card&#8230;&#8221;.</p>
<pre class="prettyprint" lang-java>
public class Order {

    @Named("PaymentType")
    @Inject
    private String text;

    public String getText(){
        return text;
    }
}
</pre>
<p><u>Providers</u><br />
The last example is with the use of providers.<br />
A provider can be used when you have to craete an object. You have to annotate it with the @Provides annotation and the return type is the bound type.<br />
<b>Payment</b></p>
<pre class="prettyprint" lang-java>
public interface Payment {
    void pay();
    int getAmount();
}
</pre>
<p><b>CashPayment</b></p>
<pre class="prettyprint" lang-java>
public class CashPayment implements Payment{

    private int amount;

    public void pay() {
        System.out.println("Inside cashpayment");
    }

    public void setAmount(int amount){
        this.amount=amount;
    }

    public int getAmount(){
        return amount;
    }
}
</pre>
<p><b>Main</b></p>
<pre class="prettyprint" lang-java>
public class Main {
    public static void main(String[] args) {
        Payment payment = Guice.createInjector(new MyModule()).getInstance(Payment.class);
        payment.pay();
        System.out.println(payment.getAmount());
    }
}
</pre>
<p><b>MyModule</b><br />
Inside the module class, we can construct the class and set the amount of payment.</p>
<pre class="prettyprint" lang-java>
public class MyModule extends AbstractModule{

    @Override
    protected void configure() {
    }

    @Provides
    Payment providePayment(){
        CashPayment pay = new CashPayment();
        pay.setAmount(100);
        return pay;
    }
}
</pre>
<p><u>Conclusion</u><br />
You can do more with Guice than described above but that&#8217;s up to you to find out.<br />
<b>I love Guice!!</b> It&#8217;s pretty simple and works very good. You don&#8217;t have to use XML to bind your classes and it&#8217;s very lightweight. If you just wan&#8217;t to use Dependency Injection, Guice is in my opinion the number 1.<br />
<script type="text/javascript">var dzone_url = 'http://dev.eek.be/?p=66';</script><br />
<script type="text/javascript">var dzone_title = 'Dependency Injection with Google Guice by example';</script><br />
<script type="text/javascript">var dzone_blurb = 'Google Guice by example';</script><br />
<script type="text/javascript">var dzone_style = '1';</script><br />
<script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.eek.be/2009/09/dependency-injection-with-google-guice/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
