JSP คืออะไร? บทนำสู่ JavaServer Pages

JavaServer Pages (JSP) เป็นเทคโนโลยีมาตรฐาน Java ที่ช่วยให้คุณสามารถเขียนไดนามิกเพจที่ขับเคลื่อนด้วยข้อมูลสำหรับเว็บแอ็พพลิเคชัน Java ของคุณ JSP สร้างขึ้นจากข้อมูลจำเพาะ Java Servlet โดยทั่วไปเทคโนโลยีทั้งสองจะทำงานร่วมกันโดยเฉพาะในเว็บแอปพลิเคชัน Java รุ่นเก่า จากมุมมองของการเข้ารหัสความแตกต่างที่ชัดเจนที่สุดระหว่างสิ่งเหล่านี้คือด้วย servlets ที่คุณเขียนโค้ด Java แล้วฝังมาร์กอัปฝั่งไคลเอ็นต์ (เช่น HTML) ลงในโค้ดนั้นในขณะที่ JSP คุณเริ่มต้นด้วยสคริปต์ฝั่งไคลเอ็นต์หรือมาร์กอัปจากนั้นฝัง แท็ก JSP เพื่อเชื่อมต่อเพจของคุณกับแบ็กเอนด์ Java

JSP ยังเกี่ยวข้องอย่างใกล้ชิดกับ JSF (JavaServer Faces) ซึ่งเป็นข้อกำหนด Java สำหรับการสร้างเว็บแอปพลิเคชัน MVC (model-view-controller) JSP เป็นเทคโนโลยีที่ค่อนข้างง่ายและเก่ากว่า JSF ซึ่งเป็นมาตรฐานสำหรับเว็บเฟรมเวิร์กของ Java เช่น Eclipse Mojarra, MyFaces และ PrimeFaces แม้ว่าจะไม่ใช่เรื่องแปลกที่จะเห็น JSP ใช้เป็นส่วนหน้าสำหรับแอปพลิเคชัน JSF รุ่นเก่า แต่ Facelets เป็นเทคโนโลยีมุมมองที่ต้องการสำหรับการใช้งาน JSF ที่ทันสมัย

แม้ว่า JSP อาจไม่ใช่ตัวเลือกแรกของคุณในการสร้างเว็บเพจแบบไดนามิก แต่ก็เป็นเทคโนโลยีเว็บหลักของ Java หน้า JSP นั้นค่อนข้างรวดเร็วและง่ายต่อการสร้างและโต้ตอบกับ Java servlet ในคอนเทนเนอร์ servlet เช่น Tomcat คุณจะพบ JSP ในเว็บแอปพลิเคชัน Java รุ่นเก่าและในบางครั้งคุณอาจพบว่ามีประโยชน์สำหรับการสร้างเว็บเพจ Java แบบไดนามิกที่เรียบง่าย ในฐานะนักพัฒนา Java อย่างน้อยคุณควรคุ้นเคยกับ JSP

บทความนี้จะเป็นข้อมูลเบื้องต้นเกี่ยวกับ JavaServer Pages รวมถึง JSP Standard Tag Library (JSTL) ตัวอย่างแสดงวิธีการเขียนเพจ HTML แบบง่ายฝังแท็ก JSP เพื่อเชื่อมต่อกับ Java servlet และรันเพจในคอนเทนเนอร์ servlet

ดูบทความก่อนหน้าในชุดนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ Java servlets และ JavaServer Faces

JSP ในจาการ์ตา EE

หลังจากการเผยแพร่ Java EE 8 Oracle ได้ย้ายการดูแล Java Enterprise Edition (Java EE) ไปยัง Eclipse Foundation นับจากนี้แพลตฟอร์มสำหรับองค์กร Java ได้รับการเปลี่ยนชื่อเป็น Jakarta EE นอกเหนือจากข้อกำหนด Java Servlet และ JSF แล้ว JSP ยังเป็นหนึ่งในเทคโนโลยีเว็บ Java ที่รวมไว้สำหรับการสนับสนุนและการอัปเกรดอย่างต่อเนื่องใน Jakarta EE

