Home
Course
Service
Contact
About Us

 

 

 

 

 

 

 

 

 


Packages ใน JSP

เมื่อเราดูโค้ดจาวาที่ container สร้างให้ อาจเกิดคำถามเกี่ยวกับ packages ต่างๆที่โปรแกรมใช้ ซึ่งจะเพิ่มเติมมาจาก packages มาตรฐานทีเคยเห็นในโปรแกรมจาวาทั่วไป ถึงตอนนี้เรารู้จัก syntax ของสคริปต์กันแล้ว จึงน่าที่จะได้รู้จัก packages ต่างๆไว้ด้วยเพื่อที่จะได้สามารถเรียกใช้ได้ตามความต้องการ

ในชุดสำหรับการพัฒนา jsp จะมี packages ที่เป็น extension คือ javax โดยในส่วนที่เราสนใจนี้จะเป็นการ extend ลงมาเป็น javax.servlet ซึ่งก็จะมี api ต่างๆที่เราเห็นอยู่ใน source ข้างบนนั่นเองเช่น GenericServlet ,Servlet, ServletConfig, ServletContext, ServletException, ServletRequest, ServletResponse, ServletInputStream, ServletOutputStream เป็นต้น

ถัดจากชั้นของ servlet ก็จะมีการ extend ลงไปเป็นสองกลุ่มคือ javax.servlet.http และ javax.servlet.jsp ที่ใช้กันมากโดยเฉพาะในการเขียนสคริปต์ jsp นี้ก็คงเป็นกลุ่มหลัง คือ javax.servlet.jsp ซึ่งมี api ประกอบไปด้วย HttpJspPage, JspEngineInfo, JspFactory, JspPage, JspWriter และ PageContext ส่วนในกลุ่มของ javax.servlet.http คงยังไม่กล่าวถึงในที่นี้

หลังจากที่ได้เรียนรู้เกี่ยวกับ syntax ต่าง ๆ ของ JSP ชุด packages ที่สามารถเรียกใช้ และทำความเข้าใจสคริปต์แบบบรรทัดต่อบรรทัดกันแล้ว เรามาดูโครงสร้างของ JSP กันจากตัวอย่างต่อไป โดยให้บันทึกเป็น c:\jswdk\myexam\jsp\today.jsp

<%@page import="java.text.*,java.util.*" %>

<html>

<body>

<%

Date d=new Date();

String today=DateFormat.getDateInstance().format(d);

%>

Today is:

<em><%=today%></elm>

</body>

</html>

ถึงตอนนี้เราทราบแล้วว่า source file ที่มีนามสกุลเป็น jsp จะถูกคอมไพล์เป็น servlet ซึ่งช่วงของ translation phase นี้จะดำเนินการโดย jsp engine (ความจริงแล้วตัว jsp engine นี้เองก็เป็น servlet พิเศษตัวหนึ่งนั่นเอง) รายละเอียดต่างๆในช่วง translation phase เช่น source และ class เก็บไว้ที่ไหน หรืออะไรทำนองนี้ จะขี้นกับการ implement ในที่นี้เราใช้ jswdk เป็น container ก็จะสร้าง source สำหรับ class ให้ดังนี้


package myexam.jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import java.io.PrintWriter;

import java.io.IOException;

import java.io.FileInputStream;

import java.io.ObjectInputStream;

import java.util.Vector;

import com.sun.jsp.runtime.*;

import java.beans.*;

import com.sun.jsp.JspException;

import java.text.*;

import java.util.*;

