JSP - Quick Reference

JSP Tag
Tag สำหรับ JSP ที่ใช้มีดังนี้

scriptlet - <% ... %> เป็นพื้นฐานของ JSP เลย เราสามารถเขียน code java ลงไปในนี้ได้
XML-compliant ที่ใช้แทน <% list.add("Fred"); %> จะเป็นดังนี้

<jsp:scriptlet>
list.add("Fred");
</jsp:scriptlet>

directive - <@% ...%>
DirectiveAttributeUsage
pagecontentTypeกำหนดการเข้ารหัสตัวอักษรหรือ MIME type ของ response ในกรณีที่ไม่ได้กำหนดค่าจะใช้ค่าจาก pageEncoding attribute

default = "text/html;charSet=ISO-8859-1"
importimport class อื่นเข้ามาใช้งาน

XML-compliant: <jsp:directive.page import="path/file" />
isThreadSafeถ้าเป็น "true" แปลว่า Servlet ที่ได้ หลังจาก translate JSP แล้วจะ implement SingleThreadModel เพื่อให้ Servlet เป็น thread safe (ซึ่งการทำงานจริงๆ ของ SingleThreadModel ขึ้นอยู่กับ Web Container แต่ละเจ้า จะ implement เป็นแบบไหน ซึ่งโดยลึกๆ แล้ว ไม่ค่อยได้ประโยชน์เท่าไร)
errorPageurl ของ exception page
isErrorPageบอกให้รู้ว่า JSP page ปัจจุบันเป็น errorPage หรือไม่ ถ้าเป็น "true" ก็จะมี implicit object exception ถ้าเป็น "false" ก็จะไม่สามารถใช้ object exception ใน page นี้ได้

default = "false"
isELIgnoredบอกว่าจะไม่สามารถใช้ Expression Language ใน JSP นี้ได้
languagedefine scripting language ที่ใช้ใน scriptlet และ declaration
default = Java
extendsกำหนด class ที่ JSP นี้จะ extend ซึ่งโดยปกติ จะึขึ้นอยู่กับ web containner ดังนั้นถ้าเราต้องการจะ extend ตัวอื่นจะต้องกำหนดไว้ แต่ควรจะแน่ใจจริงๆ ว่ามันทำงานได้นะจ๊ะ
sessionกำหนดว่าเอกสารนี้จะใช้ implicit object session หรือไม่ สามารถกำหนดเป็น session="false" ถ้าไม่ต้องการใช้ session

default = "true"
bufferควบคุมการใช้ buffer สำหรับ jsp ว่าต้องการ buffer หรือไม่ ค่าเริ่มต้นจะอยู่ที่ 3 KB
autoFlushเมื่อ buffer เต็มจะ cleart buffer ให้อัตโนมัติ

default = "true"
infoสามารถกำหนดเป็นค่า string ใดๆ ซึ่งจะเก็บไว้ใน servlet ที่ได้ translate จาก JSP และสามารถดึงขึ้นมาโดย Servlet.getServletInfo()
pageEncodingบอกว่า page JSP encode ด้วยรหัสอะไร ในกรณีที่ไม่กำหนดค่าจะใช้ค่าจาก contentType attribute

default = "ISO-8859-1"
includefileชื่อไฟล์ที่ต้องการนำมา include (ไฟล์ servlet ที่ได้จะเสมือนเอา included file มาแปะไว้กับ servlet เลย)
taglibtagdirdirectory ที่เก็บ tag file ไว้ (จะใช้ในกรณีที่ไม่ได้ declare tag file ไว้ใน tld)
prefixชื่อที่ใ้ช้ในการเรียก tag lib นี้ ซึ่งเป็นค่าอะไรก็ได้ ยกเว้น jsp, jspx, java, javax, servlet, sun, sunw
uriชื่อที่ต้องใช้ให้ตรงกับไฟล์ Tag Library Descriptor (TLD)
tag
*ใช้สำหรับ tag file เท่านั้น
importimport class อื่นเข้ามาใช้งาน
isELIgnoredบอกว่าจะไม่สามารถใช้ Expression Language ใน JSP นี้ได้
languagedefine scripting language ที่ใช้ใน scriptlet และ declaration