การเขียนหน้า JSP

หน้า JSP แบบธรรมดา (.jsp) ประกอบด้วยมาร์กอัป HTML ที่ฝังด้วยแท็ก JSP เมื่อไฟล์ถูกประมวลผลบนเซิร์ฟเวอร์ HTML จะถูกแสดงเป็นมุมมองแอ็พพลิเคชันซึ่งเป็นเว็บเพจ แท็ก JSP ที่ฝังไว้จะถูกใช้เพื่อเรียกโค้ดและข้อมูลฝั่งเซิร์ฟเวอร์ แผนภาพในรูปที่ 1 แสดงการโต้ตอบระหว่าง HTML, JSP และเว็บแอ็พพลิเคชันเซิร์ฟเวอร์

Matthew Tyson

รายการ 1 แสดงหน้า JSP แบบธรรมดา

รายการ 1. หน้า JSP แบบธรรมดา

${2 * 2} should equal 4

ในรายการ 1 คุณจะเห็นบล็อกของ HTML ที่มีนิพจน์ JSPซึ่งเป็นคำสั่งสำหรับเซิร์ฟเวอร์ Java ที่เขียนโดยใช้ Expression Language (EL) ในนิพจน์ " ${2 * 2}" " ${}" คือไวยากรณ์ JSP สำหรับการแก้ไขโค้ดเป็น HTML เมื่อดำเนินการ JSP จะแสดงผลลัพธ์ของการดำเนินการสิ่งที่อยู่ในนิพจน์ ในกรณีนี้ผลลัพธ์จะเป็นตัวเลข 4

JSP ในคอนเทนเนอร์ servlet

เพจ JSP ต้องถูกปรับใช้ภายในคอนเทนเนอร์ Java servlet ในการปรับใช้เว็บแอ็พพลิเคชัน Java โดยใช้ JSP และ servlets คุณจะต้องทำแพ็กเกจไฟล์. jsp โค้ด Java และข้อมูลเมตาของแอปพลิเคชันในไฟล์. war ซึ่งเป็นไฟล์. zip แบบธรรมดาที่มีโครงสร้างแบบเดิมสำหรับเว็บแอ็พพลิเคชัน

เมื่อคุณโหลด JSP ลงในคอนเทนเนอร์ servlet แล้วระบบจะคอมไพล์ลงใน servlet JSPs และ Java servlets แบ่งใช้ลักษณะที่คล้ายกันรวมถึงความสามารถในการเข้าถึงและตอบสนองต่ออ็อบเจ็กต์ที่ร้องขอ Apache Tomcat 9x คือการใช้งานอ้างอิงสำหรับข้อมูลจำเพาะของ Servlet 4.0 และ JSP 2.3 (โปรดทราบว่าการอัปเดตระหว่าง JSP 2.2 และ 2.3 นั้นค่อนข้างน้อย)

Servlet container เทียบกับแอ็พพลิเคชันเซิร์ฟเวอร์

ในโลก Java นั้นservlet containerหรือที่เรียกว่าเว็บเซิร์ฟเวอร์ก็เหมือนกับแอ็พพลิเคชันเซิร์ฟเวอร์เวอร์ชันไลต์ (เบียร์) คอนเทนเนอร์ servlet จัดการการโต้ตอบที่ร้องขอและการตอบกลับและอนุญาตให้การโต้ตอบเหล่านั้นเชื่อมต่อกับชุดย่อยของความสามารถของ Java enterprise สำหรับเว็บแอ็พพลิเคชัน แอ็พพลิเคชันเซิร์ฟเวอร์ Java รวมคอนเทนเนอร์ servlet เป็นส่วนหนึ่งของสแต็กขององค์กร Java แบบเต็มรวมถึง EJB, JPA, JMS และอื่น ๆ

