|
ลงมือเขียนโปรแกรม
หลังจากรู้จักพื้นฐานของ
syntax โครงสร้างการทำงานต่างๆพอสมควรแล้ว เราจะลองเขียนโปรแกรมเพื่อหาประสบการณ์เพิ่มเติมตัวอย่างต่อไปจะเป็นการเขียน
jsp ให้ทำงานในลักษณะของ script ขึ้นมาบ้างเล็กน้อย เช่นให้มีการทำ
loop , ทำการคำนวนหาค่า factorial เป็นต้น
สำหรับไฟล์แรกนี้
ให้บันทึกเป็น c:\jswdk\myexam\jsp\count.jsp
<HTML>
<HEAD>
<TITLE>แสดง
ตัวเลข 1 ถึง 10</TITLE>
</HEAD>
<BODY>
<%!
public int i; %>
<%
for (i=0;i<10;i++) { %>
<%=(i+1)
%> <BR>
<%
}%>
</BODY>
</HTML>
ส่วนไฟล์นี้
สังเกตว่า จะใช้เทคนิคการเขียนโปรแกรมแบบ recursive ด้วย ให้บันทึกเป็น
c:\jswdk\myexam\jsp\fact.jsp
<%--
ตัวอย่างแสดงการใช้งาน JSP ช่วยคำนวนค่า factorial --%>
<html>
<body>
<%!
public long fact (long x)
{
if (x==0)
return
1;
else
return
x * fact(x-1);
} %>
<%=
fact(7) %>
</body>
</html>
JSP
Implicit Objects
โดยปกติ
เมื่อไรก็ตามที่เราต้องการเรียกใช้คลาสบางคลาส เราจะต้องทำการ import
โดยใช้ page directive แล้วทำการเรียกใน Scriptlet ยกตัวอย่างเช่น
<%@
page import="java.util.Date" %>
...
<% Date rightNow = new Date() %>
...
บางครั้งในการเขียน
JSP จะมีคลาสบางคลาสที่เราใช้บ่อย เช่น XXXOutputStream, HttpSession
หรือคลาสบางคลาสที่เราไม่สามารถเรียกใช้ได้โดยตรงจากการ import เช่น
HttpServletRequest, HttpServletResponse ดังนั้น JSP จึงช่วยอำนวยความสะดวกโดยให้เราสามารถเรียก
object ของคลาสดังกล่าวออกมาใช้ได้เลย โดยไม่ต้องมีการประกาศตัวแปรก่อน
(ใช้ได้ใน Scriptlet และ Expression) คลาสพวกนี้เราเรียกว่า predifined
variables หรือ implicit objects
ใน JSP 1.1 Specification มี implicit objects ที่เราสามารถเรียกใช้ได้คือ
Implicit
Objects
request
javax.servlet.ServletRequest
คือ request ออบเจคที่เก็บรายละเอียดต่าง ๆ ที่ถูกส่งมาจาก client
ซึ่งรวมไปถึง parameters ที่มาจาก GET/POST ในกรณีของ Http ด้วย
response
javax.servlet.ServletResponse
คือ ออบเจคที่ใช้ส่งผลกลับไปยัง client
pageContext
javax.servlet.jsp.PageContext
คุณสมบัติต่าง ๆ ของ JSP page จะถูกเปลี่ยนแปลงได้โดยใช้ออบเจคนี้
session
javax.servlet.http.HttpSession
คือ session ออบเจคของ client ที่ส่ง request มา
application
javax.servlet.ServletContext
คือ ออบเจคที่เก็บรายละเอียดที่เกี่ยวกับ environment ที่ JSP page
อยู่
out
javax.servlet.jsp.JspWriter
คือ ออบเจค OutputStream ที่ JSP page ใช้ส่งผลกลับไปยัง client (จะเชื่อมต่อเข้ากับ
response ออบเจคอีกทีหนึ่ง) ซึ่งอาจอยู่ในรูปของ PrintWriter หรือ
JspWriter
config
javax.servlet.ServletConfig
คือ ออบเจคที่เก็บค่า setting ต่าง ๆ ของ JSP page
page
คือ ตัว JSP page ออบเจค ซึ่งก็คือ this คีย์เวิร์ดในจาวานั่นเอง
exception
java.lang.Throwable
คือ uncaught exception ออบเจคที่ใช้กับ error page ที่ถูกใส่ไว้ใน
page directive เช่น <@page errorPage="myErrorPage.jsp"
%>
1) request
คือ object ที่เป็น instance ของ ServletRequest ซึ่งถ้าใช้ใน Http
ก็จะเป็น HttpServletRequest. เราสามารถใช้ request ในการอ่านค่า parameters
ต่าง ๆ ที่ส่งมาโดย GET หรือ POST จาก client โดยการใช้ request.getParameter(...)
หรืออ่านค่าอื่น ๆ เช่น Header โดยใช้ API ที่มีอยู่ใน HttpServletRequest.
2) response คือ ServletResponse ที่ใช้ในการส่งค่าต่าง ๆ กลับไปที่
client โดยผ่านทาง OutputStream ซึ่งอยู่ในรูปของ PrintWriter หรือ
JspWriter
3) pageContext คือ object ที่เก็บฟังค์ชั่นต่าง ๆ ที่ใช้ในการเรียก
features ของ JSP Container ซึ่งจะไม่เหมือนกันในแต่ละตัว มาเชื่อมกับ
JSP ไฟล์ เพื่อเพิ่มประสิทธิภาพในการรัน
4) session คือ HttpSession ของ client ที่ส่ง request มา ซึ่งจริง
ๆ แล้วเราสามารถเรียก object นี้มาโดยผ่านทาง request.getSession(...)
ก็ได้
5) applicaion คือ ServletContext ที่เก็บค่าต่าง ๆ ของ environment
ที่ไฟล์ JSP นี้อยู่
6) out คือ PrintWriter หรือ JspWriter (Buffered version of PrintWriter)
ที่ใช้ในการพิมพ์ text output ออกไปยัง client โดยผ่านทาง response
อีกทีหนึ่ง
7) config คือ ServletConfig ที่เก็บค่า setting ต่าง ๆ สำหรับไฟล์
JSP
8) page คือ this ที่ใช้แทนตัวของไฟล์ JSP เอง (ไม่ค่อยมีประโยชน์มากนัก)
9) exception คือ Throwable interface ที่ใช้ส่งค่า error ต่าง ๆ ไปยัง
error page
* สำหรับรายละเอียดในการใช้
implicit object แต่ละตัว ให้หาอ่านเพิ่มเติมจาก API ของ object นั้น
ๆ
ตัวอย่างการใช้
Implicit objects
เขียน
JSP code ตามตัวอย่างข้างล่าง แล้วปันทึกเป็นไฟล์ implicitobjs.jsp
<%@ page session="true" %>
<%! public static final String LIGHT_YELLOW = "#d6d6ad";
%>
<%! public static final String VIOLET = "#6d6dda";
%>
<html>
<head><title>Implicit objects</title></head>
<body bgcolor="#FFFFFF">
<% out.println("Query String: " +
request.getQueryString()); %>
<br>
You got mail, i got
<% String milk = request.getParameter("milk");
if ( milk != null ) { %>
<b> MILK : )~~~ <b>
<% } else { %>
<b> Nothing : ( <b>
<% } %>
<hr>
<p>
<%
String bgColor = (String) session.getValue("bgColor");
if (bgColor == null) {
bgColor = LIGHT_YELLOW;
}
%>
<table border="1" cellspacing="0" cellpadding="1">
<tr>
<td align="center" bgcolor="<%= bgColor %>"
width=30%>bgColor=<%= bgColor %></td>
<td width=70% nowrap>SessionId = <%= session.getId() %></td>
</tr>
</table>
<%
if (bgColor.equals(LIGHT_YELLOW)) {
bgColor = VIOLET;
} else {
bgColor = LIGHT_YELLOW;
}
session.putValue("bgColor", bgColor);
%>
</body>
</html>
เมื่อทำการรัน
ให้ทำการเปรียบเทียบผลที่ได้จาก URL สองอันข้างล่างนี้ และพยายามกด
refresh หรือ reload หลาย ๆ ครั้ง
1) http://127.0.0.1:8080/myexam/jsp/implicitobjs.jsp
2)* http://127.0.0.1:8080/myexam/jsp/implicitobjs.jsp?milk=1
*เพราะไฟล์
JSP ก็คือ Servlet ดังนั้นเราสามารถส่ง query ไปให้โดยใช้ GET/POST
ได้เช่นกัน ซึ่งในกรณีของเรา เราจะส่ง Name-Value pair ที่ชื่อ milk
JSP
Actions
|