default = Java
body-contentมีค่าได้ดังนี้
  • scriptless - ไม่รับ JSP scriptlet แต่สามารถรับเป็น EL expression ได้
  • tagdependent - รับ body เสมือนว่าเป็น string
  • empty - ไม่รับ body
สังเกตว่า ไ่ม่มี JSP ในนี้ นั่นคือใน body ของ tag จะไม่สามารถเป็น scriptlet ไำด้
dynamic-attributesชื่อของ dynamic attribute ซึ่งจะรับเป็น HashMap เป็นชื่อและค่าของ attribute
attribute
*ใช้สำหรับ tag file เท่านั้น
nameชื่อของ attribute ที่รับเข้ามา
requiredเป็นค่า boolean เพื่อบอกว่าเป็น attribute ที่ต้องมีเสมอหรือไม่
rtexprvalueค่า boolean ที่บอกว่าจะ สามารถรับเป็น scriptlet ได้หรือไม่
variable
*ใช้สำหรับ tag file เท่านั้น
name-givenชื่อของตัวแปร
variable-classclass ของตัวแปร เช่น java.lang.String

expression - <%= ... %> ใช้แทน out.print() ในการแสดงผล
XML-compliant ที่ใช้แทน <%= it.next %> จะเป็นดังนี้

<jsp:expression>

it.next()
</jsp:expression>

declaration - <%! ... %> ใช้สำหรับ declare instance variable หรือ method
XML-compliant ที่ใช้แทน <%! int y = 3; %> จะเป็นดังนี้

<jsp:declaration>

int y = 3;
</jsp:declaration>

XML-compliant คือการทำให้ JSP page เป็น JSP document ความแตกต่างของสองอันนี้ก็คือ JSP document จะเป็น XML-compliant คือเป็น well-formed XML ซึ่งโดยปกติแล้ว เราจะไ่ม่ได้เขียน JSP document เอง แต่อาจจะใช้ tools ในการสร้างขึ้นมา ตัวอย่างอีก ตัวอย่างหนึ่งสำหรับ XML-compliant ก็คือการเขียน text บน JSP page ซึ่งจะใช้ตัวอย่างด้านล่างแทน

<jsp:text>

This is text.
<jsp:text>

สำหรับ comment สามารถใช้ comment ใน html คือ <!-- comment --> หรือใช้ JSP comment <% /* comment */ %> ก็ได้ แต่ถ้าใช้ html comment ข้อความก็จะถูกส่งไปที่ client เสมือนกับ html comment ทั่วไป แต่สำหรับ JSP comment จะถูกตัดทิ้งไปเมื่อ translate จาก JSP เป็น Servlet


JSP Implicit Object



APIImplicit ObjectUsed by Servlet
JspWriteroutresponse.getWriter()*
* it will get PrintWriter, not JspWriter
HttpServletRequestrequestrequest*
* depend on how to declare parameter name in service method
HttpServletResponseresponseresponse*
* depend on how to declare parameter name in service method
HttpSessionsessionrequest.getSession()
ServletContextapplicationgetServletContext()
ServletConfigconfiggetServletConfig()
Throwableexception
PageContextpageContextN/A
Object
pageN/A
page scope is not available in Servlet

tag file ก็สามารถใช้ implicit object ตัวเดียวกับ JSP file ได้เหมือนกัน ยกเว้น ServletContext ซึ่งใน tag file จะใช้เป็น jspContext ซึ่งเป็น JspContext object แทน และไม่สามารถใช้ application ซึ่งเป็น ServletContext object ได้

EL Implicit Object