ตัวอย่างแอปสำหรับ JSP

เราจะใช้แอปพลิเคชันตัวอย่างใน Tomcat เพื่อให้คุณเริ่มต้นกับ JavaServer Pages หากคุณยังไม่ได้ติดตั้ง Tomcat ให้ไปที่หน้าดาวน์โหลด Tomcat และเลือกการติดตั้ง Tomcat สำหรับระบบปฏิบัติการของคุณ จากการเขียนนี้ Tomcat 9 เป็นรุ่นปัจจุบันที่เข้ากันได้กับ Servlet 4.0 และ JSP 2.3

คุณสามารถติดตั้ง Tomcat เป็นบริการของ Windows หรือเรียกใช้จากบรรทัดคำสั่งด้วยหรือ/bin/catalina.sh start /bin/catalina.batไม่ว่าจะด้วยวิธีใดก็ตามให้เริ่ม Tomcat จากนั้นไปที่localhost:8080หน้าต้อนรับ Tomcat ที่แสดงในรูปที่ 2

Matthew Tyson

Implicit Objects ใน Tomcat

บนหน้าต้อนรับ Tomcat คลิกตัวอย่างการเชื่อมโยงจากนั้นคลิกตัวอย่าง JSP

จากนั้นเปิดเว็บแอ็พพลิเคชันImplicit Objects Execute รูปที่ 3 แสดงผลลัพธ์สำหรับแอปพลิเคชันนี้ ใช้เวลาสักครู่เพื่อศึกษาผลลัพธ์นี้

Matthew Tyson

ขอพารามิเตอร์

อ็อบเจ็กต์โดยนัยเป็นอ็อบเจ็กต์ในตัวที่สามารถเข้าถึงได้ผ่านเพจ JSP ในฐานะผู้พัฒนาเว็บเพจคุณจะใช้ออบเจ็กต์เหล่านี้เพื่อสร้างการเข้าถึงสิ่งต่างๆเช่นพารามิเตอร์คำขอซึ่งเป็นข้อมูลที่ส่งมาจากเบราว์เซอร์เมื่อออกคำขอ HTTP พิจารณา URL ของเบราว์เซอร์สำหรับ Implicit Objects:

 //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar 

พารามิเตอร์คือ?foo=barและคุณสามารถเห็นได้ในผลลัพธ์บนหน้าเว็บโดยที่ตารางจะแสดง "EL Expression" และค่าคือ "bar" ในการทดสอบนี้ให้เปลี่ยน URL เป็น//localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=zorkกดEnterแล้วคุณจะเห็นการเปลี่ยนแปลงที่แสดงในผลลัพธ์

ตัวอย่างนี้เป็นคำแนะนำง่ายๆในการใช้แท็ก JSP เพื่อเข้าถึงพารามิเตอร์คำร้องขอฝั่งเซิร์ฟเวอร์ ในกรณีนี้เพจ JSP ใช้อ็อบเจ็กต์ในตัว (โดยนัย) ที่เรียกว่าparamเพื่อเข้าถึงพารามิเตอร์คำร้องขอของเว็บแอ็พพลิเคชัน paramวัตถุสามารถใช้ได้ภายในไวยากรณ์นิพจน์ JSP ที่คุณเห็นในรายการ 1

ในตัวอย่างที่เราใช้ในการแสดงออกจะทำคณิตศาสตร์บางอย่างซึ่งเอาท์พุท${2 * 2}4

${param.foo}ในตัวอย่างนี้แสดงออกใช้ในการเข้าถึงวัตถุและข้อมูลบนวัตถุที่:

JSP ในเว็บแอปพลิเคชัน

ในหน้า Implicit Objects ให้คลิกลูกศรย้อนกลับตามด้วยลิงก์Source สิ่งนี้จะนำคุณไปสู่รหัส JSP สำหรับเว็บแอป Implicit Objects ซึ่งแสดงในรายการ 2

