KMUTNB - Internet Programming 7/7

1,818 views

Published on

Lecture for King Mongkut's University of Technology North Bangkok (KMUTNB) / Computer Science / Internet Programming Course by PHUPHA

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,818
On SlideShare
0
From Embeds
0
Number of Embeds
262
Actions
Shares
0
Downloads
30
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

KMUTNB - Internet Programming 7/7

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

×