Implicit ObjectUsed by Scriplet
${pageScope.name}N/A
page scope is not available in Servlet
${requestScope.name}request.getAttribute("name")
${sessionScope.name}session.getAttribute("name")
${applicationScope.name}application.getAttribute("name")
${param.name}request.getParameter("name")
${paramValues.name[index]}request.getParameterValues("name")[index]
${header.name}request.getHeader("name")
${headerValues.name[index]}
Enumeration headers
= request.getHeaders("name");
int i = 0;
while (headers.hasMoreElements()) {
if (i == index) {
String s = (String) headers.nextElement();
}
i++;
}
${cookie.name}
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
if ((cookies[i].getName()).equals("name")) {
Cookie s = cookies[i];
}
}
${initParam.name}application.getInitParameter("name")
${pageContext.name}pageContext.getName() เช่น pageContext.exception ซึ่งเป็นตัวแปรเดียวกับ exception ใน JSP Implicit Object ซึ่งจะสามารถ access ตัวแปรนี้ได้จะต้องกำหนดให้*
<%@ page isErrorPage="true" %>

*แต่ไปลองดูแล้วกับ Tomcat 6, Servlet 2.5 ปรากฎว่าถึงไม่ใส่ ก็สามารถ access ตัวแปรได้นะ ไม่แน่ใจเหมือนกัน

ซึ่ง pageScope, requestScope, sessionScope, applicationScope สามารถละไว้ได้ถ้าในกรณีที่เราไม่ต้องการระบุว่าจะใช้ attribute จาก scope ใด

${requestScope.person.name} --> ${person.name}

ยกเว้นถ้าในกรณีที่มี attribute ชื่อเดียวกันในหลาย scope และต้องการระบุว่าต้องการจาก scope ไหน หรือในกรณีที่ชื่อของ attribute ไม่เป็นไปตาม Java naming rule เช่น

request.setAttribute("foo.person", p); // ซึ่ง เราไม่สามารถใช้ ${foo.person.name} ได้

${requestScope["foo.person"].name}

EL Operation

Arimetic uses + , - , *, / or div, % or mod
Logical uses && or and, || or or, ! or not
Relational uses == or eq, != or ne, < or lt, > or gt, <= or le, >= or ge


EL Function

ใช้การกำหนด function ใน Tag Library Descriptor (TLD) file โดยเรียก public static method ใน class

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>1.2</tlib-version>
<short-name>NMTOKEN</short-name>

<uri>DiceFunction</uri>
<function>
<name>rollIt</name>
<function-class>com.amadmonster.scwcd.el.function.DiceRoller</function-class>
<function-signature>int rollDice()</function-signature>
</function>

<!-- สำหรับ function ที่รับตัวแปร -->
<function>
<name>rollWith</name>
<function-class>com.amadmonster.scwcd.el.function.DiceRoller</function-class>
<function-signature>int rollDice(int)</function-signature>
</function>
</taglib>

นอกจาก tld file จะประกอบด้วย EL Function แล้วยังสามารถใส่ custom tag ด้วย แต่จะกล่าวในตอน JSTL & Custom Tag ต่อไป

Standard Action
ActionAttributeUsage
jsp:useBeanidเป็น identifier ของ object โดยรับเป็น string name ของ JavaBean นั้นๆ ซึ่งจะแปลเป็น servlet โดยใช้ getAttribute หรือ setAttribute method ดังนั้นจึงเป็น case sensitive
scopeเป็น scope ที่ใช้ในการอ้างอิงถึง JavaBean นั้น มีค่าได้ดังนี้
  • page: ใช้ใน page นั้นๆ (default)
  • request: ใช้ในการ request ครั้งหนึ่งๆ เป็น attribute ของ request
  • session: ใช้ใน session นั้นๆ เหมือนกับ attribute ของ session
  • application: ใช้ได้ทุกๆ servlet เหมือนกับ attribute ของ applicationContext
