Higlight: Pocket PC

Traffic on Map

Now we have Pocket PC Phone (Windows Mobile) Client Application. .. more detail

Higlight: Traffic

Traffic on Map

Now Traffic infomation is showing in Abzolute GPS Tracking System .. more detail

JSP Programming Technics

 

Basic knowledge JSP

(Required before studying WebX Framework)

 

 

  1. JSP Programming Technique By: Mr. PHUPHA PUNYAPOTASAKUL (ภูผา ปัญญาโพธาสกุล)
  2. Searching • Basic concept: Build SQL based on input criteria prod_name like ? and cat_id=? • เติม AND หรือไม่เติม boolean is_first=true; 2
  3. Joining • SELECT * from book b, category c WHERE b.cat_id=c.cat_id and c.cat_name like ? • Many-2-Many อาจจะเกิด duplicate record SELECT distinct b.* from book b, bclink bc, category c where b.book_id=bc.book_id and bc.cat_id=c.cat_id 3
  4. Boolean Search • Boolean search e.g. ( ยา | medical ) & general • ใช้ StringTokenizer(in,\"()|&!\",true); – Ignore space – convert | & ! to OR AND NOT – convert other to criteria e.g. book_name like ? – put final result in () 4
  5. Boolean Search • Validation – Invalid search input may cause exception – การตรวจสอบความถูกต้องของวงเล็บ Start from 0, open count increment, close count decrement • No -1 during checking • End up 0 – การตรวจสอบความถูกต้องอื่นๆ State checking 5
  6. Paging • หาจำานวน record – Select count(*) from .. หรือ – rs.last(); rs.getRow(); • การไปยังหน้าที่ต้องการ – ให้ npp คือ จำานวน record per page – ให้ page คือ หน้าที่ต้องการแสดง เริ่มต้น จาก 1.. 6
  7. Paging • การไปยังหน้าที่ต้องการ – หาก่อนว่าเริ่มต้นแสดง record ที่เท่าไหร่ – for(int i=0;i<(page-1)*npp && rs.next();i++){} – หรือ rs.absolute((page-1)*npp+1); • การวน Loop for(int i=0;i<npp && rs.next();i++){ 7
  8. Paging • หาว่ามีทั้งหมดกี่หน้า – ให้ numrow คือจำานวน record ทั้งหมด – (int)Math.ceil((float)numrow/npp); • การแสดง icon back, next – ให้ numpage คือจำานวนหน้าทั้งหมด – แสดง icon back หาก page>1 – แสดง icon next หาก page<numpage 8
  9. Data Formatting • Number เช่น price DecimalFormat df=new DecimalFormat(\"#,###.0000\"); • Date เช่น วันที่คืน วันที่ยืม SimpleDateFormat sf=new SimpleDateFormat(\"d/M/yyyy\"); sf.format(date); • ปกติ date format จะอิงกับ reginal ของ OS เช่น แสดงชือเดือนเป็นภาษาไทย ่ แสดงปีเป็น พุทธศักราช 9
  10. Data Formatting • การเปลี่ยน Locale ของการแสดงผล Date – Locale loc=new Locale(\"en\",\"US\"); – SimpleDateFormat sf=new SimpleDateFormat(\"d/M/yyyy\",loc); 10
  11. Data Formatting • String ปัญหาที่อาจเกิดขึ้น เช่น – จำานวนนักเรียน < ปัจจุบัน แต่จำานวน หนังสือ > ปัจจุบัน – <input value=\"She is \"Hero\"..\"> – <a href=\"book.jsp?name=Tom&Jerry\" • \"&\",\"<\",\">\",\"\\\"\",\"\\'\" เปลี่ยนเป็น \"&amp;\",\"&lt;\",\"&gt;\",\"&quot;\",\"&# 39;\" 11
  12. Data inputting • Number อาจมีการ input 1,000.25 ซึงจะผิด ่ format และเกิด Exception ควรตัด comma ออก • Date ใช้ function parse(input) ใน SimpleDateformat ร่วมกับ Calendar picker 12
  13. Parameter Roundtrip • Next, Back มี parameter อะไรบ้าง ต้องส่งต่อให้ครบ e.g. book.jsp? page=2&book_name=< %=request.getParameter(\"book_name\")&cat_id=< %=request.getParameter(\"cat_id\")%> • ระวังค่า Null ในกรณีที่ไม่มี Parameter • Submit แบบ GET ใช้ reqest.queryString(); และใช้ regular expression replace เฉพาะ page=xx 13
  14. Parameter Roundtrip • public static String chPage(int page,String url){ if(url.indexOf(\"?\")==-1) return url+\"?page=\" + page; else if(url.indexOf(\"?page=\")!=-1) return url.replaceFirst(\"[?]page=\\\\d+\",\"?page=\" + page); else return url.replaceFirst(\"[?]\",\"?page=\" + page + \"&\"); } • การ Edit แล้วกลับหน้าเดิม – request.getHeader(\"Referer\") เก็บไว้ใน Hidden Field แล้ว submit ไปพร้อมกับแบบฟอร์ม – หลังจาก Update แล้วกลับไปยังหน้าเดิม 14
  15. Connection Pooling • Tomcat http://tomcat.apache.org/tomcat-5.5- doc/jndi-datasource-examples- howto.html • Example • Context initContext = new InitialContext(); DataSource ds = (DataSource)initContext.lookup(jndiname); Connection conn=ds.getConnection(); 15
  16. Resource Controller • สร้าง Class ชื่อว่า ResourceCtrl • ทุกครั้งที่ get Connection, สร้าง Statement, execute Query ให้ทำาผ่าน Class นี้ Class นี้จะบันทึก connection, statement, resultset เก็บไว้ • การ close ให้ทำาผ่าน Class นีด้วย ้ Class นี้จะ mark เอาไว้ว่า object ไหน ถูก close แล้ว • สุดท้ายให้ class นีทำาการ close object ้ ทั้งหมดที่ยังไม่เคยถูก close ใน finally 16
  17. Object caching / pooling • ควร caching หรือ pooling หาก การ สร้าง object มี overhead ค่อนข้างสูง • Pooling ถ้า object เหมือนกันทุก ประการ ใช้แทนกันได้ แต่ใช้พร้อมกัน ไม่ได้ (เช่น connection) • Caching ถ้า object ไม่เหมือนกันทุก ประการ มีโอกาสที่จะถูกใช้ซำ้าๆ ใช้ พร้อมกันได้ – Oldest preemption ลบตัวที่เก่าที่สุดก่อน – Least Frequency preemption ลบตัวที่มี 17
  18. Personalization • แต่ละ Session จะมีการแสดงผลที่แตก ต่างกัน – Time zone – Language / Regional – Date format / Number format • การใช้ cookie หรือ Database เพื่อจำา ว่า user แต่ละคน ควรจะใช้ setting แบบใด 18
  19. Input validation • หากไม่มีการ validate อาจเกิด error หรือ exception ได้ • Client side validation สะดวกกับผูใช้ ไม่ ้ จำาเป็นต้อง submit ก่อนจึงจะทราบข้อผิด แต่มีโอกาสหลุดหาก browser disable JavaScript • Server side validation โอกาส หลุดน้อย แต่ ข้อเสียคือ จะต้อง recover ค่าที่ input ด้วย • การใช้ Java Script Library เพือลดงาน ่ • อย่าลืม cancel การ submit หาก validate แล้วไม่ผาน ่ 19
  20. Application configuration • web.xml <init-param> <param-name>xxx</param-name> <param-value>xxxx</param-value> </init-param> </servlet> config.getInitParameter(name); • ResourceBundle และ ไฟล์ *.properties สนับสนุน internationalization • Database / Text file, XML file 20
  21. File Upload • http://www.servlets.com/cos/ • http://commons.apache.org/fileupload/ • Multipart Content ใน HTTP POST • หลักการคือ save file ที่ upload ทั้งหมดใน temporary directory หลัง จากนั้นจึงย้ายไปยัง directory ที่ ต้องการ โดยอาจมีการเปลี่ยนชือไฟล์ ่ เช่น book_<book_id>.<extension> • การอ้างถึงสามารถทำาได้โดยใช้ ID 21
  22. File Upload • การ check extension ที่อนุญาต • การกำาหนด size ของการ upload ที่ อนุญาต • Unlimited file uploading – Table file_upload ประกอบด้วย file_id, table_name, table_id, group_name, extension – ใช้หน้า upload ร่วมกัน เขียน code ครั้ง เดียว • การไม่ต้องเก็บ Extension สามารถ 22
  23. Sending Email • http://java.sun.com/products/ javamail/ • Using SMTP Server • Unless you're using Java SE 6, you will also need the JavaBeans Activation Framework • http://java.sun.com/products/javabean s/jaf/index.jsp • Authentication 23
  24. Set Input Value • วิธีปกติ แทรก Code ลงใน input tag <input type=\"radio\" name=\"xx\" value=\"xx\" < %=(\"xx\".equals(val))?\"checked\":\"\"%>> หรือ <input type=\"radio\" name=\"xx\" value=\"xx\" <% if(\"xx\".equals(val)) out.print(\"checked\"); %>> • สามารถใช้ Java Script แทนได้ • Checkbox, Radio button ถือเป็น array ยกเว้นถ้ามีอันเดียว จะไม่ถือเป็น array 24
  25. Set Input Value function selectRadio(sObj,dVal){ if(sObj==null) return; if(isNaN(sObj.length)){ sObj.checked=true; return; } if(sObj.length>0) sObj[0].checked=true; for(var i=0;i<sObj.length;i++){ if(sObj[i].value==dVal){ sObj[i].checked=true; break; } } } 25
  26. Field Mapping • กำาหนดให้ parameter ขึ้นต้นด้วย ds_, dn_, dd_, dt_ สำาหรับ string, number, date, timestamp ตามลำาดับ • request.getParameterNames(); เพือดึง ่ ชือ parameter ทั้งหมด ่ • Build insert, update SQL โดยดูจาก ชือ parameter ่ 26
  27. Question & Answer 27