Monday, December 19, 2011

Java SE သင္ခန္းစာ Link and JSP သင္ခန္းစာ Link

Java SE သင္ခန္းစာ Link and JSP သင္ခန္းစာ Link

လြယ္လြယ္ကူကူ အေျခခံေလးေတြေလ႔လာဖို႕အတြက္သင္႔ေတာ္ပါတယ္။ ဘာမွမလုပ္ရင္ေတာ႔ ဘာမွမျဖစ္ပါဘူး။ တစ္ခုခုလုပ္ရင္ေတာ႔တစ္ခုခုျဖစ္ပါတယ္။ ေလ႔က်င္႔ေတာ္မူႏုိင္ၾကပါေစ။

https://wikis.oracle.com/display/code/Language+Syntax#LanguageSyntax

JSP အလြယ္စားေလ႔က်င္႔ခန္းေတြကို ဒီေနရာမွာေလ႔လာလုိ႕ရပါတယ္။
run လုိ႕ရတယ္။ ျမင္သာထင္သာရိွတယ္ေပါ႔ခမ်ာ။

http://www.jsptut.com/

ပထမဆံုးအလုပ္ကေတာ႔ ေပ်ာ္ဖုိ႕ပဲ။ ေပ်ာ္ေအာင္လုပ္ပါ။ ဘာမဆို သင္ယူရင္ေပ်ာ္မွတတ္တယ္။ မေပ်ာ္တဲ႔သူေတြက ဘာသင္သင္ တကယ္မတတ္ဘူး။ မတတ္သာလုိ႕သင္ရတဲ႔ဟာေတြက တကယ္မတတ္ရျခင္းရဲ႕ အေၾကာင္းရင္းဘဲ။

စစခ်င္း လြယ္တာေတြေလ႔လာ။ ပိုျပီးခက္တာေတြလားပါလာမွာပဲ။ လြယ္တာေတြကို ေက်ညက္သြားရင္ ကိုယ္႔ကိုယ္ကို နည္းနည္းပိုျပီး ယံုၾကည္လာတယ္။ ငါလုပ္ရင္ျဖစ္ေလာက္တယ္ဆိုတာမ်ိဳးေလးျဖစ္ဖုိ႕လိုတယ္။

Regards,
Zero

Boxing Conversion

Boxing Conversion


Boxing ဆိုတာနဲ႕ လက္ေ၀ွ႕ထုိးတယ္မ်ားထင္မလားမသိဘူး။ primitive type ေတြကို သူတို႕အတြက္လုပ္ထားတဲ႔ refernce type ေတြဆီကို ေျပာင္းတာကို Boxing လုိ႕ေခၚတာပါ။ ေသတၱာထဲထည္႕တာေပါ႔ခမ်ာ။ ေအာက္မွာရွစ္ခုရိွတယ္တဲ႔ခင္ဗ်။
  • From type boolean to type Boolean
  • From type byte to type Byte
  • From type char to type Character
  • From type short to type Short
  • From type int to type Integer
  • From type long to type Long
  • From type float to type Float
  • From type double to type Double
Double ဆိုတာေတြ႕ရင္ မေနႏုိင္မထိုင္ႏိုင္ 1 cent issue ကိုသတိရမိတယ္ဗ်။ double ေတြဟာ သိမ္းစရာရိွတာကို အတည္႕မသိမ္းဘူးခင္ဗ်။ ဘာနဲ႕တူသလဲဆိုရင္ ဟာထဲကလို ႏြားေတြျဖတ္ေျပးတာကို ေျခေထာက္ေတြလုိက္ေရၾကည္႕ျပီး ေလးနဲ႕စားသလိုမ်ိဳးေပါ႔။ လြယ္တာကို ခက္ေအာင္လုပ္တယ္။ 60 ကို ၅၉.၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉ ဆိုျပီးသိမ္းတဲ႔အတြက္ အတြက္အခ်က္ေတြ လုပ္ရင္း လုပ္ရင္း လုပ္ရင္း လုပ္ရင္း ေနာက္ဆံုး တစ္ျပားကြာကုန္တယ္ေပါ႔ဗ်ာ။ အဲဒါေၾကာင္႔လည္း BigDecimal ပဲေနာက္ပိုင္းေျပာင္းသံုးၾကတယ္။


Run time ၾကရင္ Boxing conversion ေတြက ဒီလိုေျပာင္းလဲသတဲ႔။
  • If p is a value of type boolean, then boxing conversion converts p into a reference r of class and type Boolean, such that r.booleanValue() == p
p က boolean ဆိုပါေတာ႔။ လြယ္ေအာင္ေရးလိုက္ရင္ boolean p=true;
ဆိုပါေတာ႔။ run time ေရာက္ရင္ primitive type boolean ေလးကို Reference Type အျဖစ္ေျပာင္းပစ္လုိက္တယ္။ ေျပာင္းပစ္လုိက္တယ္ဆိုတာမွာ Reference Type Boolean r ထဲကို boolean တန္ဖိုးေရာက္သြားတယ္။ B အၾကီးေတြ အေသးေတြ ရွဳပ္ေနတယ္လို႕မထင္ပါနဲ႕။ Java ရဲ႕ၾကီးက်ယ္ေသာ boxing ေျပာင္းလဲမႈၾကီးပါ။ 


