JSP Programming Technics
Basic knowledge JSP
(Required before studying WebX Framework)
- Web Programming
- Web Application Architechture & HTTP Protocol
- HTML Basic / Cascade Style Sheet
- Cascade Style Sheet / Java Script / DOM
- JSP Basic
- JSP and DB Programming (JDBC)
- JSP Programming Technics
- JSP Programming Technique By: Mr. PHUPHA PUNYAPOTASAKUL (ภูผา ปัญญาโพธาสกุล)
- Searching Basic concept: Build SQL based on input criteria prod_name like ? and cat_id=? เติม AND หรือไม่เติม boolean is_first=true; 2
- 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
- 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
- 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
- Paging หาจำานวน record Select count(*) from .. หรือ rs.last(); rs.getRow(); การไปยังหน้าที่ต้องการ ให้ npp คือ จำานวน record per page ให้ page คือ หน้าที่ต้องการแสดง เริ่มต้น จาก 1.. 6
- 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
- Paging หาว่ามีทั้งหมดกี่หน้า ให้ numrow คือจำานวน record ทั้งหมด (int)Math.ceil((float)numrow/npp); การแสดง icon back, next ให้ numpage คือจำานวนหน้าทั้งหมด แสดง icon back หาก page>1 แสดง icon next หาก page<numpage 8
- 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
- Data Formatting การเปลี่ยน Locale ของการแสดงผล Date Locale loc=new Locale(\"en\",\"US\"); SimpleDateFormat sf=new SimpleDateFormat(\"d/M/yyyy\",loc); 10
- Data Formatting String ปัญหาที่อาจเกิดขึ้น เช่น จำานวนนักเรียน < ปัจจุบัน แต่จำานวน หนังสือ > ปัจจุบัน <input value=\"She is \"Hero\"..\"> <a href=\"book.jsp?name=Tom&Jerry\" \"&\",\"<\",\">\",\"\\\"\",\"\\'\" เปลี่ยนเป็น \"&\",\"<\",\">\",\""\",\"&# 39;\" 11
- Data inputting Number อาจมีการ input 1,000.25 ซึงจะผิด ่ format และเกิด Exception ควรตัด comma ออก Date ใช้ function parse(input) ใน SimpleDateformat ร่วมกับ Calendar picker 12
- 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
- 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
- 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
- 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
- Object caching / pooling ควร caching หรือ pooling หาก การ สร้าง object มี overhead ค่อนข้างสูง Pooling ถ้า object เหมือนกันทุก ประการ ใช้แทนกันได้ แต่ใช้พร้อมกัน ไม่ได้ (เช่น connection) Caching ถ้า object ไม่เหมือนกันทุก ประการ มีโอกาสที่จะถูกใช้ซำ้าๆ ใช้ พร้อมกันได้ Oldest preemption ลบตัวที่เก่าที่สุดก่อน Least Frequency preemption ลบตัวที่มี 17
- Personalization แต่ละ Session จะมีการแสดงผลที่แตก ต่างกัน Time zone Language / Regional Date format / Number format การใช้ cookie หรือ Database เพื่อจำา ว่า user แต่ละคน ควรจะใช้ setting แบบใด 18
- Input validation หากไม่มีการ validate อาจเกิด error หรือ exception ได้ Client side validation สะดวกกับผูใช้ ไม่ ้ จำาเป็นต้อง submit ก่อนจึงจะทราบข้อผิด แต่มีโอกาสหลุดหาก browser disable JavaScript Server side validation โอกาส หลุดน้อย แต่ ข้อเสียคือ จะต้อง recover ค่าที่ input ด้วย การใช้ Java Script Library เพือลดงาน ่ อย่าลืม cancel การ submit หาก validate แล้วไม่ผาน ่ 19
- 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
- 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
- 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
- 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
- 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
- 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
- Field Mapping กำาหนดให้ parameter ขึ้นต้นด้วย ds_, dn_, dd_, dt_ สำาหรับ string, number, date, timestamp ตามลำาดับ request.getParameterNames(); เพือดึง ่ ชือ parameter ทั้งหมด ่ Build insert, update SQL โดยดูจาก ชือ parameter ่ 26
- Question & Answer 27
