|
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 เรื่องระบบความปลอดภัย และการนำเสนอนั้นเป็นระบบและง่ายต่อการดูแล

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