Boolean b;
boolean a=true;
b = new Boolean(a);
System.out.println(b.booleanValue());
Boolean ၾကီးဟာ reference type ၾကီးပါ။ သူက class လည္းျဖစ္တဲ႔အတြက္ သံုးခ်င္ရင္ new လုပ္ေပးရပါမယ္။ Boolean b= new Boolean("true") ဆိုျပီး တစ္ခါတည္း create လုပ္လုိက္တာကိုၾကေတာ႔ auto boxing လို႕ေခၚတယ္ဗ်။ Class ေတြကို compare လုပ္ေနတာလို႕ ခင္ဗ်ားတို႕သတိထားမိရင္ == operator ကို သံုးရင္လြဲမယ္ဆိုတာကိုလည္း ေျပာစရာမလုိပါဘူး။ Boolean ၾကီးကို == နဲ႕သြားျပီးတုိက္ဆုိင္ရင္ လြဲမွာပဲ။ သူ႕ရဲ႕ value က .booleanValue() နဲ႕ရွာမွထြက္လာမယ္။ .equals () operator နဲ႕လည္း နည္းနည္းစမ္းျပီးေရးၾကည္႕ပါ။ က်န္တာေတြလည္း အလားတူပါပဲ။


 အဲဒီရွစ္မ်ိဳးကို ေျပာင္းျပန္လွည္႕ေျပာရင္ တနည္းအားျဖင္႔ Reference Type ကေန primitive ကိုေျပာင္းတာကို unboxing ေသတၱာထဲက ထုတ္တယ္လို႕ဆိုတာပါပဲ။ လူမ်ားေတြ boxing/unboxing လုပ္တယ္ဘာညာဆိုတာေတြကို အၾကီးၾကီးထင္မွာစိုးလုိ႕ပါ။ သိေအာင္လုပ္ထားတာေကာင္းပါတယ္။

Boxing was introduced in JDK 1.5 to eliminate trivial conversions between primitives (int, boolean, etc) and corresponding wrapper objects (Integer, Boolean, etc). Boxing allows some code to be a bit more concise and legible. It's also useful when using collections (which only take objects, not primitives).

Integer, Boolean စတဲ႔ Reference Type Objects ေတြကို wrapper objects လို႕လည္းေခၚတယ္ဆိုတာကို ေျပာခ်င္လုိ႕ကူးလာတာပါ။ JDK 1.5 ရဲ႕ သိသာထင္ရွားတဲ႔အမွတ္အသားတစ္ခုပါပဲ။

အဆင္ေျပၾကမယ္လို႕ထင္ပါတယ္။
နားမလည္ဘူးလား။ နားလည္လားေတာ႔မသိပါဘူး။ ၾကိဳးစားျပီး ရွာဖတ္ၾကည္႕ပါ။ ေရးေတးေတးျဖစ္ေနရင္လည္း မ်ားမ်ားေလးေလ႔လာၾကည္႕ပါ။ အဆင္ေျပသြားမွာပါ။ တကယ္တမ္း အလုပ္မွာ ဒီေလာက္သိစရာမလိုဘူး။ ေရးေနတာၾကာျပီ။ ကြ်န္ေတာ္ဆို ဒါကို Boxing လား၊ ၀ူရွဴးလားမသိဘဲ တစ္ႏွစ္ခြဲေလာက္ေရးေနတာပဲ။ ေရးလို႕ျဖစ္ပါတယ္။ ကိုယ္သိေနတာေတြကို ဘယ္လုိေခၚလဲျပန္ျပီးေလ႔လာရတာလည္း ေပ်ာ္စရာေကာင္းပါရဲ႕ဗ်ာ။

ကဲ Boxing သင္ခန္းစာ ဆံုးေလ၏။            ။

Regards,
Zero.

Ref:

Sunday, December 18, 2011

Singleton

Singleton

Design Pattern စာအုပ္ေတြထဲမွာေရာ source code ေတြမွာပါ ေတြ႕ဖူးပါတယ္။ ဘာအတြက္သံုးလဲအနည္းငယ္ေလာက္ပဲသိပါတယ္။ Java မွာသိစရာနည္းနည္းမ်ားတယ္ထင္ပါတယ္။ နည္းနည္းသိတဲ႔အသိဟာအႏၲရာယ္မ်ားတယ္ဆိုေပေသာ္ျငားလည္း အင္တာဗ်ဴးေျဖဖို႕ၾကေတာ႔လည္း အသံုး၀င္သား။

အၾကမ္းဖ်င္းေလာက္ပဲေျပာမွာဆုိေတာ႔ wiki ရဲ႕ဖြင္႔ဆိုခ်က္ကိုပဲ ကိုးကားလုိက္ပါတယ္။ အိမ္ေရာက္ရင္ ထပ္ကိုးကားစရာမ်ား ကံေကာင္းေထာက္မျပီးေတြ႕ခဲ႔ရင္ ေနာက္တစ္ေခါက္ ထပ္ကိုးကားပါဦးမယ္။ singleton ဟာ class ေတြ instantiation လုပ္တာကို ကန္႕သတ္ဖုိ႕သံုးပါသတဲ႔။ system တစ္ခုလံုးမွာ ဒီ Object တစ္ခုပဲသံုးမယ္ဆုိျပီး ဒီဇုိင္းဆင္ရင္ သံုးတယ္ေပါ႔ခမ်ာ။ အထူးသျဖင္႔ သူ႕ကို Instance ဘယ္ႏွစ္ခုအထိပဲသံုးမလဲဆိုတာမ်ိဳးကန္႕သတ္ခ်င္ရင္ အဆင္ေျပတယ္ေပါ႔ဗ်ာ။

Anti-pattern လို႕လည္းဆိုၾကသဗ်။ Anti-pattern ဆိုတာက သံုးသာသံုးေနတယ္။ အက်ိဳးသိပ္မရိွဘူး။ သူ႕ဘာသာသူ ရြာလည္ေနတယ္လို႕ဆိုလုိတယ္။ အသံုးမတတ္တာေၾကာင္႔လည္းျဖစ္ႏိုင္သလို၊ မလိုအပ္ဘဲသိပ္သံုးလြန္းတာေၾကာင္႔လည္းျဖစ္မယ္။ အင္တာဗ်ဴးရင္ေတာ႔ လႊတ္သာေျပာေပး။ ဒီလုိကိစၥေတြသိတယ္ဆိုတာ ေတာ္ရံုမဟုတ္ဘူး ထင္လာတဲ႔အထိေပါ႔။

Java မွာေတာ႔ ပ်င္းပ်င္းရိရိ singleton နဲ႕ မပ်င္းတပ်င္းဆိုျပီးႏွစ္ခုရိွတယ္ဗ်။

