JSP - คู่มือฉบับย่อ
JavaServer Pages คืออะไร
JavaServer Pages (JSP) เป็นเทคโนโลยีสำหรับการพัฒนาเว็บเพจที่สนับสนุนเนื้อหาแบบไดนามิก สิ่งนี้ช่วยให้นักพัฒนาแทรกโค้ด java ในหน้า HTML โดยใช้แท็ก JSP พิเศษซึ่งส่วนใหญ่เริ่มต้นด้วย <% และลงท้ายด้วย%>
คอมโพเนนต์ JavaServer Pages เป็นประเภทของ Java servlet ที่ออกแบบมาเพื่อตอบสนองบทบาทของส่วนติดต่อผู้ใช้สำหรับเว็บแอ็พพลิเคชัน Java นักพัฒนาเว็บเขียน JSP เป็นไฟล์ข้อความที่รวมโค้ด HTML หรือ XHTML องค์ประกอบ XML และการดำเนินการและคำสั่ง JSP ที่ฝังไว้
เมื่อใช้ JSP คุณสามารถรวบรวมอินพุตจากผู้ใช้ผ่านฟอร์มของเว็บเพจนำเสนอเร็กคอร์ดจากฐานข้อมูลหรือแหล่งอื่นและสร้างเว็บเพจแบบไดนามิก
แท็ก JSP สามารถใช้เพื่อวัตถุประสงค์ต่างๆเช่นการดึงข้อมูลจากฐานข้อมูลหรือการลงทะเบียนการกำหนดลักษณะผู้ใช้การเข้าถึงส่วนประกอบ JavaBeans การส่งผ่านการควบคุมระหว่างเพจและการแชร์ข้อมูลระหว่างคำร้องขอเพจเป็นต้น
ทำไมต้องใช้ JSP
JavaServer Pages มักมีจุดประสงค์เดียวกับโปรแกรมที่ใช้งานโดยใช้ไฟล์ Common Gateway Interface (CGI). แต่ JSP มีข้อดีหลายประการเมื่อเปรียบเทียบกับ CGI
ประสิทธิภาพดีขึ้นอย่างเห็นได้ชัดเนื่องจาก JSP อนุญาตให้ฝังองค์ประกอบแบบไดนามิกในหน้า HTML แทนที่จะมีไฟล์ CGI แยกต่างหาก
JSP จะถูกคอมไพล์เสมอก่อนที่เซิร์ฟเวอร์จะประมวลผลซึ่งแตกต่างจาก CGI / Perl ซึ่งต้องการให้เซิร์ฟเวอร์โหลดตัวแปลและสคริปต์เป้าหมายทุกครั้งที่มีการร้องขอเพจ
JavaServer Pages สร้างขึ้นบน Java Servlets API เช่นเดียวกับ Servlets JSP ยังสามารถเข้าถึง Enterprise Java API ที่มีประสิทธิภาพทั้งหมดรวมถึง JDBC, JNDI, EJB, JAXP, เป็นต้น
เพจ JSP สามารถใช้ร่วมกับ servlets ที่จัดการตรรกะทางธุรกิจซึ่งเป็นโมเดลที่รองรับโดย Java servlet template engine
สุดท้าย JSP เป็นส่วนหนึ่งของ Java EE ซึ่งเป็นแพลตฟอร์มที่สมบูรณ์สำหรับแอปพลิเคชันระดับองค์กร ซึ่งหมายความว่า JSP สามารถมีส่วนร่วมในแอพพลิเคชั่นที่ง่ายที่สุดจนถึงซับซ้อนและต้องการมากที่สุด
ข้อดีของ JSP
ตารางต่อไปนี้แสดงข้อดีอื่น ๆ ของการใช้ JSP กับเทคโนโลยีอื่น ๆ -
เทียบกับ Active Server Pages (ASP)
ข้อดีของ JSP คือสองเท่า ขั้นแรกส่วนไดนามิกเขียนด้วย Java ไม่ใช่ Visual Basic หรือภาษาเฉพาะ MS อื่น ๆ ดังนั้นจึงมีประสิทธิภาพและใช้งานง่ายกว่า ประการที่สองเป็นแบบพกพาไปยังระบบปฏิบัติการอื่นและเว็บเซิร์ฟเวอร์ที่ไม่ใช่ของ Microsoft
เทียบกับ Pure Servlets
สะดวกกว่าในการเขียน (และแก้ไข!) HTML ปกติมากกว่าการมีคำสั่ง println จำนวนมากที่สร้าง HTML
เทียบกับฝั่งเซิร์ฟเวอร์รวม (SSI)
SSI มีไว้สำหรับการรวมแบบธรรมดาเท่านั้นไม่ใช่สำหรับโปรแกรม "จริง" ที่ใช้ข้อมูลแบบฟอร์มทำการเชื่อมต่อฐานข้อมูลและอื่น ๆ
เทียบกับ JavaScript
JavaScript สามารถสร้าง HTML แบบไดนามิกบนไคลเอนต์ แต่แทบจะไม่สามารถโต้ตอบกับเว็บเซิร์ฟเวอร์เพื่อทำงานที่ซับซ้อนเช่นการเข้าถึงฐานข้อมูลและการประมวลผลภาพเป็นต้น
เทียบกับ Static HTML
แน่นอนว่า HTML ปกติต้องไม่มีข้อมูลแบบไดนามิก
Next คืออะไร?
ฉันจะแนะนำคุณทีละขั้นตอนในการตั้งค่าสภาพแวดล้อมของคุณเพื่อเริ่มต้นด้วย JSP ฉันสมมติว่าคุณมีประสบการณ์ที่ดีกับ Java Programming เพื่อเรียนรู้ JSP ต่อไป
หากคุณไม่รู้จัก Java Programming Language เราขอแนะนำให้คุณอ่านJava Tutorialเพื่อทำความเข้าใจกับ Java Programming
สภาพแวดล้อมการพัฒนาคือที่ที่คุณจะพัฒนาโปรแกรม JSP ทดสอบและรันโปรแกรมเหล่านั้นในที่สุด
บทช่วยสอนนี้จะแนะนำคุณในการตั้งค่าสภาพแวดล้อมการพัฒนา JSP ของคุณซึ่งเกี่ยวข้องกับขั้นตอนต่อไปนี้ -
การตั้งค่า Java Development Kit
ขั้นตอนนี้เกี่ยวข้องกับการดาวน์โหลดการใช้งาน Java Software Development Kit (SDK) และตั้งค่าตัวแปรสภาพแวดล้อม PATH ให้เหมาะสม
คุณสามารถดาวน์โหลด SDK จากเว็บไซต์ Java ของออราเคิล - Java SE ดาวน์โหลด
เมื่อคุณดาวน์โหลดการใช้งาน Java ของคุณแล้วให้ทำตามคำแนะนำที่กำหนดเพื่อติดตั้งและกำหนดค่าการตั้งค่า สุดท้ายตั้งค่าPATH and JAVA_HOME ตัวแปรสภาพแวดล้อมเพื่ออ้างถึงไดเร็กทอรีที่มี java และ javacโดยทั่วไปแล้ว java_install_dir/bin และ java_install_dir ตามลำดับ
หากคุณใช้ Windows และติดตั้ง SDK ใน C:\jdk1.5.0_20คุณต้องเพิ่มบรรทัดต่อไปนี้ในไฟล์ C:\autoexec.bat ไฟล์.
set PATH = C:\jdk1.5.0_20\bin;%PATH%
set JAVA_HOME = C:\jdk1.5.0_20
หรืออีกวิธีหนึ่งคือเปิด Windows NT/2000/XPคุณยังสามารถคลิกขวาที่ My Computerเลือก Propertiesแล้ว Advanced, ติดตามโดย Environment Variables. จากนั้นคุณจะอัปเดตค่า PATH และกดปุ่ม OK
บน Unix (Solaris, Linux ฯลฯ ) หากติดตั้ง SDK ในไฟล์ /usr/local/jdk1.5.0_20 และคุณใช้ C เชลล์คุณจะใส่สิ่งต่อไปนี้ลงในไฟล์ .cshrc ไฟล์.
setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.5.0_20
หรือหากคุณใช้ไฟล์ Integrated Development Environment (IDE) ชอบ Borland JBuilder, Eclipse, IntelliJ IDEA, หรือ Sun ONE Studioคอมไพล์และรันโปรแกรมง่ายๆเพื่อยืนยันว่า IDE รู้ตำแหน่งที่คุณติดตั้ง Java
การตั้งค่าเว็บเซิร์ฟเวอร์: Tomcat
มีเว็บเซิร์ฟเวอร์จำนวนหนึ่งที่รองรับการพัฒนา JavaServer Pages และ Servlets ในตลาด บางเว็บเซิร์ฟเวอร์สามารถดาวน์โหลดได้ฟรีและ Tomcat ก็เป็นหนึ่งในนั้น
Apache Tomcat เป็นซอฟต์แวร์โอเพ่นซอร์สที่ใช้เทคโนโลยี JavaServer Pages และ Servlet และสามารถทำหน้าที่เป็นเซิร์ฟเวอร์แบบสแตนด์อโลนสำหรับทดสอบ JSP และ Servlets และสามารถรวมเข้ากับ Apache Web Server ขั้นตอนในการตั้งค่า Tomcat บนเครื่องของคุณมีดังนี้ -
ดาวน์โหลด Tomcat เวอร์ชันล่าสุดจาก https://tomcat.apache.org/.
เมื่อคุณดาวน์โหลดการติดตั้งแล้วให้แกะการแจกแจงไบนารีในตำแหน่งที่สะดวก ตัวอย่างเช่นในC:\apache-tomcat-5.5.29 on windows, or /usr/local/apache-tomcat-5.5.29 บน Linux / Unix และสร้างไฟล์ CATALINA_HOME ตัวแปรสภาพแวดล้อมที่ชี้ไปยังตำแหน่งเหล่านี้
Tomcat สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Windows -
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-5.5.29\bin\startup.bat
Tomcat สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-5.5.29/bin/startup.sh
หลังจากเริ่มต้นสำเร็จเว็บแอปพลิเคชันเริ่มต้นที่มาพร้อมกับ Tomcat จะพร้อมใช้งานโดยไปที่ http://localhost:8080/.
เมื่อดำเนินการคุณจะได้รับผลลัพธ์ต่อไปนี้ -
ข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าและการเรียกใช้ Tomcat สามารถพบได้ในเอกสารที่รวมอยู่ที่นี่เช่นเดียวกับในเว็บไซต์ Tomcat - https://tomcat.apache.org/.
Tomcat สามารถหยุดได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Windows -
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-5.5.29\bin\shutdown
Tomcat สามารถหยุดได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh
การตั้งค่า CLASSPATH
เนื่องจาก servlets ไม่ได้เป็นส่วนหนึ่งของ Java Platform, Standard Edition คุณต้องระบุคลาส servlet กับคอมไพลเลอร์
หากคุณใช้ Windows คุณต้องใส่บรรทัดต่อไปนี้ในไฟล์ C:\autoexec.bat ไฟล์.
set CATALINA = C:\apache-tomcat-5.5.29
set CLASSPATH = %CATALINA%\common\lib\jsp-api.jar;%CLASSPATH%
หรืออีกวิธีหนึ่งคือเปิด Windows NT/2000/XPคุณยังสามารถคลิกขวาที่ My Computerเลือก Propertiesแล้ว Advancedแล้ว Environment Variables. จากนั้นคุณจะอัปเดตค่า CLASSPATH และกดปุ่ม OK
บน Unix (Solaris, Linux ฯลฯ ) หากคุณใช้ C เชลล์คุณจะต้องใส่บรรทัดต่อไปนี้ลงใน .cshrc ไฟล์.
setenv CATALINA = /usr/local/apache-tomcat-5.5.29
setenv CLASSPATH $CATALINA/common/lib/jsp-api.jar:$CLASSPATH
NOTE - สมมติว่าไดเร็กทอรีการพัฒนาของคุณคือ C:\JSPDev (Windows) หรือ /usr/JSPDev (Unix)จากนั้นคุณจะต้องเพิ่มไดเรกทอรีเหล่านี้ด้วยใน CLASSPATH
เว็บเซิร์ฟเวอร์ต้องการเอ็นจิน JSP นั่นคือคอนเทนเนอร์เพื่อประมวลผลเพจ JSP คอนเทนเนอร์ JSP มีหน้าที่สกัดกั้นการร้องขอสำหรับเพจ JSP บทช่วยสอนนี้ใช้ประโยชน์จาก Apache ซึ่งมีคอนเทนเนอร์ JSP ในตัวเพื่อรองรับการพัฒนาเพจ JSP
คอนเทนเนอร์ JSP ทำงานร่วมกับเว็บเซิร์ฟเวอร์เพื่อจัดเตรียมสภาพแวดล้อมรันไทม์และบริการอื่น ๆ ที่ JSP ต้องการ มันรู้วิธีทำความเข้าใจองค์ประกอบพิเศษที่เป็นส่วนหนึ่งของ JSPs
แผนภาพต่อไปนี้แสดงตำแหน่งของคอนเทนเนอร์ JSP และไฟล์ JSP ในโปรแกรมประยุกต์บนเว็บ
การประมวลผล JSP
ขั้นตอนต่อไปนี้อธิบายวิธีที่เว็บเซิร์ฟเวอร์สร้างเว็บเพจโดยใช้ JSP -
เช่นเดียวกับหน้าปกติเบราว์เซอร์ของคุณจะส่งคำขอ HTTP ไปยังเว็บเซิร์ฟเวอร์
เว็บเซิร์ฟเวอร์รับรู้ว่าคำร้องขอ HTTP มีไว้สำหรับเพจ JSP และส่งต่อไปยังเอ็นจิน JSP ซึ่งทำได้โดยใช้เพจ URL หรือ JSP ซึ่งลงท้ายด้วย.jsp แทน .html.
เอ็นจิน JSP โหลดเพจ JSP จากดิสก์และแปลงเป็นเนื้อหา servlet การแปลงนี้ทำได้ง่ายมากซึ่งข้อความเทมเพลตทั้งหมดจะถูกแปลงเป็นคำสั่ง println () และองค์ประกอบ JSP ทั้งหมดจะถูกแปลงเป็นโค้ด Java รหัสนี้ใช้พฤติกรรมไดนามิกที่สอดคล้องกันของเพจ
เอ็นจิน JSP คอมไพล์ servlet เป็นคลาสที่เรียกใช้งานได้และส่งต่อคำร้องขอดั้งเดิมไปยังเอ็นจิน servlet
ส่วนหนึ่งของเว็บเซิร์ฟเวอร์ที่เรียกว่า servlet engine จะโหลดคลาส Servlet และเรียกใช้งาน ในระหว่างการดำเนินการ servlet จะสร้างเอาต์พุตในรูปแบบ HTML เอาต์พุตคือ furthur ส่งผ่านไปยังเว็บเซิร์ฟเวอร์โดย servlet engine ภายในการตอบสนอง HTTP
เว็บเซิร์ฟเวอร์ส่งต่อการตอบสนอง HTTP ไปยังเบราว์เซอร์ของคุณในแง่ของเนื้อหา HTML แบบคงที่
สุดท้ายเว็บเบราว์เซอร์จะจัดการเพจ HTML ที่สร้างขึ้นแบบไดนามิกภายในการตอบสนอง HTTP เหมือนกับว่าเป็นเพจแบบคงที่
ขั้นตอนที่กล่าวมาทั้งหมดสามารถดูได้ในแผนภาพต่อไปนี้ -
โดยปกติเอ็นจิน JSP จะตรวจสอบเพื่อดูว่ามี servlet สำหรับไฟล์ JSP อยู่แล้วหรือไม่และวันที่แก้ไขบน JSP เก่ากว่า servlet หรือไม่ ถ้า JSP เก่ากว่า servlet ที่สร้างขึ้นคอนเทนเนอร์ JSP จะถือว่า JSP ไม่ได้เปลี่ยนแปลงและ servlet ที่สร้างขึ้นยังคงตรงกับเนื้อหาของ JSP ทำให้กระบวนการนี้มีประสิทธิภาพมากกว่าภาษาสคริปต์อื่น ๆ (เช่น PHP) และเร็วกว่า
ดังนั้นในอีกวิธีหนึ่งเพจ JSP จึงเป็นอีกวิธีหนึ่งในการเขียน servlet โดยไม่ต้องเป็นตัวช่วยเขียนโปรแกรม Java ยกเว้นเฟสการแปลหน้า JSP จะได้รับการจัดการเหมือนกับ servlet ทั่วไปทุกประการ
ในบทนี้เราจะกล่าวถึงวงจรชีวิตของ JSP กุญแจสำคัญในการทำความเข้าใจฟังก์ชันการทำงานระดับต่ำของ JSP คือการเข้าใจวงจรชีวิตที่เรียบง่ายที่พวกเขาปฏิบัติตาม
วงจรชีวิต JSP หมายถึงกระบวนการตั้งแต่การสร้างจนถึงการทำลายล้าง สิ่งนี้คล้ายกับวงจรชีวิตของ servlet ที่มีขั้นตอนเพิ่มเติมซึ่งจำเป็นในการคอมไพล์ JSP ลงใน servlet
เส้นทางตามด้วย JSP
ต่อไปนี้เป็นเส้นทางที่ตามด้วย JSP -
- Compilation
- Initialization
- Execution
- Cleanup
สี่ขั้นตอนหลักของวงจรชีวิต JSP นั้นคล้ายคลึงกับวงจรชีวิตของเซอร์เวตมาก สี่ขั้นตอนได้อธิบายไว้ด้านล่าง -
การรวบรวม JSP
เมื่อเบราว์เซอร์ขอ JSP เอ็นจิ้น JSP จะตรวจสอบก่อนว่าจำเป็นต้องคอมไพล์เพจหรือไม่ หากไม่เคยคอมไพล์เพจหรือถ้า JSP ถูกแก้ไขตั้งแต่คอมไพล์ครั้งล่าสุดเอ็นจิน JSP จะคอมไพล์เพจ
กระบวนการรวบรวมประกอบด้วยสามขั้นตอน -
- การแยกวิเคราะห์ JSP
- เปลี่ยน JSP ให้เป็น servlet
- การคอมไพล์ servlet
การเริ่มต้น JSP
เมื่อคอนเทนเนอร์โหลด JSP มันจะเรียกใช้ jspInit()ก่อนที่จะให้บริการตามคำขอใด ๆ หากคุณต้องการเริ่มต้นเฉพาะ JSP ให้แทนที่ไฟล์jspInit() วิธีการ -
public void jspInit(){
// Initialization code...
}
โดยปกติการเริ่มต้นจะดำเนินการเพียงครั้งเดียวและเช่นเดียวกับวิธีการ init ของ servlet โดยทั่วไปคุณจะเริ่มต้นการเชื่อมต่อฐานข้อมูลเปิดไฟล์และสร้างตารางการค้นหาในเมธอด jspInit
การดำเนินการ JSP
ระยะนี้ของวงจรชีวิต JSP แสดงการโต้ตอบทั้งหมดกับคำร้องขอจนกว่า JSP จะถูกทำลาย
เมื่อใดก็ตามที่เบราว์เซอร์ร้องขอ JSP และเพจถูกโหลดและเตรียมข้อมูลเบื้องต้นเอ็นจิน JSP จะเรียกใช้ _jspService() วิธีการใน JSP
_jspService () วิธีการใช้ HttpServletRequest และ HttpServletResponse เป็นพารามิเตอร์ดังนี้ -
void _jspService(HttpServletRequest request, HttpServletResponse response) {
// Service handling code...
}
_jspService()วิธีการของ JSP ถูกเรียกใช้ตามคำขอ สิ่งนี้มีหน้าที่ในการสร้างการตอบสนองสำหรับคำขอนั้นและวิธีนี้ยังรับผิดชอบในการสร้างการตอบสนองไปยังเมธอด HTTP ทั้งเจ็ด ได้แก่GET, POST, DELETEฯลฯ
JSP Cleanup
ระยะการทำลายของวงจรชีวิต JSP แสดงถึงเมื่อ JSP ถูกลบออกจากการใช้งานโดยคอนเทนเนอร์
jspDestroy()เมธอดเทียบเท่า JSP ของเมธอดทำลายสำหรับ servlets แทนที่ jspDestroy เมื่อคุณต้องการทำการล้างข้อมูลใด ๆ เช่นปล่อยการเชื่อมต่อฐานข้อมูลหรือปิดไฟล์ที่เปิดอยู่
jspDestroy () วิธีการมีรูปแบบต่อไปนี้ -
public void jspDestroy() {
// Your cleanup code goes here.
}
ในบทนี้เราจะพูดถึงไวยากรณ์ใน JSP เราจะเข้าใจพื้นฐานการใช้ไวยากรณ์อย่างง่าย (เช่นองค์ประกอบ) ที่เกี่ยวข้องกับการพัฒนา JSP
องค์ประกอบของ JSP
องค์ประกอบของ JSP ได้อธิบายไว้ด้านล่าง -
Scriptlet
scriptlet สามารถมีคำสั่งภาษา JAVA การประกาศตัวแปรหรือเมธอดจำนวนเท่าใดก็ได้หรือนิพจน์ที่ใช้ได้ในภาษาสคริปต์ของเพจ
ต่อไปนี้เป็นไวยากรณ์ของ Scriptlet -
<% code fragment %>
คุณสามารถเขียน XML ที่เทียบเท่ากับไวยากรณ์ข้างต้นได้ดังนี้ -
<jsp:scriptlet>
code fragment
</jsp:scriptlet>
ข้อความแท็ก HTML หรือองค์ประกอบ JSP ที่คุณเขียนต้องอยู่นอกสคริปต์เล็ต ต่อไปนี้เป็นตัวอย่างง่ายๆและแรกสำหรับ JSP -
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
NOTE - สมมติว่ามีการติดตั้ง Apache Tomcat ใน C: \ apache-tomcat-7.0.2 และสภาพแวดล้อมของคุณได้รับการตั้งค่าตามแบบฝึกหัดการตั้งค่าสภาพแวดล้อม
ให้เราเก็บรหัสด้านบนไว้ในไฟล์ JSP hello.jsp แล้วใส่ไฟล์นี้เข้าไป C:\apache-tomcat7.0.2\webapps\ROOTไดเรกทอรี เรียกดูข้อมูลเดียวกันโดยใช้ URLhttp://localhost:8080/hello.jsp. โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
ประกาศ JSP
การประกาศประกาศตัวแปรหรือวิธีการอย่างน้อยหนึ่งรายการที่คุณสามารถใช้ในโค้ด Java ในไฟล์ JSP ในภายหลัง คุณต้องประกาศตัวแปรหรือวิธีการก่อนที่คุณจะใช้ในไฟล์ JSP
ต่อไปนี้เป็นไวยากรณ์สำหรับ JSP Declarations -
<%! declaration; [ declaration; ]+ ... %>
คุณสามารถเขียน XML ที่เทียบเท่ากับไวยากรณ์ข้างต้นได้ดังนี้ -
<jsp:declaration>
code fragment
</jsp:declaration>
ต่อไปนี้เป็นตัวอย่างสำหรับการประกาศ JSP -
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
นิพจน์ JSP
อิลิเมนต์นิพจน์ JSP มีนิพจน์ภาษาสคริปต์ที่ถูกประเมินแปลงเป็นสตริงและแทรกเมื่อนิพจน์ปรากฏในไฟล์ JSP
เนื่องจากค่าของนิพจน์ถูกแปลงเป็น String คุณสามารถใช้นิพจน์ภายในบรรทัดข้อความไม่ว่าจะถูกแท็กด้วย HTML ในไฟล์ JSP หรือไม่ก็ตาม
อิลิเมนต์นิพจน์สามารถมีนิพจน์ใด ๆ ที่ถูกต้องตามข้อกำหนดของภาษา Java แต่คุณไม่สามารถใช้อัฒภาคเพื่อสิ้นสุดนิพจน์ได้
ต่อไปนี้เป็นไวยากรณ์ของ JSP Expression -
<%= expression %>
คุณสามารถเขียน XML ที่เทียบเท่ากับไวยากรณ์ข้างต้นได้ดังนี้ -
<jsp:expression>
expression
</jsp:expression>
ตัวอย่างต่อไปนี้แสดงนิพจน์ JSP -
<html>
<head><title>A Comment Test</title></head>
<body>
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
Today's date: 11-Sep-2010 21:24:25
ความคิดเห็น JSP
ข้อคิดเห็น JSP ทำเครื่องหมายข้อความหรือคำสั่งที่คอนเทนเนอร์ JSP ควรละเว้น ความคิดเห็น JSP มีประโยชน์เมื่อคุณต้องการซ่อนหรือ "แสดงความคิดเห็น" ซึ่งเป็นส่วนหนึ่งของหน้า JSP ของคุณ
ต่อไปนี้เป็นไวยากรณ์ของข้อคิดเห็น JSP -
<%-- This is JSP comment --%>
ตัวอย่างต่อไปนี้แสดงความคิดเห็น JSP -
<html>
<head><title>A Comment Test</title></head>
<body>
<h2>A Test of Comments</h2>
<%-- This comment will not be visible in the page source --%>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
A Test of Comments
มีโครงสร้างพิเศษจำนวนเล็กน้อยที่คุณสามารถใช้ในกรณีต่างๆเพื่อแทรกความคิดเห็นหรืออักขระที่จะได้รับการปฏิบัติเป็นพิเศษ นี่คือบทสรุป -
ส. | ไวยากรณ์และวัตถุประสงค์ |
---|---|
1 | <%-- comment --%> ความคิดเห็น JSP ไม่สนใจโดยเครื่องยนต์ JSP |
2 | <!-- comment --> ความคิดเห็น HTML ไม่สนใจโดยเบราว์เซอร์ |
3 | <\% แสดงถึงคง <% literal |
4 | %\> แสดง%> ลิเทอรัลคงที่ |
5 | \' อัญประกาศเดี่ยวในแอตทริบิวต์ที่ใช้อัญประกาศเดี่ยว |
6 | \" อัญประกาศคู่ในแอตทริบิวต์ที่ใช้เครื่องหมายคำพูดคู่ |
คำสั่ง JSP
คำสั่ง JSP มีผลต่อโครงสร้างโดยรวมของคลาส servlet โดยปกติจะมีรูปแบบดังนี้ -
<%@ directive attribute="value" %>
แท็กคำสั่งมีสามประเภท -
ส. | คำสั่งและคำอธิบาย |
---|---|
1 | <%@ page ... %> กำหนดแอ็ตทริบิวต์ที่ขึ้นกับเพจเช่นภาษาสคริปต์เพจข้อผิดพลาดและข้อกำหนดการบัฟเฟอร์ |
2 | <%@ include ... %> รวมไฟล์ระหว่างขั้นตอนการแปล |
3 | <%@ taglib ... %> ประกาศไลบรารีแท็กที่มีการดำเนินการแบบกำหนดเองที่ใช้ในเพจ |
เราจะอธิบายคำสั่ง JSP ในบทที่แยกต่างหากJSP - Directives
การดำเนินการ JSP
การดำเนินการ JSP ใช้ constructsในไวยากรณ์ XML เพื่อควบคุมลักษณะการทำงานของ servlet engine คุณสามารถแทรกไฟล์แบบไดนามิกใช้คอมโพเนนต์ JavaBeans ซ้ำส่งต่อผู้ใช้ไปยังเพจอื่นหรือสร้าง HTML สำหรับปลั๊กอิน Java
มีเพียงไวยากรณ์เดียวสำหรับองค์ประกอบการดำเนินการเนื่องจากสอดคล้องกับมาตรฐาน XML -
<jsp:action_name attribute="value" />
องค์ประกอบการดำเนินการเป็นฟังก์ชันที่กำหนดไว้ล่วงหน้าโดยทั่วไป ตารางต่อไปนี้แสดงรายการการดำเนินการ JSP ที่มีอยู่ -
ส. | ไวยากรณ์และวัตถุประสงค์ |
---|---|
1 | jsp:include รวมไฟล์เมื่อมีการร้องขอเพจ |
2 | jsp:useBean ค้นหาหรือสร้างอินสแตนซ์ JavaBean |
3 | jsp:setProperty ตั้งค่าคุณสมบัติของ JavaBean |
4 | jsp:getProperty แทรกคุณสมบัติของ JavaBean ลงในเอาต์พุต |
5 | jsp:forward ส่งต่อผู้ร้องขอไปยังเพจใหม่ |
6 | jsp:plugin สร้างโค้ดเฉพาะเบราว์เซอร์ที่สร้างแท็ก OBJECT หรือ EMBED สำหรับปลั๊กอิน Java |
7 | jsp:element กำหนดองค์ประกอบ XML แบบไดนามิก |
8 | jsp:attribute กำหนดแอตทริบิวต์ขององค์ประกอบ XML ที่กำหนดแบบไดนามิก |
9 | jsp:body กำหนดเนื้อหาขององค์ประกอบ XML ที่กำหนดแบบไดนามิก |
10 | jsp:text ใช้เพื่อเขียนข้อความเทมเพลตในหน้า JSP และเอกสาร |
เราจะอธิบายการกระทำของ JSP ในบทที่แยกต่างหากJSP - Actions
วัตถุโดยนัย JSP
JSP รองรับตัวแปรที่กำหนดโดยอัตโนมัติเก้าตัวแปรซึ่งเรียกอีกอย่างว่าออบเจ็กต์โดยนัย ตัวแปรเหล่านี้คือ -
ส. | วัตถุและคำอธิบาย |
---|---|
1 | request นี้เป็น HttpServletRequest วัตถุที่เกี่ยวข้องกับคำขอ |
2 | response นี้เป็น HttpServletResponse วัตถุที่เกี่ยวข้องกับการตอบสนองไปยังไคลเอนต์ |
3 | out นี้เป็น PrintWriter วัตถุที่ใช้ในการส่งเอาต์พุตไปยังไคลเอนต์ |
4 | session นี้เป็น HttpSession วัตถุที่เกี่ยวข้องกับคำขอ |
5 | application นี้เป็น ServletContext วัตถุที่เชื่อมโยงกับบริบทของแอปพลิเคชัน |
6 | config นี้เป็น ServletConfig วัตถุที่เกี่ยวข้องกับเพจ |
7 | pageContext สิ่งนี้สรุปการใช้คุณลักษณะเฉพาะเซิร์ฟเวอร์เช่นประสิทธิภาพที่สูงขึ้น JspWriters. |
8 | page นี่เป็นเพียงคำพ้องความหมายสำหรับ thisและใช้เพื่อเรียกเมธอดที่กำหนดโดยคลาส servlet ที่แปลแล้ว |
9 | Exception Exception ออบเจ็กต์อนุญาตให้เข้าถึงข้อมูลข้อยกเว้นโดย JSP ที่กำหนด |
เราจะอธิบาย JSP วัตถุโดยปริยายในบทที่แยกต่างหากJSP - วัตถุโดยปริยาย
คำสั่ง Control-Flow
คุณสามารถใช้ API และส่วนประกอบของ Java ทั้งหมดในการเขียนโปรแกรม JSP ของคุณรวมถึงคำสั่งในการตัดสินใจลูป ฯลฯ
งบตัดสินใจ
if...else บล็อกเริ่มต้นเหมือน Scriptlet ทั่วไป แต่ Scriptlet จะปิดในแต่ละบรรทัดโดยมีข้อความ HTML รวมอยู่ระหว่างแท็ก Scriptlet
<%! int day = 3; %>
<html>
<head><title>IF...ELSE Example</title></head>
<body>
<% if (day == 1 || day == 7) { %>
<p> Today is weekend</p>
<% } else { %>
<p> Today is not weekend</p>
<% } %>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
Today is not weekend
ตอนนี้ดูสิ่งต่อไปนี้ switch...case บล็อกที่เขียนแตกต่างกันเล็กน้อยโดยใช้ไฟล์ out.println() และภายใน Scriptletas -
<%! int day = 3; %>
<html>
<head><title>SWITCH...CASE Example</title></head>
<body>
<%
switch(day) {
case 0:
out.println("It\'s Sunday.");
break;
case 1:
out.println("It\'s Monday.");
break;
case 2:
out.println("It\'s Tuesday.");
break;
case 3:
out.println("It\'s Wednesday.");
break;
case 4:
out.println("It\'s Thursday.");
break;
case 5:
out.println("It\'s Friday.");
break;
default:
out.println("It's Saturday.");
}
%>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
It's Wednesday.
คำสั่งวนซ้ำ
คุณยังสามารถใช้บล็อกการวนซ้ำพื้นฐานสามประเภทใน Java: for, while, and do…while บล็อกในการเขียนโปรแกรม JSP ของคุณ
ให้เราดูต่อไปนี้ for ตัวอย่างวง -
<%! int fontSize; %>
<html>
<head><title>FOR LOOP Example</title></head>
<body>
<%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
<font color = "green" size = "<%= fontSize %>">
JSP Tutorial
</font><br />
<%}%>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
JSP Tutorial
JSP Tutorial
JSP Tutorial
ตัวอย่างด้านบนสามารถเขียนโดยใช้ while วนดังนี้ -
<%! int fontSize; %>
<html>
<head><title>WHILE LOOP Example</title></head>
<body>
<%while ( fontSize <= 3){ %>
<font color = "green" size = "<%= fontSize %>">
JSP Tutorial
</font><br />
<%fontSize++;%>
<%}%>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
JSP Tutorial
JSP Tutorial
JSP Tutorial
JSP Operators
JSP สนับสนุนตัวดำเนินการทางตรรกะและเลขคณิตทั้งหมดที่ Java สนับสนุน ตารางต่อไปนี้แสดงรายการตัวดำเนินการทั้งหมดที่มีลำดับความสำคัญสูงสุดจะปรากฏที่ด้านบนสุดของตารางโดยที่มีค่าต่ำสุดจะปรากฏที่ด้านล่าง
ภายในนิพจน์ตัวดำเนินการที่มีลำดับความสำคัญสูงกว่าจะได้รับการประเมินก่อน
ประเภท | ตัวดำเนินการ | ความสัมพันธ์ |
---|---|---|
Postfix | () []. (ตัวดำเนินการจุด) | จากซ้ายไปขวา |
ยูนารี | ++ - -! ~ | จากขวาไปซ้าย |
หลายหลาก | * /% | จากซ้ายไปขวา |
สารเติมแต่ง | + - | จากซ้ายไปขวา |
กะ | >> >>> << | จากซ้ายไปขวา |
เชิงสัมพันธ์ | >> = <<= | จากซ้ายไปขวา |
ความเท่าเทียมกัน | ==! = | จากซ้ายไปขวา |
Bitwise AND | & | จากซ้ายไปขวา |
Bitwise XOR | ^ | จากซ้ายไปขวา |
Bitwise หรือ | | | จากซ้ายไปขวา |
ตรรกะ AND | && | จากซ้ายไปขวา |
ตรรกะหรือ | || | จากซ้ายไปขวา |
เงื่อนไข | ?: | จากขวาไปซ้าย |
การมอบหมายงาน | = + = - = * = / =% = >> = << = & = ^ = | = | จากขวาไปซ้าย |
จุลภาค | , | จากซ้ายไปขวา |
ตัวอักษร JSP
ภาษานิพจน์ JSP กำหนดตัวอักษรต่อไปนี้ -
Boolean - จริงและเท็จ
Integer - เช่นเดียวกับใน Java
Floating point - เช่นเดียวกับใน Java
String- มีคำพูดเดี่ยวและคู่ "ถูก Escape เป็น \", "เป็น Escape เป็น \" และ \ จะถูก Escape เป็น \\
Null - null
ในบทนี้เราจะพูดถึง Directives ใน JSP คำสั่งเหล่านี้ให้ทิศทางและคำแนะนำไปยังคอนเทนเนอร์โดยบอกวิธีจัดการบางประการของการประมวลผล JSP
คำสั่ง JSP มีผลต่อโครงสร้างโดยรวมของคลาส servlet โดยปกติจะมีรูปแบบดังนี้ -
<%@ directive attribute = "value" %>
คำสั่งสามารถมีแอตทริบิวต์จำนวนหนึ่งซึ่งคุณสามารถแสดงรายการเป็นคู่คีย์ - ค่าและคั่นด้วยเครื่องหมายจุลภาค
ช่องว่างระหว่างสัญลักษณ์ @ และชื่อคำสั่งและระหว่างแอตทริบิวต์สุดท้ายกับ%> ปิดเป็นทางเลือก
แท็กคำสั่งมีสามประเภท -
ส. | คำสั่งและคำอธิบาย |
---|---|
1 | <%@ page ... %> กำหนดแอ็ตทริบิวต์ที่ขึ้นกับเพจเช่นภาษาสคริปต์เพจข้อผิดพลาดและข้อกำหนดการบัฟเฟอร์ |
2 | <%@ include ... %> รวมไฟล์ระหว่างขั้นตอนการแปล |
3 | <%@ taglib ... %> ประกาศไลบรารีแท็กที่มีการดำเนินการแบบกำหนดเองที่ใช้ในเพจ |
JSP - คำสั่งของเพจ
pageคำสั่งใช้เพื่อให้คำแนะนำแก่คอนเทนเนอร์ คำแนะนำเหล่านี้เกี่ยวข้องกับเพจ JSP ปัจจุบัน คุณสามารถกำหนดรหัสเพจได้ทุกที่ในเพจ JSP ของคุณ ตามแบบแผนคำสั่งของเพจจะถูกเข้ารหัสไว้ที่ด้านบนของเพจ JSP
ต่อไปนี้เป็นไวยากรณ์พื้นฐานของคำสั่งหน้า -
<%@ page attribute = "value" %>
คุณสามารถเขียน XML ที่เทียบเท่ากับไวยากรณ์ข้างต้นได้ดังนี้ -
<jsp:directive.page attribute = "value" />
คุณลักษณะ
ตารางต่อไปนี้แสดงรายการคุณลักษณะที่เกี่ยวข้องกับคำสั่งเพจ -
ส. | คุณสมบัติและวัตถุประสงค์ |
---|---|
1 | buffer ระบุโมเดลการบัฟเฟอร์สำหรับสตรีมเอาต์พุต |
2 | autoFlush ควบคุมลักษณะการทำงานของบัฟเฟอร์เอาต์พุตของ servlet |
3 | contentType กำหนดโครงร่างการเข้ารหัสอักขระ |
4 | errorPage กำหนด URL ของ JSP อื่นที่รายงานข้อยกเว้นรันไทม์ Java ที่ไม่ได้ตรวจสอบ |
5 | isErrorPage ระบุว่าเพจ JSP นี้เป็น URL ที่ระบุโดยแอ็ตทริบิวต์ errorPage ของเพจ JSP อื่นหรือไม่ |
6 | extends ระบุซูเปอร์คลาสที่ servlet ที่สร้างขึ้นต้องขยาย |
7 | import ระบุรายการแพ็กเกจหรือคลาสสำหรับใช้ใน JSP ตามที่คำสั่งอิมพอร์ต Java ทำสำหรับคลาส Java |
8 | info กำหนดสตริงที่สามารถเข้าถึงได้ด้วย servlet getServletInfo() วิธี. |
9 | isThreadSafe กำหนดโมเดลเธรดสำหรับ servlet ที่สร้างขึ้น |
10 | language กำหนดภาษาโปรแกรมที่ใช้ในเพจ JSP |
11 | session ระบุว่าเพจ JSP เข้าร่วมในเซสชัน HTTP หรือไม่ |
12 | isELIgnored ระบุว่านิพจน์ EL ภายในเพจ JSP จะถูกละเว้นหรือไม่ |
13 | isScriptingEnabled กำหนดว่าองค์ประกอบการเขียนสคริปต์ได้รับอนุญาตให้ใช้หรือไม่ |
ตรวจสอบรายละเอียดเพิ่มเติมที่เกี่ยวข้องกับทุกคุณลักษณะดังกล่าวข้างต้นที่หน้า Directive
รวม Directive
includeคำสั่งใช้เพื่อรวมไฟล์ระหว่างขั้นตอนการแปล คำสั่งนี้บอกให้คอนเทนเนอร์รวมเนื้อหาของไฟล์ภายนอกอื่น ๆ กับ JSP ปัจจุบันในระหว่างขั้นตอนการแปล คุณสามารถเขียนรหัสinclude สั่งที่ใดก็ได้ในหน้า JSP ของคุณ
รูปแบบการใช้งานทั่วไปของคำสั่งนี้มีดังนี้ -
<%@ include file = "relative url" >
ชื่อไฟล์ในคำสั่ง include เป็น URL สัมพัทธ์ หากคุณระบุชื่อไฟล์โดยไม่มีพา ธ เชื่อมโยงคอมไพลเลอร์ JSP จะถือว่าไฟล์อยู่ในไดเร็กทอรีเดียวกับ JSP ของคุณ
คุณสามารถเขียน XML ที่เทียบเท่ากับไวยากรณ์ข้างต้นได้ดังนี้ -
<jsp:directive.include file = "relative url" />
สำหรับรายละเอียดเพิ่มเติมที่เกี่ยวข้องกับการรวมคำสั่งให้ตรวจสอบรวม Directive
คำสั่ง taglib
JavaServer Pages API อนุญาตให้คุณกำหนดแท็ก JSP แบบกำหนดเองที่มีลักษณะเหมือนแท็ก HTML หรือ XML และไลบรารีแท็กคือชุดของแท็กที่ผู้ใช้กำหนดเองซึ่งใช้ลักษณะการทำงานที่กำหนดเอง
taglib คำสั่งประกาศว่าเพจ JSP ของคุณใช้ชุดแท็กที่กำหนดเองระบุตำแหน่งของไลบรารีและระบุวิธีการระบุแท็กที่กำหนดเองในเพจ JSP ของคุณ
คำสั่ง taglib เป็นไปตามไวยากรณ์ที่ระบุด้านล่าง -
<%@ taglib uri="uri" prefix = "prefixOfTag" >
ที่นี่ uri ค่าแอตทริบิวต์แก้ไขไปยังตำแหน่งที่คอนเทนเนอร์เข้าใจและ prefix แอตทริบิวต์แจ้งคอนเทนเนอร์ว่าบิตของมาร์กอัปเป็นการกระทำที่กำหนดเอง
คุณสามารถเขียน XML ที่เทียบเท่ากับไวยากรณ์ข้างต้นได้ดังนี้ -
<jsp:directive.taglib uri = "uri" prefix = "prefixOfTag" />
สำหรับรายละเอียดเพิ่มเติมที่เกี่ยวข้องกับการสั่ง taglib ให้ตรวจสอบtaglib Directive
ในบทนี้เราจะพูดถึงการดำเนินการใน JSP การดำเนินการเหล่านี้ใช้โครงสร้างในไวยากรณ์ XML เพื่อควบคุมลักษณะการทำงานของเครื่องยนต์ servlet คุณสามารถแทรกไฟล์แบบไดนามิกใช้คอมโพเนนต์ JavaBeans ซ้ำส่งต่อผู้ใช้ไปยังเพจอื่นหรือสร้าง HTML สำหรับปลั๊กอิน Java
มีเพียงไวยากรณ์เดียวสำหรับองค์ประกอบการดำเนินการเนื่องจากสอดคล้องกับมาตรฐาน XML -
<jsp:action_name attribute = "value" />
องค์ประกอบการดำเนินการเป็นฟังก์ชันที่กำหนดไว้ล่วงหน้าโดยทั่วไป ตารางต่อไปนี้แสดงรายการการดำเนินการ JSP ที่มี -
ส. | ไวยากรณ์และวัตถุประสงค์ |
---|---|
1 | jsp:include รวมไฟล์เมื่อมีการร้องขอเพจ |
2 | jsp:useBean ค้นหาหรือสร้างอินสแตนซ์ JavaBean |
3 | jsp:setProperty ตั้งค่าคุณสมบัติของ JavaBean |
4 | jsp:getProperty แทรกคุณสมบัติของ JavaBean ลงในเอาต์พุต |
5 | jsp:forward ส่งต่อผู้ร้องขอไปยังเพจใหม่ |
6 | jsp:plugin สร้างโค้ดเฉพาะเบราว์เซอร์ที่สร้างแท็ก OBJECT หรือ EMBED สำหรับปลั๊กอิน Java |
7 | jsp:element กำหนดองค์ประกอบ XML แบบไดนามิก |
8 | jsp:attribute กำหนดแอตทริบิวต์ขององค์ประกอบ XML ที่กำหนดแบบไดนามิก |
9 | jsp:body กำหนดเนื้อหาขององค์ประกอบ XML ที่กำหนดแบบไดนามิก |
10 | jsp:text ใช้เพื่อเขียนข้อความเทมเพลตในหน้า JSP และเอกสาร |
คุณสมบัติทั่วไป
มีสองแอตทริบิวต์ที่เหมือนกันสำหรับองค์ประกอบ Action ทั้งหมด: id แอตทริบิวต์และ scope แอตทริบิวต์
แอตทริบิวต์ Id
แอตทริบิวต์ id ระบุองค์ประกอบ Action โดยไม่ซ้ำกันและอนุญาตให้อ้างอิงการดำเนินการภายในเพจ JSP หาก Action สร้างอินสแตนซ์ของอ็อบเจ็กต์ค่า id สามารถใช้เพื่ออ้างอิงผ่านอ็อบเจ็กต์โดยนัย PageContext
แอตทริบิวต์ขอบเขต
แอตทริบิวต์นี้ระบุวงจรชีวิตขององค์ประกอบ Action แอตทริบิวต์ id และแอตทริบิวต์ขอบเขตเกี่ยวข้องโดยตรงเนื่องจากแอตทริบิวต์ขอบเขตกำหนดอายุการใช้งานของวัตถุที่เชื่อมโยงกับ id แอตทริบิวต์ขอบเขตมีค่าที่เป็นไปได้สี่ค่า:(a) page, (b)request, (c)sessionและ (d) application.
<jsp: include> การดำเนินการ
การดำเนินการนี้ช่วยให้คุณสามารถแทรกไฟล์ลงในหน้าที่กำลังสร้าง ไวยากรณ์มีลักษณะดังนี้ -
<jsp:include page = "relative URL" flush = "true" />
ไม่เหมือนกับ include คำสั่งซึ่งแทรกไฟล์ในเวลาที่เพจ JSP ถูกแปลเป็น servlet การดำเนินการนี้จะแทรกไฟล์ในเวลาที่เพจถูกร้องขอ
ตารางต่อไปนี้แสดงรายการคุณลักษณะที่เกี่ยวข้องกับการดำเนินการรวม -
ส. | คุณสมบัติและคำอธิบาย |
---|---|
1 | page URL สัมพัทธ์ของเพจที่จะรวม |
2 | flush แอตทริบิวต์บูลีนกำหนดว่าทรัพยากรที่รวมมีการล้างบัฟเฟอร์ก่อนที่จะรวมหรือไม่ |
ตัวอย่าง
ให้เรากำหนดสองไฟล์ต่อไปนี้ (a)date.jsp และ (b) main.jsp ดังต่อไปนี้ -
ต่อไปนี้เป็นเนื้อหาของไฟล์ date.jsp ไฟล์ -
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
ต่อไปนี้เป็นเนื้อหาของไฟล์ main.jsp ไฟล์ -
<html>
<head>
<title>The include Action Example</title>
</head>
<body>
<center>
<h2>The include action Example</h2>
<jsp:include page = "date.jsp" flush = "true" />
</center>
</body>
</html>
ตอนนี้ให้เราเก็บไฟล์เหล่านี้ไว้ในไดเรกทอรีรากและพยายามเข้าถึง main.jsp. คุณจะได้รับผลลัพธ์ต่อไปนี้ -
The include action Example
Today's date: 12-Sep-2010 14:54:22
การดำเนินการ <jsp: useBean>
useBeanการกระทำค่อนข้างหลากหลาย ขั้นแรกค้นหาวัตถุที่มีอยู่โดยใช้ตัวแปร id และขอบเขต หากไม่พบวัตถุก็จะพยายามสร้างวัตถุที่ระบุ
วิธีที่ง่ายที่สุดในการโหลดถั่วมีดังนี้ -
<jsp:useBean id = "name" class = "package.class" />
เมื่อโหลดคลาส bean แล้วคุณสามารถใช้ jsp:setProperty และ jsp:getProperty การดำเนินการเพื่อแก้ไขและดึงคุณสมบัติ bean
ตารางต่อไปนี้แสดงรายการคุณลักษณะที่เกี่ยวข้องกับการกระทำ useBean -
ส. | คุณสมบัติและคำอธิบาย |
---|---|
1 | class กำหนดชื่อแพ็กเกจเต็มของ bean |
2 | type ระบุชนิดของตัวแปรที่จะอ้างถึงออบเจ็กต์ |
3 | beanName กำหนดชื่อของ bean ตามที่ระบุโดยเมธอด instantiate () ของคลาส java.beans Bean |
ให้เราพูดคุยเกี่ยวกับ jsp:setProperty และ jsp:getProperty การดำเนินการก่อนที่จะให้ตัวอย่างที่ถูกต้องที่เกี่ยวข้องกับการกระทำเหล่านี้
การดำเนินการ <jsp: setProperty>
setPropertyการดำเนินการตั้งค่าคุณสมบัติของถั่ว Bean ต้องได้รับการกำหนดไว้ก่อนหน้านี้ก่อนการดำเนินการนี้ มีสองวิธีพื้นฐานในการใช้การดำเนินการ setProperty -
คุณสามารถใช้ได้ jsp:setProperty หลังจากนั้น แต่นอกก jsp:useBean องค์ประกอบตามที่ระบุด้านล่าง -
<jsp:useBean id = "myName" ... />
...
<jsp:setProperty name = "myName" property = "someProperty" .../>
ในกรณีนี้ไฟล์ jsp:setProperty จะดำเนินการโดยไม่คำนึงว่า bean ใหม่ถูกสร้างอินสแตนซ์หรือพบ bean ที่มีอยู่
บริบทที่สองที่ jsp: setProperty สามารถปรากฏอยู่ภายในเนื้อหาของไฟล์ jsp:useBean องค์ประกอบตามที่ระบุด้านล่าง -
<jsp:useBean id = "myName" ... >
...
<jsp:setProperty name = "myName" property = "someProperty" .../>
</jsp:useBean>
ที่นี่ jsp: setProperty จะถูกเรียกใช้เฉพาะเมื่ออ็อบเจ็กต์ใหม่ถูกสร้างอินสแตนซ์ไม่ใช่ในกรณีที่พบอ็อบเจ็กต์ที่มีอยู่
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่เกี่ยวข้องกับ setProperty การกระทำ -
ส. | คุณสมบัติและคำอธิบาย |
---|---|
1 | name กำหนดคุณสมบัติของ bean ที่จะตั้งค่า ถั่วต้องได้รับการกำหนดไว้ก่อนหน้านี้ |
2 | property ระบุคุณสมบัติที่คุณต้องการตั้งค่า ค่าของ "*" หมายความว่าพารามิเตอร์คำร้องขอทั้งหมดที่มีชื่อตรงกับชื่อคุณสมบัติ bean จะถูกส่งต่อไปยังเมธอด setter ที่เหมาะสม |
3 | value ค่าที่จะกำหนดให้กับคุณสมบัติที่กำหนด ค่าของพารามิเตอร์เป็นค่าว่างหรือไม่มีพารามิเตอร์การกระทำ setProperty จะถูกละเว้น |
4 | param แอ็ตทริบิวต์พารามิเตอร์คือชื่อของพารามิเตอร์การร้องขอที่มีค่าคุณสมบัติที่จะได้รับ คุณไม่สามารถใช้ทั้งค่าและพารามิเตอร์ได้ แต่ไม่อนุญาตให้ใช้ทั้งสองอย่าง |
การดำเนินการ <jsp: getProperty>
getProperty การดำเนินการใช้เพื่อดึงค่าของคุณสมบัติที่กำหนดและแปลงเป็นสตริงและสุดท้ายจะแทรกลงในเอาต์พุต
การดำเนินการ getProperty มีเพียงสองแอตทริบิวต์ซึ่งจำเป็นทั้งสองอย่าง ไวยากรณ์ของการดำเนินการ getProperty มีดังนี้ -
<jsp:useBean id = "myName" ... />
...
<jsp:getProperty name = "myName" property = "someProperty" .../>
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็นที่เกี่ยวข้องกับ getProperty การกระทำ -
ส. | คุณสมบัติและคำอธิบาย |
---|---|
1 | name ชื่อของ Bean ที่มีคุณสมบัติที่จะเรียกคืน ถั่วต้องได้รับการกำหนดไว้ก่อนหน้านี้ |
2 | property แอตทริบิวต์คุณสมบัติคือชื่อของคุณสมบัติ Bean ที่จะดึงข้อมูล |
ตัวอย่าง
ให้เรากำหนดถั่วทดสอบที่จะใช้ต่อไปในตัวอย่างของเรา -
/* File: TestBean.java */
package action;
public class TestBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
คอมไพล์โค้ดด้านบนเพื่อสร้าง TestBean.class และตรวจสอบให้แน่ใจว่าคุณได้คัดลอก TestBean.class ใน C:\apache-tomcat-7.0.2\webapps\WEB-INF\classes\action โฟลเดอร์และไฟล์ CLASSPATH ควรตั้งค่าตัวแปรเป็นโฟลเดอร์นี้ด้วย -
ตอนนี้ใช้รหัสต่อไปนี้ใน main.jspไฟล์. สิ่งนี้จะโหลด bean และ set / รับพารามิเตอร์ String อย่างง่าย -
<html>
<head>
<title>Using JavaBeans in JSP</title>
</head>
<body>
<center>
<h2>Using JavaBeans in JSP</h2>
<jsp:useBean id = "test" class = "action.TestBean" />
<jsp:setProperty name = "test" property = "message"
value = "Hello JSP..." />
<p>Got message....</p>
<jsp:getProperty name = "test" property = "message" />
</center>
</body>
</html>
ตอนนี้ให้เราพยายามเข้าถึง main.jspมันจะแสดงผลลัพธ์ต่อไปนี้ -
Using JavaBeans in JSP
Got message.... Hello JSP...
การดำเนินการ <jsp: forward>
forward การดำเนินการยุติการดำเนินการของเพจปัจจุบันและส่งต่อคำร้องขอไปยังรีซอร์สอื่นเช่นเพจสแตติกเพจ JSP อื่นหรือ Java Servlet
ต่อไปนี้เป็นไวยากรณ์ของ forward การกระทำ -
<jsp:forward page = "Relative URL" />
ตารางต่อไปนี้แสดงรายการคุณลักษณะที่จำเป็นที่เกี่ยวข้องกับการดำเนินการไปข้างหน้า -
ส. | คุณสมบัติและคำอธิบาย |
---|---|
1 | page ควรประกอบด้วย URL สัมพัทธ์ของรีซอร์สอื่นเช่นเพจแบบคงที่เพจ JSP อื่นหรือ Java Servlet |
ตัวอย่าง
ให้เรานำสองไฟล์ต่อไปนี้กลับมาใช้ใหม่ (a) date.jsp และ (b) main.jsp ดังต่อไปนี้ -
ต่อไปนี้เป็นเนื้อหาของไฟล์ date.jsp ไฟล์ -
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
ต่อไปนี้เป็นเนื้อหาของไฟล์ main.jsp ไฟล์ -
<html>
<head>
<title>The include Action Example</title>
</head>
<body>
<center>
<h2>The include action Example</h2>
<jsp:forward page = "date.jsp" />
</center>
</body>
</html>
ตอนนี้ให้เราเก็บไฟล์เหล่านี้ไว้ในไดเรกทอรีรากและพยายามเข้าถึง main.jsp. สิ่งนี้จะแสดงผลลัพธ์ดังนี้
ที่นี่จะทิ้งเนื้อหาจากหน้าหลักและแสดงเนื้อหาจากหน้าที่ส่งต่อเท่านั้น
Today's date: 12-Sep-2010 14:54:22
<jsp: plugin> การดำเนินการ
pluginการดำเนินการใช้เพื่อแทรกคอมโพเนนต์ Java ลงในเพจ JSP กำหนดประเภทของเบราว์เซอร์และแทรกไฟล์<object> หรือ <embed> แท็กตามต้องการ
หากไม่มีปลั๊กอินที่จำเป็นให้ดาวน์โหลดปลั๊กอินจากนั้นเรียกใช้งานคอมโพเนนต์ Java คอมโพเนนต์ Java สามารถเป็นได้ทั้ง Applet หรือ JavaBean
แอ็คชันปลั๊กอินมีแอ็ตทริบิวต์หลายตัวที่สอดคล้องกับแท็ก HTML ทั่วไปที่ใช้ในการจัดรูปแบบคอมโพเนนต์ Java <param> องค์ประกอบยังสามารถใช้เพื่อส่งพารามิเตอร์ไปยัง Applet หรือ Bean
ต่อไปนี้เป็นไวยากรณ์ทั่วไปของการใช้ปลั๊กอิน -
<jsp:plugin type = "applet" codebase = "dirname" code = "MyApplet.class"
width = "60" height = "80">
<jsp:param name = "fontcolor" value = "red" />
<jsp:param name = "background" value = "black" />
<jsp:fallback>
Unable to initialize Java Plugin
</jsp:fallback>
</jsp:plugin>
คุณสามารถลองดำเนินการนี้โดยใช้แอพเพล็ตบางตัวหากคุณสนใจ องค์ประกอบใหม่<fallback> องค์ประกอบสามารถใช้เพื่อระบุสตริงข้อผิดพลาดที่จะส่งไปยังผู้ใช้ในกรณีที่คอมโพเนนต์ล้มเหลว
The <jsp:element> Action
The <jsp:attribute> Action
The <jsp:body> Action
<jsp:element>, <jsp:attribute> และ <jsp:body>การดำเนินการใช้เพื่อกำหนดองค์ประกอบ XML แบบไดนามิก คำนี้มีความสำคัญแบบไดนามิกเนื่องจากหมายความว่าองค์ประกอบ XML สามารถสร้างขึ้นได้ตามเวลาที่ร้องขอแทนที่จะเป็นแบบคงที่ในเวลาคอมไพล์
ต่อไปนี้เป็นตัวอย่างง่ายๆในการกำหนดองค์ประกอบ XML แบบไดนามิก -
<%@page language = "java" contentType = "text/html"%>
<html xmlns = "http://www.w3c.org/1999/xhtml"
xmlns:jsp = "http://java.sun.com/JSP/Page">
<head><title>Generate XML Element</title></head>
<body>
<jsp:element name = "xmlElement">
<jsp:attribute name = "xmlElementAttr">
Value for the attribute
</jsp:attribute>
<jsp:body>
Body for XML element
</jsp:body>
</jsp:element>
</body>
</html>
สิ่งนี้จะสร้างโค้ด HTML ต่อไปนี้ในขณะทำงาน -
<html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page">
<head><title>Generate XML Element</title></head>
<body>
<xmlElement xmlElementAttr = "Value for the attribute">
Body for XML element
</xmlElement>
</body>
</html>
<jsp: text> การดำเนินการ
<jsp:text>การดำเนินการสามารถใช้เพื่อเขียนข้อความเทมเพลตในหน้า JSP และเอกสาร ต่อไปนี้เป็นไวยากรณ์ง่ายๆสำหรับการกระทำนี้ -
<jsp:text>Template data</jsp:text>
เนื้อหาของเทมเพลตต้องไม่มีองค์ประกอบอื่น สามารถมีได้เฉพาะข้อความและนิพจน์ EL เท่านั้น (หมายเหตุ - นิพจน์ EL จะอธิบายในบทถัดไป) โปรดทราบว่าในไฟล์ XML คุณไม่สามารถใช้นิพจน์เช่น${whatever > 0}เนื่องจากเครื่องหมายที่ใหญ่กว่านั้นผิดกฎหมาย ให้ใช้ไฟล์gt แบบฟอร์มเช่น ${whatever gt 0} หรืออีกทางเลือกหนึ่งคือการฝังค่าในไฟล์ CDATA มาตรา.
<jsp:text><![CDATA[<br>]]></jsp:text>
หากคุณต้องการรวมไฟล์ DOCTYPE การประกาศเช่นสำหรับ XHTMLคุณต้องใช้ไฟล์ <jsp:text> องค์ประกอบดังนี้ -
<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">]]></jsp:text>
<head><title>jsp:text action</title></head>
<body>
<books><book><jsp:text>
Welcome to JSP Programming
</jsp:text></book></books>
</body>
</html>
ลองใช้ตัวอย่างข้างต้นทั้งแบบมีและไม่มี <jsp:text> หนังบู๊.
ในบทนี้เราจะพูดถึง Implicit Objects ใน JSP อ็อบเจ็กต์เหล่านี้เป็นอ็อบเจ็กต์ Java ที่ JSP Container ทำให้พร้อมใช้งานสำหรับนักพัฒนาในแต่ละเพจและผู้พัฒนาสามารถเรียกใช้อ็อบเจ็กต์เหล่านี้ได้โดยตรงโดยไม่ต้องประกาศอย่างชัดเจน JSP Implicit Objects เรียกอีกอย่างว่าpre-defined variables.
ตารางต่อไปนี้แสดงรายการ Implicit Objects เก้ารายการที่ JSP รองรับ -
ส. | วัตถุและคำอธิบาย |
---|---|
1 | request นี้เป็น HttpServletRequest วัตถุที่เกี่ยวข้องกับคำขอ |
2 | response นี้เป็น HttpServletResponse วัตถุที่เกี่ยวข้องกับการตอบสนองไปยังไคลเอนต์ |
3 | out นี้เป็น PrintWriter วัตถุที่ใช้ในการส่งเอาต์พุตไปยังไคลเอนต์ |
4 | session นี้เป็น HttpSession วัตถุที่เกี่ยวข้องกับคำขอ |
5 | application นี้เป็น ServletContext วัตถุที่เชื่อมโยงกับบริบทของแอปพลิเคชัน |
6 | config นี้เป็น ServletConfig วัตถุที่เกี่ยวข้องกับเพจ |
7 | pageContext สิ่งนี้สรุปการใช้คุณลักษณะเฉพาะเซิร์ฟเวอร์เช่นประสิทธิภาพที่สูงขึ้น JspWriters. |
8 | page นี่เป็นเพียงคำพ้องความหมายสำหรับ thisและใช้เพื่อเรียกเมธอดที่กำหนดโดยคลาส servlet ที่แปลแล้ว |
9 | Exception Exception ออบเจ็กต์อนุญาตให้เข้าถึงข้อมูลข้อยกเว้นโดย JSP ที่กำหนด |
วัตถุที่ร้องขอ
ออบเจ็กต์คำขอเป็นตัวอย่างของไฟล์ javax.servlet.http.HttpServletRequestวัตถุ. ทุกครั้งที่ไคลเอ็นต์ร้องขอเพจเอ็นจิน JSP จะสร้างอ็อบเจ็กต์ใหม่เพื่อแสดงคำร้องนั้น
อ็อบเจ็กต์คำขอจัดเตรียมเมธอดในการรับข้อมูลส่วนหัว HTTP รวมถึงข้อมูลฟอร์มคุกกี้เมธอด HTTP เป็นต้น
เราสามารถครอบคลุมชุดที่สมบูรณ์ของวิธีการที่เกี่ยวข้องกับวัตถุคำขอในบทต่อมา - JSP - คำขอของลูกค้า
วัตถุตอบสนอง
วัตถุตอบสนองเป็นตัวอย่างของไฟล์ javax.servlet.http.HttpServletResponseวัตถุ. เช่นเดียวกับที่เซิร์ฟเวอร์สร้างอ็อบเจ็กต์คำขอเซิร์ฟเวอร์จะสร้างอ็อบเจ็กต์เพื่อแสดงการตอบสนองต่อไคลเอ็นต์
อ็อบเจ็กต์ตอบกลับยังกำหนดอินเตอร์เฟสที่จัดการกับการสร้างส่วนหัว HTTP ใหม่ ผ่านวัตถุนี้โปรแกรมเมอร์ JSP สามารถเพิ่มคุกกี้ใหม่หรือการประทับวันที่รหัสสถานะ HTTP ฯลฯ
เราจะครอบคลุมชุดที่สมบูรณ์ของวิธีการที่เกี่ยวข้องกับการตอบสนองวัตถุในบทต่อมา - JSP - ตอบกลับของเซิร์ฟเวอร์
วัตถุออก
ออบเจ็กต์โดยนัยเป็นตัวอย่างของไฟล์ javax.servlet.jsp.JspWriter วัตถุและใช้เพื่อส่งเนื้อหาในการตอบกลับ
อ็อบเจ็กต์ JspWriter เริ่มต้นถูกสร้างอินสแตนซ์แตกต่างกันขึ้นอยู่กับว่าเพจถูกบัฟเฟอร์หรือไม่ สามารถปิดการบัฟเฟอร์ได้อย่างง่ายดายโดยใช้ไฟล์buffered = 'false' แอตทริบิวต์ของคำสั่งเพจ
วัตถุ JspWriter มีเมธอดส่วนใหญ่เช่นเดียวกับไฟล์ java.io.PrintWriterชั้นเรียน. อย่างไรก็ตาม JspWriter มีวิธีการเพิ่มเติมบางอย่างที่ออกแบบมาเพื่อจัดการกับการบัฟเฟอร์ ไม่เหมือนกับวัตถุ PrintWriter JspWriter จะพ่นIOExceptions.
ตารางต่อไปนี้แสดงวิธีการสำคัญที่เราจะใช้ในการเขียน boolean char, int, double, object, Stringฯลฯ
ส. | วิธีการและคำอธิบาย |
---|---|
1 | out.print(dataType dt) พิมพ์ค่าชนิดข้อมูล |
2 | out.println(dataType dt) พิมพ์ค่าชนิดข้อมูลจากนั้นยุติบรรทัดด้วยอักขระบรรทัดใหม่ |
3 | out.flush() ล้างสตรีม |
วัตถุเซสชัน
วัตถุเซสชันเป็นตัวอย่างของ javax.servlet.http.HttpSession และทำงานในลักษณะเดียวกับที่วัตถุเซสชันทำงานภายใต้ Java Servlets
วัตถุเซสชันใช้เพื่อติดตามเซสชันไคลเอ็นต์ระหว่างคำขอของไคลเอ็นต์ เราจะครอบคลุมการใช้งานที่สมบูรณ์แบบของวัตถุในเซสชั่นบทที่ตามมา - JSP - การติดตามเซสชัน
วัตถุแอปพลิเคชัน
วัตถุแอปพลิเคชันคือกระดาษห่อหุ้มโดยตรงรอบ ๆ ไฟล์ ServletContext วัตถุสำหรับ Servlet ที่สร้างขึ้นและในความเป็นจริงตัวอย่างของไฟล์ javax.servlet.ServletContext วัตถุ.
วัตถุนี้เป็นตัวแทนของเพจ JSP ตลอดวงจรชีวิตทั้งหมด อ็อบเจ็กต์นี้ถูกสร้างขึ้นเมื่อเพจ JSP ถูกเตรียมใช้งานและจะถูกลบออกเมื่อเพจ JSP ถูกลบออกโดยjspDestroy() วิธี.
ด้วยการเพิ่มแอตทริบิวต์ให้กับแอปพลิเคชันคุณสามารถมั่นใจได้ว่าไฟล์ JSP ทั้งหมดที่ประกอบเป็นเว็บแอปพลิเคชันของคุณสามารถเข้าถึงได้
เราจะตรวจสอบการใช้ Application Object ในบทJSP - Hits Counter
วัตถุ config
วัตถุ config เป็นอินสแตนซ์ของ javax.servlet.ServletConfig และเป็นกระดาษห่อหุ้มโดยตรงรอบ ๆ ServletConfig วัตถุสำหรับ servlet ที่สร้างขึ้น
อ็อบเจ็กต์นี้อนุญาตให้โปรแกรมเมอร์ JSP เข้าถึงพารามิเตอร์การกำหนดค่าเริ่มต้นของเครื่องมือ Servlet หรือ JSP เช่นเส้นทางหรือตำแหน่งไฟล์เป็นต้น
ดังต่อไปนี้ config วิธีการเป็นวิธีเดียวที่คุณอาจใช้และการใช้งานนั้นไม่สำคัญ -
config.getServletName();
สิ่งนี้ส่งคืนชื่อ servlet ซึ่งเป็นสตริงที่มีอยู่ในไฟล์ <servlet-name> องค์ประกอบที่กำหนดในไฟล์ WEB-INF\web.xml ไฟล์.
วัตถุ pageContext
วัตถุ pageContext เป็นอินสแตนซ์ของไฟล์ javax.servlet.jsp.PageContextวัตถุ. อ็อบเจ็กต์ pageContext ใช้เพื่อแสดงเพจ JSP ทั้งหมด
วัตถุนี้มีจุดมุ่งหมายเพื่อเข้าถึงข้อมูลเกี่ยวกับเพจในขณะที่หลีกเลี่ยงรายละเอียดการใช้งานส่วนใหญ่
อ็อบเจ็กต์นี้เก็บการอ้างอิงถึงคำร้องขอและอ็อบเจ็กต์การตอบสนองสำหรับแต่ละคำร้องขอ application, config, sessionและอ็อบเจ็กต์ออกมาจากการเข้าถึงคุณลักษณะของอ็อบเจ็กต์นี้
อ็อบเจ็กต์ pageContext ยังมีข้อมูลเกี่ยวกับคำสั่งที่ออกให้กับเพจ JSP ซึ่งรวมถึงข้อมูลการบัฟเฟอร์ errorPageURL และขอบเขตเพจ
คลาส PageContext กำหนดฟิลด์ต่างๆรวมถึง PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE, และ APPLICATION_SCOPEซึ่งระบุขอบเขตทั้งสี่ นอกจากนี้ยังรองรับมากกว่า 40 วิธีซึ่งประมาณครึ่งหนึ่งได้รับการถ่ายทอดมาจากjavax.servlet.jsp.JspContext class.
หนึ่งในวิธีการที่สำคัญคือ removeAttribute. วิธีนี้ยอมรับข้อโต้แย้งหนึ่งหรือสองข้อ ตัวอย่างเช่น,pageContext.removeAttribute ("attrName") ลบแอตทริบิวต์ออกจากขอบเขตทั้งหมดในขณะที่โค้ดต่อไปนี้จะลบออกจากขอบเขตเพจเท่านั้น -
pageContext.removeAttribute("attrName", PAGE_SCOPE);
การใช้ pageContext สามารถตรวจสอบได้ในJSP - File Uploading chapter
หน้าวัตถุ
ออบเจ็กต์นี้เป็นการอ้างอิงจริงไปยังอินสแตนซ์ของเพจ สามารถคิดได้ว่าเป็นวัตถุที่แสดงถึงหน้า JSP ทั้งหมด
วัตถุหน้าเป็นคำพ้องความหมายโดยตรงสำหรับไฟล์ this วัตถุ.
วัตถุข้อยกเว้น
ออบเจ็กต์ข้อยกเว้นคือกระดาษห่อหุ้มที่มีข้อยกเว้นที่ส่งมาจากหน้าที่แล้ว โดยทั่วไปจะใช้เพื่อสร้างการตอบสนองที่เหมาะสมกับเงื่อนไขข้อผิดพลาด
เราจะกล่าวถึงการใช้งานออบเจ็กต์นี้อย่างสมบูรณ์ในJSP -บทการจัดการข้อยกเว้น
ในบทนี้เราจะพูดถึงคำขอของลูกค้าใน JSP เมื่อเบราว์เซอร์ร้องขอเว็บเพจเบราว์เซอร์จะส่งข้อมูลจำนวนมากไปยังเว็บเซิร์ฟเวอร์ ไม่สามารถอ่านข้อมูลนี้ได้โดยตรงเนื่องจากข้อมูลนี้เดินทางเป็นส่วนหนึ่งของส่วนหัวของคำขอ HTTP คุณสามารถตรวจสอบHTTP Protocolสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
ตารางต่อไปนี้แสดงข้อมูลส่วนหัวที่สำคัญซึ่งมาจากเบราว์เซอร์ ข้อมูลนี้มักใช้ในการเขียนโปรแกรมบนเว็บ -
ส. | ส่วนหัวและคำอธิบาย |
---|---|
1 | Accept ส่วนหัวนี้ระบุไฟล์ MIMEประเภทที่เบราว์เซอร์หรือไคลเอนต์อื่น ๆ สามารถจัดการได้ ค่าของimage/png หรือ image/jpeg เป็นสองความเป็นไปได้ที่พบบ่อยที่สุด |
2 | Accept-Charset ส่วนหัวนี้ระบุชุดอักขระที่เบราว์เซอร์สามารถใช้เพื่อแสดงข้อมูล ตัวอย่างเช่น,ISO-8859-1. |
3 | Accept-Encoding ส่วนหัวนี้ระบุประเภทของการเข้ารหัสที่เบราว์เซอร์รู้วิธีจัดการ ค่าของgzip หรือ compress เป็นสองความเป็นไปได้ที่พบบ่อยที่สุด |
4 | Accept-Language ส่วนหัวนี้ระบุภาษาที่ต้องการของไคลเอ็นต์ในกรณีที่ servlet สามารถสร้างผลลัพธ์ในมากกว่าหนึ่งภาษา ตัวอย่างเช่นen, en-us, ruฯลฯ |
5 | Authorization ไคลเอนต์ใช้ส่วนหัวนี้เพื่อระบุตัวตนเมื่อเข้าถึงหน้าเว็บที่มีการป้องกันด้วยรหัสผ่าน |
6 | Connection ส่วนหัวนี้ระบุว่าไคลเอ็นต์สามารถจัดการการเชื่อมต่อ HTTP แบบถาวรได้หรือไม่ การเชื่อมต่อแบบต่อเนื่องอนุญาตให้ไคลเอ็นต์หรือเบราว์เซอร์อื่นดึงไฟล์หลายไฟล์ด้วยคำขอเดียว ค่าของKeep-Alive หมายความว่าควรใช้การเชื่อมต่อแบบต่อเนื่อง |
7 | Content-Length ส่วนหัวนี้ใช้ได้กับ POST ร้องขอและให้ขนาดของข้อมูล POST เป็นไบต์ |
8 | Cookie ส่วนหัวนี้ส่งคืนคุกกี้ไปยังเซิร์ฟเวอร์ที่ส่งไปยังเบราว์เซอร์ก่อนหน้านี้ |
9 | Host ส่วนหัวนี้ระบุโฮสต์และพอร์ตตามที่ระบุใน URL ดั้งเดิม |
10 | If-Modified-Since ส่วนหัวนี้ระบุว่าไคลเอ็นต์ต้องการเพจก็ต่อเมื่อมีการเปลี่ยนแปลงหลังจากวันที่ระบุ เซิร์ฟเวอร์ส่งรหัส 304 ซึ่งหมายความว่าNot Modified ส่วนหัวหากไม่มีผลลัพธ์ที่ใหม่กว่า |
11 | If-Unmodified-Since ส่วนหัวนี้กลับกันของ If-Modified-Since; ระบุว่าการดำเนินการควรสำเร็จก็ต่อเมื่อเอกสารเก่ากว่าวันที่ที่ระบุ |
12 | Referer ส่วนหัวนี้ระบุ URL ของหน้าเว็บที่อ้างอิง ตัวอย่างเช่นหากคุณอยู่ที่เว็บเพจ 1 และคลิกลิงก์ไปยังเว็บเพจ 2 URL ของเว็บเพจ 1 จะรวมอยู่ในส่วนหัวของผู้อ้างอิงเมื่อเบราว์เซอร์ร้องขอเว็บเพจ 2 |
13 | User-Agent ส่วนหัวนี้ระบุเบราว์เซอร์หรือไคลเอนต์อื่นที่ส่งคำขอและสามารถใช้เพื่อส่งคืนเนื้อหาที่แตกต่างกันไปยังเบราว์เซอร์ประเภทต่างๆ |
วัตถุ HttpServletRequest
ออบเจ็กต์คำขอเป็นตัวอย่างของไฟล์ javax.servlet.http.HttpServletRequestวัตถุ. ทุกครั้งที่ไคลเอ็นต์ร้องขอเพจเอ็นจิน JSP จะสร้างอ็อบเจ็กต์ใหม่เพื่อแสดงคำร้องนั้น
อ็อบเจ็กต์การร้องขอมีวิธีการรับข้อมูลส่วนหัว HTTP รวมถึง form data, cookies, HTTP methodsฯลฯ
ตารางต่อไปนี้แสดงวิธีการสำคัญที่สามารถใช้เพื่ออ่านส่วนหัว HTTP ในโปรแกรม JSP ของคุณ วิธีการเหล่านี้สามารถใช้ได้กับอ็อบเจ็กต์HttpServletRequestซึ่งแสดงถึงการร้องขอไคลเอ็นต์ไปยังเว็บเซิร์ฟเวอร์
ส. | วิธีการและคำอธิบาย |
---|---|
1 | Cookie[] getCookies() ส่งคืนอาร์เรย์ที่มีอ็อบเจ็กต์ Cookie ทั้งหมดที่ไคลเอ็นต์ส่งมาพร้อมกับคำขอนี้ |
2 | Enumeration getAttributeNames() ส่งกลับการแจงนับที่มีชื่อของแอตทริบิวต์ที่มีให้สำหรับคำขอนี้ |
3 | Enumeration getHeaderNames() ส่งกลับการแจงนับของชื่อส่วนหัวทั้งหมดที่คำขอนี้มี |
4 | Enumeration getParameterNames() ส่งกลับการแจงนับของอ็อบเจ็กต์ String ที่มีชื่อของพารามิเตอร์ที่อยู่ในคำร้องขอนี้ |
5 | HttpSession getSession() ส่งคืนเซสชันปัจจุบันที่เชื่อมโยงกับคำขอนี้หรือหากคำขอไม่มีเซสชันให้สร้างขึ้น |
6 | HttpSession getSession(boolean create) ส่งคืน HttpSession ปัจจุบันที่เชื่อมโยงกับคำขอนี้หรือถ้าไม่มีเซสชันปัจจุบันและสร้างเป็นจริงจะส่งคืนเซสชันใหม่ |
7 | Locale getLocale() ส่งคืนโลแคลที่ต้องการซึ่งไคลเอ็นต์จะยอมรับเนื้อหาโดยยึดตามส่วนหัวของภาษาที่ยอมรับ |
8 | Object getAttribute(String name) ส่งคืนค่าของแอตทริบิวต์ที่ระบุชื่อเป็นวัตถุหรือค่าว่างหากไม่มีแอตทริบิวต์ของชื่อที่กำหนด |
9 | ServletInputStream getInputStream() ดึงเนื้อหาของคำขอเป็นข้อมูลไบนารีโดยใช้ ServletInputStream |
10 | String getAuthType() ส่งคืนชื่อของรูปแบบการพิสูจน์ตัวตนที่ใช้เพื่อป้องกัน servlet ตัวอย่างเช่น "BASIC" หรือ "SSL" หรือ null หากไม่มีการป้องกัน JSP |
11 | String getCharacterEncoding() ส่งคืนชื่อของการเข้ารหัสอักขระที่ใช้ในเนื้อหาของคำขอนี้ |
12 | String getContentType() ส่งคืนชนิด MIME ของเนื้อหาของคำขอหรือค่าว่างหากไม่ทราบชนิด |
13 | String getContextPath() ส่งคืนส่วนของ URI คำขอที่ระบุบริบทของคำขอ |
14 | String getHeader(String name) ส่งคืนค่าของส่วนหัวคำขอที่ระบุเป็นสตริง |
15 | String getMethod() ส่งคืนชื่อของเมธอด HTTP ที่มีการร้องขอนี้ตัวอย่างเช่น GET, POST หรือ PUT |
16 | String getParameter(String name) ส่งคืนค่าของพารามิเตอร์คำร้องขอเป็นสตริงหรือค่าว่างถ้าไม่มีพารามิเตอร์ |
17 | String getPathInfo() ส่งคืนข้อมูลเส้นทางเพิ่มเติมใด ๆ ที่เชื่อมโยงกับ URL ที่ไคลเอ็นต์ส่งเมื่อส่งคำขอนี้ |
18 | String getProtocol() ส่งคืนชื่อและเวอร์ชันของโปรโตคอลที่คำขอใช้ |
19 | String getQueryString() ส่งคืนสตริงเคียวรีที่อยู่ใน URL คำขอหลังพา ธ |
20 | String getRemoteAddr() ส่งคืนที่อยู่ Internet Protocol (IP) ของไคลเอนต์ที่ส่งคำขอ |
21 | String getRemoteHost() ส่งคืนชื่อแบบเต็มของไคลเอ็นต์ที่ส่งคำขอ |
22 | String getRemoteUser() ส่งคืนล็อกอินของผู้ใช้ที่ส่งคำขอนี้หากผู้ใช้ได้รับการพิสูจน์ตัวตนหรือเป็นโมฆะหากผู้ใช้ไม่ได้รับการพิสูจน์ตัวตน |
23 | String getRequestURI() ส่งคืนส่วนของ URL ของคำขอนี้จากชื่อโปรโตคอลไปจนถึงสตริงการสืบค้นในบรรทัดแรกของคำขอ HTTP |
24 | String getRequestedSessionId() ส่งคืนรหัสเซสชันที่ไคลเอ็นต์ระบุ |
25 | String getServletPath() ส่งคืนส่วนของ URL ของคำร้องขอนี้ที่เรียกใช้ JSP |
26 | String[] getParameterValues(String name) ส่งคืนอาร์เรย์ของอ็อบเจ็กต์ String ที่มีค่าทั้งหมดที่พารามิเตอร์คำร้องขอที่กำหนดมีหรือ null หากไม่มีพารามิเตอร์ |
27 | boolean isSecure() ส่งคืนบูลีนที่ระบุว่าคำขอนี้สร้างขึ้นโดยใช้ช่องทางที่ปลอดภัยเช่น HTTPS หรือไม่ |
28 | int getContentLength() ส่งคืนความยาวเป็นไบต์ของเนื้อหาคำร้องและทำให้พร้อมใช้งานโดยสตรีมอินพุตหรือ -1 หากไม่ทราบความยาว |
29 | int getIntHeader(String name) ส่งคืนค่าของส่วนหัวคำขอที่ระบุเป็น int |
30 | int getServerPort() ส่งคืนหมายเลขพอร์ตที่ได้รับคำขอนี้ |
ตัวอย่างคำขอส่วนหัว HTTP
ต่อไปนี้เป็นตัวอย่างที่ใช้ getHeaderNames() วิธีการของ HttpServletRequestเพื่ออ่านข้อมูลส่วนหัว HTTP วิธีนี้ส่งคืนการแจงนับที่มีข้อมูลส่วนหัวที่เชื่อมโยงกับคำร้องขอ HTTP ปัจจุบัน
เมื่อเรามีการแจงนับแล้วเราสามารถวนซ้ำการแจงนับในลักษณะมาตรฐานได้ เราจะใช้ไฟล์hasMoreElements() วิธีการกำหนดเวลาที่จะหยุดและ nextElement() วิธีการรับชื่อของชื่อพารามิเตอร์แต่ละตัว
<%@ page import = "java.io.*,java.util.*" %>
<html>
<head>
<title>HTTP Header Request Example</title>
</head>
<body>
<center>
<h2>HTTP Header Request Example</h2>
<table width = "100%" border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Header Name</th>
<th>Header Value(s)</th>
</tr>
<%
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</center>
</body>
</html>
ตอนนี้ให้เราใส่รหัสด้านบน main.jsp และพยายามเข้าถึง
ตัวอย่างคำขอส่วนหัว HTTP
ชื่อส่วนหัว | ค่าส่วนหัว |
---|---|
ยอมรับ | * / * |
ยอมรับภาษา | en-us |
ตัวแทนผู้ใช้ | Mozilla / 4.0 (เข้ากันได้; MSIE 7.0; Windows NT 5.1; ตรีศูล / 4.0; InfoPath.2; MS-RTC LM 8) |
ยอมรับการเข้ารหัส | gzip, ยุบ |
เจ้าภาพ | localhost: 8080 |
การเชื่อมต่อ | ให้มีชีวิตอยู่ |
การควบคุมแคช | ไม่มีแคช |
คุณสามารถลองใช้วิธีการทั้งหมดในลักษณะเดียวกัน
ในบทนี้เราจะพูดถึงการตอบสนองของเซิร์ฟเวอร์ใน JSP เมื่อเว็บเซิร์ฟเวอร์ตอบสนองต่อคำร้องขอ HTTP โดยทั่วไปการตอบสนองจะประกอบด้วยบรรทัดสถานะส่วนหัวการตอบกลับบรรทัดว่างและเอกสาร คำตอบทั่วไปมีลักษณะดังนี้ -
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
บรรทัดสถานะประกอบด้วยเวอร์ชัน HTTP (HTTP/1.1 in the example)รหัสสถานะ (200 in the example)และข้อความสั้น ๆ ที่สอดคล้องกับรหัสสถานะ (OK in the example).
ต่อไปนี้เป็นข้อมูลสรุปของส่วนหัวการตอบกลับ HTTP 1.1 ที่มีประโยชน์ที่สุดซึ่งกลับไปที่เบราว์เซอร์จากเว็บเซิร์ฟเวอร์ ส่วนหัวเหล่านี้มักใช้ในการเขียนโปรแกรมเว็บ -
ส. | ส่วนหัวและคำอธิบาย |
---|---|
1 | Allow ส่วนหัวนี้ระบุวิธีการร้องขอ (GET, POSTฯลฯ ) ที่เซิร์ฟเวอร์รองรับ |
2 | Cache-Control ส่วนหัวนี้ระบุสถานการณ์ที่สามารถแคชเอกสารตอบกลับได้อย่างปลอดภัย มันสามารถมีค่าpublic, private หรือ no-cache เป็นต้นเอกสารสาธารณะหมายถึงแคชได้เอกสารหมายถึงส่วนตัวมีไว้สำหรับผู้ใช้คนเดียวและสามารถเก็บไว้ในแคชส่วนตัว (ที่ไม่ใช้ร่วมกัน) เท่านั้นและไม่ควรแคชหมายถึงเอกสาร |
3 | Connection ส่วนหัวนี้จะแนะนำเบราว์เซอร์ว่าจะใช้การเชื่อมต่อ HTTP แบบต่อเนื่องหรือไม่ ค่าของclose สั่งให้เบราว์เซอร์ไม่ใช้การเชื่อมต่อ HTTP แบบต่อเนื่องและ keep-alive หมายถึงการใช้การเชื่อมต่อแบบต่อเนื่อง |
4 | Content-Disposition ส่วนหัวนี้ช่วยให้คุณขอให้เบราว์เซอร์ขอให้ผู้ใช้บันทึกการตอบกลับลงในดิสก์ในไฟล์ชื่อที่กำหนด |
5 | Content-Encoding ส่วนหัวนี้ระบุวิธีการเข้ารหัสเพจระหว่างการส่ง |
6 | Content-Language ส่วนหัวนี้หมายถึงภาษาที่ใช้เขียนเอกสาร ตัวอย่างเช่น,en, en-us, ru, เป็นต้น |
7 | Content-Length ส่วนหัวนี้ระบุจำนวนไบต์ในการตอบสนอง ข้อมูลนี้จำเป็นเฉพาะในกรณีที่เบราว์เซอร์ใช้การเชื่อมต่อ HTTP แบบต่อเนื่อง (คงอยู่) |
8 | Content-Type ส่วนหัวนี้ให้ไฟล์ MIME (Multipurpose Internet Mail Extension) ประเภทของเอกสารตอบกลับ |
9 | Expires ส่วนหัวนี้ระบุเวลาที่ควรพิจารณาว่าเนื้อหาล้าสมัยจึงไม่ถูกแคชอีกต่อไป |
10 | Last-Modified ส่วนหัวนี้ระบุว่าเอกสารถูกเปลี่ยนแปลงล่าสุดเมื่อใด จากนั้นไคลเอนต์สามารถแคชเอกสารและระบุวันที่โดยไฟล์If-Modified-Since ขอส่วนหัวในการร้องขอในภายหลัง |
11 | Location ส่วนหัวนี้ควรรวมอยู่ในคำตอบทั้งหมดที่มีรหัสสถานะในยุค 300 สิ่งนี้จะแจ้งเบราว์เซอร์ถึงที่อยู่เอกสาร เบราว์เซอร์จะเชื่อมต่อกับตำแหน่งนี้อีกครั้งโดยอัตโนมัติและดึงเอกสารใหม่ |
12 | Refresh ส่วนหัวนี้ระบุว่าเบราว์เซอร์ควรจะขอเพจที่อัปเดตเร็วแค่ไหน คุณสามารถระบุเวลาเป็นจำนวนวินาทีหลังจากนั้นจะรีเฟรชหน้า |
13 | Retry-After ส่วนหัวนี้สามารถใช้ร่วมกับไฟล์ 503 (Service Unavailable) ตอบกลับเพื่อแจ้งให้ลูกค้าทราบว่าสามารถทำซ้ำคำขอได้เร็วแค่ไหน |
14 | Set-Cookie ส่วนหัวนี้ระบุคุกกี้ที่เกี่ยวข้องกับเพจ |
วัตถุ HttpServletResponse
วัตถุตอบสนองเป็นตัวอย่างของไฟล์ javax.servlet.http.HttpServletResponse object. เช่นเดียวกับที่เซิร์ฟเวอร์สร้างอ็อบเจ็กต์คำขอเซิร์ฟเวอร์จะสร้างอ็อบเจ็กต์เพื่อแสดงการตอบสนองต่อไคลเอ็นต์
อ็อบเจ็กต์ตอบกลับยังกำหนดอินเตอร์เฟสที่จัดการกับการสร้างส่วนหัว HTTP ใหม่ ผ่านวัตถุนี้โปรแกรมเมอร์ JSP สามารถเพิ่มคุกกี้ใหม่หรือการประทับวันที่รหัสสถานะ HTTP เป็นต้น
สามารถใช้วิธีการต่อไปนี้เพื่อตั้งค่าส่วนหัวการตอบกลับ HTTP ในโปรแกรม servlet ของคุณ วิธีการเหล่านี้พร้อมใช้งานกับอ็อบเจ็กต์HttpServletResponse วัตถุนี้แสดงถึงการตอบสนองของเซิร์ฟเวอร์
ส. | วิธีการและคำอธิบาย |
---|---|
1 | String encodeRedirectURL(String url) เข้ารหัส URL ที่ระบุเพื่อใช้ในไฟล์ sendRedirect วิธีการหรือหากไม่จำเป็นต้องเข้ารหัสจะส่งคืน URL ที่ไม่เปลี่ยนแปลง |
2 | String encodeURL(String url) เข้ารหัส URL ที่ระบุโดยรวมรหัสเซสชันไว้ด้วยหรือหากไม่จำเป็นต้องเข้ารหัสจะส่งคืน URL ที่ไม่เปลี่ยนแปลง |
3 | boolean containsHeader(String name) ส่งคืนบูลีนที่ระบุว่ามีการตั้งค่าส่วนหัวการตอบกลับที่ตั้งชื่อแล้ว |
4 | boolean isCommitted() ส่งคืนบูลีนที่ระบุว่ามีการตอบสนองหรือไม่ |
5 | void addCookie(Cookie cookie) เพิ่มคุกกี้ที่ระบุในการตอบกลับ |
6 | void addDateHeader(String name, long date) เพิ่มส่วนหัวการตอบกลับด้วยชื่อที่กำหนดและวันที่ - ค่า |
7 | void addHeader(String name, String value) เพิ่มส่วนหัวการตอบกลับด้วยชื่อและค่าที่กำหนด |
8 | void addIntHeader(String name, int value) เพิ่มส่วนหัวการตอบกลับด้วยชื่อที่กำหนดและค่าจำนวนเต็ม |
9 | void flushBuffer() บังคับให้เขียนเนื้อหาใด ๆ ในบัฟเฟอร์ไปยังไคลเอนต์ |
10 | void reset() ล้างข้อมูลใด ๆ ที่มีอยู่ในบัฟเฟอร์ตลอดจนรหัสสถานะและส่วนหัว |
11 | void resetBuffer() ล้างเนื้อหาของบัฟเฟอร์ที่อยู่เบื้องหลังในการตอบกลับโดยไม่ต้องล้างส่วนหัวหรือรหัสสถานะ |
12 | void sendError(int sc) ส่งการตอบสนองข้อผิดพลาดไปยังไคลเอ็นต์โดยใช้รหัสสถานะที่ระบุและล้างบัฟเฟอร์ |
13 | void sendError(int sc, String msg) ส่งการตอบสนองข้อผิดพลาดไปยังไคลเอ็นต์โดยใช้สถานะที่ระบุ |
14 | void sendRedirect(String location) ส่งการตอบกลับการเปลี่ยนเส้นทางชั่วคราวไปยังไคลเอนต์โดยใช้ URL ตำแหน่งการเปลี่ยนเส้นทางที่ระบุ |
15 | void setBufferSize(int size) ตั้งค่าขนาดบัฟเฟอร์ที่ต้องการสำหรับเนื้อหาของการตอบสนอง |
16 | void setCharacterEncoding(String charset) ตั้งค่าการเข้ารหัสอักขระ (ชุดอักขระ MIME) ของการตอบกลับที่ส่งไปยังไคลเอ็นต์เช่นเป็น UTF-8 |
17 | void setContentLength(int len) ตั้งค่าความยาวของเนื้อหาในการตอบสนองใน HTTP servlets; วิธีนี้ยังตั้งค่าส่วนหัว HTTP Content-Length |
18 | void setContentType(String type) ตั้งค่าชนิดเนื้อหาของการตอบกลับที่ส่งไปยังไคลเอ็นต์หากการตอบกลับยังไม่ได้รับการยืนยัน |
19 | void setDateHeader(String name, long date) ตั้งค่าส่วนหัวการตอบกลับด้วยชื่อที่กำหนดและวันที่ - ค่า |
20 | void setHeader(String name, String value) ตั้งค่าส่วนหัวการตอบกลับด้วยชื่อและค่าที่กำหนด |
21 | void setIntHeader(String name, int value) ตั้งค่าส่วนหัวการตอบกลับด้วยชื่อที่กำหนดและค่าจำนวนเต็ม |
22 | void setLocale(Locale loc) ตั้งค่าภาษาของการตอบกลับหากการตอบกลับยังไม่ได้รับการยืนยัน |
23 | void setStatus(int sc) ตั้งรหัสสถานะสำหรับการตอบกลับนี้ |
ตัวอย่างการตอบสนองส่วนหัวของ HTTP
ตัวอย่างต่อไปนี้จะใช้ setIntHeader() วิธีการตั้งค่า Refresh ส่วนหัวเพื่อจำลองนาฬิกาดิจิตอล -
<%@ page import = "java.io.*,java.util.*" %>
<html>
<head>
<title>Auto Refresh Header Example</title>
</head>
<body>
<center>
<h2>Auto Refresh Header Example</h2>
<%
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 5);
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
out.println("Current Time is: " + CT + "\n");
%>
</center>
</body>
</html>
ตอนนี้ใส่รหัสด้านบน main.jspและพยายามเข้าถึง ซึ่งจะแสดงเวลาของระบบปัจจุบันหลังจากทุกๆ 5 วินาทีดังนี้ เรียกใช้ JSP คุณจะได้รับผลลัพธ์ต่อไปนี้: -
Auto Refresh Header Example
Current Time is: 9:44:50 PM
คุณสามารถลองหาวิธีอื่น ๆ ในลักษณะเดียวกัน
ในบทนี้เราจะพูดถึงรหัสสถานะ Http ใน JSP รูปแบบของคำขอ HTTP และข้อความตอบกลับ HTTP จะคล้ายกันและจะมีโครงสร้างดังต่อไปนี้ -
บรรทัดสถานะเริ่มต้น + CRLF (Carriage Return + Line Feed เช่น New Line)
เส้นส่วนหัวเป็นศูนย์หรือมากกว่า + CRLF
บรรทัดว่างเช่น CRLF
เนื้อหาข้อความที่เป็นทางเลือกเช่นไฟล์ข้อมูลคิวรีหรือเอาต์พุตคิวรี
ตัวอย่างเช่นส่วนหัวการตอบกลับของเซิร์ฟเวอร์มีลักษณะดังต่อไปนี้ -
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
บรรทัดสถานะประกอบด้วย HTTP version (HTTP/1.1 in the example), รหัสสถานะ (200 ในตัวอย่าง) และข้อความสั้น ๆ ที่สอดคล้องกับรหัสสถานะ (OK in the example).
ตารางต่อไปนี้แสดงรหัสสถานะ HTTP และข้อความที่เกี่ยวข้องซึ่งอาจส่งคืนจากเว็บเซิร์ฟเวอร์ -
รหัส | ข้อความ | คำอธิบาย |
---|---|---|
100 | ดำเนินการต่อ | เซิร์ฟเวอร์ได้รับคำขอเพียงบางส่วนเท่านั้น แต่ตราบใดที่ยังไม่ถูกปฏิเสธไคลเอ็นต์ควรดำเนินการตามคำขอต่อไป |
101 | การสลับโปรโตคอล | เซิร์ฟเวอร์สลับโปรโตคอล |
200 | ตกลง | คำขอก็โอเค |
201 | สร้าง | คำขอเสร็จสมบูรณ์และมีการสร้างทรัพยากรใหม่ |
202 | ได้รับการยอมรับ | คำขอได้รับการยอมรับสำหรับการประมวลผล แต่การประมวลผลไม่สมบูรณ์ |
203 | ข้อมูลที่ไม่น่าเชื่อถือ | |
204 | ไม่มีเนื้อหา | |
205 | รีเซ็ตเนื้อหา | |
206 | เนื้อหาบางส่วน | |
300 | หลายทางเลือก | ลิงค์ลิสต์; ผู้ใช้สามารถเลือกลิงค์และไปที่ตำแหน่งนั้นได้ สูงสุดห้าที่อยู่ |
301 | ย้ายถาวร | หน้าที่ร้องขอได้ย้ายไปยัง URL ใหม่ |
302 | พบ | หน้าที่ร้องขอได้ย้ายไปยัง URL ใหม่ชั่วคราว |
303 | ดูอื่น ๆ | หน้าที่ร้องขอสามารถพบได้ภายใต้ URL อื่น |
304 | ไม่ได้แก้ไข | |
305 | ใช้ Proxy | |
306 | ไม่ได้ใช้ | รหัสนี้ถูกใช้ในเวอร์ชันก่อนหน้า ไม่มีการใช้งานอีกต่อไป แต่สงวนรหัสไว้ |
307 | เปลี่ยนเส้นทางชั่วคราว | หน้าที่ร้องขอได้ย้ายไปยัง URL ใหม่ชั่วคราว |
400 | คำขอไม่ถูกต้อง | เซิร์ฟเวอร์ไม่เข้าใจคำขอ |
401 | ไม่ได้รับอนุญาต | หน้าที่ร้องขอต้องมีชื่อผู้ใช้และรหัสผ่าน |
402 | ต้องชำระเงิน | คุณยังไม่สามารถใช้รหัสนี้ได้ |
403 | ต้องห้าม | ไม่อนุญาตให้เข้าถึงหน้าที่ร้องขอ |
404 | ไม่พบ | เซิร์ฟเวอร์ไม่พบหน้าที่ร้องขอ |
405 | วิธีการไม่ได้รับอนุญาต | ไม่อนุญาตวิธีการที่ระบุในคำขอ |
406 | ไม่ยอมรับ | เซิร์ฟเวอร์สามารถสร้างการตอบสนองที่ไคลเอนต์ไม่ยอมรับเท่านั้น |
407 | จำเป็นต้องมีการตรวจสอบสิทธิ์พร็อกซี | คุณต้องตรวจสอบสิทธิ์กับพร็อกซีเซิร์ฟเวอร์ก่อนจึงจะสามารถให้บริการได้ |
408 | หมดเวลาการร้องขอ | คำขอใช้เวลานานกว่าที่เซิร์ฟเวอร์เตรียมรอ |
409 | ขัดแย้ง | ไม่สามารถดำเนินการตามคำขอได้เนื่องจากมีข้อขัดแย้ง |
410 | ที่ไปแล้ว | หน้าที่ร้องขอไม่สามารถใช้ได้อีกต่อไป |
411 | ความยาวที่ต้องการ | ไม่ได้กำหนด "ความยาวของเนื้อหา" เซิร์ฟเวอร์จะไม่ยอมรับคำขอหากไม่มีมัน |
412 | เงื่อนไขเบื้องต้นล้มเหลว | เงื่อนไขเบื้องต้นที่กำหนดในคำขอที่เซิร์ฟเวอร์ประเมินเป็นเท็จ |
413 | ขอเอนทิตีใหญ่เกินไป | เซิร์ฟเวอร์จะไม่ยอมรับคำขอเนื่องจากเอนทิตีคำขอมีขนาดใหญ่เกินไป |
414 | Request-url ยาวเกินไป | เซิร์ฟเวอร์จะไม่ยอมรับคำขอเนื่องจาก url ยาวเกินไป กรณีนี้เกิดขึ้นเมื่อคุณแปลงคำขอ "โพสต์" เป็นคำขอ "รับ" ด้วยข้อมูลการสืบค้นแบบยาว |
415 | ประเภทสื่อที่ไม่รองรับ | เซิร์ฟเวอร์จะไม่ยอมรับคำขอเนื่องจากไม่รองรับประเภทสื่อ |
417 | ความคาดหวังล้มเหลว | |
500 | ข้อผิดพลาดภายในเซิร์ฟเวอร์ | คำขอไม่เสร็จสมบูรณ์ เซิร์ฟเวอร์พบเงื่อนไขที่ไม่คาดคิด |
501 | ไม่ได้ดำเนินการ | คำขอไม่เสร็จสมบูรณ์ เซิร์ฟเวอร์ไม่รองรับฟังก์ชันที่จำเป็น |
502 | เกตเวย์ไม่ดี | คำขอไม่เสร็จสมบูรณ์ เซิร์ฟเวอร์ได้รับการตอบสนองที่ไม่ถูกต้องจากเซิร์ฟเวอร์ต้นน้ำ |
503 | ไม่สามารถให้บริการได้ | คำขอไม่เสร็จสมบูรณ์ เซิร์ฟเวอร์ทำงานเกินหรือหยุดทำงานชั่วคราว |
504 | หมดเวลาเกตเวย์ | เกตเวย์หมดเวลาแล้ว |
505 | ไม่รองรับเวอร์ชัน HTTP | เซิร์ฟเวอร์ไม่รองรับไฟล์ "http protocol" รุ่น. |
วิธีการตั้งรหัสสถานะ HTTP
คุณสามารถใช้วิธีการต่อไปนี้เพื่อตั้งค่ารหัสสถานะ HTTP ในโปรแกรม servlet ของคุณ วิธีการเหล่านี้พร้อมใช้งานกับอ็อบเจ็กต์HttpServletResponse
ส. | วิธีการและคำอธิบาย |
---|---|
1 | public void setStatus ( int statusCode ) วิธีนี้ตั้งรหัสสถานะโดยพลการ เมธอด setStatus ใช้ int (รหัสสถานะ) เป็นอาร์กิวเมนต์ หากคำตอบของคุณมีรหัสสถานะพิเศษและเอกสารอย่าลืมโทรsetStatusก่อนที่จะกลับมาจริงใด ๆ ของเนื้อหาที่มีPrintWriter |
2 | public void sendRedirect(String url) วิธีนี้สร้างการตอบกลับ 302 พร้อมกับส่วนหัวตำแหน่งที่ให้ URL ของเอกสารใหม่ |
3 | public void sendError(int code, String message) วิธีนี้จะส่งรหัสสถานะ (โดยปกติคือ 404) พร้อมกับข้อความสั้น ๆ ที่จัดรูปแบบโดยอัตโนมัติภายในเอกสาร HTML และส่งไปยังไคลเอนต์ |
ตัวอย่างรหัสสถานะ HTTP
ตัวอย่างต่อไปนี้แสดงวิธีการส่งรหัสข้อผิดพลาด 407 ไปยังเบราว์เซอร์ไคลเอนต์ หลังจากนี้เบราว์เซอร์จะแสดงให้คุณเห็น "Need authentication!!!"ข้อความ.
<html>
<head>
<title>Setting HTTP Status Code</title>
</head>
<body>
<%
// Set error code and reason.
response.sendError(407, "Need authentication!!!" );
%>
</body>
</html>
คุณจะได้รับผลลัพธ์ต่อไปนี้ -
HTTP Status 407 - Need authentication!!!
type Status report
message Need authentication!!!
description The client must first authenticate itself with the proxy (Need authentication!!!).
Apache Tomcat/5.5.29
เพื่อให้สะดวกสบายยิ่งขึ้นกับรหัสสถานะ HTTP ให้ลองตั้งรหัสสถานะอื่นและคำอธิบาย
ในบทนี้เราจะพูดถึงการประมวลผลแบบฟอร์มใน JSP คุณต้องเจอสถานการณ์ต่างๆมากมายเมื่อคุณต้องส่งข้อมูลบางอย่างจากเบราว์เซอร์ของคุณไปยังเว็บเซิร์ฟเวอร์และท้ายที่สุดไปยังโปรแกรมแบ็กเอนด์ของคุณ เบราว์เซอร์ใช้สองวิธีในการส่งข้อมูลนี้ไปยังเว็บเซิร์ฟเวอร์ วิธีการเหล่านี้คือ GET Method และ POST Method
วิธีการในการประมวลผลแบบฟอร์ม
ตอนนี้ให้เราหารือเกี่ยวกับวิธีการในการประมวลผลแบบฟอร์ม
รับวิธีการ
เมธอด GET จะส่งข้อมูลผู้ใช้ที่เข้ารหัสต่อท้ายคำขอเพจ หน้าและข้อมูลที่เข้ารหัสจะถูกคั่นด้วยเครื่องหมาย? ตัวละครดังนี้ -
http://www.test.com/hello?key1=value1&key2=value2
เมธอด GET เป็นวิธีการเริ่มต้นในการส่งข้อมูลจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และสร้างสตริงยาวที่ปรากฏในเบราว์เซอร์ของคุณ Location:box. ขอแนะนำว่าอย่าใช้วิธี GET จะดีกว่า หากคุณมีรหัสผ่านหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ เพื่อส่งผ่านไปยังเซิร์ฟเวอร์
วิธี GET มีข้อ จำกัด ด้านขนาด: only 1024 characters can be in a request string.
ข้อมูลนี้ถูกส่งผ่านโดยใช้ QUERY_STRING header และสามารถเข้าถึงได้ผ่านตัวแปรสภาพแวดล้อม QUERY_STRING ซึ่งสามารถจัดการได้โดยใช้ getQueryString() และ getParameter() วิธีการขอวัตถุ
วิธีการโพสต์
วิธีการส่งข้อมูลไปยังโปรแกรมแบ็กเอนด์ที่น่าเชื่อถือกว่าโดยทั่วไปคือวิธีการโพสต์
วิธีนี้บรรจุข้อมูลในลักษณะเดียวกับเมธอด GET แต่แทนที่จะส่งเป็นสตริงข้อความหลัง a? ใน URL จะส่งเป็นข้อความแยกต่างหาก ข้อความนี้มาถึงโปรแกรมแบ็กเอนด์ในรูปแบบของอินพุตมาตรฐานซึ่งคุณสามารถแยกวิเคราะห์และใช้สำหรับการประมวลผลของคุณ
JSP จัดการคำขอประเภทนี้โดยใช้ getParameter() วิธีการอ่านพารามิเตอร์อย่างง่ายและ getInputStream() วิธีการอ่านสตรีมข้อมูลไบนารีที่มาจากไคลเอนต์
การอ่านข้อมูลแบบฟอร์มโดยใช้ JSP
JSP จัดการการแยกวิเคราะห์ข้อมูลฟอร์มโดยอัตโนมัติโดยใช้วิธีการต่อไปนี้ขึ้นอยู่กับสถานการณ์ -
getParameter() - คุณโทร request.getParameter() วิธีการรับค่าของพารามิเตอร์ฟอร์ม
getParameterValues() - เรียกใช้เมธอดนี้หากพารามิเตอร์ปรากฏมากกว่าหนึ่งครั้งและส่งกลับค่าหลายค่าเช่นช่องทำเครื่องหมาย
getParameterNames() - เรียกใช้วิธีนี้หากคุณต้องการรายการพารามิเตอร์ทั้งหมดในคำขอปัจจุบัน
getInputStream() - เรียกวิธีนี้เพื่ออ่านสตรีมข้อมูลไบนารีที่มาจากไคลเอนต์
รับตัวอย่างวิธีการใช้ URL
URL ต่อไปนี้จะส่งผ่านค่าสองค่าไปยังโปรแกรม HelloForm โดยใช้เมธอด GET
http://localhost:8080/main.jsp?first_name=ZARA&last_name=ALI
ด้านล่างนี้คือไฟล์ main.jspโปรแกรม JSP เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ เราจะใช้ไฟล์getParameter() วิธีการที่ทำให้ง่ายต่อการเข้าถึงข้อมูลที่ส่งผ่าน -
<html>
<head>
<title>Using GET Method to Read Form Data</title>
</head>
<body>
<h1>Using GET Method to Read Form Data</h1>
<ul>
<li><p><b>First Name:</b>
<%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last Name:</b>
<%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>
ตอนนี้พิมพ์ http://localhost:8080/main.jsp?first_name=ZARA&last_name=ALI ในเบราว์เซอร์ของคุณ Location:box. สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
ใช้วิธี GET เพื่ออ่านข้อมูลแบบฟอร์ม
|
รับตัวอย่างวิธีการโดยใช้แบบฟอร์ม
ต่อไปนี้เป็นตัวอย่างที่ส่งผ่านค่าสองค่าโดยใช้รูปแบบ HTML และปุ่มส่ง เราจะใช้ JSP main.jsp เดียวกันเพื่อจัดการอินพุตนี้
<html>
<body>
<form action = "main.jsp" method = "GET">
First Name: <input type = "text" name = "first_name">
<br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
เก็บ HTML นี้ไว้ในไฟล์ Hello.htm แล้วใส่ลงไป <Tomcat-installation-directory>/webapps/ROOT directory. เมื่อคุณจะเข้าถึงhttp://localhost:8080/Hello.htmคุณจะได้รับผลลัพธ์ต่อไปนี้
ตัวอย่างวิธีการโพสต์โดยใช้แบบฟอร์ม
ให้เราทำการปรับเปลี่ยนเล็กน้อยใน JSP ด้านบนเพื่อจัดการทั้ง GET และเมธอด POST ด้านล่างนี้คือไฟล์main.jsp โปรแกรม JSP เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์โดยใช้วิธีการ GET หรือ POST
ไม่มีการเปลี่ยนแปลงใน JSP ข้างต้นเนื่องจากวิธีเดียวในการส่งผ่านพารามิเตอร์มีการเปลี่ยนแปลงและไม่มีการส่งข้อมูลไบนารีไปยังโปรแกรม JSP แนวคิดที่เกี่ยวข้องกับการจัดการไฟล์จะได้รับการอธิบายในบทที่แยกต่างหากซึ่งเราจำเป็นต้องอ่านสตรีมข้อมูลไบนารี
<html>
<head>
<title>Using GET and POST Method to Read Form Data</title>
</head>
<body>
<center>
<h1>Using POST Method to Read Form Data</h1>
<ul>
<li><p><b>First Name:</b>
<%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last Name:</b>
<%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>
ต่อไปนี้เป็นเนื้อหาของไฟล์ Hello.htm ไฟล์ -
<html>
<body>
<form action = "main.jsp" method = "POST">
First Name: <input type = "text" name = "first_name">
<br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
ตอนนี้ให้เราเก็บไว้ main.jsp และ hello.htm ใน <Tomcat-installationdirectory>/webapps/ROOT directory. เมื่อคุณเข้าถึงhttp://localhost:8080/Hello.htmคุณจะได้รับผลลัพธ์ต่อไปนี้
ลองป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์ในเครื่องของคุณที่แมวตัวผู้กำลังทำงานอยู่
จากข้อมูลที่ป้อนคุณจะได้รับผลลัพธ์ที่คล้ายกันดังตัวอย่างข้างต้น
การส่งผ่านข้อมูลช่องทำเครื่องหมายไปยังโปรแกรม JSP
ช่องทำเครื่องหมายถูกใช้เมื่อจำเป็นต้องเลือกมากกว่าหนึ่งตัวเลือก
ต่อไปนี้เป็นตัวอย่าง HTML code, CheckBox.htmสำหรับแบบฟอร์มที่มีช่องทำเครื่องหมายสองช่อง
<html>
<body>
<form action = "main.jsp" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" checked = "checked" /> Maths
<input type = "checkbox" name = "physics" /> Physics
<input type = "checkbox" name = "chemistry" checked = "checked" /> Chemistry
<input type = "submit" value = "Select Subject" />
</form>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
ต่อไปนี้เป็นโปรแกรม main.jsp JSP เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์สำหรับปุ่มช่องทำเครื่องหมาย
<html>
<head>
<title>Reading Checkbox Data</title>
</head>
<body>
<h1>Reading Checkbox Data</h1>
<ul>
<li><p><b>Maths Flag:</b>
<%= request.getParameter("maths")%>
</p></li>
<li><p><b>Physics Flag:</b>
<%= request.getParameter("physics")%>
</p></li>
<li><p><b>Chemistry Flag:</b>
<%= request.getParameter("chemistry")%>
</p></li>
</ul>
</body>
</html>
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้ -
Reading Checkbox Data
Maths Flag :: on
Physics Flag:: null
Chemistry Flag:: on
การอ่านพารามิเตอร์แบบฟอร์มทั้งหมด
ต่อไปนี้เป็นตัวอย่างทั่วไปที่ใช้ getParameterNames()วิธีการของ HttpServletRequest เพื่ออ่านพารามิเตอร์ฟอร์มที่มีอยู่ทั้งหมด เมธอดนี้ส่งคืนการแจงนับที่มีชื่อพารามิเตอร์ในลำดับที่ไม่ระบุ
เมื่อเรามีการแจงนับแล้วเราสามารถวนซ้ำการแจงนับในลักษณะมาตรฐานโดยใช้ hasMoreElements() วิธีการกำหนดว่าเมื่อใดควรหยุดและใช้ไฟล์ nextElement() วิธีการรับชื่อพารามิเตอร์แต่ละตัว
<%@ page import = "java.io.*,java.util.*" %>
<html>
<head>
<title>HTTP Header Request Example</title>
</head>
<body>
<center>
<h2>HTTP Header Request Example</h2>
<table width = "100%" border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Param Name</th>
<th>Param Value(s)</th>
</tr>
<%
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</center>
</body>
</html>
ต่อไปนี้เป็นเนื้อหาของไฟล์ Hello.htm -
<html>
<body>
<form action = "main.jsp" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" checked = "checked" /> Maths
<input type = "checkbox" name = "physics" /> Physics
<input type = "checkbox" name = "chemistry" checked = "checked" /> Chem
<input type = "submit" value = "Select Subject" />
</form>
</body>
</html>
ตอนนี้ลองโทรหา JSP โดยใช้ Hello.htm ข้างต้น สิ่งนี้จะสร้างผลลัพธ์ดังต่อไปนี้ตามอินพุตที่ให้ไว้ -
การอ่านพารามิเตอร์แบบฟอร์มทั้งหมด
ชื่อ Param | ค่าพารามิเตอร์ |
---|---|
คณิตศาสตร์ | บน |
เคมี | บน |
คุณสามารถลองใช้ JSP ด้านบนเพื่ออ่านข้อมูลในรูปแบบอื่นซึ่งมีวัตถุอื่น ๆ เช่นกล่องข้อความปุ่มตัวเลือกหรือดรอปดาวน์เป็นต้น
ในบทนี้เราจะพูดถึงตัวกรองใน JSP Servlet และ JSP Filters เป็นคลาส Java ที่สามารถใช้ใน Servlet และ JSP Programming เพื่อวัตถุประสงค์ดังต่อไปนี้ -
เพื่อสกัดกั้นคำขอจากไคลเอ็นต์ก่อนที่จะเข้าถึงทรัพยากรที่ส่วนหลัง
เพื่อจัดการการตอบกลับจากเซิร์ฟเวอร์ก่อนที่จะส่งกลับไปยังไคลเอนต์
มีตัวกรองหลายประเภทที่แนะนำโดยข้อกำหนด -
- ตัวกรองการรับรองความถูกต้อง
- ตัวกรองการบีบอัดข้อมูล
- ตัวกรองการเข้ารหัส
- ตัวกรองที่ทริกเกอร์เหตุการณ์การเข้าถึงทรัพยากร
- ตัวกรองการแปลงรูปภาพ
- ตัวกรองการบันทึกและการตรวจสอบ
- ตัวกรองโซ่แบบ MIME
- ตัวกรอง Tokenizing
- XSL / T ฟิลเตอร์ที่แปลงเนื้อหา XML
ตัวกรองถูกปรับใช้ในไฟล์ตัวอธิบายการปรับใช้ web.xmlจากนั้นแม็พกับชื่อ servlet หรือ JSP หรือรูปแบบ URL ในตัวบอกการปรับใช้แอปพลิเคชันของคุณ web.xml ใช้งานอธิบายไฟล์สามารถพบได้ใน<Tomcat ติดตั้งไดเรกทอรี> \ confไดเรกทอรี
เมื่อคอนเทนเนอร์ JSP เริ่มต้นใช้งานเว็บแอ็พพลิเคชันของคุณจะสร้างอินสแตนซ์ของตัวกรองแต่ละตัวที่คุณได้ประกาศไว้ในตัวบอกการปรับใช้ ตัวกรองจะดำเนินการตามลำดับที่ประกาศไว้ในตัวบอกการปรับใช้
วิธีการกรอง Servlet
ตัวกรองเป็นเพียงคลาส Java ที่ใช้ javax.servlet.Filterอินเตอร์เฟซ. อินเทอร์เฟซ javax.servlet.Filter กำหนดสามวิธี -
ส. | วิธีการและคำอธิบาย |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) คอนเทนเนอร์เรียกใช้เมธอดนี้ทุกครั้งที่คู่การร้องขอ / การตอบกลับถูกส่งผ่านห่วงโซ่เนื่องจากการร้องขอของไคลเอ็นต์สำหรับทรัพยากรที่ส่วนท้ายของห่วงโซ่ |
2 | public void init(FilterConfig filterConfig) วิธีนี้เรียกโดยเว็บคอนเทนเนอร์เพื่อระบุตัวกรองว่ากำลังถูกวางลงในบริการ |
3 | public void destroy() วิธีนี้เรียกโดยเว็บคอนเทนเนอร์เพื่อระบุตัวกรองว่ากำลังถูกนำออกจากบริการ |
ตัวอย่างตัวกรอง JSP
ตัวอย่างต่อไปนี้แสดงวิธีการพิมพ์ที่อยู่ IP ของไคลเอ็นต์และเวลาวันที่ปัจจุบันแต่ละครั้งที่เข้าถึงไฟล์ JSP ตัวอย่างนี้จะทำให้คุณมีความเข้าใจพื้นฐานเกี่ยวกับตัวกรอง JSP แต่คุณสามารถเขียนแอปพลิเคชันตัวกรองที่ซับซ้อนมากขึ้นโดยใช้แนวคิดเดียวกัน -
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Implements Filter class
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// Get init parameter
String testParam = config.getInitParameter("test-param");
//Print the init parameter
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws java.io.IOException, ServletException {
// Get the IP address of client machine.
String ipAddress = request.getRemoteAddr();
// Log the IP address and current timestamp.
System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());
// Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy( ) {
/* Called before the Filter instance is removed
from service by the web container*/
}
}
รวบรวม LogFilter.java ตามปกติและใส่ไฟล์ LogFilter.class ไฟล์ใน <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.
JSP Filter Mapping ใน Web.xml
มีการกำหนดฟิลเตอร์แล้วแมปกับ URL หรือชื่อไฟล์ JSP ในลักษณะเดียวกับที่กำหนด Servlet จากนั้นแมปกับรูปแบบ URL ใน web.xmlไฟล์. สร้างรายการต่อไปนี้สำหรับแท็กตัวกรองในไฟล์ตัวอธิบายการปรับใช้web.xml
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ตัวกรองด้านบนจะใช้กับ servlets และ JSP ทั้งหมดเนื่องจากเราระบุ /*ในการกำหนดค่าของเรา คุณสามารถระบุ servlet เฉพาะหรือพา ธ JSP ได้หากคุณต้องการใช้ตัวกรองกับ servlet บางตัวหรือ JSP เท่านั้น
ตอนนี้ลองเรียก servlet หรือ JSP ใด ๆ และคุณจะเห็นบันทึกที่สร้างขึ้นในบันทึกเว็บเซิร์ฟเวอร์ของคุณ คุณสามารถใช้ได้Log4J logger เพื่อเข้าสู่ระบบด้านบนเข้าสู่ระบบในไฟล์แยกต่างหาก
การใช้ตัวกรองหลายตัว
เว็บแอปพลิเคชันของคุณอาจกำหนดตัวกรองที่แตกต่างกันโดยมีวัตถุประสงค์เฉพาะ พิจารณาคุณกำหนดสองตัวกรองAuthenFilterและLogFilter กระบวนการที่เหลือจะยังคงเป็นไปตามที่อธิบายไว้ข้างต้นยกเว้นว่าคุณต้องสร้างการทำแผนที่อื่นดังที่กล่าวไว้ด้านล่าง -
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter>
<filter-name>AuthenFilter</filter-name>
<filter-class>AuthenFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
กรองใบสั่งแอปพลิเคชัน
ลำดับขององค์ประกอบการแมปตัวกรองใน web.xml กำหนดลำดับที่เว็บคอนเทนเนอร์ใช้ตัวกรองกับ servlet หรือ JSP ในการย้อนกลับลำดับของตัวกรองคุณเพียงแค่ต้องย้อนกลับองค์ประกอบการจับคู่ตัวกรองในไฟล์web.xml ไฟล์.
ตัวอย่างเช่นตัวอย่างข้างต้นจะใช้ LogFilter ก่อนจากนั้นจะใช้ AuthenFilter กับ servlet หรือ JSP ใด ๆ ตัวอย่างต่อไปนี้จะย้อนกลับคำสั่ง -
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ในบทนี้เราจะพูดถึงการจัดการคุกกี้ใน JSP คุกกี้คือไฟล์ข้อความที่เก็บไว้ในคอมพิวเตอร์ไคลเอนต์และจะถูกเก็บไว้เพื่อวัตถุประสงค์ในการติดตามข้อมูลต่างๆ JSP สนับสนุนคุกกี้ HTTP อย่างโปร่งใสโดยใช้เทคโนโลยี servlet ที่อยู่เบื้องหลัง
มีสามขั้นตอนที่เกี่ยวข้องในการระบุและส่งคืนผู้ใช้ -
สคริปต์เซิร์ฟเวอร์ส่งชุดคุกกี้ไปยังเบราว์เซอร์ ตัวอย่างเช่นชื่ออายุหรือหมายเลขประจำตัวเป็นต้น
เบราว์เซอร์เก็บข้อมูลนี้ไว้ในเครื่องท้องถิ่นเพื่อใช้ในอนาคต
เมื่อครั้งต่อไปที่เบราว์เซอร์ส่งคำขอใด ๆ ไปยังเว็บเซิร์ฟเวอร์จะส่งข้อมูลคุกกี้เหล่านั้นไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์จะใช้ข้อมูลดังกล่าวเพื่อระบุตัวผู้ใช้หรืออาจเพื่อวัตถุประสงค์อื่นด้วย
บทนี้จะสอนวิธีตั้งค่าหรือรีเซ็ตคุกกี้วิธีเข้าถึงและวิธีลบโดยใช้โปรแกรม JSP
กายวิภาคของคุกกี้
โดยปกติคุกกี้จะถูกตั้งค่าในส่วนหัว HTTP (แม้ว่า JavaScript จะสามารถตั้งค่าคุกกี้ได้โดยตรงบนเบราว์เซอร์ก็ตาม) JSP ที่ตั้งค่าคุกกี้อาจส่งส่วนหัวที่มีลักษณะเช่นนี้ -
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT;
path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html
อย่างที่คุณเห็นไฟล์ Set-Cookie header ประกอบด้วย a name value pair, a GMT date, a path และ a domain. ชื่อและค่าจะถูกเข้ารหัส URL expires ฟิลด์เป็นคำสั่งสำหรับเบราว์เซอร์เพื่อ "forget" คุกกี้หลังจากเวลาและวันที่ที่กำหนด
หากเบราว์เซอร์ได้รับการกำหนดค่าให้จัดเก็บคุกกี้เบราว์เซอร์จะเก็บข้อมูลนี้ไว้จนถึงวันหมดอายุ หากผู้ใช้ชี้เบราว์เซอร์ไปที่หน้าใด ๆ ที่ตรงกับเส้นทางและโดเมนของคุกกี้ผู้ใช้จะส่งคุกกี้ไปยังเซิร์ฟเวอร์อีกครั้ง ส่วนหัวของเบราว์เซอร์อาจมีลักษณะดังนี้ -
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz
จากนั้นสคริปต์ JSP จะสามารถเข้าถึงคุกกี้ผ่านวิธีการร้องขอ request.getCookies()ซึ่งส่งคืนอาร์เรย์ของวัตถุคุกกี้
วิธีการคุกกี้ของ Servlet
ตารางต่อไปนี้แสดงวิธีการที่มีประโยชน์ที่เกี่ยวข้องกับวัตถุคุกกี้ซึ่งคุณสามารถใช้ในขณะที่จัดการคุกกี้ใน JSP -
ส. | วิธีการและคำอธิบาย |
---|---|
1 | public void setDomain(String pattern) วิธีนี้ตั้งค่าโดเมนที่จะใช้คุกกี้ ตัวอย่างเช่น tutorialspoint.com |
2 | public String getDomain() วิธีนี้ได้รับโดเมนที่ใช้คุกกี้ ตัวอย่างเช่น tutorialspoint.com |
3 | public void setMaxAge(int expiry) วิธีนี้กำหนดระยะเวลา (เป็นวินาที) ก่อนที่คุกกี้จะหมดอายุ หากคุณไม่ได้ตั้งค่านี้คุกกี้จะคงอยู่ในเซสชันปัจจุบันเท่านั้น |
4 | public int getMaxAge() วิธีนี้จะคืนค่าอายุสูงสุดของคุกกี้ซึ่งระบุเป็นวินาทีโดยค่าเริ่มต้น -1 ระบุว่าคุกกี้จะยังคงอยู่จนกว่าจะปิดเบราว์เซอร์ |
5 | public String getName() วิธีนี้จะส่งคืนชื่อของคุกกี้ ไม่สามารถเปลี่ยนชื่อได้หลังจากสร้างแล้ว |
6 | public void setValue(String newValue) วิธีนี้ตั้งค่าที่เกี่ยวข้องกับคุกกี้ |
7 | public String getValue() วิธีนี้ได้รับค่าที่เกี่ยวข้องกับคุกกี้ |
8 | public void setPath(String uri) วิธีนี้กำหนดเส้นทางที่จะใช้คุกกี้นี้ หากคุณไม่ระบุเส้นทางคุกกี้จะถูกส่งคืนสำหรับ URL ทั้งหมดในไดเร็กทอรีเดียวกับเพจปัจจุบันตลอดจนไดเร็กทอรีย่อยทั้งหมด |
9 | public String getPath() วิธีนี้ได้รับเส้นทางที่ใช้กับคุกกี้นี้ |
10 | public void setSecure(boolean flag) วิธีนี้ตั้งค่าบูลีนที่ระบุว่าควรส่งคุกกี้ผ่านการเชื่อมต่อที่เข้ารหัส (เช่น SSL) หรือไม่ |
11 | public void setComment(String purpose) วิธีนี้ระบุความคิดเห็นที่อธิบายวัตถุประสงค์ของคุกกี้ ความคิดเห็นจะมีประโยชน์หากเบราว์เซอร์แสดงคุกกี้แก่ผู้ใช้ |
12 | public String getComment() วิธีนี้จะส่งกลับความคิดเห็นที่อธิบายวัตถุประสงค์ของคุกกี้นี้หรือเป็นโมฆะหากคุกกี้ไม่มีความคิดเห็น |
การตั้งค่าคุกกี้ด้วย JSP
การตั้งค่าคุกกี้ด้วย JSP มีสามขั้นตอน -
ขั้นตอนที่ 1: การสร้างวัตถุคุกกี้
คุณเรียกตัวสร้างคุกกี้ด้วยชื่อคุกกี้และค่าคุกกี้ซึ่งทั้งสองอย่างนี้เป็นสตริง
Cookie cookie = new Cookie("key","value");
โปรดทราบว่าทั้งชื่อและค่าไม่ควรมีช่องว่างหรืออักขระใด ๆ ต่อไปนี้ -
[ ] ( ) = , " / ? @ : ;
ขั้นตอนที่ 2: ตั้งค่าอายุสูงสุด
คุณใช้ setMaxAgeเพื่อระบุระยะเวลาที่ควรใช้คุกกี้ (เป็นวินาที) รหัสต่อไปนี้จะตั้งค่าคุกกี้เป็นเวลา 24 ชั่วโมง
cookie.setMaxAge(60*60*24);
ขั้นตอนที่ 3: การส่งคุกกี้ไปยังส่วนหัวการตอบกลับ HTTP
คุณใช้ response.addCookie เพื่อเพิ่มคุกกี้ในส่วนหัวการตอบกลับ HTTP ดังต่อไปนี้
response.addCookie(cookie);
ตัวอย่าง
ให้เราแก้ไขตัวอย่างแบบฟอร์มของเราเพื่อตั้งค่าคุกกี้สำหรับชื่อและนามสกุล
<%
// Create cookies for first and last names.
Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
// Set expiry date after 24 Hrs for both the cookies.
firstName.setMaxAge(60*60*24);
lastName.setMaxAge(60*60*24);
// Add both the cookies in the response header.
response.addCookie( firstName );
response.addCookie( lastName );
%>
<html>
<head>
<title>Setting Cookies</title>
</head>
<body>
<center>
<h1>Setting Cookies</h1>
</center>
<ul>
<li><p><b>First Name:</b>
<%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last Name:</b>
<%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>
ให้เราใส่รหัสด้านบน main.jsp ไฟล์และใช้ในหน้า HTML ต่อไปนี้ -
<html>
<body>
<form action = "main.jsp" method = "GET">
First Name: <input type = "text" name = "first_name">
<br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
เก็บเนื้อหา HTML ข้างต้นไว้ในไฟล์ hello.jsp และใส่ hello.jsp และ main.jsp ใน <Tomcat-installation-directory>/webapps/ROOTไดเรกทอรี เมื่อคุณจะเข้าถึงhttp://localhost:8080/hello.jspนี่คือผลลัพธ์จริงของแบบฟอร์มด้านบน
ลองป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่ง ซึ่งจะแสดงชื่อและนามสกุลบนหน้าจอของคุณและจะตั้งค่าคุกกี้สองรายการfirstName และ lastName. คุกกี้เหล่านี้จะถูกส่งกลับไปยังเซิร์ฟเวอร์เมื่อคุณคลิกปุ่มส่งในครั้งถัดไป
ในส่วนถัดไปเราจะอธิบายวิธีการเข้าถึงคุกกี้เหล่านี้ในเว็บแอปพลิเคชันของคุณ
การอ่านคุกกี้กับ JSP
ในการอ่านคุกกี้คุณต้องสร้างอาร์เรย์ของวัตถุjavax.servlet.http.Cookieโดยเรียกไฟล์getCookies( )วิธีการHttpServletRequest จากนั้นวนรอบอาร์เรย์และใช้getName() และ getValue() วิธีการเข้าถึงคุกกี้และมูลค่าที่เกี่ยวข้อง
ตัวอย่าง
ตอนนี้ให้เราอ่านคุกกี้ที่ตั้งไว้ในตัวอย่างก่อนหน้านี้ -
<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
// Get an array of Cookies associated with the this domain
cookies = request.getCookies();
if( cookies != null ) {
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
} else {
out.println("<h2>No cookies founds</h2>");
}
%>
</body>
</html>
ตอนนี้ให้เราใส่รหัสด้านบน main.jspไฟล์และพยายามเข้าถึง หากคุณตั้งค่าfirst_name cookie เป็น "John" และ last_name cookie เป็น "ผู้เล่น" แล้วทำงาน http://localhost:8080/main.jsp จะแสดงผลลัพธ์ต่อไปนี้ -
Found Cookies Name and Value
Name : first_name, Value: John
Name : last_name, Value: Player
ลบคุกกี้ด้วย JSP
การลบคุกกี้นั้นง่ายมาก หากคุณต้องการลบคุกกี้คุณต้องทำตามสามขั้นตอนนี้ -
อ่านคุกกี้ที่มีอยู่แล้วและเก็บไว้ในวัตถุคุกกี้
ตั้งค่าอายุคุกกี้เป็นศูนย์โดยใช้ setMaxAge() วิธีลบคุกกี้ที่มีอยู่
เพิ่มคุกกี้นี้กลับเข้าไปในส่วนหัวการตอบกลับ
ตัวอย่าง
ตัวอย่างต่อไปนี้จะแสดงวิธีการลบคุกกี้ที่มีอยู่ชื่อ "first_name" และเมื่อคุณรัน main.jsp JSP ในครั้งถัดไปมันจะส่งคืนค่า null สำหรับ first_name
<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
// Get an array of Cookies associated with the this domain
cookies = request.getCookies();
if( cookies != null ) {
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
if((cookie.getName( )).compareTo("first_name") == 0 ) {
cookie.setMaxAge(0);
response.addCookie(cookie);
out.print("Deleted cookie: " +
cookie.getName( ) + "<br/>");
}
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
} else {
out.println(
"<h2>No cookies founds</h2>");
}
%>
</body>
</html>
ตอนนี้ให้เราใส่รหัสด้านบนในไฟล์ main.jspไฟล์และพยายามเข้าถึง มันจะแสดงผลลัพธ์ต่อไปนี้ -
Cookies Name and Value
Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name, Value: Player
ตอนนี้เรียกใช้http: // localhost: 8080 / main.jspอีกครั้งและควรแสดงคุกกี้เพียงรายการเดียวดังนี้ -
Found Cookies Name and Value
Name : last_name, Value: Player
คุณสามารถลบคุกกี้ของคุณใน Internet Explorer ได้ด้วยตนเอง เริ่มที่เมนูเครื่องมือและเลือกตัวเลือกอินเทอร์เน็ต หากต้องการลบคุกกี้ทั้งหมดให้คลิกปุ่ม Delete Cookies
ในบทนี้เราจะพูดถึงการติดตามเซสชันใน JSP HTTP เป็นโปรโตคอลแบบ "ไร้สถานะ" ซึ่งหมายความว่าทุกครั้งที่ไคลเอนต์เรียกค้นเว็บเพจไคลเอนต์จะเปิดการเชื่อมต่อแยกกับเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์จะไม่เก็บบันทึกคำขอของไคลเอ็นต์ก่อนหน้านี้โดยอัตโนมัติ
การบำรุงรักษาเซสชันระหว่างเว็บไคลเอนต์และเซิร์ฟเวอร์
ตอนนี้ให้เราพูดถึงตัวเลือกสองสามอย่างในการรักษาเซสชันระหว่างไคลเอนต์เว็บและเว็บเซิร์ฟเวอร์ -
คุ้กกี้
เว็บเซิร์ฟเวอร์สามารถกำหนดรหัสเซสชันที่ไม่ซ้ำกันเป็นคุกกี้ให้กับเว็บไคลเอ็นต์แต่ละรายและสำหรับคำขอที่ตามมาจากไคลเอนต์สามารถรับรู้ได้โดยใช้คุกกี้ที่ได้รับ
นี่อาจไม่ใช่วิธีที่มีประสิทธิภาพเนื่องจากบางครั้งเบราว์เซอร์ไม่รองรับคุกกี้ ไม่แนะนำให้ใช้ขั้นตอนนี้เพื่อรักษาเซสชัน
ฟิลด์แบบฟอร์มที่ซ่อนอยู่
เว็บเซิร์ฟเวอร์สามารถส่งฟิลด์ฟอร์ม HTML ที่ซ่อนอยู่พร้อมกับรหัสเซสชันที่ไม่ซ้ำกันดังต่อไปนี้ -
<input type = "hidden" name = "sessionid" value = "12345">
รายการนี้หมายความว่าเมื่อส่งแบบฟอร์มชื่อและค่าที่ระบุจะรวมอยู่ในไฟล์ GET หรือ POSTข้อมูล. ทุกครั้งที่เว็บเบราว์เซอร์ส่งคำขอกลับไฟล์session_id สามารถใช้ค่าเพื่อติดตามเว็บเบราว์เซอร์ต่างๆ
นี่อาจเป็นวิธีที่มีประสิทธิภาพในการติดตามเซสชัน แต่การคลิกลิงก์ไฮเปอร์เท็กซ์ปกติ (<A HREF...>) จะไม่ส่งผลให้มีการส่งแบบฟอร์มดังนั้นฟิลด์แบบฟอร์มที่ซ่อนอยู่จึงไม่สามารถรองรับการติดตามเซสชันทั่วไปได้
การเขียน URL ใหม่
คุณสามารถเพิ่มข้อมูลเพิ่มเติมบางส่วนต่อท้าย URL แต่ละรายการได้ ข้อมูลนี้ระบุเซสชัน เซิร์ฟเวอร์สามารถเชื่อมโยงตัวระบุเซสชันนั้นกับข้อมูลที่เก็บไว้เกี่ยวกับเซสชันนั้น
ตัวอย่างเช่นด้วย http://tutorialspoint.com/file.htm;sessionid=12345ตัวระบุเซสชันจะแนบเป็น sessionid = 12345 ซึ่งสามารถเข้าถึงได้ที่เว็บเซิร์ฟเวอร์เพื่อระบุไคลเอ็นต์
การเขียน URL ใหม่เป็นวิธีที่ดีกว่าในการรักษาเซสชันและใช้งานได้กับเบราว์เซอร์เมื่อไม่รองรับคุกกี้ ข้อเสียเปรียบคือคุณจะต้องสร้างทุก URL แบบไดนามิกเพื่อกำหนดรหัสเซสชันแม้ว่าหน้าจะเป็นหน้า HTML แบบคงที่แบบธรรมดา
วัตถุเซสชัน
นอกเหนือจากตัวเลือกที่กล่าวถึงข้างต้น JSP ยังใช้ servlet ที่มีให้ HttpSession Interface อินเทอร์เฟซนี้มีวิธีระบุตัวผู้ใช้
- คำขอหน้าเดียวหรือ
- เยี่ยมชมเว็บไซต์หรือ
- จัดเก็บข้อมูลเกี่ยวกับผู้ใช้นั้น
โดยค่าเริ่มต้น JSPs จะเปิดใช้งานการติดตามเซสชันและอ็อบเจ็กต์ HttpSession ใหม่จะถูกสร้างอินสแตนซ์สำหรับไคลเอ็นต์ใหม่แต่ละตัวโดยอัตโนมัติ การปิดใช้งานการติดตามเซสชันจำเป็นต้องปิดการใช้งานอย่างชัดเจนโดยตั้งค่าแอตทริบิวต์เซสชันคำสั่งเพจเป็นเท็จดังนี้ -
<%@ page session = "false" %>
เอ็นจิน JSP เปิดเผยอ็อบเจ็กต์ HttpSession ไปยังผู้เขียน JSP ผ่านทางนัย sessionวัตถุ. ตั้งแต่session ออบเจ็กต์ถูกจัดเตรียมให้กับโปรแกรมเมอร์ JSP แล้วโปรแกรมเมอร์สามารถเริ่มจัดเก็บและดึงข้อมูลจากอ็อบเจ็กต์ได้ทันทีโดยไม่ต้องเริ่มต้นหรือ getSession().
นี่คือบทสรุปของวิธีการที่สำคัญที่มีอยู่ในวัตถุเซสชัน -
ส. | วิธีการและคำอธิบาย |
---|---|
1 | public Object getAttribute(String name) เมธอดนี้จะส่งคืนอ็อบเจ็กต์ที่ถูกผูกไว้ด้วยชื่อที่ระบุในเซสชันนี้หรือ null หากไม่มีอ็อบเจ็กต์ถูกผูกไว้ใต้ชื่อ |
2 | public Enumeration getAttributeNames() วิธีนี้จะส่งคืนอ็อบเจ็กต์ Enumeration of String ที่มีชื่อของอ็อบเจ็กต์ทั้งหมดที่เชื่อมโยงกับเซสชันนี้ |
3 | public long getCreationTime() วิธีนี้จะคืนค่าเวลาที่สร้างเซสชันนี้โดยวัดเป็นมิลลิวินาทีนับตั้งแต่เที่ยงคืน 1 มกราคม 1970 GMT |
4 | public String getId() วิธีนี้ส่งคืนสตริงที่มีตัวระบุเฉพาะที่กำหนดให้กับเซสชันนี้ |
5 | public long getLastAccessedTime() วิธีนี้ส่งคืนครั้งสุดท้ายที่ไคลเอ็นต์ส่งคำขอที่เกี่ยวข้องกับเซสชันนี้เป็นจำนวนมิลลิวินาทีนับตั้งแต่เที่ยงคืนวันที่ 1 มกราคม 1970 GMT |
6 | public int getMaxInactiveInterval() วิธีนี้จะคืนค่าช่วงเวลาสูงสุดเป็นวินาทีที่คอนเทนเนอร์ servlet จะเปิดเซสชันนี้ไว้ระหว่างการเข้าถึงไคลเอ็นต์ |
7 | public void invalidate() วิธีนี้ทำให้เซสชันนี้เป็นโมฆะและเลิกผูกวัตถุใด ๆ ที่ผูกไว้กับมัน |
8 | public boolean isNew() วิธีนี้จะคืนค่าจริงหากลูกค้ายังไม่ทราบเกี่ยวกับเซสชันหรือหากลูกค้าเลือกที่จะไม่เข้าร่วมเซสชัน |
9 | public void removeAttribute(String name) วิธีนี้จะลบอ็อบเจ็กต์ที่ผูกกับชื่อที่ระบุจากเซสชันนี้ |
10 | public void setAttribute(String name, Object value) วิธีนี้ผูกอ็อบเจ็กต์กับเซสชันนี้โดยใช้ชื่อที่ระบุ |
11 | public void setMaxInactiveInterval(int interval) วิธีนี้ระบุเวลาเป็นวินาทีระหว่างคำขอของไคลเอ็นต์ก่อนที่คอนเทนเนอร์ servlet จะทำให้เซสชันนี้เป็นโมฆะ |
ตัวอย่างการติดตามเซสชัน
ตัวอย่างนี้อธิบายวิธีการใช้วัตถุ HttpSession เพื่อค้นหาเวลาสร้างและเวลาที่เข้าถึงล่าสุดสำหรับเซสชัน เราจะเชื่อมโยงเซสชันใหม่กับคำขอหากไม่มีอยู่แล้ว
<%@ page import = "java.io.*,java.util.*" %>
<%
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this Webpage.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your Webpage.
if (session.isNew() ){
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1>Session Tracking</h1>
</center>
<table border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print( session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>
ตอนนี้ใส่รหัสด้านบน main.jsp และพยายามเข้าถึง http://localhost:8080/main.jsp. เมื่อคุณเรียกใช้ URL คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
ยินดีต้อนรับสู่เว็บไซต์ของฉัน
Session Information
ข้อมูลเซสชัน | มูลค่า |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
เวลาสร้าง | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
เวลาเข้าถึงล่าสุด | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
รหัสผู้ใช้ | เอบีซีดี |
จำนวนการเข้าชม | 0 |
ตอนนี้ลองเรียกใช้ JSP เดียวกันเป็นครั้งที่สองคุณจะได้รับผลลัพธ์ต่อไปนี้
ยินดีต้อนรับกลับสู่เว็บไซต์ของฉัน
Session Information
ประเภทข้อมูล | มูลค่า |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
เวลาสร้าง | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
เวลาเข้าถึงล่าสุด | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
รหัสผู้ใช้ | เอบีซีดี |
จำนวนการเข้าชม | 1 |
การลบข้อมูลเซสชัน
เมื่อคุณดำเนินการกับข้อมูลเซสชันของผู้ใช้เสร็จแล้วคุณมีหลายทางเลือก -
Remove a particular attribute - คุณสามารถโทร public void removeAttribute(String name) วิธีการลบค่าที่เกี่ยวข้องกับคีย์เฉพาะ
Delete the whole session - คุณสามารถโทร public void invalidate() วิธีการทิ้งเซสชันทั้งหมด
Setting Session timeout - คุณสามารถโทร public void setMaxInactiveInterval(int interval) วิธีการตั้งค่าระยะหมดเวลาสำหรับแต่ละเซสชัน
Log the user out - เซิร์ฟเวอร์ที่รองรับ servlets 2.4 คุณสามารถโทร logout เพื่อล็อกไคลเอนต์ออกจากเว็บเซิร์ฟเวอร์และทำให้เซสชันทั้งหมดที่เป็นของผู้ใช้ทั้งหมดเป็นโมฆะ
web.xml Configuration - หากคุณใช้ Tomcat นอกเหนือจากวิธีการข้างต้นคุณสามารถกำหนดค่าการหมดเวลาของเซสชันในไฟล์ web.xml ได้ดังนี้
<session-config>
<session-timeout>15</session-timeout>
</session-config>
การหมดเวลาจะแสดงเป็นนาทีและแทนที่การหมดเวลาเริ่มต้นซึ่งเป็น 30 นาทีใน Tomcat
getMaxInactiveInterval( )วิธีการใน servlet ส่งคืนช่วงหมดเวลาสำหรับเซสชันนั้นเป็นวินาที ดังนั้นหากกำหนดค่าเซสชันของคุณใน web.xml เป็นเวลา 15 นาทีgetMaxInactiveInterval( ) ส่งคืน 900
ในบทนี้เราจะพูดถึงการอัปโหลดไฟล์ใน JSP JSP สามารถใช้กับแท็กรูปแบบ HTML เพื่ออนุญาตให้ผู้ใช้อัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ ไฟล์ที่อัปโหลดอาจเป็นไฟล์ข้อความหรือไบนารีหรือไฟล์รูปภาพหรือเอกสารใดก็ได้
การสร้างแบบฟอร์มอัพโหลดไฟล์
ตอนนี้ให้เราเข้าใจวิธีสร้างแบบฟอร์มอัปโหลดไฟล์ โค้ด HTML ต่อไปนี้สร้างฟอร์มผู้อัปโหลด ต่อไปนี้เป็นประเด็นสำคัญที่ควรสังเกต -
แบบฟอร์ม method ควรตั้งค่าแอตทริบิวต์เป็น POST ไม่สามารถใช้ method และ GET method ได้
แบบฟอร์ม enctype ควรตั้งค่าแอตทริบิวต์เป็น multipart/form-data.
แบบฟอร์ม actionควรตั้งค่าแอตทริบิวต์เป็นไฟล์ JSP ซึ่งจะรองรับการอัปโหลดไฟล์ที่เซิร์ฟเวอร์แบ็กเอนด์ ตัวอย่างต่อไปนี้ใช้uploadFile.jsp ไฟล์โปรแกรมเพื่ออัพโหลดไฟล์
ในการอัปโหลดไฟล์เดียวคุณควรใช้ไฟล์ <input .../> แท็กด้วยแอตทริบิวต์ type = "file". หากต้องการอนุญาตให้อัปโหลดหลายไฟล์ให้ใส่แท็กอินพุตมากกว่าหนึ่งแท็กที่มีค่าต่างกันสำหรับแอตทริบิวต์ name เบราว์เซอร์เชื่อมโยงปุ่มเรียกดูกับแต่ละปุ่ม
<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action = "UploadServlet" method = "post"
enctype = "multipart/form-data">
<input type = "file" name = "file" size = "50" />
<br />
<input type = "submit" value = "Upload File" />
</form>
</body>
</html>
ซึ่งจะแสดงผลลัพธ์ต่อไปนี้ ตอนนี้คุณสามารถเลือกไฟล์จากพีซีในระบบและเมื่อผู้ใช้คลิก "อัปโหลดไฟล์" แบบฟอร์มจะถูกส่งไปพร้อมกับไฟล์ที่เลือก -
File Upload −
Select a file to upload −
NOTE - แบบฟอร์มด้านบนเป็นเพียงรูปแบบจำลองและไม่สามารถใช้งานได้คุณควรลองใช้โค้ดด้านบนที่เครื่องของคุณเพื่อให้ใช้งานได้
การเขียนสคริปต์ JSP ของแบ็กเอนด์
ตอนนี้ให้เรากำหนดตำแหน่งที่จะจัดเก็บไฟล์ที่อัปโหลด คุณสามารถฮาร์ดโค้ดนี้ในโปรแกรมของคุณหรือสามารถเพิ่มชื่อไดเร็กทอรีนี้ได้โดยใช้การกำหนดค่าภายนอกเช่นไฟล์context-param องค์ประกอบใน web.xml ดังนี้ -
<web-app>
....
<context-param>
<description>Location to store uploaded file</description>
<param-name>file-upload</param-name>
<param-value>
c:\apache-tomcat-5.5.29\webapps\data\
</param-value>
</context-param>
....
</web-app>
ต่อไปนี้เป็นซอร์สโค้ดสำหรับ UploadFile.jsp. สิ่งนี้สามารถรองรับการอัปโหลดไฟล์หลายไฟล์ในแต่ละครั้ง ให้เราพิจารณาสิ่งต่อไปนี้ก่อนที่จะดำเนินการอัปโหลดไฟล์
ตัวอย่างต่อไปนี้ขึ้นอยู่กับ FileUpload; ตรวจสอบให้แน่ใจว่าคุณมีเวอร์ชันล่าสุดของcommons-fileupload.x.x.jarไฟล์ใน classpath ของคุณ คุณสามารถดาวน์โหลดได้จากhttps://commons.apache.org/fileupload/.
FileUpload ขึ้นอยู่กับ Commons IO; ตรวจสอบให้แน่ใจว่าคุณมีเวอร์ชันล่าสุดของcommons-io-x.x.jarไฟล์ใน classpath ของคุณ คุณสามารถดาวน์โหลดได้จากhttps://commons.apache.org/io/.
ในขณะที่ทดสอบตัวอย่างต่อไปนี้คุณควรอัปโหลดไฟล์ที่มีขนาดน้อยกว่าmaxFileSizeมิฉะนั้นไฟล์จะไม่ถูกอัปโหลด
ตรวจสอบให้แน่ใจว่าคุณได้สร้างไดเร็กทอรี c:\temp และ c:\apache-tomcat5.5.29\webapps\data ล่วงหน้า.
<%@ page import = "java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import = "javax.servlet.http.*" %>
<%@ page import = "org.apache.commons.fileupload.*" %>
<%@ page import = "org.apache.commons.fileupload.disk.*" %>
<%@ page import = "org.apache.commons.fileupload.servlet.*" %>
<%@ page import = "org.apache.commons.io.output.*" %>
<%
File file ;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
ServletContext context = pageContext.getServletContext();
String filePath = context.getInitParameter("file-upload");
// Verify the content type
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File("c:\\temp"));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax( maxFileSize );
try {
// Parse the request to get file items.
List fileItems = upload.parseRequest(request);
// Process the uploaded file items
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<head>");
out.println("<title>JSP File upload</title>");
out.println("</head>");
out.println("<body>");
while ( i.hasNext () ) {
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () ) {
// Get the uploaded file parameters
String fieldName = fi.getFieldName();
String fileName = fi.getName();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// Write the file
if( fileName.lastIndexOf("\\") >= 0 ) {
file = new File( filePath +
fileName.substring( fileName.lastIndexOf("\\"))) ;
} else {
file = new File( filePath +
fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
fi.write( file ) ;
out.println("Uploaded Filename: " + filePath +
fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
} catch(Exception ex) {
System.out.println(ex);
}
} else {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
}
%>
ตอนนี้ลองอัปโหลดไฟล์โดยใช้รูปแบบ HTML ที่คุณสร้างไว้ด้านบน เมื่อคุณได้ลองhttp://localhost:8080/UploadFile.htmมันจะแสดงผลลัพธ์ต่อไปนี้ วิธีนี้จะช่วยให้คุณอัปโหลดไฟล์จากเครื่องในพื้นที่ของคุณ
File Upload −
Select a file to upload −
หากสคริปต์ JSP ของคุณทำงานได้ดีไฟล์ของคุณควรอัปโหลดในรูปแบบ c:\apache-tomcat5.5.29\webapps\data\ ไดเรกทอรี
ในบทนี้เราจะพูดถึงวิธีจัดการข้อมูลใน JSP ข้อดีที่สำคัญที่สุดอย่างหนึ่งของการใช้ JSP คือคุณสามารถใช้วิธีการทั้งหมดที่มีอยู่ใน Java หลัก เราจะนำคุณผ่านDate คลาสที่มีอยู่ในไฟล์ java.utilแพ็คเกจ; คลาสนี้สรุปวันที่และเวลาปัจจุบัน
คลาส Date รองรับตัวสร้างสองตัว ตัวสร้างแรกเริ่มต้นวัตถุด้วยวันที่และเวลาปัจจุบัน
Date( )
ตัวสร้างต่อไปนี้ยอมรับหนึ่งอาร์กิวเมนต์ที่เท่ากับจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่เที่ยงคืนวันที่ 1 มกราคม 1970
Date(long millisec)
เมื่อคุณมีวัตถุ Date แล้วคุณสามารถเรียกใช้วิธีการสนับสนุนต่อไปนี้เพื่อเล่นกับวันที่ -
ส. | วิธีการและคำอธิบาย |
---|---|
1 | boolean after(Date date) ส่งคืนค่าจริงหากอ็อบเจ็กต์วันที่เรียกใช้มีวันที่ที่ช้ากว่าวันที่ที่ระบุมิฉะนั้นจะส่งกลับเท็จ |
2 | boolean before(Date date) ส่งคืนค่าจริงหากอ็อบเจ็กต์วันที่เรียกใช้มีวันที่ก่อนหน้าวันที่ระบุไว้มิฉะนั้นจะส่งกลับเท็จ |
3 | Object clone( ) ทำซ้ำอ็อบเจ็กต์ Date ที่เรียกใช้ |
4 | int compareTo(Date date) เปรียบเทียบค่าของวัตถุที่เรียกใช้กับวันที่ ส่งคืน 0 หากค่าเท่ากัน ส่งคืนค่าลบหากออบเจ็กต์ที่เรียกใช้ก่อนหน้าวันที่ ส่งคืนค่าบวกหากวัตถุที่เรียกใช้ช้ากว่าวันที่ |
5 | int compareTo(Object obj) ดำเนินการเหมือนกันกับ CompareTo (Date) ถ้า obj เป็นคลาส Date มิฉะนั้นจะพ่น ClassCastException |
6 | boolean equals(Object date) ส่งคืนจริงหากอ็อบเจ็กต์วันที่เรียกใช้มีเวลาและวันที่เดียวกันกับที่ระบุโดยวันที่มิฉะนั้นจะส่งกลับเท็จ |
7 | long getTime( ) ส่งคืนจำนวนมิลลิวินาทีที่ผ่านไปนับตั้งแต่วันที่ 1 มกราคม 1970 |
8 | int hashCode( ) ส่งคืนรหัสแฮชสำหรับวัตถุที่เรียกใช้ |
9 | void setTime(long time) ตั้งเวลาและวันที่ตามที่ระบุโดยเวลาซึ่งแสดงเวลาที่ผ่านไปในหน่วยมิลลิวินาทีจากเที่ยงคืนวันที่ 1 มกราคม 1970 |
10 | String toString( ) แปลงอ็อบเจ็กต์วันที่เรียกใช้เป็นสตริงและส่งคืนผลลัพธ์ |
รับวันที่และเวลาปัจจุบัน
ด้วยโปรแกรม JSP การรับวันที่และเวลาปัจจุบันเป็นเรื่องง่ายมาก คุณสามารถใช้ออบเจ็กต์ Date แบบธรรมดากับไฟล์toString() วิธีพิมพ์วันที่และเวลาปัจจุบันดังนี้ -
<%@ page import = "java.io.*,java.util.*, javax.servlet.*" %>
<html>
<head>
<title>Display Current Date & Time</title>
</head>
<body>
<center>
<h1>Display Current Date & Time</h1>
</center>
<%
Date date = new Date();
out.print( "<h2 align = \"center\">" +date.toString()+"</h2>");
%>
</body>
</html>
ตอนนี้ให้เราเก็บรหัสไว้ CurrentDate.jsp จากนั้นเรียกสิ่งนี้ว่า JSP โดยใช้ URL http://localhost:8080/CurrentDate.jsp. คุณจะได้รับผลดังต่อไปนี้ -
Display Current Date & Time
Mon Jun 21 21:46:49 GMT+04:00 2010
รีเฟรชหน้าด้วยไฟล์ URL http://localhost:8080/CurrentDate.jsp. คุณจะพบความแตกต่างในไม่กี่วินาทีทุกครั้งที่คุณรีเฟรช
การเปรียบเทียบวันที่
ตามที่กล่าวไว้ในส่วนก่อนหน้านี้คุณสามารถใช้วิธีการ Java ที่มีอยู่ทั้งหมดในสคริปต์ JSP ของคุณ ในกรณีที่คุณต้องการเปรียบเทียบวันที่สองวันให้พิจารณาวิธีการต่อไปนี้ -
คุณสามารถใช้ได้ getTime( ) เพื่อให้ได้จำนวนมิลลิวินาทีที่ผ่านไปนับตั้งแต่เที่ยงคืนวันที่ 1 มกราคม 1970 สำหรับวัตถุทั้งสองแล้วเปรียบเทียบค่าทั้งสองนี้
คุณสามารถใช้วิธีการ before( ), after( )และ equals( )เพราะวันที่ 12 ของเดือนมาก่อนวันที่ 18 ตัวอย่างเช่น,new Date(99, 2, 12).before(new Date (99, 2, 18)) คืนค่าจริง
คุณสามารถใช้ไฟล์ compareTo( )วิธี; วิธีนี้กำหนดโดยไฟล์Comparable interface และดำเนินการตามวันที่
การจัดรูปแบบวันที่โดยใช้ SimpleDateFormat
SimpleDateFormat เป็นคลาสที่เป็นรูปธรรมสำหรับการจัดรูปแบบและการแยกวิเคราะห์วันที่ในลักษณะที่คำนึงถึงสถานที่ SimpleDateFormat ช่วยให้คุณสามารถเริ่มต้นด้วยการเลือกรูปแบบที่ผู้ใช้กำหนดเองสำหรับการจัดรูปแบบวันที่และเวลา
ให้เราปรับเปลี่ยนตัวอย่างข้างต้นดังนี้ -
<%@ page import = "java.io.*,java.util.*" %>
<%@ page import = "javax.servlet.*,java.text.*" %>
<html>
<head>
<title>Display Current Date & Time</title>
</head>
<body>
<center>
<h1>Display Current Date & Time</h1>
</center>
<%
Date dNow = new Date( );
SimpleDateFormat ft =
new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.print( "<h2 align=\"center\">" + ft.format(dNow) + "</h2>");
%>
</body>
</html>
รวบรวม servlet ด้านบนอีกครั้งจากนั้นเรียกใช้ servlet นี้โดยใช้ URL http://localhost:8080/CurrentDate. คุณจะได้รับผลดังต่อไปนี้ -
Display Current Date & Time
Mon 2010.06.21 at 10:06:44 PM GMT+04:00
รหัสรูปแบบ DateFormat อย่างง่าย
ในการระบุรูปแบบเวลาให้ใช้สตริงรูปแบบเวลา ในรูปแบบนี้ตัวอักษร ASCII ทั้งหมดสงวนไว้เป็นตัวอักษรรูปแบบซึ่งกำหนดไว้ดังต่อไปนี้ -
ตัวละคร | คำอธิบาย | ตัวอย่าง |
---|---|---|
ช | ผู้กำหนดยุค | ค.ศ. |
ย | ปีเป็นตัวเลขสี่หลัก | พ.ศ. 2544 |
ม | เดือนในปี | กรกฎาคมหรือ 07 |
ง | วันในเดือน | 0 |
ซ | ชั่วโมงใน AM / PM (1 ~ 12) | 2 |
ซ | ชั่วโมงในวัน (0 ~ 23) | 22 |
ม | นาทีในชั่วโมง | 30 |
เอส | วินาทีในหนึ่งนาที | 55 |
ส | มิลลิวินาที | 234 |
จ | วันในสัปดาห์ | วันอังคาร |
ง | วันในปี | 360 |
ฉ | วันของสัปดาห์ในเดือน | 2 (วันพุธที่สองของเดือนกรกฎาคม) |
ว | สัปดาห์ในปี | 40 |
ว | สัปดาห์ในเดือน | |
ก | เครื่องหมาย AM / PM | น |
k | ชั่วโมงในวัน (1 ~ 24) | 24 |
เค | ชั่วโมงใน AM / PM (0 ~ 11) | 0 |
z | เขตเวลา | เวลามาตรฐานตะวันออก |
' | Escape สำหรับข้อความ | ตัวคั่น |
" | ใบเสนอราคาเดียว | ` |
สำหรับรายการวิธีการคงที่ที่มีอยู่ทั้งหมดในการจัดการวันที่คุณสามารถอ้างถึงเอกสาร Java มาตรฐาน
ในบทนี้เราจะพูดถึงการเปลี่ยนเส้นทางเพจด้วย JSP โดยทั่วไปการเปลี่ยนเส้นทางหน้าจะใช้เมื่อเอกสารย้ายไปยังตำแหน่งใหม่และเราจำเป็นต้องส่งไคลเอ็นต์ไปยังตำแหน่งใหม่นี้ อาจเป็นเพราะการจัดสรรภาระงานหรือเพื่อการสุ่มอย่างง่าย
วิธีที่ง่ายที่สุดในการเปลี่ยนเส้นทางคำขอไปยังเพจอื่นคือการใช้ sendRedirect()วิธีการตอบสนองของวัตถุ ต่อไปนี้เป็นลายเซ็นของวิธีนี้ -
public void response.sendRedirect(String location)
throws IOException
วิธีนี้จะส่งการตอบกลับไปยังเบราว์เซอร์พร้อมกับรหัสสถานะและตำแหน่งหน้าใหม่ คุณยังสามารถใช้ไฟล์setStatus() และ setHeader() วิธีการร่วมกันเพื่อให้บรรลุตัวอย่างการเปลี่ยนเส้นทางเดียวกัน -
....
String site = "http://www.newpage.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
....
ตัวอย่าง
ตัวอย่างนี้แสดงวิธีที่ JSP ดำเนินการเปลี่ยนเส้นทางเพจไปยังตำแหน่งอื่น -
<%@ page import = "java.io.*,java.util.*" %>
<html>
<head>
<title>Page Redirection</title>
</head>
<body>
<center>
<h1>Page Redirection</h1>
</center>
<%
// New location to be redirected
String site = new String("http://www.photofuntoos.com");
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
%>
</body>
</html>
ตอนนี้ให้เราใส่โค้ดด้านบนใน PageRedirect.jsp และเรียก JSP นี้โดยใช้ URL http://localhost:8080/PageRedirect.jsp. ซึ่งจะนำคุณไปยัง URL ที่กำหนดhttp://www.photofuntoos.com.
ในบทนี้เราจะพูดถึง Hits Counter ใน JSP ตัวนับจำนวนการเข้าชมจะบอกคุณเกี่ยวกับจำนวนการเข้าชมในหน้าใดหน้าหนึ่งของเว็บไซต์ของคุณ โดยปกติคุณจะแนบตัวนับจำนวนเข้ากับหน้า index.jsp โดยสมมติว่ามีคนเข้ามาที่หน้าแรกของคุณก่อน
ในการใช้ตัวนับ Hit คุณสามารถใช้ประโยชน์จากวัตถุ Application Implicit และวิธีการที่เกี่ยวข้องได้ getAttribute() และ setAttribute().
วัตถุนี้เป็นตัวแทนของเพจ JSP ตลอดวงจรชีวิตทั้งหมด อ็อบเจ็กต์นี้ถูกสร้างขึ้นเมื่อเพจ JSP ถูกเตรียมใช้งานและจะถูกลบออกเมื่อเพจ JSP ถูกลบออกโดยjspDestroy() วิธี.
ต่อไปนี้เป็นไวยากรณ์สำหรับตั้งค่าตัวแปรที่ระดับแอปพลิเคชัน -
application.setAttribute(String Key, Object Value);
คุณสามารถใช้วิธีการข้างต้นเพื่อตั้งค่าตัวแปรตัวนับ Hit และเพื่อรีเซ็ตตัวแปรเดียวกัน ต่อไปนี้เป็นวิธีการอ่านตัวแปรที่กำหนดโดยวิธีการก่อนหน้านี้ -
application.getAttribute(String Key);
ทุกครั้งที่ผู้ใช้เข้าถึงเพจของคุณคุณสามารถอ่านค่าปัจจุบันของตัวนับ Hit และเพิ่มขึ้นทีละครั้งและตั้งค่าอีกครั้งเพื่อใช้ในอนาคต
ตัวอย่าง
ตัวอย่างนี้แสดงให้เห็นว่าคุณสามารถใช้ JSP เพื่อนับจำนวน Hit ทั้งหมดในหน้าใดหน้าหนึ่งได้อย่างไร หากคุณต้องการนับจำนวน Hit ทั้งหมดในเว็บไซต์ของคุณคุณจะต้องใส่รหัสเดียวกันในหน้า JSP ทั้งหมด
<%@ page import = "java.io.*,java.util.*" %>
<html>
<head>
<title>Application object in JSP</title>
</head>
<body>
<%
Integer hitsCount = (Integer)application.getAttribute("hitCounter");
if( hitsCount ==null || hitsCount == 0 ) {
/* First visit */
out.println("Welcome to my website!");
hitsCount = 1;
} else {
/* return visit */
out.println("Welcome back to my website!");
hitsCount += 1;
}
application.setAttribute("hitCounter", hitsCount);
%>
<center>
<p>Total number of visits: <%= hitsCount%></p>
</center>
</body>
</html>
ตอนนี้ให้เราใส่รหัสด้านบน main.jsp และเรียกสิ่งนี้ว่า JSP โดยใช้ URL http://localhost:8080/main.jsp. ซึ่งจะแสดงค่า Hit Counter ซึ่งจะเพิ่มขึ้นเมื่อคุณรีเฟรชหน้า คุณสามารถลองเข้าถึงเพจโดยใช้เบราว์เซอร์ที่แตกต่างกันและคุณจะพบว่าตัวนับจำนวนการเข้าชมจะเพิ่มขึ้นเรื่อย ๆ ทุกครั้งที่เข้าชมและคุณจะได้รับผลลัพธ์ดังนี้ -
Welcome back to my website!
Total number of visits: 12
Hit Counter รีเซ็ต
จะเกิดอะไรขึ้นเมื่อคุณรีสตาร์ทแอปพลิเคชันของคุณเช่นเว็บเซิร์ฟเวอร์สิ่งนี้จะรีเซ็ตตัวแปรแอปพลิเคชันของคุณและตัวนับของคุณจะรีเซ็ตเป็นศูนย์ เพื่อหลีกเลี่ยงการสูญเสียนี้ให้พิจารณาประเด็นต่อไปนี้ -
กำหนดตารางฐานข้อมูลด้วยการนับครั้งเดียวให้เราพูดว่า hitcount กำหนดค่าเป็นศูนย์ให้กับมัน
ทุกครั้งที่เข้าชมให้อ่านตารางเพื่อรับมูลค่าของการตี
เพิ่มมูลค่าของ hitcount ทีละรายการและอัปเดตตารางด้วยค่าใหม่
แสดงค่า hitcount ใหม่เป็นจำนวนการเข้าชมหน้าทั้งหมด
หากคุณต้องการนับจำนวน Hit สำหรับทุกหน้าให้ใช้ตรรกะข้างต้นสำหรับทุกหน้า
ในบทนี้เราจะพูดถึงการรีเฟรชอัตโนมัติใน JSP พิจารณาหน้าเว็บที่แสดงคะแนนเกมสดหรือสถานะตลาดหุ้นหรือปันส่วนการแลกเปลี่ยนสกุลเงิน สำหรับหน้าประเภทนี้ทั้งหมดคุณจะต้องรีเฟรชหน้าเว็บของคุณเป็นประจำโดยใช้ปุ่มรีเฟรชหรือโหลดซ้ำกับเบราว์เซอร์ของคุณ
JSP ทำให้งานนี้ง่ายขึ้นโดยจัดเตรียมกลไกที่คุณสามารถสร้างเว็บเพจในลักษณะที่จะรีเฟรชโดยอัตโนมัติหลังจากช่วงเวลาที่กำหนด
วิธีที่ง่ายที่สุดในการรีเฟรชหน้าเว็บคือการใช้ไฟล์ setIntHeader()วิธีการของวัตถุตอบสนอง ต่อไปนี้เป็นลายเซ็นของวิธีนี้ -
public void setIntHeader(String header, int headerValue)
วิธีนี้จะส่งส่วนหัว "รีเฟรช" กลับไปยังเบราว์เซอร์พร้อมกับค่าจำนวนเต็มซึ่งระบุช่วงเวลาเป็นวินาที
ตัวอย่างการรีเฟรชหน้าอัตโนมัติ
ในตัวอย่างต่อไปนี้เราจะใช้ไฟล์ setIntHeader() วิธีการตั้งค่า Refreshหัวข้อ. สิ่งนี้จะช่วยจำลองนาฬิกาดิจิทัล -
<%@ page import = "java.io.*,java.util.*" %>
<html>
<head>
<title>Auto Refresh Header Example</title>
</head>
<body>
<center>
<h2>Auto Refresh Header Example</h2>
<%
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 5);
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
out.println("Crrent Time: " + CT + "\n");
%>
</center>
</body>
</html>
ตอนนี้ใส่รหัสด้านบน main.jspและพยายามเข้าถึง ซึ่งจะแสดงเวลาของระบบปัจจุบันหลังจากทุกๆ 5 วินาทีดังนี้ เพียงแค่เรียกใช้ JSP และรอดูผลลัพธ์ -
Auto Refresh Header Example
Current Time is: 9:44:50 PM
ในบทนี้เราจะพูดถึงวิธีการส่งอีเมลโดยใช้ JSP ในการส่งอีเมลโดยใช้ JSP คุณควรมีไฟล์JavaMail API และ Java Activation Framework (JAF) ติดตั้งบนเครื่องของคุณ
คุณสามารถดาวน์โหลดJavaMailเวอร์ชันล่าสุด(เวอร์ชัน 1.2) ได้จากเว็บไซต์มาตรฐานของ Java
คุณสามารถดาวน์โหลด JavaBeans Activation Framework JAF (เวอร์ชัน 1.0.2) เวอร์ชันล่าสุดได้จากเว็บไซต์มาตรฐานของ Java
ดาวน์โหลดและแตกไฟล์เหล่านี้ในไดเร็กทอรีระดับบนสุดที่สร้างขึ้นใหม่ คุณจะพบไฟล์ jar จำนวนหนึ่งสำหรับทั้งสองแอปพลิเคชัน คุณต้องเพิ่มไฟล์mail.jar และ activation.jar ไฟล์ใน CLASSPATH ของคุณ
ส่งอีเมลธรรมดา
นี่คือตัวอย่างการส่งอีเมลง่ายๆจากเครื่องของคุณ สันนิษฐานว่าเป็นไฟล์localhostเชื่อมต่อกับอินเทอร์เน็ตและมีความสามารถเพียงพอที่จะส่งอีเมล ตรวจสอบให้แน่ใจว่าไฟล์ jar ทั้งหมดจากแพ็กเกจ Java Email API และแพ็คเกจ JAF พร้อมใช้งานใน CLASSPATH
<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%
String result;
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties object
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session mailSession = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(mailSession);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Now set the actual message
message.setText("This is actual message");
// Send message
Transport.send(message);
result = "Sent message successfully....";
} catch (MessagingException mex) {
mex.printStackTrace();
result = "Error: unable to send message....";
}
%>
<html>
<head>
<title>Send Email using JSP</title>
</head>
<body>
<center>
<h1>Send Email using JSP</h1>
</center>
<p align = "center">
<%
out.println("Result: " + result + "\n");
%>
</p>
</body>
</html>
ตอนนี้ให้เราใส่รหัสด้านบน SendEmail.jsp ไฟล์และเรียกสิ่งนี้ว่า JSP โดยใช้ URL http://localhost:8080/SendEmail.jsp. วิธีนี้จะช่วยส่งอีเมลไปยังรหัสอีเมลที่ระบุ[email protected]. คุณจะได้รับคำตอบดังต่อไปนี้ -
Send Email using JSP
Result: Sent message successfully....
หากคุณต้องการส่งอีเมลไปยังผู้รับหลายคนให้ใช้วิธีการต่อไปนี้เพื่อระบุรหัสอีเมลหลายรายการ -
void addRecipients(Message.RecipientType type, Address[] addresses)
throws MessagingException
นี่คือคำอธิบายของพารามิเตอร์ -
type- จะตั้งค่าเป็น TO, CC หรือ BCC CC ในที่นี้หมายถึง Carbon Copy และ BCC หมายถึง Black Carbon Copy ตัวอย่างข้อความRecipientType.TO
addresses- นี่คืออาร์เรย์ของ ID อีเมล คุณจะต้องใช้เมธอด InternetAddress () ในขณะที่ระบุรหัสอีเมล
ส่งอีเมล HTML
นี่คือตัวอย่างการส่งอีเมล HTML จากเครื่องของคุณ สันนิษฐานว่าเป็นไฟล์localhostเชื่อมต่อกับอินเทอร์เน็ตและมีความสามารถเพียงพอที่จะส่งอีเมล ตรวจสอบให้แน่ใจว่าไฟล์ jar ทั้งหมดจากไฟล์Java Email API package และ JAF package มีอยู่ใน CLASSPATH
ตัวอย่างนี้คล้ายกับตัวอย่างก่อนหน้านี้มากยกเว้นว่าเรากำลังใช้ไฟล์ setContent() วิธีการตั้งค่าเนื้อหาที่มีอาร์กิวเมนต์ที่สองคือ "text/html" เพื่อระบุว่าเนื้อหา HTML รวมอยู่ในข้อความ
เมื่อใช้ตัวอย่างนี้คุณสามารถส่งเนื้อหา HTML ได้มากเท่าที่คุณต้องการ
<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%
String result;
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties object
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session mailSession = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(mailSession);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Send the actual HTML message, as big as you like
message.setContent("<h1>This is actual message</h1>", "text/html" );
// Send message
Transport.send(message);
result = "Sent message successfully....";
} catch (MessagingException mex) {
mex.printStackTrace();
result = "Error: unable to send message....";
}
%>
<html>
<head>
<title>Send HTML Email using JSP</title>
</head>
<body>
<center>
<h1>Send Email using JSP</h1>
</center>
<p align = "center">
<%
out.println("Result: " + result + "\n");
%>
</p>
</body>
</html>
ให้เราใช้ JSP ด้านบนเพื่อส่งข้อความ HTML ในรหัสอีเมลที่กำหนด
ส่งไฟล์แนบในอีเมล
ต่อไปนี้เป็นตัวอย่างการส่งอีเมลพร้อมไฟล์แนบจากเครื่องของคุณ -
<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%
String result;
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties object
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session mailSession = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(mailSession);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText("This is message body");
// Create a multipart message
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
// Part two is attachment
messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// Send the complete message parts
message.setContent(multipart );
// Send message
Transport.send(message);
String title = "Send Email";
result = "Sent message successfully....";
} catch (MessagingException mex) {
mex.printStackTrace();
result = "Error: unable to send message....";
}
%>
<html>
<head>
<title>Send Attachment Email using JSP</title>
</head>
<body>
<center>
<h1>Send Attachment Email using JSP</h1>
</center>
<p align = "center">
<%out.println("Result: " + result + "\n");%>
</p>
</body>
</html>
ตอนนี้ให้เราเรียกใช้ JSP ด้านบนเพื่อส่งไฟล์เป็นไฟล์แนบพร้อมกับข้อความในรหัสอีเมลที่กำหนด
ส่วนการตรวจสอบผู้ใช้
หากจำเป็นต้องระบุ ID ผู้ใช้และรหัสผ่านให้กับเซิร์ฟเวอร์อีเมลเพื่อวัตถุประสงค์ในการตรวจสอบสิทธิ์คุณสามารถตั้งค่าคุณสมบัติเหล่านี้ได้ดังนี้ -
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");
กลไกการส่งอีเมลที่เหลือจะยังคงเป็นไปตามที่อธิบายไว้ข้างต้น
การใช้แบบฟอร์มเพื่อส่งอีเมล
คุณสามารถใช้รูปแบบ HTML เพื่อยอมรับพารามิเตอร์อีเมลจากนั้นคุณสามารถใช้ไฟล์ request คัดค้านเพื่อรับข้อมูลทั้งหมดดังนี้ -
String to = request.getParameter("to");
String from = request.getParameter("from");
String subject = request.getParameter("subject");
String messageText = request.getParameter("body");
เมื่อคุณมีข้อมูลทั้งหมดแล้วคุณสามารถใช้โปรแกรมดังกล่าวข้างต้นเพื่อส่งอีเมลได้
ในบทนี้เราจะเข้าใจแท็กต่างๆใน JSP JavaServer Pages Standard Tag Library (JSTL) คือชุดของแท็ก JSP ที่มีประโยชน์ซึ่งห่อหุ้มฟังก์ชันการทำงานหลักที่ใช้ร่วมกันกับแอปพลิเคชัน JSP จำนวนมาก
JSTL รองรับงานโครงสร้างทั่วไปเช่นการวนซ้ำและเงื่อนไขแท็กสำหรับการจัดการเอกสาร XML แท็กสากลและแท็ก SQL นอกจากนี้ยังมีกรอบสำหรับการรวมแท็กที่กำหนดเองที่มีอยู่กับแท็ก JSTL
ติดตั้ง JSTL Library
ในการเริ่มต้นทำงานกับ JSP tages คุณต้องติดตั้งไลบรารี JSTL ก่อน หากคุณใช้คอนเทนเนอร์ Apache Tomcat ให้ทำตามสองขั้นตอนนี้ -
Step 1- ดาวน์โหลดการแจกแจงไบนารีจากApache Standard Taglibและแกะไฟล์บีบอัด
Step 2 - ในการใช้ Standard Taglib จากไฟล์ Jakarta Taglibs distributionเพียงคัดลอกไฟล์ JAR ในไดเร็กทอรี 'lib' ของการแจกจ่ายไปยังแอปพลิเคชันของคุณ webapps\ROOT\WEB-INF\lib ไดเรกทอรี
ในการใช้ไลบรารีใด ๆ คุณต้องใส่ <taglib> คำสั่งที่ด้านบนของแต่ละ JSP ที่ใช้ไลบรารี
การจำแนกประเภทของแท็ก JSTL
แท็ก JSTL สามารถจัดประเภทตามหน้าที่ของพวกเขาเป็นกลุ่มไลบรารีแท็ก JSTL ต่อไปนี้ที่สามารถใช้เมื่อสร้างเพจ JSP -
Core Tags
Formatting tags
SQL tags
XML tags
JSTL Functions
แท็กหลัก
กลุ่มหลักของแท็กคือแท็ก JSTL ที่ใช้บ่อยที่สุด ต่อไปนี้เป็นไวยากรณ์ที่จะรวมไลบรารี JSTL Core ใน JSP ของคุณ -
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
ตารางต่อไปนี้แสดงรายการแท็ก JSTL หลัก -
ส. | แท็กและคำอธิบาย |
---|---|
1 | เช่น <% = ... > แต่สำหรับนิพจน์ |
2 | ตั้งค่าผลลัพธ์ของการประเมินนิพจน์ในไฟล์ 'scope' |
3 | ลบไฟล์ scoped variable (จากขอบเขตเฉพาะหากระบุไว้) |
4 | จับใด ๆ Throwable ที่เกิดขึ้นในร่างกายและอาจเปิดเผยได้ |
5 | แท็กเงื่อนไขอย่างง่ายซึ่งประเมินเนื้อความหากเงื่อนไขที่ให้มาเป็นจริง |
6 | แท็กเงื่อนไขอย่างง่ายที่สร้างบริบทสำหรับการดำเนินการตามเงื่อนไขที่ไม่ซ้ำกันซึ่งทำเครื่องหมายโดย <when> และ <otherwise>. |
7 | แท็กย่อยของ <choose> ซึ่งรวมถึงร่างกายของมันหากสภาพของมันถูกประเมินเป็น 'true'. |
8 | แท็กย่อยของ <choose> ที่เป็นไปตาม <when> แท็กและรันก็ต่อเมื่อเงื่อนไขก่อนหน้าทั้งหมดถูกประเมินเป็น 'false'. |
9 | ดึงข้อมูล URL แบบสัมบูรณ์หรือแบบสัมพัทธ์และแสดงเนื้อหาไปยังเพจซึ่งเป็น String in 'var'หรือผู้อ่านใน 'varReader'. |
10 | แท็กการวนซ้ำพื้นฐานยอมรับประเภทคอลเลกชันที่แตกต่างกันมากมายและรองรับการตั้งค่าย่อยและฟังก์ชันอื่น ๆ |
11 | วนซ้ำบนโทเค็นคั่นด้วยเส้นคั่นที่ให้มา |
12 | เพิ่มพารามิเตอร์ให้กับไฟล์ 'import' URL ของแท็ก |
13 | เปลี่ยนเส้นทางไปยัง URL ใหม่ |
14 | สร้าง URL ที่มีพารามิเตอร์การสืบค้นเพิ่มเติม |
การจัดรูปแบบแท็ก
แท็กการจัดรูปแบบ JSTL ใช้เพื่อจัดรูปแบบและแสดงข้อความวันที่เวลาและตัวเลขสำหรับเว็บไซต์ที่เป็นสากล ต่อไปนี้เป็นไวยากรณ์ที่จะรวมไลบรารีการจัดรูปแบบใน JSP ของคุณ -
<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
ตารางต่อไปนี้แสดงรายการแท็ก JSTL การจัดรูปแบบ -
ส. | แท็กและคำอธิบาย |
---|---|
1 | เพื่อแสดงค่าตัวเลขด้วยความแม่นยำหรือรูปแบบเฉพาะ |
2 | แยกวิเคราะห์การแสดงสตริงของตัวเลขสกุลเงินหรือเปอร์เซ็นต์ |
3 | จัดรูปแบบวันที่และ / หรือเวลาโดยใช้รูปแบบและรูปแบบที่ให้มา |
4 | แยกวิเคราะห์การแทนค่าสตริงของวันที่และ / หรือเวลา |
5 | โหลดบันเดิลทรัพยากรที่จะใช้โดยเนื้อหาแท็ก |
6 | เก็บโลแคลที่ระบุในตัวแปรคอนฟิกูเรชันโลแคล |
7 | โหลดบันเดิลรีซอร์สและเก็บไว้ในตัวแปรกำหนดขอบเขตที่มีชื่อหรือตัวแปรคอนฟิกูเรชันบันเดิล |
8 | ระบุเขตเวลาสำหรับการจัดรูปแบบเวลาหรือการแยกวิเคราะห์การกระทำที่ซ้อนอยู่ในเนื้อความ |
9 | เก็บเขตเวลาที่กำหนดไว้ในตัวแปรการกำหนดค่าโซนเวลา |
10 | แสดงข้อความสากล |
11 | ตั้งค่าการเข้ารหัสอักขระร้องขอ |
แท็ก SQL
ไลบรารีแท็ก JSTL SQL จัดเตรียมแท็กสำหรับโต้ตอบกับฐานข้อมูลเชิงสัมพันธ์ (RDBMS) เช่น Oracle, mySQL, หรือ Microsoft SQL Server.
ต่อไปนี้เป็นไวยากรณ์ที่จะรวมไลบรารี JSTL SQL ใน JSP ของคุณ -
<%@ taglib prefix = "sql" uri = "http://java.sun.com/jsp/jstl/sql" %>
ตารางต่อไปนี้แสดงรายการแท็ก SQL JSTL -
ส. | แท็กและคำอธิบาย |
---|---|
1 | สร้างแหล่งข้อมูลอย่างง่ายที่เหมาะสำหรับการสร้างต้นแบบเท่านั้น |
2 | เรียกใช้แบบสอบถาม SQL ที่กำหนดไว้ในเนื้อความหรือผ่านแอตทริบิวต์ sql |
3 | เรียกใช้การอัปเดต SQL ที่กำหนดไว้ในเนื้อหาหรือผ่านแอตทริบิวต์ sql |
4 | ตั้งค่าพารามิเตอร์ในคำสั่ง SQL เป็นค่าที่ระบุ |
5 | ตั้งค่าพารามิเตอร์ในคำสั่ง SQL เป็นค่า java.util.Date ที่ระบุ |
6 | จัดเตรียมองค์ประกอบการดำเนินการฐานข้อมูลที่ซ้อนกันด้วยการเชื่อมต่อแบบแบ่งใช้ตั้งค่าเพื่อดำเนินการคำสั่งทั้งหมดเป็นธุรกรรมเดียว |
แท็ก XML
แท็ก JSTL XML จัดเตรียมวิธีการสร้างและจัดการเอกสาร XML ที่เน้น JSP เป็นศูนย์กลาง ต่อไปนี้เป็นไวยากรณ์ที่จะรวมไลบรารี JSTL XML ใน JSP ของคุณ
ไลบรารีแท็ก JSTL XML มีแท็กที่กำหนดเองสำหรับการโต้ตอบกับข้อมูล XML ซึ่งรวมถึงการแยกวิเคราะห์ XML การแปลงข้อมูล XML และการควบคุมโฟลว์ตามนิพจน์ XPath
<%@ taglib prefix = "x"
uri = "http://java.sun.com/jsp/jstl/xml" %>
ก่อนที่คุณจะดำเนินการกับตัวอย่างคุณจะต้องคัดลอกไลบรารี XML และ XPath สองไลบรารีต่อไปนี้ลงในไฟล์ <Tomcat Installation Directory>\lib -
XercesImpl.jar - ดาวน์โหลดจาก https://www.apache.org/dist/xerces/j/
xalan.jar - ดาวน์โหลดจาก https://xml.apache.org/xalan-j/index.html
ต่อไปนี้เป็นรายการ XML JSTL Tags -
ส. | แท็กและคำอธิบาย |
---|---|
1 | เช่น <% = ... > แต่สำหรับนิพจน์ XPath |
2 | ใช้เพื่อแยกวิเคราะห์ข้อมูล XML ที่ระบุผ่านแอตทริบิวต์หรือในเนื้อหาแท็ก |
3 | ตั้งค่าตัวแปรเป็นค่าของนิพจน์ XPath |
4 | ประเมินนิพจน์ XPath ทดสอบและหากเป็นจริงจะประมวลผลร่างของมัน หากเงื่อนไขการทดสอบเป็นเท็จเนื้อหาจะถูกละเว้น |
5 | ในการวนซ้ำโหนดในเอกสาร XML |
6 | แท็กเงื่อนไขอย่างง่ายที่สร้างบริบทสำหรับการดำเนินการตามเงื่อนไขที่ไม่ซ้ำกันซึ่งทำเครื่องหมายโดย <when> และ <otherwise> แท็ก |
7 | แท็กย่อยของ <choose> ซึ่งรวมถึงเนื้อความหากนิพจน์ประเมินว่าเป็น 'จริง' |
8 | แท็กย่อยของ <choose> ที่เป็นไปตาม <when> แท็กและรันก็ต่อเมื่อเงื่อนไขก่อนหน้านี้ทั้งหมดประเมินว่าเป็น 'เท็จ' |
9 | ใช้การแปลง XSL บนเอกสาร XML |
10 | ใช้ร่วมกับ transform แท็กเพื่อตั้งค่าพารามิเตอร์ในสไตล์ชีต XSLT |
ฟังก์ชั่น JSTL
JSTL มีฟังก์ชันมาตรฐานจำนวนหนึ่งซึ่งส่วนใหญ่เป็นฟังก์ชันการจัดการสตริงทั่วไป ต่อไปนี้เป็นไวยากรณ์ที่จะรวมไลบรารีฟังก์ชัน JSTL ใน JSP ของคุณ -
<%@ taglib prefix = "fn"
uri = "http://java.sun.com/jsp/jstl/functions" %>
ตารางต่อไปนี้แสดงรายการฟังก์ชั่น JSTL ต่างๆ -
ส. | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | fn: มี () ทดสอบว่าสตริงอินพุตมีสตริงย่อยที่ระบุหรือไม่ |
2 | fn: containsIgnoreCase () ทดสอบว่าสตริงอินพุตมีสตริงย่อยที่ระบุหรือไม่โดยไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ |
3 | Fn: สิ้นสุดด้วย () ทดสอบว่าสตริงอินพุตลงท้ายด้วยคำต่อท้ายที่ระบุหรือไม่ |
4 | Fn: escapeXml () หลีกเลี่ยงอักขระที่สามารถตีความเป็นมาร์กอัป XML |
5 | fn: indexOf () ส่งคืนดัชนีที่มีสตริงของการเกิดขึ้นครั้งแรกของสตริงย่อยที่ระบุ |
6 | fn: เข้าร่วม () รวมองค์ประกอบทั้งหมดของอาร์เรย์ลงในสตริง |
7 | Fn: ความยาว () ส่งคืนจำนวนรายการในคอลเลกชันหรือจำนวนอักขระในสตริง |
8 | fn: แทนที่ () ส่งคืนสตริงที่เกิดจากการแทนที่ในสตริงอินพุตเหตุการณ์ทั้งหมดที่เกิดขึ้นด้วยสตริงที่กำหนด |
9 | Fn: แยก () แยกสตริงออกเป็นอาร์เรย์ของสตริงย่อย |
10 | Fn: startWith () ทดสอบว่าสตริงอินพุตเริ่มต้นด้วยคำนำหน้าที่ระบุหรือไม่ |
11 | Fn: สตริงย่อย () ส่งคืนชุดย่อยของสตริง |
12 | fn: substringAfter () ส่งคืนชุดย่อยของสตริงตามสตริงย่อยเฉพาะ |
13 | Fn: substringBefore () ส่งคืนชุดย่อยของสตริงก่อนสตริงย่อยเฉพาะ |
14 | Fn: toLowerCase () แปลงอักขระทั้งหมดของสตริงเป็นตัวพิมพ์เล็ก |
15 | Fn: toUpperCase () แปลงอักขระทั้งหมดของสตริงเป็นตัวพิมพ์ใหญ่ |
16 | Fn: ตัดแต่ง () ลบช่องว่างสีขาวจากปลายทั้งสองด้านของสตริง |
ในบทนี้เราจะพูดถึงวิธีการเข้าถึงฐานข้อมูลด้วย JSP เราถือว่าคุณมีความเข้าใจดีว่าแอปพลิเคชัน JDBC ทำงานอย่างไร ก่อนเริ่มต้นด้วยการเข้าถึงฐานข้อมูลผ่าน JSP ตรวจสอบให้แน่ใจว่าคุณมีการตั้งค่าสภาพแวดล้อม JDBC ที่เหมาะสมพร้อมกับฐานข้อมูล
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเข้าถึงฐานข้อมูลโดยใช้ JDBC และการตั้งค่าสภาพแวดล้อมของคุณสามารถไปถึงเราสอน JDBC
ในการเริ่มต้นด้วยแนวคิดพื้นฐานให้เราสร้างตารางและสร้างระเบียนสองสามรายการในตารางดังต่อไปนี้ -
สร้างตาราง
เพื่อสร้างไฟล์ Employees ตารางในฐานข้อมูล EMP ใช้ขั้นตอนต่อไปนี้ -
ขั้นตอนที่ 1
เปิดไฟล์ Command Prompt และเปลี่ยนเป็นไดเร็กทอรีการติดตั้งดังนี้ -
C:\>
C:\>cd Program Files\MySQL\bin
C:\Program Files\MySQL\bin>
ขั้นตอนที่ 2
เข้าสู่ระบบฐานข้อมูลดังนี้ -
C:\Program Files\MySQL\bin>mysql -u root -p
Enter password: ********
mysql>
ขั้นตอนที่ 3
สร้างไฟล์ Employee ตารางใน TEST ฐานข้อมูลดังนี้ - -
mysql> use TEST;
mysql> create table Employees
(
id int not null,
age int not null,
first varchar (255),
last varchar (255)
);
Query OK, 0 rows affected (0.08 sec)
mysql>
สร้างบันทึกข้อมูล
ตอนนี้ให้เราสร้างบันทึกสองสามรายการในไฟล์ Employee ตารางดังนี้ - -
mysql> INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali');
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO Employees VALUES (101, 25, 'Mahnaz', 'Fatma');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal');
Query OK, 1 row affected (0.00 sec)
mysql>
เลือกการทำงาน
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเราสามารถเรียกใช้ไฟล์ SQL SELECT คำสั่งโดยใช้ JTSL ในการเขียนโปรแกรม JSP -
<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
<html>
<head>
<title>SELECT Operation</title>
</head>
<body>
<sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost/TEST"
user = "root" password = "pass123"/>
<sql:query dataSource = "${snapshot}" var = "result">
SELECT * from Employees;
</sql:query>
<table border = "1" width = "100%">
<tr>
<th>Emp ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Age</th>
</tr>
<c:forEach var = "row" items = "${result.rows}"> <tr> <td><c:out value = "${row.id}"/></td>
<td><c:out value = "${row.first}"/></td> <td><c:out value = "${row.last}"/></td>
<td><c:out value = "${row.age}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
เข้าถึง JSP ด้านบนผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Emp ID
First Name
Last Name
Age
100
Zara
Ali
18
101
Mahnaz
Fatma
25
102
Zaid
Khan
30
103
Sumit
Mittal
28
การทำงานของ INSERT
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเราสามารถเรียกใช้คำสั่ง SQL INSERT โดยใช้ JTSL ในการเขียนโปรแกรม JSP ได้อย่างไร -
<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
<html>
<head>
<title>JINSERT Operation</title>
</head>
<body>
<sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost/TEST"
user = "root" password = "pass123"/>
<sql:update dataSource = "${snapshot}" var = "result">
INSERT INTO Employees VALUES (104, 2, 'Nuha', 'Ali');
</sql:update>
<sql:query dataSource = "${snapshot}" var = "result"> SELECT * from Employees; </sql:query> <table border = "1" width = "100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>Age</th> </tr> <c:forEach var = "row" items = "${result.rows}">
<tr>
<td><c:out value = "${row.id}"/></td> <td><c:out value = "${row.first}"/></td>
<td><c:out value = "${row.last}"/></td> <td><c:out value = "${row.age}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
เข้าถึง JSP ด้านบนผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Emp ID
First Name
Last Name
Age
100
Zara
Ali
18
101
Mahnaz
Fatma
25
102
Zaid
Khan
30
103
Sumit
Mittal
28
104
Nuha
Ali
2
ลบการดำเนินการ
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเราสามารถเรียกใช้ไฟล์ SQL DELETE คำสั่งโดยใช้ JTSL ในการเขียนโปรแกรม JSP -
<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
<html>
<head>
<title>DELETE Operation</title>
</head>
<body>
<sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost/TEST"
user = "root" password = "pass123"/>
<c:set var = "empId" value = "103"/>
<sql:update dataSource = "${snapshot}" var = "count"> DELETE FROM Employees WHERE Id = ? <sql:param value = "${empId}" />
</sql:update>
<sql:query dataSource = "${snapshot}" var = "result"> SELECT * from Employees; </sql:query> <table border = "1" width = "100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>Age</th> </tr> <c:forEach var = "row" items = "${result.rows}">
<tr>
<td><c:out value = "${row.id}"/></td> <td><c:out value = "${row.first}"/></td>
<td><c:out value = "${row.last}"/></td> <td><c:out value = "${row.age}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
เข้าถึง JSP ด้านบนผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Emp ID
First Name
Last Name
Age
100
Zara
Ali
18
101
Mahnaz
Fatma
25
102
Zaid
Khan
30
อัปเดตการทำงาน
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเราสามารถเรียกใช้ไฟล์ SQL UPDATE คำสั่งโดยใช้ JTSL ในการเขียนโปรแกรม JSP -
<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
<html>
<head>
<title>DELETE Operation</title>
</head>
<body>
<sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost/TEST"
user = "root" password = "pass123"/>
<c:set var = "empId" value = "102"/>
<sql:update dataSource = "${snapshot}" var = "count"> UPDATE Employees SET WHERE last = 'Ali' <sql:param value = "${empId}" />
</sql:update>
<sql:query dataSource = "${snapshot}" var = "result"> SELECT * from Employees; </sql:query> <table border = "1" width = "100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>Age</th> </tr> <c:forEach var = "row" items = "${result.rows}">
<tr>
<td><c:out value = "${row.id}"/></td> <td><c:out value = "${row.first}"/></td>
<td><c:out value = "${row.last}"/></td> <td><c:out value = "${row.age}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
เข้าถึง JSP ด้านบนผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Emp ID
First Name
Last Name
Age
100
Zara
Ali
18
101
Mahnaz
Fatma
25
102
Zaid
Ali
30
เมื่อคุณส่งข้อมูล XML ผ่าน HTTP ควรใช้ JSP เพื่อจัดการเอกสาร XML ขาเข้าและขาออก ตัวอย่างเช่นเอกสาร RSS เนื่องจากเอกสาร XML เป็นเพียงข้อความจำนวนมากการสร้างผ่าน JSP นั้นง่ายกว่าการสร้างเอกสาร HTML มาก
การส่ง XML จาก JSP
คุณสามารถส่งเนื้อหา XML โดยใช้ JSP แบบเดียวกับที่คุณส่ง HTML ข้อแตกต่างเพียงอย่างเดียวคือคุณต้องตั้งค่าประเภทเนื้อหาของเพจของคุณเป็น text / xml ในการตั้งค่าประเภทเนื้อหาให้ใช้ไฟล์<%@page%> แท็กแบบนี้ -
<%@ page contentType = "text/xml" %>
ตัวอย่างต่อไปนี้จะแสดงวิธีการส่งเนื้อหา XML ไปยังเบราว์เซอร์ -
<%@ page contentType = "text/xml" %>
<books>
<book>
<name>Padam History</name>
<author>ZARA</author>
<price>100</price>
</book>
</books>
เข้าถึง XML ด้านบนโดยใช้เบราว์เซอร์อื่นเพื่อดูการนำเสนอแผนผังเอกสารของ XML ด้านบน
การประมวลผล XML ใน JSP
ก่อนที่คุณจะดำเนินการประมวลผล XML โดยใช้ JSP คุณจะต้องคัดลอกไลบรารี XML และ XPath สองไลบรารีต่อไปนี้ลงในไฟล์ <Tomcat Installation Directory>\lib -
XercesImpl.jar - ดาวน์โหลดจาก https://www.apache.org/dist/xerces/j/
xalan.jar - ดาวน์โหลดจาก https://xml.apache.org/xalan-j/index.html
ให้เราใส่เนื้อหาต่อไปนี้ในไฟล์ books.xml -
<books>
<book>
<name>Padam History</name>
<author>ZARA</author>
<price>100</price>
</book>
<book>
<name>Great Mistry</name>
<author>NUHA</author>
<price>2000</price>
</book>
</books>
ลองทำดังต่อไปนี้ main.jspเก็บไว้ในไดเรกทอรีเดียวกัน -
<%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "x" uri="http://java.sun.com/jsp/jstl/xml" %>
<html>
<head>
<title>JSTL x:parse Tags</title>
</head>
<body>
<h3>Books Info:</h3>
<c:import var = "bookInfo" url="http://localhost:8080/books.xml"/>
<x:parse xml = "${bookInfo}" var = "output"/> <b>The title of the first book is</b>: <x:out select = "$output/books/book[1]/name" />
<br>
<b>The price of the second book</b>:
<x:out select = "$output/books/book[2]/price" />
</body>
</html>
เข้าถึง JSP ด้านบนโดยใช้ http://localhost:8080/main.jspผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Books Info:
The title of the first book is:Padam History
The price of the second book: 2000
การจัดรูปแบบ XML ด้วย JSP
พิจารณาสไตล์ชีต XSLT ต่อไปนี้ style.xsl -
<?xml version = "1.0"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
version = "1.0">
<xsl:output method = "html" indent = "yes"/>
<xsl:template match = "/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match = "books">
<table border = "1" width = "100%">
<xsl:for-each select = "book">
<tr>
<td>
<i><xsl:value-of select = "name"/></i>
</td>
<td>
<xsl:value-of select = "author"/>
</td>
<td>
<xsl:value-of select = "price"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
ตอนนี้พิจารณาไฟล์ JSP ต่อไปนี้ -
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "x" uri = "http://java.sun.com/jsp/jstl/xml" %>
<html>
<head>
<title>JSTL x:transform Tags</title>
</head>
<body>
<h3>Books Info:</h3>
<c:set var = "xmltext">
<books>
<book>
<name>Padam History</name>
<author>ZARA</author>
<price>100</price>
</book>
<book>
<name>Great Mistry</name>
<author>NUHA</author>
<price>2000</price>
</book>
</books>
</c:set>
<c:import url = "http://localhost:8080/style.xsl" var = "xslt"/>
<x:transform xml = "${xmltext}" xslt = "${xslt}"/>
</body>
</html>
ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Books Info:
Padam History
ZARA
100
Great Mistry
NUHA
2000
หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการประมวลผลโดยใช้ XML JSTL คุณสามารถตรวจสอบห้องสมุดแท็ก JSP มาตรฐาน
JavaBean เป็นคลาส Java ที่สร้างขึ้นเป็นพิเศษซึ่งเขียนด้วย Java และเข้ารหัสตามข้อกำหนด JavaBeans API
ต่อไปนี้เป็นลักษณะเฉพาะที่ทำให้ JavaBean แตกต่างจากคลาส Java อื่น ๆ -
มีตัวสร้างเริ่มต้นที่ไม่มีอาร์กิวเมนต์
ควรเป็นอนุกรมและสิ่งที่สามารถใช้ Serializable อินเตอร์เฟซ.
มันอาจมีคุณสมบัติหลายอย่างที่สามารถอ่านหรือเขียนได้
มันอาจมีจำนวน "getter"และ"setter"วิธีการสำหรับคุณสมบัติ
คุณสมบัติ JavaBeans
คุณสมบัติ JavaBean คือแอ็ตทริบิวต์ที่มีชื่อซึ่งผู้ใช้อ็อบเจ็กต์สามารถเข้าถึงได้ แอตทริบิวต์สามารถเป็นประเภทข้อมูล Java ใดก็ได้รวมถึงคลาสที่คุณกำหนด
คุณสมบัติ JavaBean อาจเป็น read, write, read only, หรือ write only. คุณสมบัติ JavaBean ถูกเข้าถึงผ่านสองวิธีในคลาสการใช้งานของ JavaBean -
ส. | วิธีการและคำอธิบาย |
---|---|
1 | ได้รับPropertyName() ตัวอย่างเช่นถ้าชื่อคุณสมบัติเป็นfirstNameชื่อเมธอดของคุณจะเป็นgetFirstName()เพื่ออ่านคุณสมบัตินั้น วิธีนี้เรียกว่า accessor |
2 | ชุดPropertyName() ตัวอย่างเช่นถ้าชื่อคุณสมบัติเป็นfirstNameชื่อเมธอดของคุณจะเป็นsetFirstName()เพื่อเขียนคุณสมบัตินั้น วิธีนี้เรียกว่า mutator |
แอตทริบิวต์แบบอ่านอย่างเดียวจะมีเพียงไฟล์ getPropertyName() method และแอตทริบิวต์แบบเขียนอย่างเดียวจะมีเพียงไฟล์ setPropertyName() วิธี.
ตัวอย่าง JavaBeans
พิจารณาชั้นเรียนของนักเรียนที่มีคุณสมบัติน้อย -
package com.tutorialspoint;
public class StudentsBean implements java.io.Serializable {
private String firstName = null;
private String lastName = null;
private int age = 0;
public StudentsBean() {
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getAge(){
return age;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(Integer age){
this.age = age;
}
}
การเข้าถึง JavaBeans
useBeanการดำเนินการประกาศ JavaBean สำหรับใช้ใน JSP เมื่อประกาศแล้ว bean จะกลายเป็นตัวแปรสคริปต์ที่สามารถเข้าถึงได้โดยทั้งองค์ประกอบการเขียนสคริปต์และแท็กแบบกำหนดเองอื่น ๆ ที่ใช้ใน JSP ไวยากรณ์เต็มสำหรับแท็ก useBean มีดังนี้ -
<jsp:useBean id = "bean's name" scope = "bean's scope" typeSpec/>
ค่าสำหรับแอตทริบิวต์ขอบเขตสามารถเป็นไฟล์ page, request, session หรือ application basedตามความต้องการของคุณ ค่าของid แอตทริบิวต์อาจเป็นค่าใดก็ได้ตราบเท่าที่เป็นชื่อที่ไม่ซ้ำกัน useBean declarations ใน JSP เดียวกัน
ตัวอย่างต่อไปนี้แสดงวิธีใช้การดำเนินการ useBean -
<html>
<head>
<title>useBean Example</title>
</head>
<body>
<jsp:useBean id = "date" class = "java.util.Date" />
<p>The date/time is <%= date %>
</body>
</html>
คุณจะได้รับผลดังต่อไปนี้ - -
The date/time is Thu Sep 30 11:18:11 GST 2010
การเข้าถึงคุณสมบัติ JavaBeans
พร้อมด้วย <jsp:useBean...> คุณสามารถใช้ไฟล์ <jsp:getProperty/> การดำเนินการเพื่อเข้าถึงเมธอด get และไฟล์ <jsp:setProperty/>การดำเนินการเพื่อเข้าถึงวิธีการตั้งค่า นี่คือไวยากรณ์แบบเต็ม -
<jsp:useBean id = "id" class = "bean's class" scope = "bean's scope">
<jsp:setProperty name = "bean's id" property = "property name"
value = "value"/>
<jsp:getProperty name = "bean's id" property = "property name"/>
...........
</jsp:useBean>
แอตทริบิวต์ name อ้างอิง id ของ JavaBean ที่แนะนำก่อนหน้านี้กับ JSP โดยแอ็คชัน useBean แอตทริบิวต์คุณสมบัติคือชื่อของget หรือ set วิธีการที่ควรเรียกใช้
ตัวอย่างต่อไปนี้แสดงวิธีการเข้าถึงข้อมูลโดยใช้ไวยากรณ์ด้านบน -
<html>
<head>
<title>get and set properties Example</title>
</head>
<body>
<jsp:useBean id = "students" class = "com.tutorialspoint.StudentsBean">
<jsp:setProperty name = "students" property = "firstName" value = "Zara"/>
<jsp:setProperty name = "students" property = "lastName" value = "Ali"/>
<jsp:setProperty name = "students" property = "age" value = "10"/>
</jsp:useBean>
<p>Student First Name:
<jsp:getProperty name = "students" property = "firstName"/>
</p>
<p>Student Last Name:
<jsp:getProperty name = "students" property = "lastName"/>
</p>
<p>Student Age:
<jsp:getProperty name = "students" property = "age"/>
</p>
</body>
</html>
ให้เราสร้างไฟล์ StudentsBean.classมีอยู่ใน CLASSPATH เข้าถึง JSP ด้านบน ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น -
Student First Name: Zara
Student Last Name: Ali
Student Age: 10
ในบทนี้เราจะพูดถึง Custom Tags ใน JSP แท็กที่กำหนดเองคืออิลิเมนต์ภาษา JSP ที่ผู้ใช้กำหนดเอง เมื่อเพจ JSP ที่มีแท็กที่กำหนดเองถูกแปลเป็น servlet แท็กจะถูกแปลงเป็นการดำเนินการบนอ็อบเจ็กต์ที่เรียกว่าตัวจัดการแท็ก จากนั้นเว็บคอนเทนเนอร์จะเรียกใช้การดำเนินการเหล่านั้นเมื่อมีการเรียกใช้ servlet ของเพจ JSP
ส่วนขยายแท็ก JSP ช่วยให้คุณสามารถสร้างแท็กใหม่ที่คุณสามารถแทรกลงใน JavaServer Page ได้โดยตรง ข้อกำหนด JSP 2.0 แนะนำ Simple Tag Handlers สำหรับการเขียนแท็กที่กำหนดเองเหล่านี้
ในการเขียนแท็กที่กำหนดเองคุณสามารถขยายได้ SimpleTagSupport คลาสและแทนที่ไฟล์ doTag() วิธีการที่คุณสามารถวางโค้ดของคุณเพื่อสร้างเนื้อหาสำหรับแท็ก
สร้างแท็ก "สวัสดี"
พิจารณาว่าคุณต้องการกำหนดแท็กที่กำหนดเองชื่อ <ex: Hello> และคุณต้องการใช้ในลักษณะต่อไปนี้โดยไม่มีร่างกาย -
<ex:Hello />
ในการสร้างแท็ก JSP แบบกำหนดเองก่อนอื่นคุณต้องสร้างคลาส Java ที่ทำหน้าที่เป็นตัวจัดการแท็ก ให้เราสร้างไฟล์HelloTag ชั้นเรียนดังนี้ -
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}
รหัสด้านบนมีการเข้ารหัสอย่างง่ายโดยที่ไฟล์ doTag() วิธีการใช้วัตถุ JspContext ปัจจุบันโดยใช้ getJspContext() วิธีการและใช้ในการส่ง "Hello Custom Tag!" จนถึงปัจจุบัน JspWriter วัตถุ
ให้เรารวบรวมคลาสข้างต้นและคัดลอกในไดเร็กทอรีที่มีอยู่ในตัวแปรสภาพแวดล้อม CLASSPATH สุดท้ายสร้างไฟล์ไลบรารีแท็กต่อไปนี้:<Tomcat-Installation-Directory>webapps\ROOT\WEB-INF\custom.tld.
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
ตอนนี้ให้เราใช้แท็กที่กำหนดเองที่กำหนดไว้ข้างต้น Hello ในโปรแกรม JSP ของเราดังต่อไปนี้ -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
เรียก JSP ข้างต้นและสิ่งนี้ควรให้ผลลัพธ์ดังต่อไปนี้ -
Hello Custom Tag!
การเข้าถึงเนื้อหาแท็ก
คุณสามารถรวมข้อความในเนื้อหาของแท็กได้ตามที่คุณเห็นด้วยแท็กมาตรฐาน พิจารณาว่าคุณต้องการกำหนดแท็กที่กำหนดเองชื่อ<ex:Hello> และคุณต้องการใช้ในรูปแบบต่อไปนี้กับร่างกาย -
<ex:Hello>
This is message body
</ex:Hello>
ให้เราทำการเปลี่ยนแปลงต่อไปนี้ในโค้ดแท็กด้านบนเพื่อประมวลผลเนื้อหาของแท็ก -
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException {
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
ที่นี่ผลลัพธ์ที่เกิดจากการเรียกใช้จะถูกจับเป็นไฟล์ StringWriterก่อนที่จะเขียนไปยัง JspWriter ที่เชื่อมโยงกับแท็ก เราต้องเปลี่ยนไฟล์ TLD ดังนี้ -
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
ให้เราเรียกแท็กด้านบนด้วยเนื้อความที่เหมาะสมดังนี้ -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello>
This is message body
</ex:Hello>
</body>
</html>
คุณจะได้รับผลดังต่อไปนี้ -
This is message body
แอตทริบิวต์แท็กที่กำหนดเอง
คุณสามารถใช้แอตทริบิวต์ต่างๆร่วมกับแท็กที่กำหนดเองได้ ในการยอมรับค่าแอตทริบิวต์คลาสแท็กที่กำหนดเองจำเป็นต้องใช้setter วิธีการเหมือนกับวิธีการตั้งค่า JavaBean ดังที่แสดงด้านล่าง -
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String msg) {
this.message = msg;
}
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException {
if (message != null) {
/* Use message from attribute */
JspWriter out = getJspContext().getOut();
out.println( message );
} else {
/* use message from the body */
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
ชื่อแอตทริบิวต์คือ "message"ดังนั้นวิธีการตั้งค่าคือ setMessage(). ให้เราเพิ่มแอตทริบิวต์นี้ในไฟล์ TLD โดยใช้ไฟล์<attribute> องค์ประกอบดังนี้ -
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
ให้เราติดตาม JSP พร้อมคุณสมบัติข้อความดังนี้ -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello message = "This is custom tag" />
</body>
</html>
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
This is custom tag
พิจารณารวมคุณสมบัติต่อไปนี้สำหรับแอตทริบิวต์ -
ส. | คุณสมบัติและวัตถุประสงค์ |
---|---|
1 | name องค์ประกอบชื่อกำหนดชื่อของแอตทริบิวต์ ชื่อแอตทริบิวต์แต่ละรายการต้องไม่ซ้ำกันสำหรับแท็กหนึ่ง ๆ |
2 | required สิ่งนี้ระบุว่าต้องการแอตทริบิวต์นี้หรือเป็นทางเลือก มันจะเป็นเท็จสำหรับทางเลือก |
3 | rtexprvalue ประกาศว่าค่านิพจน์รันไทม์สำหรับแอตทริบิวต์แท็กถูกต้องหรือไม่ |
4 | type กำหนดประเภทคลาส Java ของแอ็ตทริบิวต์นี้ โดยค่าเริ่มต้นจะถือว่าเป็นString |
5 | description สามารถให้คำอธิบายข้อมูลได้ |
6 | fragment ประกาศว่าควรถือว่าค่าแอตทริบิวต์นี้เป็นไฟล์ JspFragment. |
ต่อไปนี้เป็นตัวอย่างเพื่อระบุคุณสมบัติที่เกี่ยวข้องกับแอตทริบิวต์ -
.....
<attribute>
<name>attribute_name</name>
<required>false</required>
<type>java.util.Date</type>
<fragment>false</fragment>
</attribute>
.....
หากคุณใช้สองแอตทริบิวต์คุณสามารถแก้ไข TLD ของคุณได้ดังนี้ -
.....
<attribute>
<name>attribute_name1</name>
<required>false</required>
<type>java.util.Boolean</type>
<fragment>false</fragment>
</attribute>
<attribute>
<name>attribute_name2</name>
<required>true</required>
<type>java.util.Date</type>
</attribute>
.....
JSP Expression Language (EL) ทำให้สามารถเข้าถึงข้อมูลแอปพลิเคชันที่เก็บไว้ในคอมโพเนนต์ JavaBeans ได้อย่างง่ายดาย JSP EL ช่วยให้คุณสร้างนิพจน์ทั้งสอง(a) เลขคณิตและ (b)ตรรกะ ภายในนิพจน์ JSP EL คุณสามารถใช้ไฟล์integers, floating point numbers, strings, the built-in constants true and false สำหรับค่าบูลีนและค่าว่าง
ไวยากรณ์อย่างง่าย
โดยทั่วไปเมื่อคุณระบุค่าแอตทริบิวต์ในแท็ก JSP คุณเพียงแค่ใช้สตริง ตัวอย่างเช่น -
<jsp:setProperty name = "box" property = "perimeter" value = "100"/>
JSP EL อนุญาตให้คุณระบุนิพจน์สำหรับค่าแอ็ตทริบิวต์เหล่านี้ ไวยากรณ์ง่ายๆสำหรับ JSP EL มีดังนี้ -
${expr}
ที่นี่ exprระบุนิพจน์เอง ตัวดำเนินการที่พบมากที่สุดใน JSP EL คือ. และ []. ตัวดำเนินการทั้งสองนี้ช่วยให้คุณสามารถเข้าถึงแอ็ตทริบิวต์ต่างๆของ Java Beans และอ็อบเจ็กต์ JSP ในตัว
ตัวอย่างเช่นไวยากรณ์ข้างต้น <jsp:setProperty> แท็กสามารถเขียนด้วยนิพจน์เช่น -
<jsp:setProperty name = "box" property = "perimeter"
value = "${2*box.width+2*box.height}"/>
เมื่อคอมไพเลอร์ JSP เห็นไฟล์ ${} รูปแบบในแอตทริบิวต์จะสร้างรหัสเพื่อประเมินนิพจน์และแทนที่ค่าของนิพจน์
คุณยังสามารถใช้นิพจน์ JSP EL ภายในข้อความเทมเพลตสำหรับแท็ก ตัวอย่างเช่นไฟล์<jsp:text>แท็กเพียงแค่แทรกเนื้อหาภายในเนื้อหาของ JSP ดังต่อไปนี้<jsp:text> แทรกประกาศ <h1>Hello JSP!</h1> ลงในเอาต์พุต JSP -
<jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>
ตอนนี้คุณสามารถรวมนิพจน์ JSP EL ในเนื้อหาของไฟล์ <jsp:text> แท็ก (หรือแท็กอื่น ๆ ) ที่เหมือนกัน ${}ไวยากรณ์ที่คุณใช้สำหรับแอตทริบิวต์ ตัวอย่างเช่น -
<jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>
นิพจน์ EL สามารถใช้วงเล็บเพื่อจัดกลุ่มนิพจน์ย่อย ตัวอย่างเช่น,${(1 + 2) * 3} equals 9, but ${1 + (2 * 3)} equals 7.
ในการปิดใช้งานการประเมินนิพจน์ EL เราระบุไฟล์ isELIgnored แอตทริบิวต์ของคำสั่งเพจดังต่อไปนี้ -
<%@ page isELIgnored = "true|false" %>
ค่าที่ถูกต้องของแอตทริบิวต์นี้เป็นจริงและเท็จ หากเป็นจริงนิพจน์ EL จะถูกละเว้นเมื่อปรากฏในแอตทริบิวต์ข้อความหรือแท็กแบบคงที่ หากเป็นเท็จนิพจน์ EL จะถูกประเมินโดยคอนเทนเนอร์
ตัวดำเนินการพื้นฐานใน EL
JSP Expression Language (EL) สนับสนุนตัวดำเนินการทางคณิตศาสตร์และตรรกะส่วนใหญ่ที่ Java สนับสนุน ตารางต่อไปนี้แสดงตัวดำเนินการที่ใช้บ่อยที่สุด -
ส. | ตัวดำเนินการและคำอธิบาย |
---|---|
1 | . เข้าถึงคุณสมบัติ bean หรือรายการแผนที่ |
2 | [] เข้าถึงอาร์เรย์หรือองค์ประกอบรายการ |
3 | ( ) จัดกลุ่มนิพจน์ย่อยเพื่อเปลี่ยนลำดับการประเมิน |
4 | + ส่วนที่เพิ่มเข้าไป |
5 | - การลบหรือการลบค่า |
6 | * การคูณ |
7 | / or div แผนก |
8 | % or mod โมดูโล่ (ส่วนที่เหลือ) |
9 | == or eq ทดสอบความเท่าเทียมกัน |
10 | != or ne ทดสอบอสมการ |
11 | < or lt ทดสอบน้อยกว่า |
12 | > or gt ทดสอบมากกว่า |
13 | <= or le ทดสอบน้อยกว่าหรือเท่ากับ |
14 | >= or ge ทดสอบมากกว่าหรือเท่ากับ |
15 | && or and ทดสอบตรรกะ AND |
16 | || or or ทดสอบตรรกะหรือ |
17 | ! or not Unary Boolean complement |
18 | empty ทดสอบค่าตัวแปรว่าง |
ฟังก์ชั่นใน JSP EL
JSP EL ช่วยให้คุณสามารถใช้ฟังก์ชันในนิพจน์ได้เช่นกัน ต้องกำหนดฟังก์ชันเหล่านี้ในไลบรารีแท็กที่กำหนดเอง การใช้ฟังก์ชันมีไวยากรณ์ต่อไปนี้ -
${ns:func(param1, param2, ...)}
ที่ไหน ns คือเนมสเปซของฟังก์ชัน func คือชื่อของฟังก์ชันและ param1คือค่าพารามิเตอร์แรก ตัวอย่างเช่นฟังก์ชันfn:lengthซึ่งเป็นส่วนหนึ่งของไลบรารี JSTL สามารถใช้ฟังก์ชันนี้ได้ดังต่อไปนี้เพื่อรับความยาวของสตริง
${fn:length("Get my length")}
ในการใช้ฟังก์ชันจากไลบรารีแท็กใด ๆ (มาตรฐานหรือแบบกำหนดเอง) คุณต้องติดตั้งไลบรารีนั้นบนเซิร์ฟเวอร์ของคุณและต้องรวมไลบรารีใน JSP ของคุณโดยใช้ <taglib> คำสั่งตามที่อธิบายไว้ในบท JSTL
JSP EL Implicit Objects
ภาษานิพจน์ JSP สนับสนุนอ็อบเจ็กต์โดยนัยต่อไปนี้ -
ส. เลขที่ | วัตถุและคำอธิบายโดยนัย |
---|---|
1 | pageScope ตัวแปรที่กำหนดขอบเขตจากขอบเขตหน้า |
2 | requestScope ตัวแปรที่กำหนดขอบเขตจากขอบเขตคำขอ |
3 | sessionScope ตัวแปรที่กำหนดขอบเขตจากขอบเขตเซสชัน |
4 | applicationScope ตัวแปรที่กำหนดขอบเขตจากขอบเขตการใช้งาน |
5 | param ขอพารามิเตอร์เป็นสตริง |
6 | paramValues ร้องขอพารามิเตอร์เป็นคอลเล็กชันของสตริง |
7 | header ส่วนหัวคำขอ HTTP เป็นสตริง |
8 | headerValues ส่วนหัวคำร้องขอ HTTP เป็นคอลเล็กชันของสตริง |
9 | initParam พารามิเตอร์บริบทเริ่มต้น |
10 | cookie ค่าคุกกี้ |
11 | pageContext วัตถุ JSP PageContext สำหรับเพจปัจจุบัน |
คุณสามารถใช้ออบเจ็กต์เหล่านี้ในนิพจน์ราวกับว่าเป็นตัวแปร ตัวอย่างต่อไปนี้จะช่วยให้คุณเข้าใจแนวคิด -
วัตถุ pageContext
อ็อบเจ็กต์ pageContext ให้คุณเข้าถึงอ็อบเจ็กต์ pageContext JSP ผ่านวัตถุ pageContext คุณสามารถเข้าถึงวัตถุร้องขอ ตัวอย่างเช่นในการเข้าถึงสตริงแบบสอบถามขาเข้าสำหรับคำขอคุณสามารถใช้นิพจน์ต่อไปนี้ -
${pageContext.request.queryString}
วัตถุขอบเขต
pageScope, requestScope, sessionScopeและ applicationScope ตัวแปรให้การเข้าถึงตัวแปรที่จัดเก็บในแต่ละระดับขอบเขต
ตัวอย่างเช่นหากคุณต้องการเข้าถึงตัวแปร box อย่างชัดเจนในขอบเขตแอปพลิเคชันคุณสามารถเข้าถึงได้ผ่านตัวแปร applicationScope เป็น applicationScope.box.
วัตถุพารามิเตอร์และ paramValues
อ็อบเจ็กต์ param และ paramValues ให้คุณเข้าถึงค่าพารามิเตอร์ที่มีอยู่โดยปกติผ่านทาง request.getParameter และ request.getParameterValues วิธีการ
ตัวอย่างเช่นในการเข้าถึงพารามิเตอร์ชื่อลำดับให้ใช้นิพจน์ ${param.order} หรือ ${param["order"]}.
ต่อไปนี้เป็นตัวอย่างในการเข้าถึงพารามิเตอร์คำขอชื่อผู้ใช้ -
<%@ page import = "java.io.*,java.util.*" %>
<%String title = "Accessing Request Param";%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align = "center">
<p>${param["username"]}</p>
</div>
</body>
</html>
อ็อบเจ็กต์พารามิเตอร์ส่งคืนค่าสตริงเดี่ยวในขณะที่อ็อบเจ็กต์ paramValues ส่งคืนสตริงอาร์เรย์
header และ headerValues Objects
ออบเจ็กต์ header และ headerValues ช่วยให้คุณสามารถเข้าถึงค่าส่วนหัวได้ตามปกติผ่านทางไฟล์ request.getHeader และ request.getHeaders วิธีการ
ตัวอย่างเช่นในการเข้าถึงส่วนหัวที่ชื่อ user-agent ให้ใช้นิพจน์ ${header.user-agent} หรือ ${header["user-agent"]}.
ต่อไปนี้เป็นตัวอย่างในการเข้าถึงพารามิเตอร์ส่วนหัวที่ชื่อ user-agent -
<%@ page import = "java.io.*,java.util.*" %>
<%String title = "User Agent Example";%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align = "center">
<p>${header["user-agent"]}</p>
</div>
</body>
</html>
ผลลัพธ์จะเป็นดังนี้ -
User Agent Example
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)
อ็อบเจ็กต์ส่วนหัวส่งคืนค่าสตริงเดี่ยวในขณะที่อ็อบเจ็กต์ headerValues ส่งคืนสตริงอาร์เรย์
ในบทนี้. เราจะพูดถึงวิธีจัดการข้อยกเว้นใน JSP เมื่อคุณเขียนโค้ด JSP คุณอาจเกิดข้อผิดพลาดในการเข้ารหัสซึ่งอาจเกิดขึ้นที่ส่วนใดส่วนหนึ่งของโค้ด อาจเกิดข้อผิดพลาดประเภทต่อไปนี้ในรหัส JSP ของคุณ -
ตรวจสอบข้อยกเว้น
ข้อยกเว้นที่ตรวจสอบแล้วเป็นข้อยกเว้นที่โดยทั่วไปเป็นข้อผิดพลาดของผู้ใช้หรือปัญหาที่โปรแกรมเมอร์ไม่สามารถคาดเดาได้ ตัวอย่างเช่นหากต้องการเปิดไฟล์ แต่ไม่พบไฟล์จะมีข้อยกเว้นเกิดขึ้น ข้อยกเว้นเหล่านี้ไม่สามารถละเลยได้ในขณะที่ทำการรวบรวม
ข้อยกเว้นรันไทม์
ข้อยกเว้นรันไทม์เป็นข้อยกเว้นที่โปรแกรมเมอร์อาจหลีกเลี่ยงได้ ตรงข้ามกับข้อยกเว้นที่ตรวจสอบแล้วข้อยกเว้นรันไทม์จะถูกละเว้นในเวลาที่ปฏิบัติตาม
ข้อผิดพลาด
สิ่งเหล่านี้ไม่ใช่ข้อยกเว้น แต่เป็นปัญหาที่เกิดขึ้นนอกเหนือการควบคุมของผู้ใช้หรือโปรแกรมเมอร์ โดยทั่วไปข้อผิดพลาดจะถูกละเว้นในโค้ดของคุณเนื่องจากคุณแทบไม่สามารถทำอะไรเกี่ยวกับข้อผิดพลาดได้ ตัวอย่างเช่นหากเกิดสแต็กล้นจะมีข้อผิดพลาดเกิดขึ้น นอกจากนี้ยังถูกละเว้นในช่วงเวลาของการรวบรวม
เราจะหารือเพิ่มเติมเกี่ยวกับวิธีจัดการข้อยกเว้น / ข้อผิดพลาดเวลาทำงานที่เกิดขึ้นในรหัส JSP ของคุณ
การใช้ Exception Object
อ็อบเจ็กต์ข้อยกเว้นคืออินสแตนซ์ของคลาสย่อยของ Throwable (เช่น java.lang. NullPointerException) และมีอยู่ในเพจข้อผิดพลาดเท่านั้น ตารางต่อไปนี้แสดงวิธีการสำคัญที่มีอยู่ในคลาส Throwable
ส. | วิธีการและคำอธิบาย |
---|---|
1 | public String getMessage() ส่งคืนข้อความโดยละเอียดเกี่ยวกับข้อยกเว้นที่เกิดขึ้น ข้อความนี้เริ่มต้นในตัวสร้าง Throwable |
2 | public Throwable getCause() ส่งคืนสาเหตุของข้อยกเว้นที่แสดงโดยวัตถุ Throwable |
3 | public String toString() ส่งคืนชื่อของคลาสที่เชื่อมต่อกับผลลัพธ์ของ getMessage(). |
4 | public void printStackTrace() พิมพ์ผลลัพธ์ของ toString() พร้อมกับสแต็กติดตามไปที่ System.errสตรีมเอาต์พุตข้อผิดพลาด |
5 | public StackTraceElement [] getStackTrace() ส่งคืนอาร์เรย์ที่มีแต่ละองค์ประกอบในการติดตามสแต็ก องค์ประกอบที่ดัชนี 0 แสดงถึงด้านบนสุดของ call stack และองค์ประกอบสุดท้ายในอาร์เรย์แสดงถึงวิธีการที่ด้านล่างของ call stack |
6 | public Throwable fillInStackTrace() เติมการติดตามสแต็กของอ็อบเจ็กต์ Throwable นี้ด้วยการติดตามสแต็กปัจจุบันโดยเพิ่มข้อมูลก่อนหน้านี้ในการติดตามสแต็ก |
JSP มีตัวเลือกให้คุณระบุ Error Pageสำหรับแต่ละ JSP เมื่อใดก็ตามที่เพจเกิดข้อยกเว้นคอนเทนเนอร์ JSP จะเรียกใช้เพจข้อผิดพลาดโดยอัตโนมัติ
ต่อไปนี้เป็นตัวอย่างเพื่อระบุหน้าข้อผิดพลาดสำหรับไฟล์ main.jsp. ในการตั้งค่าหน้าข้อผิดพลาดให้ใช้ไฟล์<%@ page errorPage = "xxx" %> คำสั่ง
<%@ page errorPage = "ShowError.jsp" %>
<html>
<head>
<title>Error Handling Example</title>
</head>
<body>
<%
// Throw an exception to invoke the error page
int x = 1;
if (x == 1) {
throw new RuntimeException("Error condition!!!");
}
%>
</body>
</html>
ตอนนี้เราจะเขียน Error Handling JSP ShowError.jsp หนึ่งรายการซึ่งได้รับด้านล่าง โปรดสังเกตว่าหน้าการจัดการข้อผิดพลาดมีคำสั่ง<%@ page isErrorPage = "true" %>. คำสั่งนี้ทำให้คอมไพลเลอร์ JSP สร้างตัวแปรอินสแตนซ์ข้อยกเว้น
<%@ page isErrorPage = "true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<p>Sorry, an error occurred.</p>
<p>Here is the exception stack trace: </p>
<pre><% exception.printStackTrace(response.getWriter()); %></pre>
</body>
</html>
เข้าถึงไฟล์ main.jspคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
java.lang.RuntimeException: Error condition!!!
......
Opps...
Sorry, an error occurred.
Here is the exception stack trace:
การใช้แท็ก JSTL สำหรับหน้าข้อผิดพลาด
คุณสามารถใช้แท็ก JSTL เพื่อเขียนหน้าข้อผิดพลาด ShowError.jsp. หน้านี้มีตรรกะเกือบจะเหมือนกับในตัวอย่างข้างต้นโดยมีโครงสร้างที่ดีขึ้นและข้อมูลเพิ่มเติม -
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage = "true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<table width = "100%" border = "1">
<tr valign = "top">
<td width = "40%"><b>Error:</b></td>
<td>${pageContext.exception}</td>
</tr>
<tr valign = "top">
<td><b>URI:</b></td>
<td>${pageContext.errorData.requestURI}</td> </tr> <tr valign = "top"> <td><b>Status code:</b></td> <td>${pageContext.errorData.statusCode}</td>
</tr>
<tr valign = "top">
<td><b>Stack trace:</b></td>
<td>
<c:forEach var = "trace"
items = "${pageContext.exception.stackTrace}"> <p>${trace}</p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>
เข้าถึง main.jsp สิ่งต่อไปนี้จะถูกสร้างขึ้น -
Opps...
Error:
java.lang.RuntimeException: Error condition!!!
URI:
/main.jsp
Status code:
500
Stack trace:
org.apache.jsp.main_jsp._jspService(main_jsp.java:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
ใช้ Try ... Catch Block
หากคุณต้องการจัดการข้อผิดพลาดภายในหน้าเดียวกันและต้องการดำเนินการบางอย่างแทนการเริ่มต้นหน้าข้อผิดพลาดคุณสามารถใช้ประโยชน์จาก try....catch บล็อก.
ต่อไปนี้เป็นตัวอย่างง่ายๆที่แสดงวิธีใช้บล็อก try ... catch ให้เราใส่รหัสต่อไปนี้ใน main.jsp -
<html>
<head>
<title>Try...Catch Example</title>
</head>
<body>
<%
try {
int i = 1;
i = i / 0;
out.println("The answer is " + i);
}
catch (Exception e) {
out.println("An exception occurred: " + e.getMessage());
}
%>
</body>
</html>
เข้าถึง main.jsp ควรสร้างผลลัพธ์ดังนี้ -
An exception occurred: / by zero
ในบทนี้เราจะพูดถึงการดีบัก JSP การทดสอบ / การดีบัก JSP และ servlets เป็นเรื่องยากเสมอ JSP และ Servlets มีแนวโน้มที่จะเกี่ยวข้องกับการโต้ตอบกับไคลเอ็นต์ / เซิร์ฟเวอร์จำนวนมากทำให้เกิดข้อผิดพลาดได้ยาก แต่จะเกิดซ้ำได้ยาก
ต่อไปนี้เป็นคำแนะนำและคำแนะนำบางประการที่อาจช่วยคุณในการแก้ไขข้อบกพร่องของคุณ
การใช้ System.out.println ()
System.out.println()ง่ายต่อการใช้เป็นเครื่องหมายเพื่อทดสอบว่ามีการเรียกใช้โค้ดบางส่วนหรือไม่ เราสามารถพิมพ์ค่าตัวแปรได้เช่นกัน พิจารณาประเด็นเพิ่มเติมดังต่อไปนี้ -
เนื่องจากอ็อบเจ็กต์ System เป็นส่วนหนึ่งของอ็อบเจ็กต์ Java หลักจึงสามารถใช้ได้ทุกที่โดยไม่จำเป็นต้องติดตั้งคลาสเพิ่มเติมใด ๆ ซึ่งรวมถึงServlets, JSP, RMI, EJB's, ordinary Beans และ classesและ standalone applications.
เมื่อเทียบกับการหยุดที่จุดพักการเขียนถึง System.out ไม่รบกวนขั้นตอนการดำเนินการตามปกติของแอปพลิเคชันมากนักซึ่งทำให้มีค่ามากเมื่อการเลียนแบบมีความสำคัญ
ต่อไปนี้เป็นไวยากรณ์ที่จะใช้ System.out.println() -
System.out.println("Debugging message");
ตัวอย่างต่อไปนี้แสดงวิธีการใช้งาน System.out.print() -
<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>System.out.println</title></head>
<body>
<c:forEach var = "counter" begin = "1" end = "10" step = "1" >
<c:out value = "${counter-5}"/></br>
<% System.out.println( "counter = " + pageContext.findAttribute("counter") ); %>
</c:forEach>
</body>
</html>
เข้าถึง JSP ด้านบนเบราว์เซอร์จะแสดงผลลัพธ์ต่อไปนี้ -
-4
-3
-2
-1
0
1
2
3
4
5
หากคุณใช้ Tomcat คุณจะพบบรรทัดเหล่านี้ต่อท้าย stdout.log ในไดเร็กทอรี logs
counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
counter = 6
counter = 7
counter = 8
counter = 9
counter = 10
ด้วยวิธีนี้คุณสามารถนำตัวแปรและข้อมูลอื่น ๆ เข้าสู่บันทึกของระบบซึ่งสามารถวิเคราะห์เพื่อค้นหาสาเหตุที่แท้จริงของปัญหาหรือด้วยเหตุผลอื่น ๆ
การใช้ JDB Logger
J2SEกรอบการบันทึกได้รับการออกแบบมาเพื่อให้บริการบันทึกสำหรับคลาสใด ๆ ที่ทำงานใน JVM เราสามารถใช้กรอบนี้เพื่อบันทึกข้อมูลใด ๆ
ให้เราเขียนตัวอย่างข้างต้นอีกครั้งโดยใช้ JDK logger API -
<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page import = "java.util.logging.Logger" %>
<html>
<head><title>Logger.info</title></head>
<body>
<% Logger logger = Logger.getLogger(this.getClass().getName());%>
<c:forEach var = "counter" begin = "1" end = "10" step = "1" >
<c:set var = "myCount" value = "${counter-5}" />
<c:out value = "${myCount}"/></br>
<% String message = "counter = "
+ pageContext.findAttribute("counter") + "myCount = "
+ pageContext.findAttribute("myCount");
logger.info( message );
%>
</c:forEach>
</body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ที่คล้ายกันบนเบราว์เซอร์และใน stdout.log แต่คุณจะมีข้อมูลเพิ่มเติมใน stdout.log. เราจะใช้ไฟล์infoวิธีการของคนตัดไม้เพราะและบันทึกข้อความเพียงเพื่อจุดประสงค์ในการให้ข้อมูล ต่อไปนี้เป็นภาพรวมของไฟล์ stdout.log -
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 1 myCount = -4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 2 myCount = -3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 3 myCount = -2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 4 myCount = -1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 5 myCount = 0
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 6 myCount = 1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 7 myCount = 2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 8 myCount = 3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 9 myCount = 4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 10 myCount = 5
สามารถส่งข้อความในระดับต่างๆได้โดยใช้ฟังก์ชันอำนวยความสะดวก severe(), warning(), info(), config(), fine(), finer(), และ finest(). ที่นี่วิธีที่ดีที่สุด () สามารถใช้เพื่อบันทึกข้อมูลที่ดีที่สุดและสามารถใช้วิธีการอย่างรุนแรง () เพื่อบันทึกข้อมูลที่รุนแรง
คุณสามารถใช้Log4J Frameworkเพื่อบันทึกข้อความในไฟล์ต่างๆตามระดับความรุนแรงและความสำคัญ
เครื่องมือดีบั๊ก
NetBeans เป็น Java Integrated Development Environment ฟรีและโอเพ่นซอร์สที่สนับสนุนการพัฒนาแอปพลิเคชัน Java แบบสแตนด์อโลนและเว็บแอปพลิเคชันที่สนับสนุนข้อกำหนด JSP และ servlet และรวมถึงดีบักเกอร์ JSP
NetBeans รองรับฟังก์ชันการดีบักพื้นฐานดังต่อไปนี้ -
- Breakpoints
- ก้าวผ่านรหัส
- Watchpoints
คุณสามารถอ้างถึง NetBeans documentation เพื่อทำความเข้าใจฟังก์ชันการดีบักข้างต้น
ใช้ JDB Debugger
คุณสามารถดีบัก JSP และ servlets ด้วยสิ่งเดียวกัน jdb คำสั่งที่คุณใช้เพื่อดีบักแอพเพล็ตหรือแอปพลิเคชัน
ในการดีบัก JSP หรือ servlet คุณสามารถดีบัก sun.servlet.http.HttpServerจากนั้นสังเกตว่า HttpServer เรียกใช้งาน JSP / servlets เพื่อตอบสนองคำขอ HTTP ที่เราสร้างจากเบราว์เซอร์ สิ่งนี้คล้ายกับวิธีแก้จุดบกพร่องของแอพเพล็ต ความแตกต่างคือเมื่อใช้แอพเพล็ตโปรแกรมจริงที่ถูกดีบักคือsun.applet.AppletViewer.
ดีบักเกอร์ส่วนใหญ่ซ่อนรายละเอียดนี้โดยรู้วิธีการดีบักแอพเพล็ตโดยอัตโนมัติ จนกว่าพวกเขาจะทำเช่นเดียวกันสำหรับ JSP คุณต้องช่วยดีบักเกอร์ของคุณโดยพิจารณาสิ่งต่อไปนี้ -
ตั้งค่าคลาสพา ธ ของดีบักเกอร์ สิ่งนี้ช่วยให้คุณพบsun.servlet.http.Http-Server และคลาสที่เกี่ยวข้อง
ตั้งค่าคลาสพา ธ ของดีบักเกอร์ สิ่งนี้ช่วยให้คุณค้นหา JSP และคลาสสนับสนุนของคุณโดยทั่วไปROOT\WEB-INF\classes.
เมื่อคุณตั้งค่าคลาสพา ธ ที่เหมาะสมแล้วให้เริ่มการดีบัก sun.servlet.http.HttpServer. คุณสามารถตั้งค่าจุดพักใน JSP ใดก็ได้ที่คุณสนใจในการดีบักจากนั้นใช้เว็บเบราว์เซอร์เพื่อส่งคำขอไปยัง HttpServer สำหรับ JSP ที่กำหนด(http://localhost:8080/JSPToDebug). การดำเนินการที่นี่จะหยุดที่จุดพัก
การใช้ความคิดเห็น
ความคิดเห็นในโค้ดของคุณสามารถช่วยกระบวนการดีบักได้หลายวิธี ข้อคิดเห็นสามารถใช้ในรูปแบบอื่น ๆ ในกระบวนการดีบัก
JSP ใช้ความคิดเห็น Java และ single line (// ...) และ multiple line (/* ... */)ความคิดเห็นสามารถใช้เพื่อลบบางส่วนของโค้ด Java ของคุณชั่วคราว หากข้อบกพร่องหายไปให้ตรวจสอบโค้ดที่คุณเพิ่งแสดงความคิดเห็นอย่างละเอียดและค้นหาปัญหา
ส่วนหัวไคลเอ็นต์และเซิร์ฟเวอร์
บางครั้งเมื่อ JSP ไม่ทำงานตามที่คาดไว้การดูคำขอและการตอบกลับ HTTP แบบดิบจะมีประโยชน์ หากคุณคุ้นเคยกับโครงสร้างของ HTTP คุณสามารถอ่านคำขอและการตอบกลับและดูว่าเกิดอะไรขึ้นกับส่วนหัวเหล่านั้น
เคล็ดลับการแก้จุดบกพร่องที่สำคัญ
นี่คือรายการเคล็ดลับการดีบักเพิ่มเติมเกี่ยวกับการดีบัก JSP -
ขอให้เบราว์เซอร์แสดงเนื้อหาดิบของหน้าที่กำลังแสดง ซึ่งสามารถช่วยระบุปัญหาการจัดรูปแบบ โดยปกติจะเป็นตัวเลือกในเมนู View
ตรวจสอบให้แน่ใจว่าเบราว์เซอร์ไม่ได้แคชเอาต์พุตของคำขอก่อนหน้านี้โดยบังคับให้โหลดหน้าเว็บซ้ำทั้งหมด ด้วยNetscape Navigator, ใช้ Shift-Reload; ด้วยInternet Explorer ใช้ Shift-Refresh.
JavaServer Pages และ servlets ทำให้นักพัฒนาเว็บสามารถใช้กลไกต่างๆเพื่อรักษาความปลอดภัยให้กับแอปพลิเคชัน ทรัพยากรได้รับการปกป้องอย่างเปิดเผยโดยการระบุในตัวอธิบายการปรับใช้แอปพลิเคชันและกำหนดบทบาทให้กับทรัพยากร
มีการพิสูจน์ตัวตนหลายระดับตั้งแต่การพิสูจน์ตัวตนพื้นฐานโดยใช้ตัวระบุและรหัสผ่านไปจนถึงการพิสูจน์ตัวตนที่ซับซ้อนโดยใช้ใบรับรอง
การรับรองความถูกต้องตามบทบาท
กลไกการพิสูจน์ตัวตนในข้อมูลจำเพาะ servlet ใช้เทคนิคที่เรียกว่า role-based security. แนวคิดคือแทนที่จะ จำกัด ทรัพยากรที่ระดับผู้ใช้คุณต้องสร้างบทบาทและ จำกัด ทรัพยากรตามบทบาท
คุณสามารถกำหนดบทบาทต่างๆในไฟล์ tomcat-users.xmlซึ่งอยู่นอกโฮมไดเร็กทอรีของ Tomcat ใน conf. ตัวอย่างของไฟล์นี้แสดงไว้ด้านล่าง -
<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
<role rolename = "tomcat"/>
<role rolename = "role1"/>
<role rolename = "manager"/>
<role rolename = "admin"/>
<user username = "tomcat" password = "tomcat" roles = "tomcat"/>
<user username = "role1" password = "tomcat" roles = "role1"/>
<user username = "both" password = "tomcat" roles = "tomcat,role1"/>
<user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>
ไฟล์นี้กำหนดการแมปอย่างง่ายระหว่างไฟล์ username, passwordและ role. โปรดสังเกตว่าผู้ใช้ที่ระบุอาจมีหลายบทบาท ตัวอย่างเช่น,username = "both" อยู่ในบทบาท "แมวตัวผู้" และบทบาท "บทบาทที่ 1"
เมื่อคุณระบุและกำหนดบทบาทที่แตกต่างกันแล้วข้อ จำกัด ด้านความปลอดภัยตามบทบาทสามารถวางไว้บนทรัพยากร Web Application ที่แตกต่างกันได้โดยใช้ไฟล์ <security-constraint> องค์ประกอบใน web.xml ไฟล์ที่มีอยู่ในไดเรกทอรี WEB-INF
ต่อไปนี้เป็นรายการตัวอย่างใน web.xml -
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
...
</web-app>
รายการข้างต้นจะหมายถึง -
คำขอ HTTP GET หรือ POST ใด ๆ ไปยัง URL ที่ตรงกับ / ปลอดภัย / * จะอยู่ภายใต้ข้อ จำกัด ด้านความปลอดภัย
บุคคลที่มีบทบาทเป็นผู้จัดการจะได้รับสิทธิ์ในการเข้าถึงทรัพยากรที่ปลอดภัย
login-config องค์ประกอบใช้เพื่ออธิบายไฟล์ BASIC รูปแบบการพิสูจน์ตัวตน
หากคุณลองเรียกดู URL ใด ๆ รวมถึงไฟล์ /securityไดเร็กทอรีกล่องโต้ตอบต่อไปนี้จะปรากฏขึ้นเพื่อขอชื่อผู้ใช้และรหัสผ่าน หากคุณให้ผู้ใช้"admin" และรหัสผ่าน "secret"จากนั้นคุณจะสามารถเข้าถึง URL ที่ตรงกับ /secured/* ตามที่เราได้กำหนดผู้ดูแลระบบผู้ใช้ที่มีบทบาทผู้จัดการซึ่งได้รับอนุญาตให้เข้าถึงทรัพยากรนี้
การรับรองความถูกต้องตามฟอร์ม
เมื่อคุณใช้วิธีการรับรองความถูกต้องของ FORM คุณต้องใส่แบบฟอร์มการเข้าสู่ระบบเพื่อแจ้งให้ผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่าน ต่อไปนี้เป็นรหัสง่ายๆของlogin.jsp. สิ่งนี้ช่วยสร้างแบบฟอร์มเพื่อจุดประสงค์เดียวกัน -
<html>
<body bgcolor = "#ffffff">
<form method = "POST" action ="j_security_check">
<table border = "0">
<tr>
<td>Login</td>
<td><input type = "text" name="j_username"></td>
</tr>
<tr>
<td>Password</td>
<td><input type = "password" name="j_password"></td>
</tr>
</table>
<input type = "submit" value = "Login!">
</form>
</body>
</html>
ที่นี่คุณต้องตรวจสอบให้แน่ใจว่าแบบฟอร์มการเข้าสู่ระบบต้องมีองค์ประกอบของฟอร์มที่ชื่อ j_username และ j_password. การดำเนินการใน<form> ต้องเป็นแท็ก j_security_check. POSTต้องใช้เป็นวิธีการแบบฟอร์ม ในเวลาเดียวกันคุณจะต้องแก้ไขไฟล์<login-config> แท็กเพื่อระบุ auth-method เป็น FORM -
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Let only managers use this app</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
...
</web-app>
ตอนนี้เมื่อคุณพยายามเข้าถึงทรัพยากรใด ๆ ด้วย URL /secured/*มันจะแสดงแบบฟอร์มด้านบนเพื่อขอรหัสผู้ใช้และรหัสผ่าน เมื่อคอนเทนเนอร์เห็นเครื่องหมาย "j_security_check"การดำเนินการจะใช้กลไกภายในบางอย่างเพื่อตรวจสอบผู้โทร
หากการเข้าสู่ระบบสำเร็จและผู้เรียกได้รับอนุญาตให้เข้าถึงทรัพยากรที่มีการรักษาความปลอดภัยคอนเทนเนอร์จะใช้รหัสเซสชันเพื่อระบุเซสชันการเข้าสู่ระบบสำหรับผู้โทรจากจุดนั้นเป็นต้นไป คอนเทนเนอร์จะเก็บรักษาเซสชันการเข้าสู่ระบบด้วยคุกกี้ที่มีรหัสเซสชัน เซิร์ฟเวอร์จะส่งคุกกี้กลับไปยังไคลเอนต์และตราบใดที่ผู้โทรแสดงคุกกี้นี้พร้อมกับคำขอที่ตามมาคอนเทนเนอร์ก็จะรู้ว่าผู้โทรคือใคร
หากการเข้าสู่ระบบล้มเหลวเซิร์ฟเวอร์จะส่งเพจที่ระบุโดยการตั้งค่า form-error-page กลับมา
ที่นี่ j_security_checkเป็นการดำเนินการที่แอปพลิเคชันที่ใช้การเข้าสู่ระบบตามฟอร์มต้องระบุสำหรับแบบฟอร์มการเข้าสู่ระบบ ในรูปแบบเดียวกันคุณควรมีตัวควบคุมการป้อนข้อความที่เรียกว่าj_username และก password input control เรียกว่า j_password. เมื่อคุณเห็นสิ่งนี้หมายความว่าข้อมูลที่อยู่ในแบบฟอร์มจะถูกส่งไปยังเซิร์ฟเวอร์ซึ่งจะตรวจสอบชื่อและรหัสผ่าน วิธีการนี้เป็นเฉพาะเซิร์ฟเวอร์
ตรวจสอบStandard Realm Implementationsเพื่อทำความเข้าใจว่าj_security_check ใช้ได้กับตู้คอนเทนเนอร์ Tomcat ..
การรักษาความปลอดภัยแบบเป็นโปรแกรมใน Servlet / JSP
HttpServletRequest วัตถุมีวิธีการต่อไปนี้ซึ่งสามารถใช้ในการขุดข้อมูลความปลอดภัยในรันไทม์ -
ส. | วิธีการและคำอธิบาย |
---|---|
1 | String getAuthType() getAuthType() วิธีการส่งคืนอ็อบเจ็กต์ String ที่แสดงถึงชื่อของโครงร่างการพิสูจน์ตัวตนที่ใช้เพื่อป้องกัน Servlet |
2 | boolean isUserInRole(java.lang.String role) isUserInRole() วิธีการส่งคืนค่าบูลีน: true ถ้าผู้ใช้อยู่ในบทบาทที่กำหนดหรือเป็นเท็จถ้าไม่ใช่ |
3 | String getProtocol() getProtocol()วิธีการส่งคืนอ็อบเจ็กต์ String ที่เป็นตัวแทนของโปรโตคอลที่ใช้ในการส่งคำขอ ค่านี้สามารถตรวจสอบเพื่อตรวจสอบว่ามีการใช้โปรโตคอลที่ปลอดภัยหรือไม่ |
4 | boolean isSecure() isSecure()method ส่งคืนค่าบูลีนที่แสดงว่ามีการร้องขอโดยใช้ HTTPS หรือไม่ ค่าเป็นจริงหมายถึงมันและการเชื่อมต่อนั้นปลอดภัย ค่าเป็นเท็จหมายถึงคำขอไม่ได้ |
5 | Principle getUserPrinciple() getUserPrinciple() method ส่งคืนอ็อบเจ็กต์ java.security.Principle ที่มีชื่อของผู้ใช้ปัจจุบันที่พิสูจน์ตัวตน |
ตัวอย่างเช่นสำหรับ JavaServer Page ที่ลิงก์ไปยังเพจสำหรับผู้จัดการคุณอาจมีรหัสต่อไปนี้ -
<% if (request.isUserInRole("manager")) { %>
<a href = "managers/mgrreport.jsp">Manager Report</a>
<a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>
ด้วยการตรวจสอบบทบาทของผู้ใช้ใน JSP หรือ servlet คุณสามารถปรับแต่งเว็บเพจเพื่อแสดงเฉพาะรายการที่ผู้ใช้เข้าถึงได้ หากคุณต้องการชื่อผู้ใช้ตามที่ป้อนในแบบฟอร์มการรับรองความถูกต้องคุณสามารถเรียกไฟล์getRemoteUser วิธีการในวัตถุคำขอ
ในบทนี้เราจะกล่าวถึงแนวคิดของการทำให้เป็นสากลใน JSP ก่อนที่เราจะดำเนินการต่อให้เราเข้าใจคำศัพท์สำคัญสามข้อต่อไปนี้ -
Internationalization (i18n) - หมายถึงการเปิดใช้งานเว็บไซต์เพื่อจัดหาเนื้อหาเวอร์ชันต่างๆที่แปลเป็นภาษาหรือสัญชาติของผู้เข้าชม
Localization (l10n) - ซึ่งหมายถึงการเพิ่มทรัพยากรในเว็บไซต์เพื่อปรับให้เข้ากับภูมิภาคทางภูมิศาสตร์หรือวัฒนธรรมที่เฉพาะเจาะจงเช่นการแปลภาษาฮินดีไปยังเว็บไซต์
locale- นี่คือภูมิภาคทางวัฒนธรรมหรือทางภูมิศาสตร์โดยเฉพาะ โดยปกติจะเรียกว่าสัญลักษณ์ภาษาตามด้วยสัญลักษณ์ประเทศซึ่งคั่นด้วยเครื่องหมายขีดล่าง ตัวอย่างเช่น, "en_US"หมายถึงภาษาอังกฤษสำหรับสหรัฐอเมริกา
มีหลายรายการที่ควรได้รับการดูแลในขณะที่สร้างเว็บไซต์ทั่วโลก บทช่วยสอนนี้จะไม่ให้รายละเอียดทั้งหมดเกี่ยวกับเรื่องนี้ แต่จะให้ตัวอย่างที่ดีเกี่ยวกับวิธีที่คุณสามารถนำเสนอหน้าเว็บของคุณในภาษาต่างๆให้กับชุมชนอินเทอร์เน็ตโดยการแยกตำแหน่งที่ตั้งเช่นโลแคล
JSP สามารถเลือกเวอร์ชันที่เหมาะสมของไซต์ตามสถานที่ของผู้ร้องขอและจัดหาเวอร์ชันของไซต์ที่เหมาะสมตามภาษาวัฒนธรรมและข้อกำหนดในท้องถิ่น ต่อไปนี้เป็นวิธีการร้องขออ็อบเจ็กต์ซึ่งส่งคืนอ็อบเจ็กต์ Locale
java.util.Locale request.getLocale()
กำลังตรวจหาสถานที่
ต่อไปนี้เป็นวิธีการโลแคลที่สำคัญซึ่งคุณสามารถใช้เพื่อตรวจจับ requester's location, language และแน่นอนว่า locale. วิธีการด้านล่างทั้งหมดจะแสดงชื่อประเทศและชื่อภาษาที่ตั้งไว้ในเบราว์เซอร์ของผู้ร้องขอ
ส. | วิธีการและคำอธิบาย |
---|---|
1 | String getCountry() วิธีนี้ส่งคืนรหัสประเทศ / ภูมิภาคในตัวพิมพ์ใหญ่สำหรับโลแคลนี้ในรูปแบบ 2 ตัวอักษร ISO 3166 |
2 | String getDisplayCountry() วิธีนี้ส่งคืนชื่อสำหรับประเทศของโลแคลที่เหมาะสมสำหรับการแสดงต่อผู้ใช้ |
3 | String getLanguage() วิธีนี้ส่งคืนรหัสภาษาเป็นตัวพิมพ์เล็กสำหรับโลแคลนี้ในรูปแบบ ISO 639 |
4 | String getDisplayLanguage() เมธอดนี้จะส่งคืนชื่อสำหรับภาษาของโลแคลที่เหมาะสมสำหรับการแสดงต่อผู้ใช้ |
5 | String getISO3Country() วิธีนี้ส่งคืนตัวย่อสามตัวอักษรสำหรับประเทศของสถานที่นี้ |
6 | String getISO3Language() วิธีนี้ส่งคืนตัวย่อสามตัวอักษรสำหรับภาษาของสถานที่นี้ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีแสดงภาษาและประเทศที่เกี่ยวข้องสำหรับคำขอใน JSP -
<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%
//Get the client's Locale
Locale locale = request.getLocale();
String language = locale.getLanguage();
String country = locale.getCountry();
%>
<html>
<head>
<title>Detecting Locale</title>
</head>
<body>
<center>
<h1>Detecting Locale</h1>
</center>
<p align = "center">
<%
out.println("Language : " + language + "<br />");
out.println("Country : " + country + "<br />");
%>
</p>
</body>
</html>
การตั้งค่าภาษา
JSP สามารถแสดงผลหน้าที่เขียนด้วยภาษายุโรปตะวันตกเช่นอังกฤษสเปนเยอรมันฝรั่งเศสอิตาลีดัตช์เป็นต้นที่นี่เป็นสิ่งสำคัญในการตั้งค่าส่วนหัวของเนื้อหา - ภาษาเพื่อแสดงอักขระทั้งหมดอย่างถูกต้อง
จุดสำคัญอีกประการหนึ่งคือการแสดงอักขระพิเศษทั้งหมดโดยใช้เอนทิตี HTML ตัวอย่างเช่น,"ñ" แสดงถึง "ñ"และ "¡" แสดงถึง "¡" ดังต่อไปนี้ -
<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%
// Set response content type
response.setContentType("text/html");
// Set spanish language code.
response.setHeader("Content-Language", "es");
String title = "En Español";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align = "center">
<p>En Español</p>
<p>¡Hola Mundo!</p>
</div>
</body>
</html>
วันที่เฉพาะของสถานที่
คุณสามารถใช้ไฟล์ java.text.DateFormat คลาสและคงที่ getDateTimeInstance( )วิธีการจัดรูปแบบวันที่และเวลาเฉพาะสำหรับสถานที่ ต่อไปนี้เป็นตัวอย่างที่แสดงวิธีจัดรูปแบบวันที่เฉพาะสำหรับสถานที่ที่กำหนด -
<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.DateFormat,java.util.Date" %>
<%
String title = "Locale Specific Dates";
//Get the client's Locale
Locale locale = request.getLocale( );
String date = DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.SHORT,
locale).format(new Date( ));
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align = "center">
<p>Local Date: <% out.print(date); %></p>
</div>
</body>
</html>
สกุลเงินเฉพาะของสถานที่
คุณสามารถใช้ไฟล์ java.txt.NumberFormat คลาสและคงที่ getCurrencyInstance( )วิธีการจัดรูปแบบตัวเลขเช่น long หรือ double type ใน curreny เฉพาะโลแคล ต่อไปนี้เป็นตัวอย่างที่แสดงวิธีการจัดรูปแบบสกุลเงินเฉพาะสำหรับสถานที่ที่กำหนด -
<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.NumberFormat,java.util.Date" %>
<%
String title = "Locale Specific Currency";
//Get the client's Locale
Locale locale = request.getLocale( );
NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
String formattedCurr = nft.format(1000000);
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align = "center">
<p>Formatted Currency: <% out.print(formattedCurr); %></p>
</div>
</body>
</html>
เปอร์เซ็นต์เฉพาะของสถานที่
คุณสามารถใช้ไฟล์ java.txt.NumberFormat คลาสและคงที่ getPercentInstance( )วิธีการรับเปอร์เซ็นต์เฉพาะของโลแคล ตัวอย่างต่อไปนี้แสดงวิธีจัดรูปแบบเปอร์เซ็นต์เฉพาะสำหรับโลแคลที่กำหนด -
<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.NumberFormat,java.util.Date" %>
<%
String title = "Locale Specific Percentage";
//Get the client's Locale
Locale locale = request.getLocale( );
NumberFormat nft = NumberFormat.getPercentInstance(locale);
String formattedPerc = nft.format(0.51);
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align = "center">
<p>Formatted Percentage: <% out.print(formattedPerc); %></p>
</div>
</body>
</html>