รายการ 2. รหัส JSP สำหรับเว็บแอป Implicit Objects

     JSP 2.0 Expression Language - Implicit Objects   
    
This example illustrates some of the implicit objects available in the Expression Language. The following implicit objects are available (not all illustrated here):
  • pageContext - the PageContext object
  • pageScope - a Map that maps page-scoped attribute names to their values
  • requestScope - a Map that maps request-scoped attribute names to their values
  • sessionScope - a Map that maps session-scoped attribute names to their values
  • applicationScope - a Map that maps application-scoped attribute names to their values
  • param - a Map that maps parameter names to a single String parameter value
  • paramValues - a Map that maps parameter names to a String[] of all values for that parameter
  • header - a Map that maps header names to a single String header value
  • headerValues - a Map that maps header names to a String[] of all values for that header
  • initParam - a Map that maps context initialization parameter names to their String parameter value
  • cookie - a Map that maps cookie names to a single Cookie object.
Change Parameter foo =

EL Expression Result
\${param.foo} ${fn:escapeXml(param["foo"])}
\${param["foo"]} ${fn:escapeXml(param["foo"])}
\${header["host"]} ${fn:escapeXml(header["host"])}
\${header["accept"]} ${fn:escapeXml(header["accept"])}
\${header["user-agent"]} ${fn:escapeXml(header["user-agent"])}

JSP functions

If you're familiar with HTML, then Listing 2 should look pretty familiar. You have the expected HTML elements, followed by the ${ } JSP expression syntax introduced in Listing 1. But notice the value for param.foo: ${fn:escapeXml(param["foo"])} . The "fn:escapeXML()" is a JSP function.

A JSP function encapsulates a chunk of reusable functionality. In this case, the functionality is to escape XML. JSP offers a variety of functions, and you can also create functions yourself. To use a function, you import its library into your JSP page, then call the function.

In Listing 2, the escapeXML function is included with the line:

The syntax is pretty clear: it imports the required functions and assigns them a prefix (in this case "fn") that can be used in all following expressions.

The JSP Standard Tag Library (JSTL)

The import line in Listing 2 calls taglib, which is short for tag library, or (in this case) JSP Standard Tag Library (JSTL). Tag libraries define reusable bits of functionality for JSP. JSTL is the standard tag library, containing a collection of taglibs that ship with every servlet and JSP implementation, including Tomcat.

The "functions" library is just one of the taglibs included with JSTL. Another common taglib is the core library, which you import by calling:

Like "fn", the "c" designation is conventional, and you will see it across most JSP pages.

Securing JSP pages

An example tag from the core library is


    

which outputs the tag with the XML already escaped. This function is important because outputting content directly to a web page via ${variable} opens the door to script injection attacks. This simple function is used to protect web pages from such attacks.

The core library also includes various tags for iteration and flow control (like IF/ELSE handling).

JSTL tag classifications

There are five sets of tags included in JSTL, each designed for a specific area of web application functionality:

  • JSTL core: Dealing with logic and execution flow; conventional tag: "c"
  • JSTL formatting: Dealing with formatting (like dates) and internationalization; conventional tag: "fmt".
  • JSTL SQL: Dealing with querying SQL databases (this is usually discouraged in the view layer); conventional tag: "sql".
  • JSTL XML: Dealing with working with XML documents; conventional tag: "x".
  • JSTL functions: Dealing primarily with String manipulations; conventional tag: "fn".

Calling taglibs in JSP pages

Now that you've got a handle on JSP basics, let's make a change to the example application. To start, locate the Implicit Object app in your Tomcat installation. The path is: apache-tomcat-8.5.33/webapps/examples/jsp/jsp2/el.

Open this file and locate the functions include:

just below this line, add a new line:

Hit Return and add another new line:

Now reload the page at //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar.

คุณควรเห็นการอัปเดตของคุณแสดงในผลลัพธ์