public class today_jsp_1 extends HttpJspBase {

static char[][] _jspx_html_data = null;

public today_jsp_1( ) {

}

private static boolean _jspx_inited = false;

public final void _jspx_init() throws JspException {

ObjectInputStream oin = null;

int numStrings = 0;

try {

FileInputStream fin = new FileInputStream("work\\%3A8080%2Fmyexam\\
myexam.jsptoday.dat");

oin = new ObjectInputStream(fin);

_jspx_html_data = (char[][]) oin.readObject();

} catch (Exception ex) {

throw new JspException("Unable to open data file");

} finally {

if (oin != null)

try { oin.close(); } catch (IOException ignore) { }

}

}

public void _jspService(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

JspFactory _jspxFactory = null;

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

String _value = null;

try {

if (_jspx_inited == false) {

_jspx_init();

_jspx_inited = true;

}

_jspxFactory = JspFactory.getDefaultFactory();

response.setContentType("text/html");

pageContext = _jspxFactory.getPageContext(this, request, response,

"", true, 8192, true);

application = pageContext.getServletContext();

config = pageContext.getServletConfig();

session = pageContext.getSession();

out = pageContext.getOut();

out.print(_jspx_html_data[0]);

out.print(_jspx_html_data[1]);

// begin [file="C:\\jswdk\\myexam\\jsp\\today.jsp";from=(3,2);to=(6,0)]

Date d=new Date();

String today=DateFormat.getDateInstance().format(d);

// end

out.print(_jspx_html_data[2]);

// begin [file="C:\\jswdk\\myexam\\jsp\\today.jsp"; from=(8,7);to=(8,12)]

out.print(today);

// end

out.print(_jspx_html_data[3]);

} catch (Throwable t) {

if (out.getBufferSize() != 0)

out.clear();

throw new JspException("Unknown exception: ", t);

} finally {

out.flush();

_jspxFactory.releasePageContext(pageContext);

}

}

}

JSP page implementation class นี้จะ extends HttpJspBase ซึ่งก็จะ implements Servlet interface และให้สังเกตที่ method _jspService() ซึ่งมีหน้าที่ตอบสนอง request จาก client กระบวนการทำงานต่างๆ สามารถแสดงเป็น diagram เพื่อให้ดูง่ายขึ้นได้ดังรูป


JSP Acces Models
รูปแบบของ acces model ใน JSP มีสองอย่าง เรียกว่า model 1 และ model 2 โดยแบบแรกนั้นการทำงานจะเป็นไปอย่างง่ายๆซึ่งก็สามารถแยกส่วนของ presentation ออกจาก content ได้เหมือนกัน เพราะว่าการทำ data access ทั้งหมดจะใช้ Bean แต่ model1 นี้ก็ไม่เหมาะที่จะใช้งานกับระบบที่มีความซับซ้อนมากนัก JSP เพราะถ้าใช้ model นี้จะต้องมีโค้ดที่เป็น scriptlet มากเกินไป นอกจากนี้ แต่ละเพจยังต้องจัดการกับ เรื่องของ application state และการ verify authentication รวมทั้งระบบความปลอดภัยต่างๆเอง


สำหรับ model 2 ซึ่งบางทีเราจะเรียกว่า Model/View/Controller นั้น จะแยกส่วนที่เป็น presentation และ front component ออกจากกันอย่างเด็ดขาด โดยที่ส่วนของ front component ซี่งเป็น servlet (และบางทีก็จะเรียกว่า controller) จะไม่ต้องสนใจเรื่องของ presentation เลย มันจะจัดการเฉพาะเรื่องของ http request ทั้งหมดที่ขอเข้ามา และทำหน้าที่สร้าง Bean ให้ presentation component ใช้ด้วย ซี่งตรงนี้เป็นข้อดีดังที่กล่าวไว้แต่ต้นว่าทำให้เราสามารถแบ่งกลุ่มนักพัฒนาในโครงการออกเป็น designers และ developers ได้อย่างมีประสิทธิภาพ นอกจากนี้การที่มีจุดติดต่อกับ front components เพียงที่เดียว ทำให้ การจัดการกับเรื่องของ application state เรื่องระบบความปลอดภัย และการนำเสนอนั้นเป็นระบบและง่ายต่อการดูแล


ลงมือเขียนโปรแกรม

 



:: ศูนย์ฝึกอบรมบางปะกง การไฟฟ้าฝ่ายผลิตแห่งประเทศไทย 8/4 หมู่ 8 ตำบลท่าข้าม อำเภอบางปะกง จังหวัดฉะเชิงเทรา 24130 ::