<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;Dk8NRX86fyp7ImA9WhRUF0U.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017</id><updated>2012-01-29T04:08:14.117+07:00</updated><title>ndung's blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/hqBl" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="blogspot/hqbl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DE4MRHYyeyp7ImA9WxFaFE4.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-1026507912766178733</id><published>2010-07-18T13:59:00.003+07:00</published><updated>2010-07-18T14:09:45.893+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-18T14:09:45.893+07:00</app:edited><title>Bisnis Pulsa ICS</title><content type="html">Dear pembaca,&lt;br /&gt;&lt;br /&gt;Bagi yang punya keinginan untuk bertransformasi dari pekerja menjadi pebisnis, ingin memiliki bisnis sendiri untuk pensiun muda, maka saya menawarkan suatu bisnis yang tidak padat modal, bahkan Rp.0 sekalipun, yaitu bisnis voucher electric. Sebagai modal anda pun diberikan pinjaman sebagai deposit awal. Dan harganya pun sangat bersaing dengan dealer-dealer yang lain. Sebagai contoh, berikut saya berikan list harga untuk voucher Indosat:&lt;br /&gt;IM10/ME10 : 10150&lt;br /&gt;IM20/ME20 : 19750&lt;br /&gt;IM25/ME25 : 24450&lt;br /&gt;IM50/ME50 : 47950&lt;br /&gt;IM100/ME100 : 93650&lt;br /&gt;&lt;br /&gt;Anda bisa bandingkan harga di ICS ini dengan harga di tempat lain. Jika Anda tertarik, maka silahkan hubungi saya melalui YM ataupun email ke ndoenks@gmail.com. Saya akan memberikan penjelasan lebih lanjut mengenai tata cara dan prosesnya ataupun kesempatan untuk mendapatkan harga yang lebih murah lagi serta keuntungan-keuntungan yang lain yang bisa didapatkan. Menarik bukan? Sampai berjumpa di kesuksesan...&lt;br /&gt;&lt;br /&gt;Salam,&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-1026507912766178733?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/1026507912766178733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=1026507912766178733&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1026507912766178733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1026507912766178733?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2010/07/bisnis-pulsa-ics.html" title="Bisnis Pulsa ICS" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CkEARH88fSp7ImA9WxVUGUs.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-5148733992261687930</id><published>2009-03-25T11:23:00.006+07:00</published><updated>2009-03-25T12:57:25.175+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T12:57:25.175+07:00</app:edited><title>JMS Quick Start Using Apache ActiveMQ</title><content type="html">Read first JMS First Impression in the previous post. A JMS message has three parts:&lt;br /&gt;1. Header, consists of: JMSDestination, JMSDeliveryMode, JMSExpiration, JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, JMSReplyTo, JMSType, JMSRedelivered.&lt;br /&gt;2. Properties (optional). If we need addition values besides header fields, we can set and create message properties.&lt;br /&gt;3. Body (optional). JMS API defined five message body formats, also called message types, consists of: TextMessage, MapMessage, BytesMessage, StreamMessage, ObjectMessage, Message.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;JMS Message delivery styles&lt;/span&gt;. JMS supports synchronous and asynchronous delivery messages:&lt;br /&gt;1. Synchronous Delivery. For example:&lt;br /&gt;A client can request the next message from a message consumer using one of its receive methods. There are several variations of receive that allow a client to poll or wait for the next message.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;QueueReceiver receiver = null;&lt;br /&gt;receiver = session.createReceiver(queue);&lt;br /&gt;StreamMessage stockMessage;&lt;br /&gt;stockMessage = (StreamMessage)receiver.receive();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the above code fragment, the receiver will wait indefinitely for a message. Alternatively, we could have specified a timeout in milliseconds, such as:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;// wait for 10 seconds only.&lt;br /&gt;stockMessage = (StreamMessage)receiver.receive(10*1000);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Or, no wait at all:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;// Don’t wait?&lt;br /&gt;stockMessage = (StreamMessage)receiver.receiveNoWait();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Asynchronous Delivery &lt;br /&gt;Instead of waiting/polling the message consumer for messages, a client can register a message listener with a message consumer. A message listener is an object that implements the MessageListener.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;// asynchronous reader, register a message listener.&lt;br /&gt;// listener will be called for each message that come into the queue &lt;br /&gt;receiver.setMessageListener(listener);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At last, but not at least. We will make a Point-to-Point Simple Calculator Application. Client will write message in queue in XML format after got request from user and read synchronously a response queue from server with specific time out by using a selector. Server will read request queue asynchronously and write response in response queue. I'm using Netbeans 6.5, and Spring Framework. Also prepare the other library like jms.jar, dom4j.jar, and Apache ActiveMQ library. Create a new Java application named CalculatorMQ. Create new package named com.ndung.mq.util. In this package we will write all utility class that needed by JMS and MQ Vendor. The First class named MQConfig.java.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.mq.util;&lt;br /&gt;&lt;br /&gt;public class MQConfig {&lt;br /&gt;    private String queueName;&lt;br /&gt;    private int timeout;&lt;br /&gt;&lt;br /&gt;    //getter &amp; setter&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;The second class named MQWriter.java. This class will be used to write message in queue.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.mq.util;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class MQWriter {&lt;br /&gt;&lt;br /&gt;    private ConnectionFactory queueConnectionFactory;&lt;br /&gt;    private QueueConnection queueConnection;&lt;br /&gt;    private QueueSession queueSession;&lt;br /&gt;    private Queue queue;&lt;br /&gt;    private QueueSender queueSender;&lt;br /&gt;    private MQConfig config;&lt;br /&gt;&lt;br /&gt;    public MQWriter(MQConfig config) {&lt;br /&gt;        this.config = config;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void init() {&lt;br /&gt;        openConnection();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void terminate() {&lt;br /&gt;        try {&lt;br /&gt;            if (queueConnection != null) {&lt;br /&gt;                queueConnection.close();&lt;br /&gt;                queueConnection = null;&lt;br /&gt;            }&lt;br /&gt;        } catch (JMSException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void openConnection(){&lt;br /&gt;        try {&lt;br /&gt;            Properties props = new Properties();&lt;br /&gt;            props.load(new FileInputStream(new File("src/jndi.properties")));&lt;br /&gt;            Context jndiContext = new InitialContext(props);&lt;br /&gt;            queueConnectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");&lt;br /&gt;            queueConnection = (QueueConnection) queueConnectionFactory.createConnection();&lt;br /&gt;            queueConnection.start();&lt;br /&gt;        } catch (NamingException ne) {&lt;br /&gt;            ne.printStackTrace();&lt;br /&gt;        } catch (JMSException je) {&lt;br /&gt;            je.printStackTrace();        &lt;br /&gt;        } catch (IOException ie) {&lt;br /&gt;            ie.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void write(String message, Map properties) throws JMSException {&lt;br /&gt;        queueSender = null;&lt;br /&gt;        queueSession = null;&lt;br /&gt;        try {&lt;br /&gt;            queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;            queue = queueSession.createQueue(config.getQueueName());&lt;br /&gt;            queueSender = queueSession.createSender(queue);&lt;br /&gt;            TextMessage textMessage = queueSession.createTextMessage();&lt;br /&gt;            if (properties != null || properties.size() != 0) {&lt;br /&gt;                for (Object o : properties.keySet()) {&lt;br /&gt;                    if (o instanceof String)&lt;br /&gt;                        textMessage.setStringProperty(o.toString(), properties.get(o).toString());&lt;br /&gt;                    if (o instanceof Integer)&lt;br /&gt;                        textMessage.setIntProperty(o.toString(), Integer.parseInt(properties.get(o).toString()));&lt;br /&gt;                    if (o instanceof Long)&lt;br /&gt;                        textMessage.setLongProperty(o.toString(), Long.parseLong(properties.get(o).toString()));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            textMessage.setText(message);&lt;br /&gt;            queueSender.send(textMessage);&lt;br /&gt;        } catch (JMSException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } finally {&lt;br /&gt;            if (queueSender != null)&lt;br /&gt;                queueSender.close();&lt;br /&gt;            if (queueSession != null)&lt;br /&gt;                queueSession.close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The third class named MQSyncReader.java. This class will read message in queue synchronously. &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.mq.util;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class MQSyncReader {&lt;br /&gt;&lt;br /&gt;    private ConnectionFactory queueConnectionFactory;&lt;br /&gt;    private QueueConnection queueConnection;&lt;br /&gt;    private QueueSession queueSession;&lt;br /&gt;    private Queue queue;&lt;br /&gt;    private QueueReceiver queueReceiver;&lt;br /&gt;    private MQConfig config;&lt;br /&gt;&lt;br /&gt;    public MQSyncReader(MQConfig config) {&lt;br /&gt;        this.config = config;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void init() {&lt;br /&gt;        openConnection();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void terminate() {&lt;br /&gt;        try {&lt;br /&gt;            if (queueSession != null)&lt;br /&gt;                queueSession.close();&lt;br /&gt;            if (queueConnection != null)&lt;br /&gt;                queueConnection.close();&lt;br /&gt;        } catch (JMSException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void openConnection() {&lt;br /&gt;        try {&lt;br /&gt;            Properties props = new Properties();&lt;br /&gt;            props.load(new FileInputStream(new File("src/jndi.properties")));&lt;br /&gt;            Context jndiContext = new InitialContext(props);&lt;br /&gt;&lt;br /&gt;            queueConnectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");&lt;br /&gt;            queueConnection = (QueueConnection) queueConnectionFactory.createConnection();&lt;br /&gt;            queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;            queueConnection.start();&lt;br /&gt;        } catch (NamingException ne) {&lt;br /&gt;            ne.printStackTrace();&lt;br /&gt;        } catch (JMSException je) {&lt;br /&gt;            je.printStackTrace();&lt;br /&gt;        } catch (IOException ie) {&lt;br /&gt;            ie.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String read(String selector) throws JMSException {&lt;br /&gt;        queueReceiver = null;&lt;br /&gt;        String out = "";&lt;br /&gt;        try {&lt;br /&gt;            queue = queueSession.createQueue(config.getQueueName());&lt;br /&gt;            if (selector != null || !selector.equals("")) {&lt;br /&gt;                queueReceiver = queueSession.createReceiver(queue, selector);&lt;br /&gt;            } else {&lt;br /&gt;                queueReceiver = queueSession.createReceiver(queue);&lt;br /&gt;            }&lt;br /&gt;            TextMessage textMessage = null;&lt;br /&gt;            if (config.getTimeout() != -1)&lt;br /&gt;                textMessage = (TextMessage) queueReceiver.receive(config.getTimeout());&lt;br /&gt;            else&lt;br /&gt;                textMessage = (TextMessage) queueReceiver.receive();&lt;br /&gt;            if (textMessage != null)&lt;br /&gt;                out = textMessage.getText();&lt;br /&gt;        } catch (JMSException je) {&lt;br /&gt;            je.printStackTrace();&lt;br /&gt;        } finally {&lt;br /&gt;            if (queueReceiver != null)&lt;br /&gt;                queueReceiver.close();&lt;br /&gt;        }&lt;br /&gt;        return out;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The third class named MQAsyncReader.java. This class will read message in queue asynchronously. &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.mq.util;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class MQAsyncReader implements Runnable{&lt;br /&gt;    &lt;br /&gt;    private ConnectionFactory queueConnectionFactory;&lt;br /&gt;    private QueueConnection queueConnection;&lt;br /&gt;    private QueueSession queueSession;&lt;br /&gt;    private Queue queue;&lt;br /&gt;    private QueueReceiver queueReceiver;&lt;br /&gt;    private MQConfig config;  &lt;br /&gt;    private MessageListener listener;&lt;br /&gt;    private volatile Thread thread = null;&lt;br /&gt;&lt;br /&gt;    public MQAsyncReader(MQConfig config, MessageListener listener) {&lt;br /&gt;        this.config = config;&lt;br /&gt;        this.listener = listener;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void start(){&lt;br /&gt;        try{&lt;br /&gt;            Properties props = new Properties();&lt;br /&gt;            props.load(new FileInputStream(new File("src/jndi.properties")));&lt;br /&gt;            Context jndiContext = new InitialContext(props);&lt;br /&gt;&lt;br /&gt;            queueConnectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");&lt;br /&gt;            queueConnection = (QueueConnection) queueConnectionFactory.createConnection();&lt;br /&gt;            queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;            queueConnection.start();&lt;br /&gt;            queue = queueSession.createQueue(config.getQueueName());&lt;br /&gt;            queueReceiver = queueSession.createReceiver(queue);&lt;br /&gt;            thread = new Thread(this);&lt;br /&gt;            thread.start();&lt;br /&gt;        }&lt;br /&gt;        catch(NamingException ne){&lt;br /&gt;            ne.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        catch(JMSException je){&lt;br /&gt;            je.printStackTrace();&lt;br /&gt;        } catch (IOException ie) {&lt;br /&gt;            ie.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void stop() throws JMSException {&lt;br /&gt;        thread.interrupt();&lt;br /&gt;        thread = null;&lt;br /&gt;        if (queueReceiver != null)&lt;br /&gt;            queueReceiver.close();        &lt;br /&gt;        if (queueSession != null) &lt;br /&gt;            queueSession.close();        &lt;br /&gt;        if (queueConnection != null)&lt;br /&gt;            queueConnection.close();        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void run() {&lt;br /&gt;        Thread thisThread = Thread.currentThread();&lt;br /&gt;        while (thisThread == thread) {&lt;br /&gt;            try {&lt;br /&gt;                Thread.sleep(500);&lt;br /&gt;            } catch (InterruptedException ie) {&lt;br /&gt;                ie.printStackTrace();&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            try{&lt;br /&gt;                queueReceiver.setMessageListener(listener);&lt;br /&gt;            }&lt;br /&gt;            catch(JMSException ex){&lt;br /&gt;                ex.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then we will make client application. Create package named com.ndung.calc.client. Create two classes named Client.java and Main.java.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.calc.client;&lt;br /&gt;&lt;br /&gt;import com.ndung.mq.util.MQSyncReader;&lt;br /&gt;import com.ndung.mq.util.MQWriter;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import javax.jms.JMSException;&lt;br /&gt;&lt;br /&gt;public class Client {&lt;br /&gt;    private MQWriter mQWriter;&lt;br /&gt;    private MQSyncReader mQSyncReader;&lt;br /&gt;    private String transid;&lt;br /&gt;&lt;br /&gt;    public Client(MQWriter mQWriter, MQSyncReader mQSyncReader){&lt;br /&gt;        this.mQWriter = mQWriter;&lt;br /&gt;        this.mQSyncReader = mQSyncReader;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String execute(int arg1, String operator, int arg2) throws JMSException{&lt;br /&gt;        this.transid = String.valueOf(System.currentTimeMillis());&lt;br /&gt;        String message = "&lt;?xml version=1.0?&gt;\n" +&lt;br /&gt;                "&lt;calculator&gt;\n" +&lt;br /&gt;                "&lt;arg1&gt;"+arg1+"&lt;/arg1&gt;\n"+&lt;br /&gt;                "&lt;operator&gt;"+operator+"&lt;/operator&gt;\n"+&lt;br /&gt;                "&lt;arg2&gt;"+arg2+"&lt;/arg2&gt;\n"+&lt;br /&gt;                "&lt;/calculator&gt;";&lt;br /&gt;        queuePullRequest(message);&lt;br /&gt;        String result = lookupFromQueue();        &lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void queuePullRequest(String message) throws JMSException {&lt;br /&gt;        Map map = new HashMap();&lt;br /&gt;        map.put("TransactionID", transid);        &lt;br /&gt;        mQWriter.write(message, map);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private String lookupFromQueue() throws JMSException{&lt;br /&gt;        StringBuffer selector = new StringBuffer(1024);&lt;br /&gt;        selector.append("TransactionID = '").append(transid).append("'");&lt;br /&gt;        return mQSyncReader.read(selector.toString());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.calc.client;&lt;br /&gt;&lt;br /&gt;import java.util.Scanner;&lt;br /&gt;import javax.jms.JMSException;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;import org.springframework.context.ApplicationContext;&lt;br /&gt;import org.springframework.context.support.FileSystemXmlApplicationContext;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;    public static void main(String[] args) throws NamingException, JMSException {&lt;br /&gt;        Scanner scanner = new Scanner(System.in);&lt;br /&gt;        System.out.print("Please input the first arg: ");&lt;br /&gt;        int arg1 = scanner.nextInt();&lt;br /&gt;        System.out.print("Please input the operation, example: +,-,/,* : ");&lt;br /&gt;        String operator = scanner.next();&lt;br /&gt;        System.out.print("Please input the second arg: ");&lt;br /&gt;        int arg2 = scanner.nextInt();&lt;br /&gt;&lt;br /&gt;        ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");&lt;br /&gt;        Client client = (Client) ctx.getBean("client");&lt;br /&gt;        System.out.println("The Result is = "+client.execute(arg1, operator, arg2));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After that we make server application. Create package named com.ndung.calc.server. First make a listener class that will be registered to catch for each message that listed in request queue. This class named MQHandler.java. Then make an interface named Processor.java, that used to process request. And then four classes that implements Processor. These classes represent each calculator operation that will be handled.  Last, make a Main class for server application named Main.java. &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.calc.server;&lt;br /&gt;&lt;br /&gt;import com.ndung.mq.util.MQWriter;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import org.dom4j.*;&lt;br /&gt;import org.dom4j.io.SAXReader;&lt;br /&gt;&lt;br /&gt;public class MQHandler implements MessageListener{&lt;br /&gt;&lt;br /&gt;    Map&amp;lt;String, Processor&amp;gt; map;&lt;br /&gt;    MQWriter mQWriter;&lt;br /&gt;&lt;br /&gt;    public MQHandler(Map&amp;lt;String, Processor&amp;gt; map, MQWriter mqWriter){&lt;br /&gt;        this.map = map;&lt;br /&gt;        this.mQWriter =  mqWriter;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void onMessage(Message msg) {&lt;br /&gt;        try {&lt;br /&gt;            if (msg instanceof TextMessage) {&lt;br /&gt;                TextMessage txtMsg = (TextMessage) msg;&lt;br /&gt;                String rqMsg = txtMsg.getText();&lt;br /&gt;                System.out.println(rqMsg);&lt;br /&gt;                String transID = txtMsg.getStringProperty("TransactionID");&lt;br /&gt;                Map properties = new HashMap();&lt;br /&gt;                properties.put("TransactionID", transID);&lt;br /&gt;                //process response message&lt;br /&gt;                InputStream in = new ByteArrayInputStream(rqMsg.getBytes());&lt;br /&gt;                SAXReader reader = new SAXReader();&lt;br /&gt;                Document document = reader.read(in);&lt;br /&gt;                Element root = document.getRootElement();&lt;br /&gt;                int arg1 = Integer.parseInt(root.elementText("arg1"));&lt;br /&gt;                int arg2 = Integer.parseInt(root.elementText("arg2"));&lt;br /&gt;                String operator = root.elementText("operator");&lt;br /&gt;                Processor processor = map.get(operator);&lt;br /&gt;                int result = 0;&lt;br /&gt;                if (processor!=null)&lt;br /&gt;                    result = processor.process(arg1, arg2);&lt;br /&gt;                System.out.println("RESULT="+result);&lt;br /&gt;                mQWriter.write(String.valueOf(result), properties);&lt;br /&gt;            }&lt;br /&gt;        } catch (JMSException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (DocumentException de){&lt;br /&gt;            de.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.calc.server;&lt;br /&gt;&lt;br /&gt;public interface Processor {&lt;br /&gt;    public int process(int arg0, int arg1);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.calc.server;&lt;br /&gt;&lt;br /&gt;public class ProcessorAdd implements Processor{&lt;br /&gt;    &lt;br /&gt;    public ProcessorAdd(){        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int process(int arg0, int arg1) {&lt;br /&gt;        int result = arg0 + arg1;&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.calc.server;&lt;br /&gt;&lt;br /&gt;import com.ndung.mq.util.MQAsyncReader;&lt;br /&gt;import javax.jms.JMSException;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;import org.springframework.context.ApplicationContext;&lt;br /&gt;import org.springframework.context.support.FileSystemXmlApplicationContext;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;    private boolean active = true;&lt;br /&gt;    MQAsyncReader[] reader;&lt;br /&gt;    private int maxHandler = 1;&lt;br /&gt;    static ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");&lt;br /&gt;&lt;br /&gt;    public void start() throws JMSException {        &lt;br /&gt;        MQAsyncReader r = (MQAsyncReader) ctx.getBean("mqAsyncReader");&lt;br /&gt;        if (active) {&lt;br /&gt;            reader = new MQAsyncReader[maxHandler];&lt;br /&gt;            for (int i = 0; i &lt; maxHandler; i++) {&lt;br /&gt;                reader[i] = r;&lt;br /&gt;                reader[i].start();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            System.out.println("start no active");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public synchronized void stop() throws JMSException {&lt;br /&gt;        for (int i = 0; i &lt; reader.length; i++) {&lt;br /&gt;            reader[i].stop();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) throws NamingException, JMSException{&lt;br /&gt;        final Main main = new Main();&lt;br /&gt;        Runtime.getRuntime().addShutdownHook(&lt;br /&gt;            new Thread(&lt;br /&gt;                new Runnable() {&lt;br /&gt;                    public void run() {&lt;br /&gt;                        try {&lt;br /&gt;                            main.stop();&lt;br /&gt;                        } catch (JMSException ex) {&lt;br /&gt;                            ex.printStackTrace();&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }, "ShutdownHook"));&lt;br /&gt;        main.start();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Last make two configuration files in folder src. First named jndi.properties that used for JNDI configuration and the second named applicationContext.xml that used for Spring configuration file.&lt;br /&gt;&lt;pre name="code" class="css"&gt;&lt;br /&gt;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&lt;br /&gt;java.naming.provider.url=tcp://localhost:61616&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&amp;gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;    &amp;lt;bean id="mqAsyncReader" class="com.ndung.mq.util.MQAsyncReader"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="reqConfig" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="mqHandler" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean id="reqConfig" class="com.ndung.mq.util.MQConfig"&amp;gt;&lt;br /&gt;        &amp;lt;property name="queueName"&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;Q.REQUEST&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;  &lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean id="respConfig" class="com.ndung.mq.util.MQConfig"&amp;gt;&lt;br /&gt;        &amp;lt;property name="queueName"&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;Q.RESPONSE&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="timeout"&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;20000&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean id="mqHandler" class="com.ndung.calc.server.MQHandler"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;map&amp;gt;&lt;br /&gt;                &amp;lt;entry key="+"&amp;gt;&lt;br /&gt;                    &amp;lt;bean class="com.ndung.calc.server.ProcessorAdd"&amp;gt;&lt;br /&gt;                    &amp;lt;/bean&amp;gt;&lt;br /&gt;            &amp;lt;/map&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="mqRespWriter" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean id="mqReqWriter" class="com.ndung.mq.util.MQWriter" init-method="init"&lt;br /&gt;  destroy-method="terminate"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="reqConfig" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;        &lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean id="mqRespSyncReader" class="com.ndung.mq.util.MQSyncReader" init-method="init"&lt;br /&gt;  destroy-method="terminate"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="respConfig" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;    &lt;br /&gt;    &amp;lt;bean id="client" class="com.ndung.calc.client.Client"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="mqReqWriter"/&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="mqRespSyncReader"/&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;        &lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;bean id="mqRespWriter" class="com.ndung.mq.util.MQWriter" init-method="init"&lt;br /&gt;  destroy-method="terminate"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="respConfig" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;        &lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Run one instance of com.ndung.calc.server.Main, run and enter user inputs for several instance of com.ndung.calc.client.Main. Next post, introducing into MQ vendor that so many used in market and industry. It is MQSeries from IBM.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-5148733992261687930?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/5148733992261687930/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=5148733992261687930&amp;isPopup=true" title="34 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5148733992261687930?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5148733992261687930?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2009/03/jms-quick-start-using-apache-activemq.html" title="JMS Quick Start Using Apache ActiveMQ" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>34</thr:total></entry><entry gd:etag="W/&quot;DEMNSXYycCp7ImA9WxVUGEo.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-2063140751986227797</id><published>2009-03-24T12:34:00.005+07:00</published><updated>2009-03-24T13:34:58.898+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T13:34:58.898+07:00</app:edited><title>Introduction to Message-oriented Middleware (MOM) and Java Messaging Service (JMS) Using Apache ActiveMQ</title><content type="html">&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung;&lt;br /&gt;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import org.apache.activemq.ActiveMQConnectionFactory;&lt;br /&gt;&lt;br /&gt;public class HelloWorldProducer {&lt;br /&gt;    public static void main(String[] args) throws JMSException {&lt;br /&gt;        //Instantiate connection factory, specific to the vendor&lt;br /&gt;        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");&lt;br /&gt;        // Create a Connection&lt;br /&gt;        Connection connection = connectionFactory.createConnection();&lt;br /&gt;        connection.start();&lt;br /&gt;        // Create a Session&lt;br /&gt;        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;        // Create the destination (Topic or Queue)&lt;br /&gt;        Destination destination = session.createQueue("TEST.MQ");&lt;br /&gt;        // Create a MessageProducer from the Session to the Topic or Queue&lt;br /&gt;        MessageProducer producer = session.createProducer(destination);&lt;br /&gt;        // Create a messages&lt;br /&gt;        String text = "Hello world! From: ndung";&lt;br /&gt;        TextMessage message = session.createTextMessage(text);&lt;br /&gt;        // Tell the producer to send the message&lt;br /&gt;        System.out.println("Message Sent");&lt;br /&gt;        producer.send(message);&lt;br /&gt;        // Clean up&lt;br /&gt;        session.close();&lt;br /&gt;        connection.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung;&lt;br /&gt;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import org.apache.activemq.ActiveMQConnectionFactory;&lt;br /&gt;&lt;br /&gt;public class HelloWorldConsumer {&lt;br /&gt;    public static void main(String[] args) throws JMSException {&lt;br /&gt;        //Instantiate connection factory, specific to the vendor&lt;br /&gt;        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");&lt;br /&gt;        // Create a Connection&lt;br /&gt;        Connection connection = connectionFactory.createConnection();&lt;br /&gt;        connection.start();&lt;br /&gt;        // Create a Session&lt;br /&gt;        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;        // Create the destination (Topic or Queue)&lt;br /&gt;        Destination destination = session.createQueue("TEST.MQ");&lt;br /&gt;        // Create a MessageConsumer from the Session to the Topic or Queue&lt;br /&gt;        MessageConsumer consumer = session.createConsumer(destination);&lt;br /&gt;        // Wait for a message&lt;br /&gt;        Message message = consumer.receive(1000);&lt;br /&gt;        if (message instanceof TextMessage) {&lt;br /&gt;            TextMessage textMessage = (TextMessage) message;&lt;br /&gt;            String text = textMessage.getText();&lt;br /&gt;            System.out.println("Received: " + text);&lt;br /&gt;        } else {&lt;br /&gt;            System.out.println("Received: " + message);&lt;br /&gt;        }&lt;br /&gt;        consumer.close();&lt;br /&gt;        session.close();&lt;br /&gt;        connection.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the previous &lt;a href="http://ndoenks.blogspot.com/2009/03/introduction-to-eai.html"&gt;post&lt;/a&gt;, we have been introduced into EAI (Enterprise Application Integration) and a flash on Middleware. There are two fundamentally different types of middleware based on the approach used by the middleware to transfer the data between the distributed software applications. They are Remote Procedure Calls (RPC) based middleware and Message-oriented Middleware (MOM). &lt;br /&gt;1. RPC. Software application that uses RPC based middleware to transfer data to another software application has to wait until the latter application is done processing the data. Thus, with this type of middleware, the communication proceeds in a lock step, synchronized manner, and the communicating processes are tightly coupled to one another. Examples of such middleware include Java RMI, CORBA, etc.&lt;br /&gt;2. MOM. Is best described as a category of software for communication in an loosely-coupled, reliable, scalable, enabled asynchronous communication amongst distributed applications or systems.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;JMS is a spesification that defines a set of interfaces and associated semantics, which allow applications written in Java to access the services of any JMS compliant Message MOM product. There are plenty of compliant MOM products available in market, including MQSeries from IBM, SonicMQ  from Progress, Sun Java Message Queue, even Apache ActiveMQ, and many more. &lt;br /&gt;The players in JMS:&lt;br /&gt;1. Connections and Connection Factories&lt;br /&gt;2. Sessions&lt;br /&gt;3. Destinations&lt;br /&gt;We should try first JMS First Impression using &lt;a href="http://activemq.apache.org"&gt;ActiveMQ&lt;/a&gt; in &lt;a href="http://activemq.apache.org/version-5-hello-world.html"&gt;here&lt;/a&gt;. I'm using Netbeans 6.5 as IDE and prepare library: activemq-all-5.2.0.jar and jms.jar. &lt;br /&gt;&lt;br /&gt;There are two different types of MOM: point-to-point and publish-and-subscribe.&lt;br /&gt;1. Point-to-Point messaging style. In this model, a MOM is used by two applications to communicate with each other, often as an asynchronous replacement for remote procedure calls (RPC). &lt;br /&gt;2. Publish-and-Subscribe messaging style. In this model multiple applications connect to the MOM as their publishers, which are producers of messages, or subscribers, which are consumers of messages. An important point of difference between the two styles is that a a point-to-point system is typically  either a one-to-one system, which means one message sender talking to one message receiver, or it is a a many-to-one system, which means more than one senders are talking to one receiver. On the other hand, publish-and-subscribe systems are typically many-to-many systems, which means that there could be one or more publishers talking to one or more subscribers at a time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Simple PTP (Point-to-Point) Application and Pub/Sub (Publisher and Subscriber) Application&lt;/span&gt;&lt;br /&gt;We will enhance sample above by setting up activemq broker first and using JNDI. Configuring JNDI web application in Tomcat container can read in &lt;a href="http://activemq.apache.org/tomcat.html"&gt;here&lt;/a&gt;. After we extract apache-activemq-5.2.0.rar that we have downloaded, edit activemq.xml that placed in folder conf. Delete all "multicast" in this configuration file. After that, enter folder bin, and run activemq. In the same project with above create packages named com.ndung.ptp and com.ndung.ps. Create new two java classes named SimpleQueueSender.java and SimpleQueueReceiver.java in com.ndung.ptp package and create new two java classes named SimpleTopicPublisher.java and SimpleTopicSubscriber in com.ndung.ps package.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.ptp;&lt;br /&gt;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class SimpleQueueSender {&lt;br /&gt;    public static void main(String[] args) throws NamingException, JMSException {&lt;br /&gt;        String queueName = "PTP.ACTIVE.MQ";&lt;br /&gt;        //setting JNDI configuration, differents between vendors.&lt;br /&gt;        Properties props = new Properties();&lt;br /&gt;        props.setProperty(Context.INITIAL_CONTEXT_FACTORY,&lt;br /&gt;            "org.apache.activemq.jndi.ActiveMQInitialContextFactory");&lt;br /&gt;        props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");&lt;br /&gt;        Context jndiContext = new InitialContext(props);&lt;br /&gt;        ConnectionFactory queueConnectionFactory = (ConnectionFactory)&lt;br /&gt;            jndiContext.lookup("ConnectionFactory");&lt;br /&gt;        QueueConnection queueConnection = (QueueConnection)&lt;br /&gt;            queueConnectionFactory.createConnection();&lt;br /&gt;        QueueSession queueSession = queueConnection.createQueueSession(false,&lt;br /&gt;            Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;        Queue queue = queueSession.createQueue(queueName);&lt;br /&gt;        QueueSender queueSender = queueSession.createSender(queue);&lt;br /&gt;        queueConnection.start();&lt;br /&gt;        TextMessage textMessage = queueSession.createTextMessage();&lt;br /&gt;        textMessage.setText("Hello World");&lt;br /&gt;        queueSender.send(textMessage);&lt;br /&gt;        queueSession.close();&lt;br /&gt;        queueConnection.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.ptp;&lt;br /&gt;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class SimpleQueueReceiver {&lt;br /&gt;    public static void main(String[] args) throws JMSException, NamingException {&lt;br /&gt;        String queueName = "PTP.ACTIVE.MQ";&lt;br /&gt;        //setting JNDI configuration, differents between vendors.&lt;br /&gt;        Properties props = new Properties();&lt;br /&gt;        props.setProperty(Context.INITIAL_CONTEXT_FACTORY,&lt;br /&gt;            "org.apache.activemq.jndi.ActiveMQInitialContextFactory");&lt;br /&gt;        props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");&lt;br /&gt;        Context jndiContext = new InitialContext(props);&lt;br /&gt;&lt;br /&gt;        ConnectionFactory queueConnectionFactory = (ConnectionFactory)&lt;br /&gt;            jndiContext.lookup("ConnectionFactory");&lt;br /&gt;        QueueConnection queueConnection = (QueueConnection)&lt;br /&gt;            queueConnectionFactory.createConnection();&lt;br /&gt;        QueueSession queueSession = queueConnection.createQueueSession(false,&lt;br /&gt;            Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;        Queue queue = queueSession.createQueue(queueName);&lt;br /&gt;        QueueReceiver queueReceiver = queueSession.createReceiver(queue);&lt;br /&gt;        queueConnection.start();&lt;br /&gt;        TextMessage textMessage = (TextMessage) queueReceiver.receive();&lt;br /&gt;        System.out.println(textMessage);&lt;br /&gt;        queueSession.close();&lt;br /&gt;        queueConnection.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.ps;&lt;br /&gt;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class SimpleTopicPublisher {&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        try {&lt;br /&gt;            Properties props = new Properties();&lt;br /&gt;            props.setProperty(Context.INITIAL_CONTEXT_FACTORY,&lt;br /&gt;                "org.apache.activemq.jndi.ActiveMQInitialContextFactory");&lt;br /&gt;            props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");&lt;br /&gt;            Context jndiContext = new InitialContext(props);&lt;br /&gt;            ConnectionFactory myConnectionFactory = (ConnectionFactory)&lt;br /&gt;                jndiContext.lookup("ConnectionFactory");&lt;br /&gt;            // Use myConnectionFactory to get a Topic connection&lt;br /&gt;            TopicConnection myConnection = (TopicConnection)&lt;br /&gt;                myConnectionFactory.createConnection();&lt;br /&gt;            // Use myConnection to create a Topic session&lt;br /&gt;            TopicSession mySession = myConnection.createTopicSession(false, 1);&lt;br /&gt;            // Use mySession to get the Topic&lt;br /&gt;            Topic myTopic = mySession.createTopic("PS.ACTIVE.MQ");&lt;br /&gt;            // Use mySession to create a publisher for myTopic&lt;br /&gt;            TopicPublisher myPublisher = mySession.createPublisher(myTopic);&lt;br /&gt;            // Start the connection&lt;br /&gt;            myConnection.start();&lt;br /&gt;            // Create the HelloWorld message&lt;br /&gt;            TextMessage m = mySession.createTextMessage();&lt;br /&gt;            m.setText("Hello World");&lt;br /&gt;            // Use myPublisher to publish the message&lt;br /&gt;            myPublisher.publish(m);&lt;br /&gt;            // Done.&lt;br /&gt;            // Need to clean up&lt;br /&gt;            mySession.close();&lt;br /&gt;            myConnection.close();&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.ps;&lt;br /&gt;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class SimpleTopicSubscriber {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        try {&lt;br /&gt;            Properties props = new Properties();&lt;br /&gt;            props.setProperty(Context.INITIAL_CONTEXT_FACTORY,&lt;br /&gt;                "org.apache.activemq.jndi.ActiveMQInitialContextFactory");&lt;br /&gt;            props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");&lt;br /&gt;            Context jndiContext = new InitialContext(props);&lt;br /&gt;            ConnectionFactory myConnectionFactory = (ConnectionFactory)&lt;br /&gt;                jndiContext.lookup("ConnectionFactory");&lt;br /&gt;            // Use myConnectionFactory to get a Topic connection&lt;br /&gt;            TopicConnection myConnection = (TopicConnection)&lt;br /&gt;                myConnectionFactory.createConnection();&lt;br /&gt;            // Use myConnection to create a Topic session&lt;br /&gt;            TopicSession mySession = myConnection.createTopicSession(false, 1);&lt;br /&gt;            // Use mySession to get the Topic&lt;br /&gt;            Topic myTopic = mySession.createTopic("PS.ACTIVE.MQ");&lt;br /&gt;            // Use mySession to create a subscriber&lt;br /&gt;            TopicSubscriber mySubscriber = mySession.createSubscriber(myTopic);&lt;br /&gt;            // Start the connection&lt;br /&gt;            myConnection.start();&lt;br /&gt;            // Wait for the Hello World message&lt;br /&gt;            // Use the receiver and wait forever until the message arrives&lt;br /&gt;            TextMessage m = (TextMessage) mySubscriber.receive();&lt;br /&gt;            // Display the message&lt;br /&gt;            System.out.println("Received the message: " + m.getText());&lt;br /&gt;            // Done.&lt;br /&gt;            // Need to clean up&lt;br /&gt;            mySession.close();&lt;br /&gt;            myConnection.close();&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To know the differences between PTP application and Pub/Sub application:&lt;br /&gt;1. Run two instance of SimpleQueueReceiver and then run one instance of SimpleQueueSender. One of SimpleQueueReceiver got message from SimpleQueueSender and the other one didn't.&lt;br /&gt;2. Run two instance of SimpleTopicSubscriber and then run one instance of SimpleTopicPublisher. We can look both of SimpleTopicSubsriber got message from SimpleTopicPublisher.&lt;br /&gt;We can monitor message queue by running http://localhost:8161/admin in web browser. More better coding style in the next post.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-2063140751986227797?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/2063140751986227797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=2063140751986227797&amp;isPopup=true" title="32 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/2063140751986227797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/2063140751986227797?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2009/03/introduction-to-message-oriented.html" title="Introduction to Message-oriented Middleware (MOM) and Java Messaging Service (JMS) Using Apache ActiveMQ" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>32</thr:total></entry><entry gd:etag="W/&quot;DkEARnc4eyp7ImA9WxVVF0U.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-3551634823135940062</id><published>2009-03-11T21:58:00.006+07:00</published><updated>2009-03-11T22:17:27.933+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-11T22:17:27.933+07:00</app:edited><title>Introduction to EAI</title><content type="html">Enterprise Application Integration (EAI):&lt;br /&gt;&lt;br /&gt;Imagine that a large company/project have more than one applications/softwares:&lt;br /&gt;1. These applications run in different platforms, say for example: windows, linux, sun solaris, os/400, and so on.&lt;br /&gt;2. Between these applications: from one application to another application must can communicate to each other. As example: for common case, one application need data from another application.&lt;br /&gt;3. Message format for each applications are different. As example: One application uses EDI, another application uses XML, another application uses ISO8583 format, and so on.&lt;br /&gt;4. Each application use different communication tools. As example: One application can use MQ, another application can use TCP/IP, another application use WebService, another application just can use HTTP, and so on.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/appislands.PNG"/&gt;&lt;br /&gt;&lt;br /&gt;EAI architecture must accommodate all transactions that need coordination from one application to another system application. EAI architecture must have characteristics as below:&lt;br /&gt;1. A standard message format.&lt;br /&gt;2. Middleware as communication channel. &lt;br /&gt;&lt;br /&gt;Middleware must can handle following aspects:&lt;br /&gt;1. Make sure message arrive at its destination.&lt;br /&gt;2. Convert message from it's standard message format to other application message format and the other way.&lt;br /&gt;3. Coordinate transaction.&lt;br /&gt;4. Monitoring and logging.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/eaiarchitecture.PNG"/&gt;&lt;br /&gt;&lt;br /&gt;EAI architecture components: &lt;br /&gt;1. Adapter. EAI first implementation usually built by an adapter program for each application. This adapter will convert message from application's message format to middleware standard message format and other way.&lt;br /&gt;2. Middleware also must have message router. This program will validate message and route message to appropriate destination.&lt;br /&gt;&lt;br /&gt;Next material:&lt;br /&gt;EAI Technology. EAI products as hub-and-spoke. Example of EAI products.&lt;br /&gt;Taken from &lt;a href="http://ilmukomputer.org/2008/11/25/mengenal-enterprise-application-integration-eai"&gt;this material link&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-3551634823135940062?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/3551634823135940062/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=3551634823135940062&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/3551634823135940062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/3551634823135940062?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2009/03/introduction-to-eai.html" title="Introduction to EAI" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYFQX48fSp7ImA9WxRQE0o.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-6472204166891700150</id><published>2008-10-07T11:10:00.005+07:00</published><updated>2008-10-07T17:41:50.075+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-07T17:41:50.075+07:00</app:edited><title>(ISO 8583 + JPOS + Log4J) in Java Socket Programming</title><content type="html">&lt;span style="font-weight:bold;"&gt;SECTION 1. INTRODUCTION&lt;/span&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 1.1. ISO 8583&lt;/span&gt;&lt;br /&gt;You can read it's explanation first in &lt;a href="http://en.wikipedia.org/wiki/ISO_8583"&gt;Wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 1.2. JPOS&lt;/span&gt;&lt;br /&gt;JPOS is opensource framework for ISO 8583. Source code and library are free but documentation is comercial. We can download &lt;a href="http://www.jpos.org/download"&gt;it&lt;/a&gt; here.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 1.3. Log4J&lt;/span&gt;&lt;br /&gt;Log4J is opensource logging library. We can download it's library &lt;a href="http://logging.apache.org/log4j/1.2/download.html"&gt;here&lt;/a&gt; and read it's mini e-book first written by Mr. &lt;a href="http://endy.artivisi.com"&gt;Endy&lt;/a&gt; in &lt;a href="http://endy.muhardin.googlepages.com/minibook-log4j.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 1.4. Java Socket Programming&lt;/span&gt;&lt;br /&gt;There's no explanation. Just need the basic knowledge of Java network programming and Java Thread Programming and let's coding.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SECTION 2. CODING&lt;/span&gt;&lt;br /&gt;First we prepare that all we need. In this time, we will use NetBeans as IDE. Besides JPOS framework and Log4J library that I have mentioned above, we still need:&lt;br /&gt;1. &lt;a href="http://www.java2s.com/Code/Jar/XML/DownloadxercesImpljar.htm"&gt;Xerces-Java XML parser&lt;/a&gt; library (xercesImpl.jar)&lt;br /&gt;2. &lt;a href="http://www.springframework.org/download"&gt;Spring framework&lt;/a&gt;&lt;br /&gt;3. Jakarta Apache &lt;a href="http://commons.apache.org/downloads/download_logging.cgi"&gt;Commons Logging&lt;/a&gt; library&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 2.1. ISO 8583 + JPOS + Log4J&lt;/span&gt;&lt;br /&gt;In NetBeans, create a new Java application named MyApp. Create a package named com.ndung.iso8583. JPOS framework need a packager to set which ISO 8583 version that will be used. In this time we will use ISO 8583 version 1987. Download first &lt;a href="http://ndoenks.googlepages.com/iso87ascii.xml"&gt;iso87ascii.xml&lt;/a&gt; and place it in that package. Create a class as packager factory named PackagerFactory.java.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.iso8583;&lt;br /&gt;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;&lt;br /&gt;import org.jpos.iso.ISOException;&lt;br /&gt;import org.jpos.iso.ISOPackager;&lt;br /&gt;import org.jpos.iso.packager.GenericPackager;&lt;br /&gt;&lt;br /&gt;public class PackagerFactory {&lt;br /&gt;    public static ISOPackager getPackager() {&lt;br /&gt;        ISOPackager packager = null;&lt;br /&gt;        try {&lt;br /&gt;            String filename = "iso87ascii.xml";&lt;br /&gt;            InputStream is = PackagerFactory.class.getResourceAsStream(filename);&lt;br /&gt;            packager = new GenericPackager(is);&lt;br /&gt;        } &lt;br /&gt;        catch (ISOException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        return packager;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And then create a class named MessageHandler.java that will be used to handle received message. Download first &lt;a href="http://ndoenks.googlepages.com/iso87asciiProperties.xml"&gt;iso87asciiProperties.xml&lt;/a&gt; that will be used to translate bits of ISO message to become a String message that can be read easily.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.iso8583;&lt;br /&gt;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.jpos.iso.ISOException;&lt;br /&gt;import org.jpos.iso.ISOMsg;&lt;br /&gt;import org.jpos.iso.ISOPackager;&lt;br /&gt;&lt;br /&gt;public class MessageHandler {&lt;br /&gt;    private static ISOPackager packager = PackagerFactory.getPackager();&lt;br /&gt;    private Logger logger = Logger.getLogger( getClass() );&lt;br /&gt;    public String process(ISOMsg isomsg) throws Exception {&lt;br /&gt;        logger.info("ISO Message MTI is "+isomsg.getMTI());&lt;br /&gt;        logger.info("Is ISO message a incoming message? "+isomsg.isIncoming());&lt;br /&gt;        logger.info("Is ISO message a outgoing message? "+isomsg.isOutgoing());&lt;br /&gt;        logger.info("Is ISO message a request message? "+isomsg.isRequest());&lt;br /&gt;        logger.info("Is ISO message a response message? "+isomsg.isResponse());&lt;br /&gt;        String message = "";&lt;br /&gt;        for (int i=0;i&amp;lt;128;i++){&lt;br /&gt;            if (isomsg.hasField(i)){&lt;br /&gt;                message += loadXMLProperties().getProperty(Integer.toString(i))+"="+&lt;br /&gt;                    isomsg.getValue(i)+"\n";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        logger.info(message);&lt;br /&gt;        return message;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    public ISOMsg unpackRequest(String message) throws ISOException, Exception {&lt;br /&gt;        ISOMsg isoMsg = new ISOMsg();&lt;br /&gt;        isoMsg.setPackager(packager);&lt;br /&gt;        isoMsg.unpack(message.getBytes());&lt;br /&gt;        isoMsg.dump(System.out, " ");&lt;br /&gt;        return isoMsg ;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    public String packResponse(ISOMsg message) throws ISOException, Exception {&lt;br /&gt;        message.dump(System.out, " ");&lt;br /&gt;        return new String( message.pack() ) ;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public Properties loadXMLProperties(){&lt;br /&gt;        Properties prop = new Properties();&lt;br /&gt;        try{&lt;br /&gt;            FileInputStream input=new FileInputStream("iso87asciiProperties.xml");&lt;br /&gt;            prop.loadFromXML(input);&lt;br /&gt;            input.close();&lt;br /&gt;        }&lt;br /&gt;        catch(IOException e){&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        return prop;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 2.2. Java Socket Programming + Log4J&lt;/span&gt;&lt;br /&gt;Create a package named com.ndung.socket and then create four classes named ServerConfig.java, SocketServerHandlerFactory.java, SocketServerHandler.java, SocketConnectionServer. Before that create log4j.properties as logging configuration in default package.&lt;br /&gt;&lt;pre name="code" class="css"&gt;&lt;br /&gt;# Category Configuration&lt;br /&gt;log4j.rootLogger=INFO,Konsole,Roll &lt;br /&gt;# Console Appender Configuration&lt;br /&gt;log4j.appender.Konsole=org.apache.log4j.ConsoleAppender &lt;br /&gt;log4j.appender.Konsole.layout=org.apache.log4j.PatternLayout &lt;br /&gt;# Date Format based on ISO­8601 : %d &lt;br /&gt;log4j.appender.Konsole.layout.ConversionPattern=%d [%t] %5p %c ­ %m%n&lt;br /&gt;# Roll Appender Configuration&lt;br /&gt;log4j.appender.Roll=org.apache.log4j.RollingFileAppender &lt;br /&gt;log4j.appender.Roll.File=/home/ndung/NetBeansProjects/MyApp/log/myApp.log &lt;br /&gt;log4j.appender.Roll.MaxFileSize=10KB &lt;br /&gt;log4j.appender.Roll.MaxBackupIndex=2 &lt;br /&gt;log4j.appender.Roll.layout=org.apache.log4j.PatternLayout &lt;br /&gt;# Date Format based on ISO­8601 : %d &lt;br /&gt;log4j.appender.Roll.layout.ConversionPattern=%d [%t] %p (%F:%L) ­ %m%n&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.socket;&lt;br /&gt;public class ServerConfig {&lt;br /&gt;    private int port;&lt;br /&gt;    public int getPort() {&lt;br /&gt;        return port;&lt;br /&gt;    }&lt;br /&gt;    public void setPort(int port) {&lt;br /&gt;        this.port = port;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.socket;&lt;br /&gt;&lt;br /&gt;import com.ndung.iso8583.MessageHandler;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.Socket;&lt;br /&gt;&lt;br /&gt;public class SocketServerHandlerFactory {&lt;br /&gt;    private MessageHandler messageHandler;&lt;br /&gt;    public SocketServerHandlerFactory(MessageHandler messageHandler) {&lt;br /&gt;        this.messageHandler = messageHandler;&lt;br /&gt;    }&lt;br /&gt;    public SocketServerHandler createHandler(Socket socket) throws IOException {&lt;br /&gt;        return new SocketServerHandler(socket, messageHandler);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.socket;&lt;br /&gt;&lt;br /&gt;import com.ndung.iso8583.MessageHandler;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.DataOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.net.Socket;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.jpos.iso.ISOMsg;&lt;br /&gt;&lt;br /&gt;public class SocketServerHandler extends Thread{&lt;br /&gt;    private Logger logger = Logger.getLogger( getClass() );&lt;br /&gt;    private Socket serverSocket ;&lt;br /&gt;    private BufferedReader inFromClient;&lt;br /&gt;    private DataOutputStream outToClient;&lt;br /&gt;    private MessageHandler messageHandler;&lt;br /&gt;    private String datafromClient;&lt;br /&gt;&lt;br /&gt;    public SocketServerHandler(Socket socket, MessageHandler messageHandler) throws IOException {&lt;br /&gt;        super("SocketHandler (" + socket.getInetAddress().getHostAddress() + ")");&lt;br /&gt;        this.serverSocket = socket ;&lt;br /&gt;        this.messageHandler = messageHandler;&lt;br /&gt;        this.inFromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));&lt;br /&gt;        this.outToClient = new DataOutputStream(serverSocket.getOutputStream());&lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public void run() {&lt;br /&gt;        try {&lt;br /&gt;            logger.info("Server is ready...");&lt;br /&gt;            while (true) {&lt;br /&gt;                logger.info("There is a client connected...");&lt;br /&gt;                outToClient.writeBytes("InfoServer version 0.1\n");&lt;br /&gt;                datafromClient = inFromClient.readLine();&lt;br /&gt;                logger.info("Data From Client : "+datafromClient);&lt;br /&gt;                ISOMsg isomsg = messageHandler.unpackRequest(datafromClient);&lt;br /&gt;                outToClient.writeBytes(messageHandler.process(isomsg));   &lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch (IOException ioe) {&lt;br /&gt;            logger.error("error: " + ioe);&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {&lt;br /&gt;            logger.error("error: " + e);&lt;br /&gt;        }&lt;br /&gt;        finally {&lt;br /&gt;            try {&lt;br /&gt;                if (inFromClient != null) inFromClient.close(); &lt;br /&gt;                if (outToClient != null) outToClient.close();&lt;br /&gt;                if (serverSocket != null) serverSocket.close();&lt;br /&gt;            } catch (IOException e) { &lt;br /&gt;                e.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.socket;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.ServerSocket;&lt;br /&gt;&lt;br /&gt;public class SocketConnectionServer {&lt;br /&gt;    private ServerConfig config;&lt;br /&gt;    private SocketServerHandlerFactory handlerFactory;&lt;br /&gt;    private boolean stop;&lt;br /&gt;    public SocketConnectionServer(ServerConfig config, SocketServerHandlerFactory handlerFactory) {&lt;br /&gt;        this.config = config;&lt;br /&gt;        this.handlerFactory = handlerFactory;&lt;br /&gt;    }&lt;br /&gt;    public void start() throws IOException {&lt;br /&gt;        stop = false;&lt;br /&gt;        final ServerSocket serverSocket = new ServerSocket(config.getPort());&lt;br /&gt;        new Thread(new Runnable() {&lt;br /&gt;            public void run() {&lt;br /&gt;                while (!stop) {&lt;br /&gt;                    try {&lt;br /&gt;                         handlerFactory.createHandler(serverSocket.accept()).start();&lt;br /&gt;                    }&lt;br /&gt;                    catch (IOException e) {&lt;br /&gt;                         e.printStackTrace();&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }).start();&lt;br /&gt;    }&lt;br /&gt;    public void stop() {&lt;br /&gt;        stop = true;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Create a socket server class named MyServer.java. This class also as a main class for our application. And then we will create a socket client class named MyClient.java. Before that create applicationContext.xml in default package as Spring configuration injection for our main class.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"&lt;br /&gt;        "http://www.springframework.org/dtd/spring-beans.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;    &amp;lt;bean id="socketConnectionServer" class="com.ndung.socket.SocketConnectionServer"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="config" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="socketServerHandlerFactory" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean id="config" class="com.ndung.socket.ServerConfig"&amp;gt;&lt;br /&gt;        &amp;lt;property name="port"&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;50000&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean id="socketServerHandlerFactory" class="com.ndung.socket.SocketServerHandlerFactory"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;            &amp;lt;ref local="messageHandler" /&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean id="messageHandler" class="com.ndung.iso8583.MessageHandler"&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.socket;&lt;br /&gt;&lt;br /&gt;import org.springframework.context.ApplicationContext;&lt;br /&gt;import org.springframework.context.support.ClassPathXmlApplicationContext;&lt;br /&gt;&lt;br /&gt;public class MyServer {&lt;br /&gt;    &lt;br /&gt;    public static void main(String[] args) throws IOException {&lt;br /&gt;        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");&lt;br /&gt;        SocketConnectionServer server = (SocketConnectionServer) ctx.getBean("socketConnectionServer");&lt;br /&gt;        server.start();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.socket;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.DataOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.net.Socket;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;public class MyClient {&lt;br /&gt;    private final int MY_PORT=50000;&lt;br /&gt;    private final String TargetHost = "localhost";&lt;br /&gt;    private final String QUIT = "QUIT";&lt;br /&gt;    private Logger logger = Logger.getLogger( getClass() );&lt;br /&gt;    public MyClient() {&lt;br /&gt;        try {&lt;br /&gt;            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));&lt;br /&gt;            Socket clientSocket = new Socket(TargetHost, MY_PORT);&lt;br /&gt;            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());&lt;br /&gt;            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));&lt;br /&gt;            logger.info(inFromServer.readLine());&lt;br /&gt;            boolean isQuit = false;&lt;br /&gt;            while (!isQuit) {&lt;br /&gt;                System.out.print("Your data : ");&lt;br /&gt;                String cmd = inFromUser.readLine();&lt;br /&gt;                cmd = cmd.toUpperCase();&lt;br /&gt;                if (cmd.equals(QUIT)) {&lt;br /&gt;                    isQuit = true;&lt;br /&gt;                } &lt;br /&gt;                outToServer.writeBytes(cmd + "\n");&lt;br /&gt;                String message = inFromServer.readLine();&lt;br /&gt;                while (message!=null){&lt;br /&gt;                    logger.info("From Server: " + message);&lt;br /&gt;                    message = inFromServer.readLine();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            outToServer.close();&lt;br /&gt;            inFromServer.close();&lt;br /&gt;            clientSocket.close();&lt;br /&gt;        }&lt;br /&gt;        catch (IOException ioe) {&lt;br /&gt;            logger.error("Error:" + ioe);&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {&lt;br /&gt;            logger.error("Error:" + e);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        new MyClient();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Run our application first. It means our main class (MyServer.java) will be run first. And then run client as much that we want. It means MyClient.java will be run twice or more. And then in one of our client application console enter an input data. It means a String of ISO message. As example:&lt;br /&gt;0210723A00010A808400185936001410010999990110000000100000001007021533000001191533&lt;br /&gt;10061007065656561006090102240000000901360020100236C0102240000000&lt;br /&gt;Look in both of our application console either MyServer or MyClient. What do you see?&lt;br /&gt;Btw, Happy Eid Mubarak...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-6472204166891700150?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/6472204166891700150/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=6472204166891700150&amp;isPopup=true" title="58 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/6472204166891700150?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/6472204166891700150?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/10/iso-8583-jpos-log4j-in-java-socket.html" title="(ISO 8583 + JPOS + Log4J) in Java Socket Programming" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>58</thr:total></entry><entry gd:etag="W/&quot;DEYERn8_cSp7ImA9WxRSF0w.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-6307878595302944362</id><published>2008-09-18T08:24:00.004+07:00</published><updated>2008-09-18T12:35:07.149+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-18T12:35:07.149+07:00</app:edited><title>Quartz Scheduler First Impression</title><content type="html">&lt;a href="www.opensymphony.com/quartz/ "&gt;Quartz Scheduler&lt;/a&gt; is used to make a scheduling job. In this post we will make a scheduler to generate daily report for persons report that have we made before for each one minute. Here we start. Download first Quartz library and copy it into spring lib folder. In package com.ndung.service create two interfaces named EODManager.java and Executable.java. &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.service;&lt;br /&gt;&lt;br /&gt;public interface EODManager {&lt;br /&gt;   void executeEOD();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.service;&lt;br /&gt;&lt;br /&gt;public interface Executable {&lt;br /&gt;   void execute() throws Exception;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;In package com.ndung.service.impl add a class named EODManagerImpl.java&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.service.impl;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;import com.ndung.service.EODManager;&lt;br /&gt;import com.ndung.service.Executable;&lt;br /&gt;&lt;br /&gt;public class EODManagerImpl implements EODManager {&lt;br /&gt;   private List&amp;lt;Executable&amp;gt; executables;&lt;br /&gt;   public void setExecutables(List&amp;lt;Executable&amp;gt; executables) {&lt;br /&gt;     this.executables = executables;&lt;br /&gt;   }&lt;br /&gt;   public void executeEOD() {&lt;br /&gt;     for (Executable executable : executables) {&lt;br /&gt;       try { executable.execute(); }&lt;br /&gt;       catch (Exception e) { e.printStackTrace(); }&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Edit PersonManager.java and PersonManagerImpl.java like belows.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public interface PersonManager extends Manager, Executable{&lt;br /&gt;   ...&lt;br /&gt;   public void generateDailyReport();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PersonManagerImpl.java&lt;pre name="code" class="java"&gt;&lt;br /&gt;public void generateDailyReport() {&lt;br /&gt;   File dirPath = new File("report");&lt;br /&gt;   if (!dirPath.exists()) {&lt;br /&gt;     dirPath.mkdirs();&lt;br /&gt;   }&lt;br /&gt;   File filePath = new File(dirPath+"/PersonReport.pdf");&lt;br /&gt;     Map&amp;lt;String, Object&amp;gt; mapReport = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;     mapReport.put("title", "Persons Report");&lt;br /&gt;     mapReport.put("date", new Date());&lt;br /&gt;     ReportUtil.generateReport("PersonsReport.jrxml", filePath.getAbsolutePath(),&lt;br /&gt;       dao.getPersons(null), mapReport, "pdf");&lt;br /&gt;   }&lt;br /&gt; public void execute() throws Exception {&lt;br /&gt;   generateDailyReport();&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add a bean in applicationContext-service.xml for eodManager.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;bean id="eodManager" class="com.ndung.service.impl.EODManagerImpl"&amp;gt;&lt;br /&gt;   &amp;lt;property name="executables"&amp;gt;&lt;br /&gt;      &amp;lt;list&amp;gt;&lt;br /&gt;         &amp;lt;ref bean="personManager" /&amp;gt;&lt;br /&gt;      &amp;lt;/list&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In folder web/WEB-INF create applicationContext file named applicationContext-schedule.xml&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"&lt;br /&gt;        "http://www.springframework.org/dtd/spring-beans.dtd"&amp;gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt; &amp;lt;bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&amp;gt;&lt;br /&gt;   &amp;lt;property name="triggers"&amp;gt;&lt;br /&gt;      &amp;lt;list&amp;gt;&lt;br /&gt;         &amp;lt;ref local="cronTrigger" /&amp;gt;&lt;br /&gt;      &amp;lt;/list&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id="cronTrigger"&lt;br /&gt;     class="org.springframework.scheduling.quartz.CronTriggerBean"&amp;gt;&lt;br /&gt;   &amp;lt;property name="jobDetail"&amp;gt;&lt;br /&gt;      &amp;lt;ref bean="methodInvokingJobDetail" /&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt; &lt;br /&gt;   &amp;lt;property name="cronExpression"&amp;gt;&lt;br /&gt;      &amp;lt;value&amp;gt;0 0/1 * * * ?&amp;lt;/value&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id="methodInvokingJobDetail" &lt;br /&gt;     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&amp;gt;&lt;br /&gt;   &amp;lt;property name="targetObject"&amp;gt;&lt;br /&gt;     &amp;lt;ref bean="eodManager" /&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="targetMethod"&amp;gt;&lt;br /&gt;     &amp;lt;value&amp;gt;executeEOD&amp;lt;/value&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Run our application and check out if there a file in report/PersonReport.pdf in our computer.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-6307878595302944362?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/6307878595302944362/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=6307878595302944362&amp;isPopup=true" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/6307878595302944362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/6307878595302944362?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/quartz-scheduler-first-impression.html" title="Quartz Scheduler First Impression" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>15</thr:total></entry><entry gd:etag="W/&quot;A0EHRH4_eyp7ImA9WxRSF0w.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-8137407921107765712</id><published>2008-09-17T08:49:00.004+07:00</published><updated>2008-09-18T13:33:55.043+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-18T13:33:55.043+07:00</app:edited><title>JasperReports First Impression</title><content type="html">In &lt;a href="http://ndoenks.blogspot.com/2008/09/performing-crud-on-object-in-appfuse.html"&gt;previous&lt;/a&gt; post we have made Person model (POJO) and DAO also manager to perform CRUD on person object. Now we will generate report of person list by using &lt;a href="http://www.jaspersoft.com/jaspersoft_app12.html"&gt;JasperReports&lt;/a&gt; and &lt;a href="http://jasperforge.org/plugins/project/project_home.php?group_id=83"&gt;IReport&lt;/a&gt;. We use IReport to make .jrxml file that needed by JasperReports. This tool is so powerful because easy to use and GUI based. Here we start. Download first JasperReports libraries and IReport application. Copy JasperReports libraries folder into AppfuseExample lib folder. Edit lib.properties file.&lt;br /&gt;&lt;pre name="code" class="css"&gt;&lt;br /&gt;#&lt;br /&gt;#Jasper&lt;br /&gt;#&lt;br /&gt;jasper.version=1.2.0&lt;br /&gt;jasper.dir=${lib.dir}/jasperreports-${jasper.version}&lt;br /&gt;jasper.jar=${jasper.dir}/jasperreports-1.2.0.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Create a class to generate report in package com.ndung.util named ReportUtil.java.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.util;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import net.sf.jasperreports.engine.*;&lt;br /&gt;import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;&lt;br /&gt;import net.sf.jasperreports.engine.export.*;&lt;br /&gt;import net.sf.jasperreports.engine.util.JRLoader;&lt;br /&gt;&lt;br /&gt;public class ReportUtil { &lt;br /&gt;  public static void generateReport(String templateFilename, String outputFilename, List data,&lt;br /&gt;      Map&amp;lt;String, Object&amp;gt; reportParameters, String fileType) {  &lt;br /&gt;    try {   &lt;br /&gt;           OutputStream os = new FileOutputStream(outputFilename);&lt;br /&gt;           generateReport(templateFilename, os, data, reportParameters, fileType);   &lt;br /&gt;           os.close();  &lt;br /&gt;        } catch (IOException e) { e.printStackTrace(); } &lt;br /&gt;    }&lt;br /&gt; public static void generateReport(String templateFilename, OutputStream os, List data,&lt;br /&gt;      Map&amp;lt;String, Object&amp;gt; reportParameters, String fileType) {  &lt;br /&gt;    String reportFileName = ReportUtil.class.getResource("/" + templateFilename).getFile();&lt;br /&gt;    if(reportParameters == null)&lt;br /&gt;       reportParameters = new HashMap&amp;lt;String, Object&amp;gt;();  &lt;br /&gt;    try {&lt;br /&gt;          JasperPrint jasperPrint;&lt;br /&gt;          JasperReport jasperReport = getCompiledReport(reportFileName);&lt;br /&gt;          jasperPrint = JasperFillManager.fillReport(jasperReport, reportParameters,&lt;br /&gt;             new JRBeanCollectionDataSource(data));   &lt;br /&gt;          JRExporter exporter = null;   &lt;br /&gt;          if (fileType.equals("txt")) exporter = new JRTextExporter();&lt;br /&gt;          else if (fileType.equals("csv")) exporter = new JRCsvExporter();&lt;br /&gt;          else if (fileType.equals("xls")) exporter = new JRXlsExporter();&lt;br /&gt;          else exporter = new JRPdfExporter();&lt;br /&gt;          exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, os);&lt;br /&gt;          exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);&lt;br /&gt;          exporter.exportReport();  &lt;br /&gt;       } catch (Exception e) { e.printStackTrace(); } } &lt;br /&gt;  private static JasperReport getCompiledReport(String reportFileName) throws JRException {  &lt;br /&gt;    File reportFile = new File(reportFileName.replace("jrxml", "jasper"));  &lt;br /&gt;    if (!reportFile.exists())&lt;br /&gt;       JasperCompileManager.compileReportToFile(reportFileName);  &lt;br /&gt;    return (JasperReport) JRLoader.loadObject(reportFile.getPath());&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Now open IReport to make jrxml file. Click File -&gt; New Document. Fill report name with PersonsReport.jrxml. Click Tools -&gt; Classpath. Add jar/folder where our classes built. As example: /home/ndung/workspace/AppfuseExample/bin. Click Datasource -&gt; Report Query, in tab JavaBean Datasource, fill class name with com.ndung.model.Person and click Read javabeans attributes. If your classpath right, it will read attributes of person. Create document like picture below by dragging fields or variables or parameters in right panel (library). Save this file into folder src/web. Try to compile this file by clicking button compile. If there is no error, it will be compiled successfully. If this file has been compiled it will generate file .jasper. Check out PersonsReport.jasper in your computer folder.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/ireport.png"/&gt;&lt;br /&gt;&lt;br /&gt;We will add a page special that can be called from menu directly. In package com.ndung.webapp.action create a class named PersonReport.java. In folder web/pages create two files named personReport.html and personReport.page.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.ndung.webapp.action;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.util.zip.*;&lt;br /&gt;import com.ndung.model.Person;&lt;br /&gt;import com.ndung.service.Manager;&lt;br /&gt;import com.ndung.util.ReportUtil;&lt;br /&gt;&lt;br /&gt;public abstract class PersonReport extends BasePage{&lt;br /&gt;  public abstract Manager getManager();&lt;br /&gt;  public void generate() throws IOException{&lt;br /&gt;    List persons = getManager().getObjects(Person.class);&lt;br /&gt;    OutputStream os = getResponse().getOutputStream();&lt;br /&gt;    getResponse().addHeader( "Content-Disposition", "attachment; filename=report.zip");&lt;br /&gt;    getResponse().setContentType( "application/zip" ) ;&lt;br /&gt;    os = new ZipOutputStream( os );&lt;br /&gt;    String templateFilename = "PersonsReport.jrxml";&lt;br /&gt;    Map&amp;lt;String, Object&amp;gt; mapReport = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;    mapReport.put("title", "Persons Report");  mapReport.put("date", new Date());&lt;br /&gt;    ((ZipOutputStream)os).putNextEntry( new ZipEntry("PersonsReport.pdf" ) ) ;&lt;br /&gt;    ReportUtil.generateReport(templateFilename, os, persons, mapReport, "pdf");&lt;br /&gt;    ((ZipOutputStream)os).closeEntry() ;&lt;br /&gt;    os.flush();&lt;br /&gt;    os.close(); &lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;span jwcid="@ShowValidationError" delegate="ognl:beans.delegate"/&amp;gt;&lt;br /&gt;&amp;lt;span jwcid="@ShowMessage"/&amp;gt;&lt;br /&gt;&amp;lt;form jwcid="form"&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" class="button" jwcid="@Submit" value="message:button.generate" id="save" action="listener:generate"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE page-specification PUBLIC&lt;br /&gt;        "-//Apache Software Foundation//Tapestry Specification 4.0//EN"&lt;br /&gt;        "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;page-specification class="com.ndung.webapp.action.PersonReport"&amp;gt;&lt;br /&gt;    &amp;lt;inject property="request" object="service:tapestry.globals.HttpServletRequest"/&amp;gt;&lt;br /&gt;    &amp;lt;inject property="response" object="service:tapestry.globals.HttpServletResponse"/&amp;gt;&lt;br /&gt;    &amp;lt;inject property="manager" type="spring" object="manager"/&amp;gt;&lt;br /&gt;    &amp;lt;bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/&amp;gt;&lt;br /&gt;    &amp;lt;component id="form" type="Form"&amp;gt;&lt;br /&gt;        &amp;lt;binding name="delegate" value="ognl:beans.delegate"/&amp;gt;&lt;br /&gt;        &amp;lt;binding name="clientValidationEnabled" value="true"/&amp;gt;&lt;br /&gt;    &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/page-specification&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In tapestry application add mapping file for .page and .html. &lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;page name="personReport" specification-path="pages/personReport.page"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Edit ApplicationResources.properties and build.xml like belows.&lt;br /&gt;&lt;pre name="code" class="css"&gt;&lt;br /&gt;menu.person=Person&lt;br /&gt;menu.person.list=Person List&lt;br /&gt;menu.person.report=Person Report&lt;br /&gt;personreport.heading=Person Report&lt;br /&gt;personreport.title=Person Report&lt;br /&gt;button.generate=Generate&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;target name="package-web" ...&amp;gt;&lt;br /&gt; ...&lt;br /&gt;  &amp;lt;copy todir="${build.dir}/web/classes"&amp;gt;&lt;br /&gt;      &amp;lt;fileset dir="src/web"&amp;gt;&lt;br /&gt;      ...&lt;br /&gt;          &amp;lt;include name="**/*.jrxml"/&amp;gt;&lt;br /&gt;          &amp;lt;include name="**/*.jasper"/&amp;gt;&lt;br /&gt;      &amp;lt;/fileset&amp;gt;&lt;br /&gt;  &amp;lt;/copy&amp;gt;&lt;br /&gt; ...&lt;br /&gt;  &amp;lt;war destfile="${webapp.dist}/${webapp.war}" duplicate="preserve" ,,,&amp;gt;&lt;br /&gt;      ...&lt;br /&gt;      &amp;lt;lib dir="${jasper.dir}" includes="*.jar"/&amp;gt;&lt;br /&gt;  &amp;lt;/war&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Last, add menu for this feature.&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;insert into menu(id,name,url,parent) values(10,"menu.person",null,null);&lt;br /&gt;insert into menu(id,name,url,parent) values(11,"menu.person.list","persons.html",10);&lt;br /&gt;insert into menu(id,name,url,parent) values(12,"menu.person.report","personsReport.html",10);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(1,10);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(2,10);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(1,11);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(2,11);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(1,12);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(2,12);&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-8137407921107765712?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/8137407921107765712/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=8137407921107765712&amp;isPopup=true" title="38 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/8137407921107765712?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/8137407921107765712?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/jasperreports-first-impression.html" title="JasperReports First Impression" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>38</thr:total></entry><entry gd:etag="W/&quot;CkcGQns8fyp7ImA9WxRSF08.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-3851603379829863116</id><published>2008-09-16T10:30:00.018+07:00</published><updated>2008-09-18T13:40:23.577+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-18T13:40:23.577+07:00</app:edited><title>Performing CRUD on Object in AppFuse</title><content type="html">We have created a model named Person before. Besides using &lt;a href="http://ndoenks.blogspot.com/2008/09/hibernate-xdoclet-class-from-table.html"&gt;this&lt;/a&gt;, we also can use Middlegen that have been integrated in AppGen AppFuse to generate POJOs from database tables. Now, we will add a CRUD (create, retrieve, update, delete) application for Person. Firstly, we have must to create a new DAO to perform CRUD on the object and then create a new manager for creating Business Facades that talk to the database tier (DAOs) and handle transaction management. The last, we make web presentation to do CRUD on that object. We will use AppFuse AppGen tool that I have talked before to do all of this. &lt;br /&gt;&lt;br /&gt;Here, we start. Open terminal and enter extras/appgen directory. Run "ant" (It'll generate all the files that we need. However, we can just grab the ones we need) or "ant install" (to use the  generic DAO and manager) or instead ant-install we can use better way, "ant install-detailed" (to general a DAO and Manager specifically for our model object). We will use the last one. After we run this command, We will be prompted to generate from a POJO or a Table. If we choose pojo, the .java file should already exist in our "model" package. Because person POJO has been in our model package, we can use this or we can use this command directly:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ant -Dobject.name=Person -Dappgen.type=pojo.&lt;br /&gt;ant install -Dobject.name=Person -Dappgen.type=pojo.&lt;br /&gt;ant install-detailed -Dobject.name=Person -Dappgen.type=pojo.&lt;/span&gt;&lt;br /&gt;But if we choose table, Middlegen will be used to create a POJO from an existing database table. This will generate all the files that needed to test and perform CRUD on an object. We will use this second way, by using Middlegen. Delete first our Person.java in our model package.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/appgen.png"/&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Finally, we will be asked to enter an application module or sub-package name. This is an optional feature that will allow us to organize our classes into sub-packages. For example, for a POJO "model" package of "org.appfuse.foo.model", just enter foo when prompted.&lt;br /&gt;&lt;br /&gt;Here are the list of new files or files that have been edited after we refresh our project in Eclipse:&lt;br /&gt;(in src folder)&lt;br /&gt;1. com.ndung.Constant (edit)&lt;br /&gt;2. com.ndung.model.Person&lt;br /&gt;3. com.ndung.dao.PersonDao&lt;br /&gt;4. com.ndung.dao.PersonDaoHibernate&lt;br /&gt;5. applicationContext-hibernate.xml (edit) &lt;br /&gt;Note: In this file, we also must have to add "com/ndung/model/Person.hbm.xml" in list of value of mappingResources if there is no before.&lt;br /&gt;6. com.ndung.service.PersonManager&lt;br /&gt;7. com.ndung.service.PersonManagerImpl&lt;br /&gt;8. applicationContext-service.xml (edit)&lt;br /&gt;9. com.ndung.webapp.action.PersonForm&lt;br /&gt;10. com.ndung.webapp.action.PersonList&lt;br /&gt;&lt;br /&gt;(in test folder)&lt;br /&gt;1. com.ndung.dao.PersonDaoTest&lt;br /&gt;2. com.ndung.dao.PersonManagerTest&lt;br /&gt;3. com.ndung.webapp.action.PersonFormTest&lt;br /&gt;4. com.ndung.webapp.action.PersonListTest&lt;br /&gt;&lt;br /&gt;(in web folder)&lt;br /&gt;1. pages/web/personForm.html&lt;br /&gt;2. pages/web/personForm.page&lt;br /&gt;3. pages/web/persons.html&lt;br /&gt;4. pages/web/persons.page&lt;br /&gt;5. WEB-INF/tapestry.application (edit)&lt;br /&gt;&lt;br /&gt;Last, we add a new menu in our database menu table. Also we have to add roles and that menu in role_menu table.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;insert into menu(id,name,url,parent) values(10,"menu.person","persons.html",null);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(1,10);&lt;br /&gt;insert into role_menu(role_id,menu_id) values(2,10);&lt;/span&gt;&lt;br /&gt;Build our project through ANT (by run "ant deploy" command in our project package). Here is a screenshot of http://localhost:8080/AppfuseExample after our engine (Tomcat) started and log in as mraible.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/person.png"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE:&lt;/span&gt;&lt;br /&gt;I'm trying &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;syntax highlighter&lt;/a&gt; and modified by &lt;a href="http://fazibear.googlepages.com/blogger.html"&gt;FaziBear&lt;/a&gt; for Blogspot. We will add search feature in this application. Edit files below by adding these codes.&lt;br /&gt;&lt;br /&gt;PersonDao.java&lt;pre name="code" class="java"&gt;&lt;br /&gt;  public List findPersons(Person param);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PersonDaoHibernate.java&lt;pre name="code" class="java"&gt;&lt;br /&gt; public List findPersons(Person param) {&lt;br /&gt;  DetachedCriteria criteria = DetachedCriteria.forClass(Person.class);&lt;br /&gt;  if (param.getId()!=null){&lt;br /&gt;   criteria.add(Restrictions.eq("id", param.getId()));&lt;br /&gt;  }&lt;br /&gt;  if (param.getFirstName()!=null){&lt;br /&gt;   criteria.add(Restrictions.eq("firstName", param.getFirstName()));&lt;br /&gt;  }&lt;br /&gt;  if (param.getLastName()!=null){&lt;br /&gt;   criteria.add(Restrictions.eq("lastName", param.getLastName()));&lt;br /&gt;  }&lt;br /&gt;  criteria.addOrder(Order.desc("id"));&lt;br /&gt;  return getHibernateTemplate().findByCriteria(criteria);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PersonManager.java&lt;pre name="code" class="java"&gt;&lt;br /&gt;  public List findPersons(Person param);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PersonManagerImpl.java&lt;pre name="code" class="java"&gt;&lt;br /&gt; public List findPersons(Person param) {&lt;br /&gt;  return dao.findPersons(param);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PersonList.java&lt;pre name="code" class="java"&gt;&lt;br /&gt;public abstract class PersonList extends BasePage implements PageBeginRenderListener{&lt;br /&gt;  public abstract PersonManager getPersonManager();&lt;br /&gt;  public abstract List getPersons();&lt;br /&gt;  public abstract void setPersons(List persons);&lt;br /&gt;  public abstract Person getParam();&lt;br /&gt;  public abstract void setParam(Person param);  &lt;br /&gt;  public void pageBeginRender(PageEvent event) {&lt;br /&gt;    search(event.getRequestCycle());&lt;br /&gt;  }&lt;br /&gt;  public void search(IRequestCycle cycle) {&lt;br /&gt;    if (getParam() == null) setParam(new Person());&lt;br /&gt;    List personList = getPersonManager().findPersons(getParam());&lt;br /&gt;    PersonList nextPage = (PersonList) cycle.getPage();&lt;br /&gt;    nextPage.setPersons(personList);&lt;br /&gt;    cycle.activate(nextPage);&lt;br /&gt;  }&lt;br /&gt;  ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;persons.html&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;form jwcid="personForm@Form"&amp;gt;&lt;br /&gt;&amp;lt;table class="form"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;  &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;&amp;lt;span key="personList.namesearched"/&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;td&amp;gt;&lt;br /&gt;   &amp;lt;input jwcid="@TextField" value="ognl:param.firstName" /&amp;gt;&lt;br /&gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;  &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;td&amp;gt;&lt;br /&gt;   &amp;lt;input type="submit" class="button" jwcid="@Submit" value="message:button.search" id="search"&lt;br /&gt;       listener="ognl:listeners.search"/&amp;gt;&lt;br /&gt;  &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ApplicationResources.properties&lt;pre name="code" class="css"&gt;&lt;br /&gt;# -- person list page--&lt;br /&gt;menu.person=Person List&lt;br /&gt;personList.namesearched=Person First Name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is a screenshot:&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/searchpersons.png"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-3851603379829863116?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/3851603379829863116/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=3851603379829863116&amp;isPopup=true" title="38 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/3851603379829863116?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/3851603379829863116?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/performing-crud-on-object-in-appfuse.html" title="Performing CRUD on Object in AppFuse" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>38</thr:total></entry><entry gd:etag="W/&quot;Dk4FRnY4fip7ImA9WxRSFEg.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-5294246324386019475</id><published>2008-09-15T10:09:00.002+07:00</published><updated>2008-09-15T12:01:57.836+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T12:01:57.836+07:00</app:edited><title>Hibernate XDoclet Class From Table Generator</title><content type="html">Still remember &lt;a href="http://ndoenks.blogspot.com/2008/08/hibernate-first-impression.html"&gt;Hibernate XDoclet&lt;/a&gt;? In this post, we will create an AppGen in AppFuse. Imagine if we have a hundred of columns in our table in database and we have must to write a model of that class, it's fields, it's getter and setter one by one. So, here we start. In this example, our table (person) just have 3 columns. &lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/dmlsqlperson.png"/&gt;&lt;br /&gt;&lt;br /&gt;Create folder util in src folder. In Eclipse, create source folder that refer to src/util. Create a package in that source folder named com.ndung.gen. For the first step, we must prepare our model template for class.template, field.template, getter.template, and also setter.template. We also have to prepare our jdbc properties to connect to our database.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/class.template.png"/&gt;&lt;br /&gt;class.template&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/field.template.png"/&gt;&lt;br /&gt;field.template&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/getter.template.png"/&gt;&lt;br /&gt;getter.template&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/setter.template.png"/&gt;&lt;br /&gt;setter.template&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/jdbc.properties.png"/&gt;&lt;br /&gt;jdbc.properties&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;After that, we create two classes named TableInspector.java and ClassGenerator.java. TableInspector is used to inspect data type in each columns in table and map it in to Java class type. In another hand, ClassGenerator is used to write a Java model class file based on our template above.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/TableInspector.java.png"/&gt;&lt;br /&gt;TableInspector.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/ClassGenerator.java.png"/&gt;&lt;br /&gt;ClassGenerator.java&lt;br /&gt;&lt;br /&gt;Now, we create a main Java class named HibernateXDocletClassFromTableGenerator.java.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/hibernatexdocletclassgeneratorfromta.png"/&gt;&lt;br /&gt;&lt;br /&gt;Run that class above and refresh our project. Look in folder src/dao in package com.ndung.model. There is a model class named Person.java. We must change XDoclet attribute for id from hibernate.property to become hibernate.id.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/Person.java.png"/&gt;&lt;br /&gt;Person.java &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-5294246324386019475?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/5294246324386019475/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=5294246324386019475&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5294246324386019475?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5294246324386019475?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/hibernate-xdoclet-class-from-table.html" title="Hibernate XDoclet Class From Table Generator" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DE4FQ3k_eip7ImA9WxRSEU4.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-3021603782656185484</id><published>2008-09-11T11:08:00.004+07:00</published><updated>2008-09-11T19:41:52.742+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-11T19:41:52.742+07:00</app:edited><title>Struts-Menu First Impression</title><content type="html">We will talk about &lt;a href="http://struts-menu.sourceforge.net/"&gt;Struts-Menu&lt;/a&gt; tag library. It's demo can be seen in &lt;a href="http://demo.raibledesigns.com/struts-menu/index.jsp"&gt;here&lt;/a&gt; and it's library can be downloaded in &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=48726"&gt;here&lt;/a&gt;. We will integrate it in &lt;a href="http://www.appfuse.org/"&gt;AppFuse&lt;/a&gt;. Before we start, you must do &lt;a href="http://ndoenks.blogspot.com/2008/09/appfuse-first-impression-introduction.html"&gt;this&lt;/a&gt; first. We will try build a simple menu from a database table. It's demo can be seen in &lt;a href="http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp"&gt;here&lt;/a&gt;. In our that project (AppfuseExample), by default we can add menu and menu item in menu-config.xml. But how we can add dynamic driven menu from database? Okay, we will start here. There are 3 tables by default in our database (NDUNGDB). They are app_user, role, and user_role. We will add 2 tables more for our configuration menu. They are menu and role_menu. Table menu will store menus and table role_menu will store which menus can be accessed by which roles. Table menu will have 4 columns they are id, name, url, and parent. In other hand role_menu table will have 2 columns. They are role_id and menu_id.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/sqlmenu.png" /&gt;&lt;br /&gt;DDL SQL file for table menu and role_menu&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Edit table menu and role_menu. Add fields for them. Here is my menu and role_menu table based on default configuration of AppFuse. I'm using MySQL Query Browser.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/menutable.png" /&gt;&lt;br /&gt;menu table.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/rolemenutable.png" /&gt;&lt;br /&gt;role_menu table.&lt;br /&gt;&lt;br /&gt;We will add persistence model for menu by mapping table menu and edit role model in addition role_menu mapping table. In package com.ndung.model, add file Menu.java and edit Role.java by adding attribute menus.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/menu.java.png" /&gt;&lt;br /&gt;Menu.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/role.java.png"/&gt;&lt;br /&gt;Role.java (edit) &lt;br /&gt;&lt;br /&gt;In applicationContext-hibernate.xml add mapping model for menu. Add this line in mapping resources.&lt;br /&gt;&lt;img src ="http://ndoenks.googlepages.com/applicationContext-hibernate.xml.png"/&gt;&lt;br /&gt;applicationContext-hibernate.xml (edit)&lt;br /&gt;&lt;br /&gt;We will add a filter in package com.ndung.webapp.filter named AuthenticationProcessingFilter by extend &lt;a href="http://www.acegisecurity.org/"&gt;AcegiSecurity&lt;/a&gt; default filter. This filter is used to store all menus (menu names and it's url) from database and all roles that can access those menus in repository. Then, edit security.xml by adding this filter.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/AuthenticationProcessingFilter.java.png"/&gt;&lt;br /&gt;AuthenticationProcessingFilter.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/security.xml.png"/&gt;&lt;br /&gt;security.xml (edit)&lt;br /&gt;&lt;br /&gt;We will use ListMenu. Add mapping menu in menu-config.xml. Add this line in displayers.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/menu-config.xml.png"/&gt;&lt;br /&gt;menu-config.xml (edit)&lt;br /&gt;&lt;br /&gt;In folder web/pages add jsp file named menu.jsp (the other menu.jsp file is in folder web/common) and in folder web/decorators/ backup our default.jsp and edit it like this. Also you must have to need &lt;a href="http://demo.raibledesigns.com/struts-menu/styles/menuExpandable.css.src"&gt;menuExpandable.css&lt;/a&gt; and &lt;a href="http://demo.raibledesigns.com/struts-menu/scripts/menuExpandable.js.src"&gt;menuExpandable.js&lt;/a&gt;.  Place menuExpandable.css in folder web/styles and menuExpandable.js in folder web/scripts. &lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/menu.jsp.png"/&gt;&lt;br /&gt;menu.jsp&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/default.jsp.png"/&gt;&lt;br /&gt;default.jsp&lt;br /&gt;&lt;br /&gt;Add these lines in ApplicationResources.properties.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/appresource.png"/&gt;&lt;br /&gt;ApplicationResources.properties (edit)&lt;br /&gt;&lt;br /&gt;Here is some screenshot after we login as mraible. We must add a default css for a better view for sure.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/mainmenu.png"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-3021603782656185484?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/3021603782656185484/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=3021603782656185484&amp;isPopup=true" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/3021603782656185484?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/3021603782656185484?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/struts-menu-first-impression.html" title="Struts-Menu First Impression" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;AkIBQ3wzcCp7ImA9WxRTFk0.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-1580962005962236496</id><published>2008-09-05T15:30:00.004+07:00</published><updated>2008-09-05T16:55:52.288+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-05T16:55:52.288+07:00</app:edited><title>Coding...</title><content type="html">Computer programming, often shortened to programming or coding is one of my hobby now. I don't know exactly since when this fu*king thing become my hobby. Computer programming considered a branch of applied mathematics, is the process of writing, testing, debugging/troubleshooting, and maintaining the source code of computer programs. This source code is written in a programming language. The code may be a modification of an existing source or something completely new (taken from wikipedia.org).&lt;br /&gt;&lt;br /&gt;So what's exactly my profession? I don't know exactly too. Some may call it software engineer, the other say it software developer or even programmer. This is one of my big decision in my life by following my heart. ("Que sera, sera. Whatever will be, will be. The future's not ours, to see.") I don't know sure if it can be called "big" or not. Leave my mechanical engineering bachelor education to enter a whole new IT world. I realize once I leave it, I can't turn back in the next day. Okay, I still have time to change back my decision. But I don't think so...&lt;br /&gt;&lt;br /&gt;You know, I am paid low compare to mechanical engineer (especially in oil and gas industry, more especially in multinational company), they are paid high, several times above my salary. But I think this is not all about salary. Okay, I know I must face this world, I also need much money, but in this time I don't need so much, just enough to pay my needs for a month. I'm also not a smart programmer. I am just an average programmer. But I think I'm happy.&lt;br /&gt;&lt;br /&gt;Teringat akan renungan bahagia yang ditulis Andy F. Noya (www.kickandy.com): "Berbahagialah mereka yang menikmati pekerjaannya. Berbahagialah mereka yang sudah mencapai taraf bekerja adalah berekreasi. Sebab mereka sudah menemukan lentera jiwa mereka." Semoga menjawab pertanyaan semua orang yang selalu bertanya, "kenapa jadi programer? kenapa ga masuk astra? kenapa ga masuk perusahaan minyak? kenapa ga jadi mechanical engineer yang gajinya gede? kenapa masuk sini?" dan kenapa-kenapa lainnya.&lt;br /&gt;&lt;br /&gt;My next wish list:&lt;br /&gt;1. To become master of science in software engineering.&lt;br /&gt;2. To build my own corporation. www.ndung.com.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-1580962005962236496?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/1580962005962236496/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=1580962005962236496&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1580962005962236496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1580962005962236496?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/coding.html" title="Coding..." /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEAMSXc9cSp7ImA9WxRTEkg.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-1923864311126682965</id><published>2008-09-01T12:45:00.003+07:00</published><updated>2008-09-01T14:06:28.969+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-01T14:06:28.969+07:00</app:edited><title>AppFuse First Impression (An Introduction to MVC Design Pattern)</title><content type="html">Now, we have learned about &lt;a href="http://ndoenks.blogspot.com/2008/08/tapestry-first-impression.html"&gt;Tapestry&lt;/a&gt;, &lt;a href="http://ndoenks.blogspot.com/2008/08/hibernate-first-impression.html"&gt;Hibernate&lt;/a&gt;, and &lt;a href="http://ndoenks.blogspot.com/2008/08/ioc-inversion-of-control-introduction.html"&gt;Spring&lt;/a&gt;. So, let me introduce a MVC architecture. An architecture such as MVC is a design pattern that describes a recurring problem and its solution that used 3 main components. MVC, They are Model (business logic goes here), View (presentation logic goes here), and Controller (application logic goes here). One of MVC framework is Brick/ AppFuse Framework. By default, AppFuse use Hibernate framework as Model (object persisting framework), Tapestry framework as View (web presentation), and Spring framework as Controller. So, here it is...&lt;br /&gt;&lt;br /&gt;All that we need are &lt;a href="http://www.appfuse.org/"&gt;AppFuse framework&lt;/a&gt;, &lt;a href="http://ant.apache.org/"&gt;Apache Ant&lt;/a&gt;, &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; as database, &lt;a href="http://tomcat.apache.org/"&gt;Apache Tomcat&lt;/a&gt; as application server, &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; as IDE and &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;  as testing tools. Extract Apache Ant in a specific location, as example in /home/ndung/Java/ant/apache-ant-1.7.0. Configure our environment variables.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ sudo gedit /etc/bash.bashrc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add these lines in that file:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;export ANT_HOME=/home/ndung/Java/ant/apache-ant-1.7.0&lt;br /&gt;export PATH=$PATH:$ANT_HOME/bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To configure Apache Tomcat and Eclipse read &lt;a href="http://ndoenks.blogspot.com/2008/08/how-to-install-sun-jdk-eclipse-and.html"&gt;this&lt;/a&gt;. Extract Junit in specific folder and copy junit-x.x.jar into Apache Ant libraries (apache-ant-1.7.0/lib). Extract AppFuse in our eclipse workspace as example /home/ndung/workspace/appfuse. Open properties.xml and edit tomcat properties (line 37-40) based on our tomcat configuration mainly in user name and password. Also edit our database properties (line 43-59) based on our MySQL or our other database configuration mainly in user name and password. Open terminal and run:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ ant new&lt;/span&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/ant-new.png"/&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;After that enter our project workspace folder. Run setup and test-all.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ cd /home/ndung/workspace/AppfuseExample&lt;br /&gt;~$ ant setup test-all&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finish! Now start our tomcat. We will start it manually by using terminal. Enter Tomcat installation bin folder.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ cd /opt/apache-tomcat-5.5.26/bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add the execute permission to all of the .sh files in the $CATALINA_HOME/bin directory.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ sudo chmod u+x startup.sh&lt;br /&gt;~$ sudo chmod u+x catalina.sh&lt;br /&gt;~$ sudo chmod u+x setclasspath.sh&lt;br /&gt;~$ sudo chmod u+x shutdown.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Start our engine (tomcat) by using this command:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ ./startup.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, point our browser into http://localhost:8080/AppfuseExample. Use our tomcat user name and password to log in as user, as example in my tomcat configuration, user name: tomcat; password: tomcat. To log in as administrator use mraible as user name and tomcat as password.&lt;br /&gt;Here is some screen shot:&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/appfusescrshot.png"/&gt;&lt;br /&gt;&lt;br /&gt;Don't forget to shut down our engine:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ ./shutdown.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, how to edit this project by using IDE. Open our Eclipse. Click File -&gt; Import. Select Existing Projects into workspace under General item as an import source. Click next. Select our eclipse workspace (example:/home/ndung/workspace) as root directory. Check AppfuseExample in Projects then click Finish. Now, we can easily to add whatever in our project. In the next posts we will add other feature in this our project.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-1923864311126682965?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/1923864311126682965/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=1923864311126682965&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1923864311126682965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1923864311126682965?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/09/appfuse-first-impression-introduction.html" title="AppFuse First Impression (An Introduction to MVC Design Pattern)" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEUDQHozeSp7ImA9WxdaFks.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-5275657222756791688</id><published>2008-08-20T13:54:00.005+07:00</published><updated>2008-08-25T18:04:31.481+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-25T18:04:31.481+07:00</app:edited><title>Spring-Hibernate Hands On</title><content type="html">Now, lets talk about combining hibernate persistence framework and Spring framework. As you see from previous post, that Spring JDBC still use SQL query to access data objects in database. All that you need are:&lt;br /&gt;1. &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; as IDE&lt;br /&gt;2. &lt;a href="http://www.mysql.com/"&gt;MySQL 5&lt;/a&gt; as Database&lt;br /&gt;We also need other libraries such as:&lt;br /&gt;1. &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://hibernate.org/"&gt;Hibernate-3.*&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://www.mysql.com/products/connector-j"&gt;MySQL-connector-java-5.*&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://jakarta.apache.org/commons"&gt;Jakarta-commons&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://xdoclet.sourceforge.net/"&gt;X-Doclet-1.*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create a java project in Eclipse named SpringHibernateExample. Create a new folder named lib. It is used to place our libraries. Move all libraries above to folder lib. So in the lib folder, there are 5 folders inside. Also add a properties file in the lib folder named lib.properties. This is an example, my lib.properties. It show my libraries configuration. Make it in your own. Also configure build path our project into these libraries.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/libPropSH.png"/&gt;&lt;br /&gt;lib.properties&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;In source folder make java package named com.ndung.model and com.ndung.main. We will place our POJOs in com.ndung.model and main file in com.ndung.main. Create java classes in com.ndung.model named User.java and UserDaoHibernate.java as data access object to database. Also make a xml file named myconfig.xml and a properties file named hibernate.properties in our project source folder. In other side, create java main class named Main.java in com.ndung.main.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserSH.png"/&gt;&lt;br /&gt;User.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserDaoHibernateJava.png"/&gt;&lt;br /&gt;UserDaoHibernate.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/myconfigXml.png"/&gt;&lt;br /&gt;myconfig.xml&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/hibernateProperties.png"/&gt;&lt;br /&gt;hibernate.properties&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/MainSH.png"/&gt;&lt;br /&gt;Main.java&lt;br /&gt;&lt;br /&gt;As usually we will run our project by using Ant. Create two xml files named properties.xml and build.xml.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/propertiesXmlSH.png"/&gt;&lt;br /&gt;properties.xml&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/buildXmlSH.png"/&gt;&lt;br /&gt;build.xml&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-5275657222756791688?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/5275657222756791688/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=5275657222756791688&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5275657222756791688?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5275657222756791688?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/spring-hibernate-hands-on.html" title="Spring-Hibernate Hands On" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUBRn05eip7ImA9WxdaFks.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-7564974208891493573</id><published>2008-08-19T13:54:00.002+07:00</published><updated>2008-08-25T18:04:17.322+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-25T18:04:17.322+07:00</app:edited><title>Spring JDBC First Impression</title><content type="html">In this example, all that you need are:&lt;br /&gt;1. &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; as IDE&lt;br /&gt;2. &lt;a href="http://www.mysql.com/"&gt;MySQL 5&lt;/a&gt; as Database&lt;br /&gt;We also need other libraries such as:&lt;br /&gt;1. &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.mysql.com/products/connector-j"&gt;MySQL-connector-java-5.*&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://jakarta.apache.org/commons"&gt;Jakarta-commons&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create a java project in Eclipse named SpringJdbcExample. Create a new folder named lib. It is used to place our libraries. Move all libraries above to folder lib. So in the lib folder, there are 3 folders inside. Also add a properties file in the lib folder named lib.properties. This is an example, my lib.properties. It show my libraries configuration. Make it in your own. Also configure build path our project into these libraries.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/libPropSJ.png"/&gt;&lt;br /&gt;lib.properties&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;In source folder make java package named com.ndung.model and com.ndung.main. Create java classes in com.ndung.model named User.java as entity, UserRowMapper.java as mapping entity file to database, and UserDaoSpringJdbc.java as data access object to database. Also make a xml file named dbConnection.xml that used to configure database connection. In other side, create main java class named Main.java in com.ndung.main.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserJavaSJ.png"/&gt;&lt;br /&gt;User.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserRowMapperJava.png"/&gt;&lt;br /&gt;UserRowMapper.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserDaoSpringJdbcJava.png"/&gt;&lt;br /&gt;UserDaoSpringJdbc.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/dbConnectionXml.png"/&gt;&lt;br /&gt;dbConnection.xml&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/MainJavaSJ.png"/&gt;&lt;br /&gt;Main.java&lt;br /&gt;&lt;br /&gt;As usually we will run this project by using Ant. Make a xml file named build.xml in this project.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/buildXmlSJ.png"/&gt;&lt;br /&gt;build.xml&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-7564974208891493573?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/7564974208891493573/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=7564974208891493573&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/7564974208891493573?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/7564974208891493573?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/spring-jdbc-first-impression.html" title="Spring JDBC First Impression" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUAQHgycCp7ImA9WxdaFks.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-2895543162909155241</id><published>2008-08-18T11:45:00.002+07:00</published><updated>2008-08-25T18:04:01.698+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-25T18:04:01.698+07:00</app:edited><title>IOC (Inversion of Control) - An Introduction to Spring</title><content type="html">As usually we need Eclipse as IDE. We also need other libraries such as &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt; libraries and &lt;a href="http://jakarta.apache.org/commons"&gt;Jakarta Commons&lt;/a&gt; libraries especially commons-logging. Create a project named IoCDemo. In this project create a new folder named lib and move all our libraries into this folder. Create a library properties file, lib.properties. This is my library configuration properties. Make it in your own. Also configure build path our project into these libraries.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/libProp.png"/&gt;&lt;br /&gt;lib.properties&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Then in source folder make two packages named com.ndung.myspring and com.ndung.main. In com.ndung.myspring create a java interface named Greeting.java and a java class named GreetingImpl.java. In source folder create a xml file as configuration of our spring injection named Hello.xml and in package com.ndung.main create a main java class named Main.java.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/greetingJava.png"/&gt;&lt;br /&gt;Greeting.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/GreetingImplJava.png"/&gt;&lt;br /&gt;GreetingImpl.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/HelloXml.png"/&gt;&lt;br /&gt;Hello.xml&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/Main.png"/&gt;&lt;br /&gt;Main.java&lt;br /&gt;&lt;br /&gt;We will run this project by using Ant. Create a xml file in this project named build.xml and run this project.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/Build.png"/&gt;&lt;br /&gt;build.xml&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-2895543162909155241?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/2895543162909155241/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=2895543162909155241&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/2895543162909155241?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/2895543162909155241?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/ioc-inversion-of-control-introduction.html" title="IOC (Inversion of Control) - An Introduction to Spring" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEUFRng8eCp7ImA9WxdaFks.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-272807439713465700</id><published>2008-08-17T01:40:00.004+07:00</published><updated>2008-08-25T18:03:37.670+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-25T18:03:37.670+07:00</app:edited><title>Hibernate First Impression</title><content type="html">Now, lets talk about object persistence framework. It is Hibernate. How to generate tables in database from POJOs (Plain Old Java Objects). All that you need are:&lt;br /&gt;1. &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt; as IDE&lt;br /&gt;2. &lt;a href="http://www.mysql.com"&gt;MySQL 5&lt;/a&gt; as Database&lt;br /&gt;We also need other libraries such as:&lt;br /&gt;1. &lt;a href="http://hibernate.org"&gt;Hibernate-3.*&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.mysql.com/products/connector-j"&gt;MySQL-connector-java-5.*&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://jakarta.apache.org/commons"&gt;Jakarta-commons&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://xdoclet.sourceforge.net"&gt;X-Doclet-1.*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To generate tables in database from POJOs with hibernate, we need mapping files (*.hbm.xml) for that POJOs. As example, User.java (a POJO) need User.hbm.xml that will be used to map that POJO with table in database. We also need a hibernate configuration file (hibernate.cfg.xml). It is needed to configure database properties with hibernate. In this example we will generate both of *.hbm.xml and hibernate.cfg.xml by using X-Doclet and Ant. Let's start it.&lt;br /&gt;&lt;br /&gt;Firstly create database named ndung in MySQL.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/createDB.png"/&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Create a java project in Eclipse named HibernateExample. Create a new folder named lib. It is used to place our libraries. Move all libraries above to folder lib. So in the lib folder, there are 4 folders inside. Also add a properties file in the lib folder named lib.properties. This is an example, my lib.properties. It show my libraries configuration. Make it in your own. Also configure build path our project into these libraries.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/libProperties.png"/&gt;&lt;br /&gt;lib.properties&lt;br /&gt;&lt;br /&gt;In source folder make java package named com.ndung.model and com.ndung.main. We will place our POJOs in com.ndung.model and main file in com.ndung.main. Create java classes in com.ndung.model named User.java and HibernateUtil.java. In other side, create java class named Main.java in com.ndung.main.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserJava.png"/&gt;&lt;br /&gt;User.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/HibernateUtilJava.png"/&gt;&lt;br /&gt;HibernateUtil.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/MainJava.png"/&gt;&lt;br /&gt;Main.java&lt;br /&gt;&lt;br /&gt;Now, we will generate User.hbm.xml and hibernate.cfg.xml automatically by using X-Doclet and Ant. Make two xml files in the project named properties.xml and build.xml.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/propertiesXml.png"/&gt;&lt;br /&gt;properties.xml&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/buildXml.png"/&gt;&lt;br /&gt;build.xml&lt;br /&gt;&lt;br /&gt;To run Ant based on our own build.xml file, in Eclipse menu bar click Window, click Show View menu item, and click Ant menu item. Ant panel will show up in the right of Eclipse. Right click on that panel, click Add Buildfiles. Choose build.xml to add from HibernateExample project. 4 menus will show up in that panel below HibernateExample. Double click on hibernatedoclet. It will generate hibernate mapping files and also a hibernate configuration file. Check out in source folder, there are 2 new xml files. They are User.hbm.xml in /com/ndung/model folder and hibernate.cfg.xml.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/UserHbmXML.png"/&gt;&lt;br /&gt;User.hbm.xml&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/hibernatecfgxml.png"/&gt;&lt;br /&gt;hibernate.cfg.xml&lt;br /&gt;&lt;br /&gt;Then double click on run in Ant panel. Now, check out your database.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/showDB.png"/&gt;&lt;br /&gt;&lt;br /&gt;Btw, Long Live My Indonesia...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-272807439713465700?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/272807439713465700/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=272807439713465700&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/272807439713465700?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/272807439713465700?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/hibernate-first-impression.html" title="Hibernate First Impression" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEUEQ3k6eCp7ImA9WxdaFks.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-5651828955805025978</id><published>2008-08-08T17:24:00.007+07:00</published><updated>2008-08-25T18:03:22.710+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-25T18:03:22.710+07:00</app:edited><title>How to Install Sun JDK, Eclipse, and Apache Tomcat in Ubuntu.</title><content type="html">Due to my previous post and my next posts, I will tell you about configuration of my Ubuntu to develop software with Java. This post will cover &lt;a href="http://java.sun.com/"&gt;Sun JDK&lt;/a&gt; as Java development kit, &lt;a href="http://tomcat.apache.org/download-55.cgi"&gt;Apache Tomcat&lt;/a&gt; as application server and &lt;a href="http://www.eclipse.org/downloads"&gt;Eclipse&lt;/a&gt; as IDE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;--Install Java and setting JAVA_HOME environment variable and path--&lt;/span&gt;&lt;br /&gt;Firstly, download file installation for Sun JDK. There are 2 kind binary files of Sun JDK Installation in Ubuntu. They are file with extension .deb and file with extension .bin. For example: sun-j2sdk1.5_1.5.0_i386.deb and jdk-1_5_0_01-linux-i586.bin. File with extension .deb is easy to install. Ubuntu is a variant of Debian, so file with extension .deb is easy known by Ubuntu. Just click twice on the file and ubuntu will automatically install JDK in /usr/lib/... By this way, try to run java -version with terminal.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/java-version.png" /&gt;&lt;br /&gt;&lt;br /&gt;In another side, file with extension .bin must be extracted into a specific folder. I prefer to place other file installation in /opt folder. In terminal, run this command:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ sudo mv /home/ndung/jdk-1_5_0_01-linux-i586.bin /opt&lt;br /&gt;~$ sudo ./opt/jdk-1_5_0_01-linux-i586.bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can't run java or javac or java -version in terminal by this way directly. You must set path and environment variable in ubuntu. In terminal, run this command:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ sudo gedit /etc/bash.bashrc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add these lines at below of that file:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;export JAVA_HOME=/opt/j2sdk1.5-sun/&lt;br /&gt;export PATH=$PATH:$JAVA_HOME/bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note: Although after installation by file with extension.deb, Ubuntu by terminal can run java -version directly, but the other program like Apache Tomcat, Eclipse, etc can't know directly where the path installation of Java. So you still need to set JAVA_HOME environment variable in Ubuntu just like above. In /etc/bash.bashrc file, add these lines:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;export JAVA_HOME=/usr/lib/j2sdk1.5-sun/&lt;br /&gt;export PATH=$PATH:$JAVA_HOME/bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, test if path and environment variable are set correctly. In terminal, run this command:&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/echoJAVA_HOME.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;--Install Apache Tomcat and setting CATALINA_HOME environment variable and path--&lt;/span&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;To install Apache Tomcat, just extract file installation (.tar, .tar.gz, .tar.bz2, .zip) into a specific folder. Example extract apache-tomcat-5.5.26.zip to /home/ndung/apache-tomcat-5.5.26 and then move it into /opt folder. Just like JAVA_HOME you must set a variable path of CATALINA_HOME. Add this line into /etc/bash.bashrc file:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;export CATALINA_HOME=/opt/apache-tomcat-5.5.26/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;--Install and Run Eclipse--&lt;/span&gt;&lt;br /&gt;To install Eclipse, just extract file installation (.tar, .tar.gz, .tar.bz2, .zip) into a specific folder. Example extract eclipse-wtp-spring-subclipse.tar.bz2 to /home/ndung/eclipse and move to /opt folder. To run Eclispe just type this command in terminal:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;~$ ./opt/eclipse/eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To summarize my explanation above you can just create a simple launcher to run eclipse. Create file eclipse.sh in desktop. Fill that file with these lines and run it.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/eclipse.sh.png" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-5651828955805025978?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/5651828955805025978/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=5651828955805025978&amp;isPopup=true" title="232 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5651828955805025978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/5651828955805025978?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/how-to-install-sun-jdk-eclipse-and.html" title="How to Install Sun JDK, Eclipse, and Apache Tomcat in Ubuntu." /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>232</thr:total></entry><entry gd:etag="W/&quot;CEYHQXYyeyp7ImA9WxdaFks.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-1044696074914401033</id><published>2008-08-07T14:24:00.012+07:00</published><updated>2008-08-25T18:02:10.893+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-25T18:02:10.893+07:00</app:edited><title>Tapestry First Impression</title><content type="html">To do this, you have need &lt;a href="http://www.eclipse.org/downloads"&gt;Eclipse J2EE&lt;/a&gt; as IDE, &lt;a href="http://tomcat.apache.org/download-55.cgi"&gt;Apache Tomcat&lt;/a&gt; as application server, and &lt;a href="http://howardlewisship.com/downloads/quick-start/tapestry-libraries.tar.gz"&gt;Tapestry Libraries&lt;/a&gt; as web component framework.&lt;br /&gt;&lt;br /&gt;In Eclipse, make a dynamic web project titled HelloWorld and point target runtime to Apache Tomcat. Import library from Tapestry libraries into WEB-INF/lib/ folder. In WebContent/ folder make 2 files. They are, Home.html and Home.page. Also in src/ folder make a package named com.ndung.helloworld and one Java file in that package named Home.java.&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/home.html.png" /&gt;&lt;br /&gt;Home.html&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/home.java.png" /&gt;&lt;br /&gt;Home.java&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/home.page.png" /&gt;&lt;br /&gt;Home.page&lt;br /&gt;&lt;br /&gt;In WEB-INF/ folder edit web.xml:&lt;br /&gt;&lt;img src="http://ndoenks.googlepages.com/web.xml.png" /&gt;&lt;br /&gt;&lt;br /&gt;Run or deploy HelloWorld project in server. Point your web browser into http://localhost:8080/HelloWorld/app&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-1044696074914401033?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/1044696074914401033/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=1044696074914401033&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1044696074914401033?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/1044696074914401033?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/tapestry-first-impression.html" title="Tapestry First Impression" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkAGRH48eCp7ImA9WxdUFUU.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-4025823165471251368</id><published>2008-08-01T17:51:00.003+07:00</published><updated>2008-08-01T18:05:25.070+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-01T18:05:25.070+07:00</app:edited><title>Sorry about Hiatus of My Blog</title><content type="html">This blog has been "hiatus" for 2 months, because I was busy enough with my training and now I am ready to enter a real world. This is a new chapter of my life. This blog is created 1 year ago, 31 July 2008 and yesterday exactly it's first birthday. But I want to restructure the contents of this blog. I have been deleted all early posts. My blog will tell about my new profession as &lt;span style="font-weight: bold;"&gt;software developer&lt;/span&gt;. It is all thing about &lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt; technology. Yes, Java and also mm.. maybe &lt;span style="font-weight: bold;"&gt;Ubuntu&lt;/span&gt;, and also all technologies related with them. So enjoy it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-4025823165471251368?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/4025823165471251368/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=4025823165471251368&amp;isPopup=true" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/4025823165471251368?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/4025823165471251368?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/sorry-about-hiatus-of-my-blog.html" title="Sorry about Hiatus of My Blog" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;Ak8CSXo7eyp7ImA9WxdUFUU.&quot;"><id>tag:blogger.com,1999:blog-7613556649518960017.post-4270578672929737891</id><published>2008-08-01T17:10:00.005+07:00</published><updated>2008-08-01T18:07:48.403+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-01T18:07:48.403+07:00</app:edited><title>Hello World</title><content type="html">&lt;span style=";font-family:courier new;font-size:100%;"  &gt;pubic class HelloWorld{&lt;br /&gt;&amp;nbsp &amp;nbsp public static void main(String[] args){&lt;br /&gt;&amp;nbsp &amp;nbsp &amp;nbsp &amp;nbsp System.out.println("Hello World");&lt;br /&gt;&amp;nbsp &amp;nbsp }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7613556649518960017-4270578672929737891?l=ndoenks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ndoenks.blogspot.com/feeds/4270578672929737891/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7613556649518960017&amp;postID=4270578672929737891&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/4270578672929737891?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7613556649518960017/posts/default/4270578672929737891?v=2" /><link rel="alternate" type="text/html" href="http://ndoenks.blogspot.com/2008/08/hello-world.html" title="Hello World" /><author><name>L.P. Manik</name><uri>http://www.blogger.com/profile/16235033765439234452</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://geocities.com/ndoenks/ndoenks.jpg" /></author><thr:total>0</thr:total></entry></feed>