default: page
classclass ของ bean ที่จะถูกสร้างขึ้นในกรณีที่ attribute นั้นๆ ไม่มีอยู่ใน scope ที่ ซึ่งไ่ม่สามารถกำหนดเป็น interface หรือ abstract class ได้

property นี้เป็น optional คือไม่จำเป็นต้องมีก็ได้ ซึ่งใช้ในกรณีที่เราต้องการดึงค่า attribute ขึ้นมาใช้ แต่ในกรณีที่ไม่มี attribute อยู่จะทำการสร้าง bean เพื่อจะ add attribute ก็จะ error InstantiationException
typeType ของ bean ในกรณีที่จะถูกสร้างขึ้น เมื่อไม่มีอยู่ใน scope ซึ่งอาจจะเป็นค่าเดียวกับ class property หรือว่าเป็น parent object ของ class property หรือว่าเป็น interface ก็ได้

ในกรณีที่ไม่ได้กำหนด จะถือว่าเป็นค่า default คือ เหมือนกับ class
beanNameชื่อของ Bean
jsp:setProperty

สามารถใส่ไว้ใน body ของ jsp:useBean ได้ กรณีที่ต้องการให้ set property เมื่อมีการสร้าง bean ใหม่ (ในกรณีที่มีอยู่แล้วจะไม่ set)
nameชื่อของ Bean (เป็นค่า property id ใน action jsp:useBean นั้นเอง) ที่เรา้้จะ set ค่า
propertyชื่อ property ที่เราต้องการจะ set ค่า ถ้าให้ค่าเป็น "*" คือ ให้ map ชื่อ property กับ parameter ของ request object ที่ชื่อตรงกัน
valueค่าที่จะ set ใหักับ property นั้นๆ (ถ้ามีการ set ค่าใช้กับ param attribute ก็จะต้องไม่มีการ set ค่ากับ value อีก
paramชื่อ parameter ที่จะให้ค่ากับ property นั้นๆ ในกรณีนี้จะไม่ใส่ property value หรือในกรณีที่ไม่ใส่ัทั้ง value และ param แสดงว่า param เป็นค่าเดียวกับ property (หรือให้ใช้ param ที่มีค่าเดียวกับ property สำหรับ set ค่า)
jsp:getPropertynameชือของ object Bean (ค่า property id ใน action jsp:useBean นั้นเอง) ที่เราต้องการจะรับค่า
propertyproperty ที่เราต้องการจะรับค่า
jsp:forwardpagerelative url ที่ต้องการ forward ไป ซึ่งจะเป็น JSP, servlet หรือ dynamic file อื่นๆ ก็ได้ ที่อยู่ใน application เดียวกัน
jsp:includepagerelative url ที่จะ include (jsp:include ให้ผลเหมือนกับ directive include แต่ว่าจะทำเมื่อ runtime สำหรับในกรณีที่ included file ยังมีการเปลี่ยนแปลงอยู่)
jsp:paramnameชื่อตัวแปรที่ต้องการ forward ไปพร้อมกับ jsp:forward หรือ jsp:include เช่น
<jsp:include page="Header.jsp">
<jsp:param name="subTitle"
value="Customized Title">

</jsp:include>
valueค่าของตัวแปรตามชื่อที่ต้องการส่ง
jsp:attributenameชื่อของ attribute ซึ่งตัวนี้มี body ด้วยเป็นค่าของ attribute เช่น
<jsp:attribute name="user">${userName}</jsp:attribute>
jsp:attribute สามารถใส่ใน custom tag body ได้ ถึงแม้ว่าจะกำหนด <body-content>empty</body-content>
jsp:doBody
*ใช้สำหรับ tag file เท่านั้น

สำหรับ tag file เพื่อดึงค่า body ของ tag


Reference:
JSP 2.0 Syntax Reference

No comments:

Post a Comment