JSTL (ไลบรารีแท็กมาตรฐาน JSP)
ในบทช่วยสอน JSTL นี้ เราจะดูว่าการใช้แท็ก JSTL ที่แตกต่างกันจะทำให้การเขียนโค้ด JSP ง่ายขึ้นได้อย่างไร
JSTL คืออะไร Java?
เจเอสทีแอล ย่อมาจาก Java ไลบรารีแท็กมาตรฐานของหน้าเซิร์ฟเวอร์ และเป็นคอลเลกชันของไลบรารีแท็ก JSP ที่กำหนดเองซึ่งมีฟังก์ชันการพัฒนาเว็บทั่วไป JSTL เป็นไลบรารีแท็กมาตรฐานของ JSP
ข้อดีของ JSTL
ด้านล่างนี้เป็นข้อดีของ JSTL:
- แท็กมาตรฐาน: มีฟังก์ชันการทำงานแบบพกพาของเพจ JSP ที่หลากหลาย เป็นเรื่องง่ายสำหรับนักพัฒนาที่จะเข้าใจโค้ด
- รหัสเรียบร้อยและสะอาด: เนื่องจากสคริปต์ทำให้นักพัฒนาสับสน การใช้ JSTL จะทำให้โค้ดเรียบร้อยและสะอาดตา
- อัตโนมัติ Javaสนับสนุนการสอดส่องถั่ว: มีข้อได้เปรียบของ JSTL มากกว่าสคริปต์เล็ต JSP การจัดการภาษา JSTL Expression Javaรหัส Bean ได้อย่างง่ายดายมาก เราไม่จำเป็นต้องดาวน์คาสอ็อบเจ็กต์ซึ่งได้รับการดึงมาเป็นแอตทริบิวต์ที่กำหนดขอบเขต การใช้โค้ด JSP scriptlets จะซับซ้อน และ JSTL ได้ทำให้วัตถุประสงค์นั้นง่ายขึ้น
- ง่ายขึ้นสำหรับมนุษย์ในการอ่าน: JSTL มีพื้นฐานมาจาก XMLซึ่งคล้ายกับ HTML มาก ดังนั้นจึงเป็นเรื่องง่ายสำหรับนักพัฒนาที่จะเข้าใจ
- คอมพิวเตอร์เข้าใจได้ง่ายขึ้น: เครื่องมือเช่น Dreamweaver และหน้าแรกกำลังสร้างโค้ด HTML เพิ่มมากขึ้น เครื่องมือ HTML ทำหน้าที่จัดรูปแบบโค้ด HTML ได้เป็นอย่างดี รหัส HTML ผสมกับรหัสสคริปต์ เนื่องจาก JSTL แสดงเป็นแท็กที่สอดคล้องกับ XML จึงเป็นเรื่องง่ายสำหรับการสร้าง HTML ที่จะแยกวิเคราะห์โค้ด JSTL ภายในเอกสาร
แท็ก JSTL
แท็กหลักคือแท็กที่ใช้บ่อยที่สุดใน JSP พวกเขาให้การสนับสนุนสำหรับ
- การย้ำ
- ตรรกะเงื่อนไข
- จับข้อยกเว้น
- URL ไปข้างหน้า
- เปลี่ยนเส้นทาง ฯลฯ
ในการใช้แท็กหลัก เราจำเป็นต้องกำหนดไลบรารีแท็กก่อน และด้านล่างคือไวยากรณ์เพื่อรวมไลบรารีแท็ก
ไวยากรณ์ :
<%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core%>
ที่นี่
- คำนำหน้าสามารถใช้เพื่อกำหนดแท็กหลักทั้งหมดและ
- uri เป็นไลบรารีของ taglib ที่ใช้นำเข้า
มาดูแท็กหลักบางส่วนโดยละเอียด
1. ออก
- ผลลัพธ์ของการแสดงออกจะแสดงในแท็ก out
- สามารถหลีกเลี่ยงแท็ก XML ได้โดยตรง ดังนั้นจึงไม่ได้รับการประเมินว่าเป็นแท็กจริง
ไวยากรณ์:
<c:out value="" default="" escapeXML="">
- ค่านี้แสดงถึงข้อมูลไปยังเอาต์พุตและเป็นค่าบังคับ
- ค่าเริ่มต้นคือความล้มเหลวในการส่งออกข้อมูล และไม่บังคับ
- escapeXML – เป็นจริงหากหลบหนีอักขระ XML
ตัวอย่าง:
Coretag_jsp1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP1</title> </head> <body> </body> </html>
คำอธิบายของรหัส:
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมด และคำนำหน้าที่เพิ่มคือ 'c' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับคอร์แท็กทั้งหมดได้
รหัสบรรทัด 12: ที่นี่เรากำลังใช้ coretag พร้อมกับคำนำหน้า "c" และส่วนนี้จะพิมพ์ค่าในแท็กนิพจน์ ดังนั้นผลลัพธ์จะเป็นชื่อ
เมื่อคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ต่อไปนี้:
Output:
- เราได้รับค่าเป็นชื่อจากแท็กหลัก "out" ซึ่งจะพิมพ์ในสตรีมเอาต์พุต
2. จับ
- โดยจะตรวจจับข้อยกเว้นที่สามารถโยนได้ซึ่งเกิดขึ้นในร่างกายและแสดงเป็นเอาต์พุต
- ใช้สำหรับจัดการกับข้อผิดพลาดและตรวจจับข้อผิดพลาด
ไวยากรณ์:
<c:catchvar="">
ในที่นี้ var แสดงถึงชื่อของตัวแปร ซึ่งจะเก็บข้อยกเว้นที่สามารถส่งได้
ตัวอย่าง:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP2</title> </head> <body> <c:catch var="guruException"> <% int num = 10/0; %> </c:catch> The Exception is : ${guruException} </body> </html>
คำอธิบายของรหัส:
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมดและคำนำหน้าที่เพิ่มคือ 'c' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับ coretags ทั้งหมด
รหัสบรรทัด 11-13: Coretag catch ใช้เพื่อตรวจจับข้อยกเว้นและพิมพ์ข้อยกเว้น ที่นี่ข้อยกเว้นจะเกิดขึ้นเมื่อ 10/0 และข้อยกเว้นนั้นมีชื่อ "guruException"
รหัสบรรทัด 14: เรากำลังพิมพ์ "guruException"
เมื่อคุณรันโค้ด คุณจะได้รับผลลัพธ์ต่อไปนี้:
Output:
- เราได้รับ Arithmetic Exception เป็น /by ศูนย์ และมันถูกพิมพ์ในเอาต์พุตโดยใช้ตัวแปร “guruException”
3 นำเข้า
- เราสามารถนำเข้าเนื้อหาไฟล์อื่นลงในหน้า JSP ได้เหมือนที่เราทำ JSP รวมถึงการดำเนินการ.
- ที่นี่เราสามารถรวม URL และเนื้อหาจะแสดงบนเพจนั้นได้
ไวยากรณ์:
<c:importvar="" uri="">
ที่นี่ var คือชื่อตัวแปรซึ่งเป็นตัวระบุที่จะเก็บชื่อไฟล์/uri โดยที่ uri คือชื่อไฟล์สัมพันธ์หรือ uriname
coretag_jsp31.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP 31</title> </head> <body> <c:import var="displayfile" url="coretag_jsp32.jsp"> </c:import> <c:out value="${displayfile}"/> </body> </html>
Coretag_jsp32.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a>The file is diplayed after importing</a> </body> </html>
คำอธิบายของรหัส:
Coretag_jsp31.jsp
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมดและคำนำหน้าที่เพิ่มคือ 'c' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับ coretags ทั้งหมด
รหัสบรรทัด 11-12: ที่นี่เรากำลังนำเข้าไฟล์ coretag_jsp32.jsp ลงในไฟล์นี้โดยใช้แท็กนำเข้า
รหัสบรรทัด 13: ที่นี่เรากำลังพิมพ์ไฟล์ coretag_jsp32.jsp โดยใช้แท็ก out
เมื่อคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ดังต่อไปนี้
Output:
- Coretag_jsp32 ถูกพิมพ์ในเอาต์พุตเนื่องจากไฟล์นี้ถูกอิมพอร์ตใน coretag_jsp31.jsp
4.สำหรับแต่ละคน
- ใช้เพื่อวนซ้ำจำนวนองค์ประกอบในชุดคำสั่ง
- มันเหมือนกับก Java forloop.
ไวยากรณ์:
<c:forEach var="" begin="" end="">
- ในที่นี้ var แสดงถึงชื่อตัวแปรที่จะเก็บชื่อตัวนับ
- Begin แสดงถึงมูลค่าเริ่มต้นของตัวนับ
- End จะแสดงมูลค่าสิ้นสุด
ตัวอย่าง:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP4</title> </head> <body> <c:forEach var="gurucount" begin="5" end="10"> <c:out value="${gurucount}"/> </c:forEach> </body> </html>
คำอธิบายของรหัส:
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมดและคำนำหน้าที่เพิ่มคือ 'c' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับ coretags ทั้งหมด
รหัสบรรทัด 11-13: ที่นี่เราใช้ลูป “forEach” โดยที่ชื่อตัวแปรคือ “gurucount” ซึ่งเริ่มนับเป็น 5 และสิ้นสุดนับเป็น 10 เรากำลังพิมพ์ตัวแปร gurucount ซึ่งมีตัวเลขตั้งแต่ 5 ถึง 10
เมื่อคุณรันโค้ด คุณจะได้รับผลลัพธ์ดังต่อไปนี้
Output:
- ผลลัพธ์ที่เราได้รับคือเริ่มจาก 5 ถึง 10
5 ถ้า
- มันถูกใช้สำหรับ การทดสอบ เงื่อนไข
- หากใช้แท็กเพื่อทดสอบเงื่อนไขว่าเป็นจริงหรือไม่ตามนี้ บล็อกของโค้ดจะถูกดำเนินการ
ไวยากรณ์:
<c:if test="${condition}></c:if>
หากเงื่อนไขเป็นจริง ชุดคำสั่งต่างๆ จะถูกดำเนินการ
ตัวอย่าง:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP5</title> </head> <body> <c:set var="count" value="100"/> <c:if test="${count == 100}"> <c:out value="The count is 100"/> </c:if> </body> </html>
คำอธิบายของรหัส:
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมดและคำนำหน้าที่เพิ่มคือ 'c' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับ coretags ทั้งหมด
รหัสบรรทัด 11: ที่นี่เรากำลังตั้งค่าตัวแปรที่มีชื่อว่านับถึง 100
รหัสบรรทัด 12-14: ที่นี่เราใช้เงื่อนไข "if" โดยที่เราจะตรวจสอบว่าจำนวนนับเท่ากับ 100 หรือไม่ หากเท่ากับ 100 เราจะได้ผลลัพธ์เป็น "จำนวนนับเท่ากับ 100"
เมื่อคุณรันโค้ดข้างต้น คุณจะได้รับผลลัพธ์ดังต่อไปนี้
Output:
- เนื่องจากเงื่อนไข "if" เป็นจริง เราจะได้ผลลัพธ์เป็น "จำนวนคือ 100"
6. เปลี่ยนเส้นทาง
- ใช้สำหรับเปลี่ยนเส้นทางหน้าปัจจุบันไปยัง URL อื่นโดยระบุ URL ที่เกี่ยวข้องของแท็กนี้
- รองรับ URL ที่สัมพันธ์กับบริบท
ไวยากรณ์:
<c:redirect url="" context=""/>
ที่นี่ url คือ URL ที่เกี่ยวข้องซึ่งจะต้องเปลี่ยนเส้นทางและชื่อบริบทของแอปพลิเคชันเว็บในเครื่อง
ตัวอย่าง:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP6</title> </head> <body> <c:redirect url="/"/> </body> </html>
คำอธิบายของรหัส:
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมดและคำนำหน้าที่เพิ่มคือ 'c' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับ coretags ทั้งหมด
รหัสบรรทัด 11: ที่นี่เราใช้ “แท็กเปลี่ยนเส้นทาง” โดยที่เราระบุชื่อ URL และเมื่อเราคลิกที่หน้านั้น มันจะเปลี่ยนเส้นทางไปยังไซต์ที่ได้รับการกำหนดให้เปลี่ยนเส้นทาง
เมื่อคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ดังต่อไปนี้:
Output:
- เราได้รับ URL เอาต์พุต guru99.com ซึ่งเปลี่ยนเส้นทางโดย coretag_jsp6.jsp
แท็กที่กำหนดเอง JSTL
- มันเป็นสิ่งที่ผู้ใช้กำหนด JSP องค์ประกอบภาษา
- เมื่อ JSP ถูกแปลเป็นเซิร์ฟเล็ต แท็กที่กำหนดเองจะถูกแปลงเป็นคลาสที่ดำเนินการกับอ็อบเจ็กต์ และถูกเรียกว่าเป็นตัวจัดการแท็ก
- การกระทำเหล่านั้นเมื่อมีการดำเนินการเซิร์ฟเล็ตจะถูกเรียกใช้โดยเว็บคอนเทนเนอร์
- ในการสร้างแท็กแบบกำหนดเองที่ผู้ใช้กำหนด เราจำเป็นต้องสร้างตัวจัดการแท็กซึ่งจะขยาย SimpleTagSupport และต้องแทนที่เมธอด doTag()
- เราจำเป็นต้องสร้าง TLD โดยที่เราต้องแมปไฟล์คลาสใน TLD
ข้อดีของแท็กที่กำหนดเองใน JSP
นี่คือข้อดีของแท็กที่กำหนดเองใน JSP:
- พกพา: การดำเนินการที่อธิบายไว้ในไลบรารีแท็กจะต้องสามารถใช้ได้ในคอนเทนเนอร์ JSP ใดๆ
- ง่าย: ผู้ใช้ที่ไม่มีความรู้ความสามารถจะต้องสามารถเข้าใจและใช้กลไกนี้ได้ ผู้จำหน่ายฟังก์ชัน JSP จะต้องพบว่าการทำให้กลไกนี้พร้อมใช้งานสำหรับผู้ใช้ในรูปแบบการดำเนินการนั้นเป็นเรื่องง่าย
- การแสดงออก: กลไกจะต้องรองรับการดำเนินการที่หลากหลาย รวมถึงการดำเนินการซ้อนกัน องค์ประกอบสคริปต์ภายในเนื้อหาการดำเนินการ การสร้าง การใช้งาน และการอัปเดตตัวแปรสคริปต์
- ใช้งานได้จากภาษาสคริปต์ที่แตกต่างกัน: แม้ว่าข้อกำหนด JSP ในปัจจุบันจะกำหนดเฉพาะความหมายของสคริปต์ใน Java ภาษาการเขียนโปรแกรม เราต้องการปล่อยให้ความเป็นไปได้ของภาษาสคริปต์อื่น ๆ
- สร้างขึ้นจากแนวคิดและเครื่องจักรที่มีอยู่: เราไม่อยากสร้างสิ่งที่มีอยู่แล้วขึ้นมาใหม่ นอกจากนี้ เรายังต้องการหลีกเลี่ยงความขัดแย้งในอนาคตเมื่อใดก็ตามที่เราสามารถคาดการณ์ได้
ไวยากรณ์:
พิจารณาว่าเรากำลังสร้างแท็ก testGuru และเราสามารถใช้คลาส taghandlertestTag ซึ่งจะแทนที่เมธอด doTag()
<ex:testGuru/> Class testTag extends SimpleTagSupport{ public void doTag()}
นอกจากนี้ เราจะต้องแมปคลาส testTag นี้ใน TLD (Tag Library Descriptหรือ) เนื่องจากคอนเทนเนอร์ JSP จะสร้างการแมประหว่างไฟล์คลาสและ uri ที่ได้รับการกล่าวถึงในไฟล์ TLD โดยอัตโนมัติ
อินเทอร์เฟซแท็ก JSP
- คลาสนี้จะต้องขยายคลาส SimpleTagSupport
- คลาสนี้จะต้องแทนที่เมธอด doTag() ซึ่งเป็นส่วนหนึ่งของคลาส SimpleTagSupport (การแทนที่เป็นเมธอดที่สืบทอดมาจากคลาสพาเรนต์)
- อินเทอร์เฟซนี้เป็นอินเทอร์เฟซย่อยของอินเทอร์เฟซ JSPTag
- โดยมีวิธีการดำเนินการที่จุดเริ่มต้นและจุดสิ้นสุดของแท็ก
- นอกจากนี้ เราจำเป็นต้องแมปคลาสนี้ใน TLD เช่น Tag Library descriptor
เรากำลังพิจารณาตามตัวอย่างด้านล่าง
วิธีการติดต่อแท็ก
- doTag() เป็นวิธีการที่เราต้องแทนที่ซึ่งจะมีเนื้อหาสำหรับแท็ก
- ใช้บริบท JSP ปัจจุบันโดยใช้ getJSPContext()
ตัวอย่าง:
กำหนดเองtag_jsp1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Custom Tag</title> </head> <body> <ex:guruTag/> </body> </html>
กำหนดเอง.tld
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Test TLD</short-name> <tag> <name>guruTag</name> <tag-class>demotest.guruTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
guruTag.java(TagHandler)
package demotest; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class guruTag extends SimpleTagSupport{ public void doTag() throws JspException,IOException { JspWriter out = getJspContext().getOut(); out.println("Guru Tag"); } }
คำอธิบายของรหัส:
guruTag.java(TagHandler)
รหัสบรรทัด 6:คลาส guruTag กำลังขยายคลาส SimpleTagSupport ที่มีอยู่ใน jar javax.servlet.JSP
รหัสบรรทัด 7: ที่นี่เรากำลังเอาชนะเมธอด doTag() ซึ่งส่ง JspException และ IOException
รหัสบรรทัด 9-10: ในวิธีนี้ โค้ดจะถูกฝังลงในแท็กที่กำหนดเองซึ่งจะถูกเรียก เรากำลังรับวัตถุของ JspWriter และนั่นจะพิมพ์ "Guru Tag"
กำหนดเอง.tld
รหัสบรรทัด 6: ชื่อของแท็กที่กำหนดเองในที่นี้คือ "guruTag"
รหัสบรรทัด 7:คลาสแท็กคือ taghandlerclass เช่น guruTag.java ใช้เส้นทางแบบเต็มของไฟล์ตัวจัดการซึ่งรวมถึงเส้นทางไดเรกทอรีของตำแหน่งของไฟล์
กำหนดเองtag_jsp1.jsp
รหัสบรรทัด 3: คำนำหน้า taglib นี้จำเป็นสำหรับแท็กทั้งหมด และคำนำหน้าที่เพิ่มคือ 'ex' ดังนั้นจึงสามารถใช้เป็นคำนำหน้าสำหรับ coretags ทั้งหมดได้ และ uri คือ custom.tld ซึ่งแมปตัวจัดการแท็ก
รหัสบรรทัด 11: ที่นี่เรากำลังกำหนดแท็กที่กำหนดเอง "guruTag" ซึ่งจะเรียกเมธอดคลาสตัวจัดการ doTag() และโค้ดภายในนั้นจะถูกดำเนินการ
เมื่อคุณรันโค้ดข้างต้น คุณจะได้รับผลลัพธ์ดังต่อไปนี้
Output:
- เราได้รับเอาต์พุตเป็น “GuruTag” จาก guruTag.java เช่น TagHandler ซึ่งจะแทนที่เมธอด doTag() และพิมพ์ “Guru Tag” เป็นเอาต์พุต
สรุป
- ในส่วนนี้ เราได้เรียนรู้เกี่ยวกับไลบรารีแท็กมาตรฐาน JSP ซึ่งเราใช้แท็กหลักและแท็กที่กำหนดเอง
- แท็กหลัก ได้แก่ แท็ก for, if, redirect, import และ catch ซึ่งเป็นแท็กที่ใช้เพื่อวัตถุประสงค์พื้นฐานใน JSP
- นอกจากนี้ เรายังสร้างแท็กแบบกำหนดเองซึ่งเราสามารถกำหนดแท็กและใช้ใน JSP ได้