ပ်င္းတယ္ဆိုတာကေတာ႔ ခိုင္းတုိင္းမလုပ္ဘူးေပါ႔ခမ်ာ။ တျခားလူလုပ္ေပးမလား ထၾကည္႕တာေပါ႔။ ရိွရင္ ဒီေကာင္႔ကိုခုိင္းလုိက္ပါ။ ကြ်န္ေတာ္ဆက္အိပ္ေနခ်င္လို႕ဆိုတာမ်ိဳးကို ပ်င္းတယ္ေခၚတာေပါ႔။
ဒါေလးေတြေတာ႔ၾကည္႕ထားေပါ႔ဗ်ာ။ ေလေတြခ်ည္း စြတ္ေပါေနေတာ႔လည္း တကယ္မေရးတတ္ဘူးထင္ျပီးေမးၾကည္႕ရင္ ခက္ေနမယ္။ ခ်ေရးျပႏိုင္ေတာ႔ တစ္ပန္းခြဲေလာက္သာတာေပါ႔။

public class MySingleton { 
 private static MySingleton _instance = 
  new MySingleton(); 

 private MySingleton() { 
  // construct object . . . 
 } 

 public static MySingleton getInstance() { 
  return _instance; 
 } 

 // Remainder of class definition . . .

အဲဒီမွာၾကည္႕ရင္ MySingleton ၾကီးကို ေခၚလိုက္တာနဲ႕ instantiate လုပ္ျပီး memory ေပၚတင္ထားလုိက္တယ္။ static ပါတဲ႔အတြက္ သူက အလားတူေကာင္ေတြနဲ႕အတူရိွေနမရိွေန memory တစ္ခြင္မွာသူတစ္ေကာင္သာရိွေနဖုိ႕အတြက္ လုပ္ထားတယ္ေပါ႔ဗ်ာ။ ေခၚလိုက္တုိင္း တစ္ေကာင္ထြက္လာမယ္။ရိွေနတဲ႔ေကာင္ေသမယ္။ ျခေသၤ႔မင္းဆိုတာ တစ္ေကာင္တည္းပဲ မန္မိုရီတစ္ဂူတည္း ႏွစ္ေကာင္မေအာင္းခ်င္ဘူးေပါ႔ဗ်ာ။
ငပ်င္း singleton
public class MySingleton { 
 private static MySingleton _instance; 

 private MySingleton() { 
  // construct object . . . 
 } 

 // For lazy initialization 
 public static synchronized MySingleton getInstance() { 
  if (_instance==null) { 
   _instance = new MySingleton(); 
  } 
  return _instance; 
 } 
  // Remainder of class definition . . . 
} 

Java ကို မခ်စ္ၾကတာ ဒီအေၾကာင္းေတြေၾကာင္႔ထင္တယ္။ ဘာေတြေလွ်ာက္ေရးထားမွန္းမသိတာမ်ားလုိ႕ျဖစ္မယ္။ synchronized ဆိုတာကေတာ႔ ဒီ method ကို တစ္ေယာက္သံုးေနရင္ေနာက္တစ္ေယာက္ကေစာင္႔ေနေပေတာ႔တဲ႔။ lock လုပ္တဲ႔သေဘာပါ။ အင္မတန္အႏၲရာယ္မ်ားပါတယ္။ ပထမတစ္ေယာက္က သူပဲ ထာ၀ရသံုးေနမယ္ဆိုရင္ ေနာက္တစ္ေယာက္က ေနာက္ဘ၀မွပဲသံုးရပါမယ္။ token ဆိုတဲ႔ network topology လို သူကပဲ အပိုင္စီးထားလိုက္ရင္က်န္တဲ႔သူေတြ ငုတ္တုတ္ေမ႔သြားသလိုေပါ႔ခမ်ာ။ အခုန static method ဆိုတာကလည္း နည္းနည္းပြားျပီးျပီဆိုေတာ႔ထပ္မပြားေတာ႔ပါဘူး။ ဒီ တစ္ေခါက္ေတာ႔ စစခ်င္း new နဲ႕ instantiate မလုပ္တာကိုေတြ႕ပါလိမ္႔မယ္။ if(instance==null) ဆိုတာကေတာ႔ ပ်င္းလို႕ အရင္အေကာင္ရိွေသးရင္ အဲဒီအေကာင္ကို ဆက္သံုးၾကပါ။ ငါ႔ကို မေခၚပါနဲ႕ဦးဆိုတဲ႔သေဘာပါပဲ။ တကယ္လုိ႕ ေရွ႕ကေကာင္ၾကြျပီဆိုမွ သူ႕ကို အသစ္ဖန္တီးျပီး သံုးလုိ႕ရမယ္ဆိုတဲ႔သေဘာပါပဲ။

Bill Pugh ဆိုတဲ႔ researcher ကလည္း ကဲတယ္ခင္ဗ်။ အခုနက ကြ်န္ေတာ္ေျပာတဲ႔ synchronized ၾကီးက ဒုကၡေပးတယ္ဆိုတာသူလည္း ေပါက္တယ္တဲ႔ခင္ဗ်။ သူကေတာ႔ researcher ပီပီ အခ်ိန္ေတြပိုေနေတာ႔ေလွ်ာက္ေရးပံုရပါတယ္။


public class Singleton {
        // Private constructor prevents instantiation from other classes
        private Singleton() { }
 
        /**
        * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
        * or the first access to SingletonHolder.INSTANCE, not before.
        */
        private static class SingletonHolder { 

                public static final Singleton instance = new Singleton();
        }
 
        public static Singleton getInstance() {

                return SingletonHolder.instance;
        }
}


static final Singleton ပါခဗ်။ final keyword ကလည္း အင္မတန္က်ယ္တဲ႔ေခါင္းစဥ္တစ္ခုျဖစ္ပါတယ္။ အဲဒီလိုေရးလုိက္တာ သရက္ေစ႔ျဖစ္တယ္တဲ႔ခင္ဗ်။ thread-safe ဆုိတာ အခုန synchronized သံုးတာမ်ိဳး၊ တစ္ေယာက္သံုးေနတုန္း ေနာက္တစ္ေယာက္က ၀င္မရွဳပ္ေအာင္လုပ္တာမ်ိဳးကိုေခၚတယ္လို႕ အၾကမ္းမွတ္ထားလုိက္ရင္ရေလာက္ပါျပီ။

Regards,
Zero

အခုအခ်ိန္ကစျပီး ref: မ်ားကို လူေလးစားေလာက္ေအာင္ထည္႕ေတာ္မူသြားပါေတာ႔မယ္။ ေနာက္တစ္ခါ ျပန္ဖတ္ရင္ Bookmarks ကေန မရွာခ်င္ေတာ႔ဘူး။

ref:
http://java.sun.com/developer/technicalArticles/Programming/singletons/
http://en.wikipedia.org/wiki/Singleton_pattern
http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html
ဒီၤေအာက္ဆံုးကလင္႔ခ္ကေတာ႔ ဂန္းေအာ႔ဖ္ဖုိးကို ေနာက္ေျပာင္တယ္ခင္ဗ်။
http://www.infoq.com/news/2007/07/GoFCriticism

Servlet in 10 min

Servlet in 10 min

Servlet ေတြ အေၾကာင္းကို အလြယ္ေလးတစ္ခုေရးျပတာပါ။
Online မွာေတြ႕ေနၾကဟာေလးကို ပိုျပီးျပည္႕ျပည္႕စံုစံုျဖစ္ေအာင္ ရွင္းျပထားပါတယ္။


package business;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class ServletExample extends HttpServlet {

public void doGet (HttpServletRequest req,
                     HttpServletResponse res)
    throws ServletException, IOException
  {
    PrintWriter out = res.getWriter();
    out.println("Hello, world!");
    out.close();
  }
}

Code ကေတာ႔မေျပာင္းမလဲ Hello, world ပါပဲ။
package ကို business ဆိုတဲ႔ package ထဲမွာေရးထားတာကိုေတြ႕မွာပါ။ အဲဒီလိုဆိုရင္ class ကို လွမ္းေခၚတဲ႔အခါမွာ business.ServletExample  လို႕ေခၚရပါတယ္။ HttpServlet ကို extend လုပ္ထားတာကိုလည္းေတြ႕ပါလိမ္႔မယ္။ ကြ်န္ေတာ္တို႕ေရးသမွ် servlet ေတြဟာ HttpServlet ကို extend လုပ္ရပါမယ္။


(HttpServletRequest req,HttpServletResponse res)
ဆိုတာကိုလည္းေတြ႕ၾကမယ္ထင္ပါတယ္။ HttpServletRequest ဆိုတာကိုအၾကမ္းဖ်င္းပဲေျပာသြားပါမယ္။ ေနာက္ပိုင္းမွာ အလ်င္းသင္႔ရင္ တခါအေသးစိတ္ထပ္ေျပာပါမယ္။ request ဆိုကတည္းက သူက ေတာင္းပါတယ္။ ပါလာတာေတြေပးခိုင္းပါတယ္။ html form တစ္ခုမွာ post လုပ္လိုက္ရင္ input parameters ေတြ form ထဲမွာပါလာပါတယ္။ အဲဒီ data ေတြကို လိုခ်င္တဲ႔အခါ HttpServletRequest ကေနယူႏုိင္ပါတယ္။ ေနာက္ဥပမာေတြၾကရင္လည္းထပ္ျပီးရွင္းျပပါဦးမယ္။အခုကေတာ႔ set up ေလးတစ္ခု လြယ္လြယ္ကူကူလုပ္ဖုိ႕ပါပဲ။ HttpServletResponse က response ဆိုတဲ႔အတုိင္း ျပန္ျပီးေျပာတာပါပဲ။ သူ႕ကို တစ္ခုခု လာေျပာရင္ စကားျပန္ေျပာသလိုေပါ႔။ ျပန္ေျပာတဲ႔စကားကလည္း အမ်ိဳးမ်ိဳးရိွသလို၊ သူမွာ response လုပ္မယ္႔ type ေတြရိွပါတယ္။ text/html လား pdf လား ၊ excel လားဆိုတဲ႔ content type ေတြရိွပါတယ္။ ေကာင္မေလးတစ္ေယာက္ကို propose သြားလုပ္သလိုေပါ႔။ ဟိုက ဘာနဲ႕မဆို ေကာက္ေပါက္ႏိုင္တယ္မဟုတ္လား။

ဒီမွာေတာ႔ Hello, World နဲ႕ေကာက္ေပါက္လိုက္ပံုရတယ္။


PrintWriter out = res.getWriter();
   out.println("Hello, world!");
    out.close();


Print Writer တစ္ခုယူျပီး ေရးခ်င္ရာေရးတယ္။ response မွာျပန္ေရးေပးလုိက္တယ္။ ဆိုလုိတာက ဒီ Servlet ကိုေခၚရင္ သူ႕ရဲ႕ doGet မွာ ဒါကို အေၾကာင္းျပန္လိမ္႔မယ္ေပါ႔။

ေရးတာျပီးရင္ Tomcat မွာ project ေလးတစ္ခုတည္ေဆာက္မယ္။
လြယ္လြယ္ကူကူ JavaExample ဆိုျပီးနာမည္ေပးမယ္။ အဲဒီအထဲမွာ index.html ဆိုျပီး html page တစ္ခုေရးထားပါ။

ျပီးရင္ JavaExample folder ထဲမွာ WEB-INF ဆိုတဲ႔ folder တစ္ခုေဆာက္ပါ။ Tomcat ကလည္း ေခတ္ေဟာင္းက မိဘမ်ားလို ေမွ်ာ္လင္႔ခ်က္ရိွပါတယ္။ သူက webapps ေအာက္က project တိုင္းကို index စီးျပီး WEB-INF ရံေစခ်င္ပါတယ္။ သူ႕ရဲ႕ default structure နဲ႕တူေအာင္ပါ။ WEB-INF ထဲမွာ web.xml ပါရပါမယ္။ ျပီးရင္ classes ဆိုတဲ႔ folder လည္းပါရပါမယ္။ အဲဒီခပ္ေပါေပါအကြက္ေတြကို အထင္မေသးနဲ႕ SCWCD မွာ ဒါေတြပဲေမးေနတာ။ ခပ္ေပါေပါေတြေပမယ္႔ အေျခခံအေနနဲ႕ေတာ႔သိတာေကာင္းပါတယ္။

web.xml ကိုၾကည္႕ရေအာင္ဗ်ာ။


[web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:/java.sun.com/dtd/web-app_2_3.dtd"]
  [servlet]
    [servlet-name]example[/servlet-name]
    [servlet-class]business.ServletExample[/servlet-class]
  [/servlet]

  [servlet-mapping]
    [servlet-name]example[/servlet-name]
    [url-pattern]/testHello[/url-pattern]
  [/servlet-mapping]
[/web-app]


ဒါက အေျခခံပံုစံေပါ႔ဗ်ာ။ ဒီ config မ်ိဳးေတြကုိ Java မွာ အမ်ားၾကီးေတြ႕ရမယ္။ servlet  နဲ႕ servlet-mapping ဆိုျပီးႏွစ္ခုရိွမယ္။ servlet-name ႏွစ္ခုကတူရပါမယ္။ ၾကိဳက္နဲ႕နာမည္အတူတူေပးထားလုိ႕ရပါတယ္။ ကိုယ္ၾကိဳက္တာ ကိုယ္မလုပ္ရတာက servlet-class ပါ။အခုနကေျပာသလို business.ServletExample  ဆိုျပီး class name ကို package နဲ႕တကြ အျပည္႕အစံုေရးပါတယ္။ ဒါမွလည္း tomcat ကရွာေတြ႕ပါတယ္။ [က< ကို အစားထိုးထားတာပါ။ blogspot ကစိတ္ၾကီးေတာ႔ html tag တို႕မည္သည္ less than , greater than ပါကုန္သည္ဆိုျပီး စစ္ေနတာေၾကာင္႔ အစားထုိးလုိက္ရပါတယ္။ ဂရိတ္တားသန္းကေတာ႔ ] အျဖစ္အစားထုိးထားပါတယ္။ web.xml ကေခါင္းစဥ္ၾကီးတစ္ခုပါ။ အခုေတာ႔ အက်ဥ္းခ်ဳပ္လုိက္ပါတယ္။

ေအာက္နားေလးမွာပါတဲ႔ url-pattern ကေတာ႔ က်ယ္ျပန႔္ပါတယ္။ ေလာေလာဆယ္ က်ဥ္းလိပ္တဲ႔အေနနဲ႕ တစ္ခုပဲေရးျပထားပါတယ္။/testHello နဲ႕၀င္လာရင္ သူ႕အလုပ္လုိ႕ယူဆတယ္လုိ႕ဆိုလိုပါတယ္။

အခုကိစၥမွာဆုိရင္ http://localhost:8080/JavaExample/testHello
ဆိုရင္ သူ႕အလုပ္လုိ႕ယူဆပါလိမ္႔မယ္။ သူ႕အလုပ္လုိ႕ယူဆရင္ သူ႕ဆရာကိုအေၾကာင္းၾကားပါလိမ္႔မယ္။ သူ႕ဆရာနာမည္က example ဆိုရင္ သူ႕ဆရာ example ကို ဘာလုပ္ရမလဲဆရာဆုိျပီးေမးပါလိမ္႔မယ္။ သူ႕ဆရာကလည္း အေပၚဘက္က သူေနရာကိုျပန္တက္ျပီး စားပြဲကအံ႔ဆြဲကိုဖြင္႔ေတာ႔မွ business.ServletExample ကိုေတြ႕ပါတယ္။ အဲဒီေကာင္ကိုသာ run လုိက္ေပေတာ႔ဆိုျပီး run လုိက္တဲ႔အခါမွာ doGet ကိုေရာက္ျပီး Hello, world! ကိုျမင္ရပါလိမ္႔မယ္။

အခုေျပာေနတာဟာ hello world အေၾကာင္းလုိ႕မ်ား ထင္ေနၾကမလားမသိပါဘူး။ မဟုတ္ရပါဘူး။ တကယ္ေျပာေနတာက tomcat ရဲ႕ project folder structure အေၾကာင္းပါ။ အဲဒီ ServletExample ကို compile လုပ္ဖုိ႕အတြက္ လိုတဲ႔ jar file ကိုလည္း tomcat ရဲ႕ lib folder ထဲမွာေတြ႕ႏိုင္ပါတယ္။ servlet-api.jar ျဖစ္ပါတယ္။ ဒီ jar ဟာအေရးၾကီးပါတယ္။ tomcat ဗားရွင္းအနိမ္႔ေတြမွာ run ဖုိ႕ဆုိရင္လည္း အဲဒီ tomcat ရဲ႕ lib ထဲက servlet-api.jar ကိုယူျပီး compile လုပ္ရပါတယ္။

ဒီအခု post ဟာ hello world servlet example ေတြထဲမွာေတာ႔ ေတာ္ေတာ္ေလးျပည္႕ျပည္႕စံုစံုျဖစ္တဲ႔ hello world တစ္ခုလုိ႕ထင္ပါတယ္။ မ်ားေသာအားျဖင္႔ အလုပ္လုပ္တဲ႔သူေတြမွာ အလုပ္ကရႏိုင္တဲ႔ အေတြ႕အၾကံဳေတြ တေလွၾကီးရႏိုင္ေပမယ္႔ အလုပ္မလုပ္ရေသးတဲ႔လူေတြအဖုိ႕ ပိုျပီးျပည္႕ျပည္႕စံုစံုေရးဖုိ႕လိုမယ္ထင္လို႕ ဒီပို႕စ္ကိုေရးလုိက္ပါတယ္။

ဒီေနရာမွာ သိပ္ဟုန္သြားမွာဆိုးလို႕ servlet API ေတြရဲ႕ Version ေတြထည္႕မေျပာေတာ႔ပါဘူး။ ေနာက္ပို႕စ္မ်ားၾကမွ ပိုျပီး တိတိက်က် ေရးလိုက္ပါဦးမယ္။

ေပ်ာ္ရႊင္ဖြယ္ေလ႔က်င္႔ခန္းေလးျဖစ္ပါေစ။

Regards,
Zero

Apache Tomcat Tips

Apache Tomcat Tips

၁။JAVA_HOME for Tomcat
အလကားေပးတဲ႔ Apache Tomcat Web container ဟာ Java သမားေတြအတြက္ေတာ႔ မရိွမျဖစ္တစ္ခုပါပဲ။
Java Version အမ်ိဳးမ်ိဳးနဲ႕သံုးခ်င္တဲ႔အခါ Tomcat ထဲမွာ configure လုပ္လုိ႕ရပါမယ္။ တစ္ေၾကာင္းထဲပါ။

bin folder ေအာက္က catilina.bat ထဲမွာျပင္ရပါမယ္။ text editor တစ္ခုခုနဲ႕ .bat  file ကို ဖြင္႔လုိက္ရင္

set JAVA_HOME=C:\jdk1.6.0_13\

သတိထားဖုိ႕က ေနာက္ဆံုးက \ ေလးပါ။

ဘယ္ေနရာမွာထည္႔ရမလဲဆိုတာကေတာ႔ rem ဆိုတဲ႔ comments ေတြနဲ႕ ပိတ္ထားတဲ႔ block of comments ေတြ ေအာက္နားမွာပါ။ တခါတေလၾကရင္ jdk 1.5 နဲ႕ေျပာင္းျပီး test လုပ္ေပးဖုိ႕လုိတယ္၊ တစ္ခါတစ္ေလၾကရင္ 1.6 နဲ႕ test လုပ္ခ်င္လည္းလုပ္မယ္။ အဲဒီလိုအခါမ်ိဳးမွာ သိပ္အသံုး၀င္ပါတယ္။

၂။No more pop-up


Tomcat ကို run တဲ႔အခါမွာ pop-up window တစ္ခု တက္တက္လာတာ ၆ျမင္ကတ္စရာသိပ္ေကာင္းပါတယ္။ ပထမ run လုိက္တဲ႔ command prompt ေလးတစ္ခုထဲမွာပဲၾကည္႕ခ်င္ရင္ နည္းနည္းျပင္ရပါမယ္။ အဲဒါေလးကလည္း အရင္ရံုးကလူေတြဆီက မွတ္ထားခဲ႔တာေလးတစ္ခုပါ။ လက္ေဆာင္ျပန္ေပးလုိက္ပါတယ္။

bin folder ထဲက catilina.bat က တစ္ေၾကာင္းကိုျပင္ရပါမယ္။

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

အဲဒီ start ကို run လို႕ေျပာင္းလိုက္ရင္ လိုခ်င္တဲ႔အတုိင္းရပါမယ္။

call "%EXECUTABLE%" run %CMD_LINE_ARGS%

ဒီ command က ေအာက္ဆံုးနားမွာပါပဲ။ ရွာရလြယ္ပါတယ္။

အဆင္ေျပမယ္လုိ႕ ေမွ်ာ္လင္႔ပါတယ္။

Regards,
Zero

Notes: bro divinity is now in marriage leaves :)
Bro, please add ur apache and tomcat experience on CentOS when u have time.

Eclipse Shortcuts && Tips

Eclipse Shortcuts && Tips

အခုတေလာ အိမ္မွာ စာျပန္လုပ္ရင္း လြယ္ကူတဲ႔ေလ႔က်င္႔ခန္းေတြ တင္ဖုိ႕ ျပင္ဆင္ေနပါတယ္။
တခ်ိဳ႕ကိစၥေတြဟာ လုပ္ေနၾကနည္းေတြနဲ႕အသားက်ျပီး ပုိလြယ္တာေတြ မလုပ္မိတာေတြရိွတတ္တယ္။ ဒါေတြကို နည္းနည္းေလာက္ေရးလုိက္ပါတယ္။ စေရးၾကမယ္႔လူေတြအတြက္ good practise ေတြျဖစ္ေစမယ္ထင္ပါတယ္။

1.User Library in Ecilpse

Jar files ေတြကို ပံုမွန္အားျဖင္႔
project right clik>Build Path>>Configure Build Path>>Libraries
အဲဒီေရာက္ရင္ Jar ေတြကို Add Jars လုပ္လိုက္တယ္။

အဲဒီ နည္းလမ္းဟာ အင္မတန္မွ အဆင္ေျပပါတယ္။ ေတာ္ေတာ္လည္းလြယ္ကူပါတယ္။ အခုေနာက္ပိုင္းမွာ project အသစ္တစ္ခု ရိွတုိင္း လုိတဲ႔ jar files ေတြ ထပ္ထပ္ထည္႕ေနရတာ tedious ျဖစ္ရတယ္။ အဲဒီေတာ႔ Eclipse မွာ user library ေလးလုပ္ထားလိုက္ရင္ ေနာက္ project ေတြကို develop လုပ္တဲ႔အခါ jar files add ေနရတဲ႔ အလုပ္တစ္ခုသက္သာသြားမွာပါ။ Jar File အစား user lib တစ္ခုတည္း add လုပ္ရင္ လုိအပ္တဲ႔ jar ေတြ အကုန္ရႏုိင္ပါတယ္။

User Library အသစ္တစ္ခု create လုပ္ဖုိ႕ကို Eclipse Menu ထဲက Window>>Preference ထဲသြားျပီး search box မွာ user လုိ႕ရိုက္ထည္႕လုိက္ပါ။ Java Build Path>>User Libraries ဆိုတာေတြ႕ရင္ User Libraries ကို click ေခါက္ပါ။ ျပီးရင္ ညာဘက္မွာ New လုပ္ပါ။ New လုပ္ျပီး နာမည္ကို myUserLibs လို႕ေပးတယ္ဆိုပါေတာ႔။ myUserLibs ကို click လုပ္ျပီး Add Jars လုပ္ပါ။ လုိခ်င္တဲ႔ Jars files ေတြ တစ္ခါတည္း ခ်ိတ္ထားလုိက္ပါ။

အဲဒီ ကိစၥျပီးရင္
project right clik>Build Path>>Configure Build Path>>Libraries ျပန္သြားပါ။
Add Jars အစား Add Library ေရြးပါ။ User Library ေရြးျပီး next လုပ္ပါ။ အဲဒီမွာ အခုန create လုပ္ထားတဲ႔ myUserLibs ကိုေတြ႕ပါလိမ္႔မယ္။ ေရြးလိုက္ပါ။ အဲဒါပါပဲ။

မထူးျခားေပမယ္႔ အဆင္ေျပ အသံုးတည္႕ပါတယ္။

၂.Ctr+Shift+O (ကြန္ထရိုး ရွစ္ဖ္ အို)
ေနာက္ဆံုးက အိုျဖစ္ပါတယ္။ သုညမဟုတ္ပါဘူး။ တခါတေလ ဘာျဖစ္တတ္လဲဆိုေတာ႔ ေရွ႕ကေရးသြားတဲ႔သူေတြက warning ျပေနတာေလးေတြကို မသန္႕ရွင္းသြားတဲ႔အခါမ်ိဳးေတြမွာ အသံုးတည္႕ပါတယ္။ အထူးသျဖင္႔ import လုပ္ထားျပီး မသံုးတဲ႔ declaration ေတြအတြက္ေတာ႔ တစ္ခုခ်င္းလိုက္ဖ်က္ေနမယ္႔အစား control shift O ကို တစ္ျပိဳင္နက္ႏွိပ္လုိက္ရင္ အဲဒီ မလိုဘဲ အပိုျဖစ္ေနတာေတြကို IDE က ဖ်က္ေပးပါတယ္။

၃။Ctrl+1 (Quick Fix)

ပထမပံုမွာ ၾကည္႕ရင္ Book ဆိုတဲ႔ Class က ဘယ္ကမွန္းမသိပါဘူး။ Book က ဒီ example မွာေတာ႔ ကြ်န္ေတာ္ေရးထားတဲ႔ bean တစ္ခုျဖစ္ပါတယ္။ model package ေအာက္မွာရိွပါတယ္။ သိပ္မပ်င္းတဲ႔သူေတြကေတာ႔ import model.Book; လို႕ေရးလိုက္ၾကမွာပဲ။ ပ်င္းခ်င္လည္းရပါတယ္။ တခါတေလ package အားလံုးကို အာဂံုမေဆာင္ႏုိင္တဲ႔အခါမွေတာ႔ အဲဒီ Class ေပၚမွာ cursor ကို ထားျပီး ctrl+1 လုပ္လုိက္ရင္ IDE ကေန suggest ေတာ္မူပါလိမ္႔မယ္။













ေအာက္ကပံုမွာ suggest လုပ္ထားတာေတြ႕ႏိုင္ပါတယ္။ Book ဆိုတဲ႔ class ႏွစ္ခုရိွတယ္။ ဘယ္ဟာကိုေရြးမလဲေမးပါတယ္။ ကြ်န္ေတာ္ေရးထားတဲ႔ class က model package ေအာက္မွာလို႕ အခုနကေျပာထားတာကို သတိရမယ္ဆိုရင္ ဘယ္ဟာကို ေရြးရမယ္ဆိုတာ သိေလာက္ပါျပီ။ အဲဒါကို ေရြးလုိက္ရံုနဲ႕ import ေပးပါလိမ္႔မယ္။ Eclipse မွာ အဲဒါေတြပါပါတယ္။ မ်ားမ်ားသံုးေပးပါ။












၄။getters and setters

ငယ္တုန္းကေတာ႔ အဲဒါေတြ သိပ္ပ်င္းတယ္။ Java Bean ေတြေရးရင္ အျမဲတမ္းမပါမျဖစ္ဟာ getters and setters ပဲ။ Bean ဆိုလုိ႕ Bean နဲ႕ Class ဘာကြာလဲဆိုတဲ႔ေမးခြန္းေတြရိွပါတယ္။ bean ကေတာ႔ no arg constructor ပါမယ္။ သူ႕အထဲက private variableေတြအတြက္ public method နဲ႕အထုတ္အသြင္းလုပ္ႏုိင္ဖုိ႕ getters နဲ႕ setters ပါမယ္။ reusable ျဖစ္ေအာင္ေရးထားတာျဖစ္တဲ႔အတြက္ မလိုအပ္တာေတြကို bean ထဲမထည္႕ၾကဘူး။ ၀ါသနာပါရင္ေတာ႔ ျဖည္႕စြက္ေရးလုိ႕ရတယ္။ ကြ်န္ေတာ္႔အၾကိဳက္အရေတာ႔ Bean ကို Bean သန္႕သန္႕ေလးပဲထားေလ႔ရိွတယ္။ လိုရင္ တျခား Helper တစ္ခုခုေရးမယ္။ interface တစ္ခုခုထဲ implements လုပ္ျပီး ေရးခ်င္လည္းေရးမယ္။ bean ကိုေတာ႔ ရိုးရိုးွရင္းရွင္းပဲထားလုိက္တယ္။ Bean မွာပါတဲ႔ Getter, Setter ေတြသိပ္မ်ားလာရင္ ေရးေနရတာ ပ်င္းစရာသိပ္ေကာင္းတယ္။ Eclipse team ကလည္း ဒါကိုသိပါတယ္။

Bean/Classတစ္ခု ေရးေနတဲ႔အခါ
 private String name;
 private int id;
 private String nric;

စတာေတြေရးျပီးရင္ right click  ႏွိပ္ျပီး source ထဲက Generate Getters and Setters ထဲ၀င္ျပီး အဲဒီ private variables ေတြကို select မွတ္ျပီး OK လုပ္လိုက္ရင္ getters ေတြ setters ေတြ ေအာ္တုိမစ္တစ္ လွလွပပေလး ေရးျပီးသားျဖစ္ပါတယ္။ Thank U Eclipse.

၅။ Ctrl+Click

Method ေတြျဖစ္ျဖစ္၊ class ေတြျဖစ္ျဖစ္၊ control click နဲ႕သြားၾကည္႕ရွာၾကည္ရင္ ျမန္ျမန္ေရာက္ျပီး error ကိုလည္း ခဏေလးေတြ႕ႏိုင္ပါတယ္။ အဲဒါေတြကို java ေရးေနတဲ႔လူေတြ အားလံုး သိၾကပါတယ္။ မသိေသးတဲ႔ စေရးတဲ႔လူေတြအတြက္ေတာ႔ အဲဒါေတြဟာ အေရးၾကီးပါတယ္။ ေက်ာင္းေတြမွာ IDE မသင္ေပးလုိက္တဲ႔အတြက္ IDE အေၾကာင္းကိုလည္း အခ်ိန္နည္းနည္းယူျပီး ေလ႔လာသင္႔ပါတယ္။ ဒါမွ ကိုယ္သံုးေနတဲ႔ IDE ဟာ ဘာေတြ support လုပ္လည္းပိုသိႏုိင္ပါလိမ္႔မယ္။

Regards,
Zero

Thursday, December 15, 2011

အပ်င္းေျပ Remote Access MySql

အပ်င္းေျပ Remote Access MySql

အခုတေလာ အိမ္မွာ program ေလးဘာေလး မေမ႔ေအာင္ ျပန္ေရးပါတယ္။

MySql ကို remote ကေန၀င္ခ်င္ရင္ fire wall မွာ Port blocking လုပ္ထားလားၾကည္႕ပါ။ Window Firewall မွာ port ကို configure လုပ္ေပးလုိ႕ရပါတယ္။ default ဆိုရင္ Port 3306 ကို ဖြင္႔ေပးလုိက္ပါ။ ေနာက္တစ္ခုက security suite ေတြမွာပါတဲ႔ firewall ေတြမွာ portေတြပိတ္ထားရင္လည္း ဖြင္႔ေပးပါ။

MySQL ကုိ စသြင္းကတည္းက remote Login လုပ္မယ္ဆုိတာေရြးထားလိုက္ရင္လြယ္ပါတယ္။

Database တစ္ခုမွာ root access ကို remote ကေန ဖြင္႔မေပးတာေတာ႔အေကာင္းဆံုးပါပဲ။ သီးျခား user account တစ္ခု create လုပ္ျပီး privilege ေတြေပးပါ။ လြယ္လြယ္ကူကူ လုပ္ခ်င္ရင္ SQLYog ျဖစ္ျဖစ္သြင္းထားျပီး Manage User ကေန user ေတြ create လုပ္ျပီး access rights ေတြ define လုပ္ႏုိင္ပါတယ္။

အားလံုးအိုေကျပီဆိုရင္ေတာ႔ တျခား စက္တစ္လံုးကေန MySQL run ထားတဲ႔စက္ကို ping ၾကည္႕ပါ။
ping လုိ႕ရရင္ telnet နဲ႕ Port ပြင္႔ေနလား မပြင္႔ေနလားၾကည္႕ပါ။ Windows 7 မွာေတာ႔ telnet client ကိ္ု အရင္ on ရပါမယ္။ default က off ထားပါတယ္။

ping IP address.
telnet IP adress(space)port No.

အဲဒီလိုရျပီဆိုရင္ေတာ႔ program ကေန ခ်ိတ္ၾကည္႕လုိ႕ရပါျပီ။ SQL client နဲ႕ျဖစ္ျဖစ္ java ရဲ႕ JDBC နဲ႕ျဖစ္ျဖစ္ခ်ိတ္ျပီး ေရးလို႕ရပါျပီ။


My SQL မွာပဲျဖစ္ျဖစ္ တျခား RDBMS ေတြမွာပဲျဖစ္ျဖစ္။ Access right ကို အမ်ားၾကီးေပးထားျပီး ျပန္ေလ်ာ႔ခ်င္တယ္ဆိုရင္သတိထားဖုိ႕လိုပါတယ္။ ဥပမာအားျဖင္႔ user A ကို ပထမ delete ေရာ update access ပါေပးထားျပီး၊ select တစ္ခုပဲ ျပန္ေပးတယ္ဆိုပါေတာ႔။ userA ဟာ သူ႕ access right ကို modify မလုပ္ခင္ login ၀င္ထားရင္ အဲဒီ session ရိွေနသေရြ႕ေတာ႔ သူ႕မွာ အရင္ privilegeေတြက်န္ေနပါေသးတယ္။ remote log-in ၀င္တဲ႔ user account ေတြဆိုရင္ session ကို kill လုပ္တာျဖစ္ျဖစ္၊ မလုပ္တတ္ရင္ MySQL service ကို restart လုပ္လုိက္တာျဖစ္ျဖစ္ လုပ္ရပါမယ္။ အဲဒီလိုမလုပ္သေရြ႕ေတာ႔ user access update လုပ္လိုက္တာဟာ privilege ေတြ ေလ်ာ႔သြားဖုိ႕၊ေျပာင္းသြားဖုိ႕အတြက္ မေသခ်ာပါဘူး။ အဲဒီ အေျခခံအခ်က္ေတြကို သတိထားဖုိ႕လိုပါတယ္။

သိပ္မ်ား အၾကမ္းဖ်င္းဆန္ေနမလားမသိဘူးဗ်ာ။
screen captured လုပ္ရမွာပ်င္းတာနဲ႕ ဒီအတိုင္းပဲေရးလုိက္ပါတယ္။
အဆင္ေျပမယ္ထင္ပါတယ္။
အဆင္မေျပဘူးဆိုရင္လည္း မေျပတာေလး comment ေရးခဲ႔ပါ။

Regards,
The zero.