Expression Language (EL) และการเรียกใช้ตัวแปรจาก Scope ต่างๆ
ก่อนหน้านี้ เราได้พูดถึง Client กับ Server ใน web app. กันไปแล้ว ตามด้วย TagLib กับการลด Scriptlet ซึ่งถ้าเข้าใจแล้ว ก็ควรมีอีกอย่างหนึ่งที่ควรจะรู้จักนั่นก็คือ Expression Language หรือที่เรียกกันสั้นๆ ว่า "อีแอล (EL)" เป็นรูปแบบการเขียน web application อีกแบบหนึ่งที่ใช้สำหรับส่วนของ view ใน web app. ซึ่ง EL ก็จะทำงานฝั่ง server เช่นเดียวกับ taglib หรือบาง taglib ก็จะมีการให้ใช้ EL ควบคู่กันไป
EL สามารถใช้ดึงค่าจาก scope ต่างๆได้ โดยเมื่อเปรียบเทียบกับ java จะได้ดังนี้
ถึงแม้ว่าจะมีการเปรียบเทียบให้เห็นอย่างนี้ว่าทั้ง 2 อย่างอาจใช้แทนกันได้ แต่ในความเป็นจริงแล้ว EL จะเป็นที่ยอมรับมากกว่า และบาง taglib ก็จะบังคับว่าต้องใช้ EL เท่านั้นครับ
มาดูระดับ(Scope) แต่ละอย่างกันนะครับว่าแต่ละอันเป็นยังไง โดยที่ผมยกมานี้เป็นตัวที่คิดว่ามีให้เห็นบ่อยๆ แต่ไม่ได้หมายความว่าอันอื่นไม่ได้ใช้นะครับ ซึ่งเราก็ควรจะเลือกใช้ให้เหมาะสมครับ (พยายามอย่าใช้ระดับใหญ่ๆ เพราะ lifetime มันจะนานกว่า ทำให้เปลือง memory ครับ)
Application หรือก็คือ ServletContext ซึ่งเป็นระดับสูงสุด การอ้างถึง attribute ตัวหนึ่งก็จะเป็นตัวเดียวกันทั้งโปรแกรม โดยทุกเครื่องก็จะเห็นตรงกันทั้งหมด
Session เป็นระดับที่จะเห็น attribute แต่ละตัวเป็นตัวเดียวตลอดทั้งโปรแกรมเช่นเดียวกับ application เพียงแต่จะมีการแยกสำหรับแต่ละ session คือ แต่ละ client จะต้องมี sessionID ที่ถูกสร้างเมื่อเปิด browser จนไปถึงปิด เพื่อใช้เป็นตัวเชื่อมกับข้อมูล session ที่เก็บอยู่ใน server แปลว่าผู้ใช้จะเข้าถึง session attribute ของใครของมันได้เท่านั้น
Request เป็นระดับที่จะเก็บ attribute ไว้ก็ต่อเมื่อเปลี่ยนหน้าจอแบบ forward เท่านั้น(ถ้า redirect ก็หาย) ไม่ต้องพูดถึงการเปิดหน้าใหม่ แน่นอนว่าต้องคนละ request ชัวร์ๆ
Page ระดับนี้จากชื่อก็น่าจะพอเดาได้นะครับ attribute ก็จะมีอยู่เพียงแค่ใน page นั้นๆเท่านั้น จะ forward หรือ redirect ก็หายครับ
${test} เป็นการหาชื่อ attribute ใน page, request, session, application ตามลำดับ ในกรณีที่มีชื่อเดียวกันในหลายๆ scope จะได้ค่าจาก scope เล็กสุดเท่านั้น
Parameter อันนี้ไม่ได้เกี่ยวกับ scope อันไหน แต่เป็น parameter ที่ส่งมากับการ GET หรือ POST ซึ่งเราสามารถใช้ EL ดึงได้เช่นเดียวกัน
http://www.tutorialspoint.com/jsp/jsp_expression_language.htm
http://www.studytonight.com/jsp/expression-language.php
EL สามารถใช้ดึงค่าจาก scope ต่างๆได้ โดยเมื่อเปรียบเทียบกับ java จะได้ดังนี้
Expression Language | Java (Scriptlet with implicit objects) |
---|---|
${applicationScope.test} | application.getAttribute("test"}; |
${sessionScope.test} | session.getAttribute("test"); |
${requestScope.test} | request.getAttribute("test");; |
${pageScope.test} | pageContext.getAttribute("test"}; |
${test} | pageContext.findAttribute("test"); |
${param.test} | request.getParameter("test") |
ถึงแม้ว่าจะมีการเปรียบเทียบให้เห็นอย่างนี้ว่าทั้ง 2 อย่างอาจใช้แทนกันได้ แต่ในความเป็นจริงแล้ว EL จะเป็นที่ยอมรับมากกว่า และบาง taglib ก็จะบังคับว่าต้องใช้ EL เท่านั้นครับ
มาดูระดับ(Scope) แต่ละอย่างกันนะครับว่าแต่ละอันเป็นยังไง โดยที่ผมยกมานี้เป็นตัวที่คิดว่ามีให้เห็นบ่อยๆ แต่ไม่ได้หมายความว่าอันอื่นไม่ได้ใช้นะครับ ซึ่งเราก็ควรจะเลือกใช้ให้เหมาะสมครับ (พยายามอย่าใช้ระดับใหญ่ๆ เพราะ lifetime มันจะนานกว่า ทำให้เปลือง memory ครับ)
Application หรือก็คือ ServletContext ซึ่งเป็นระดับสูงสุด การอ้างถึง attribute ตัวหนึ่งก็จะเป็นตัวเดียวกันทั้งโปรแกรม โดยทุกเครื่องก็จะเห็นตรงกันทั้งหมด
Session เป็นระดับที่จะเห็น attribute แต่ละตัวเป็นตัวเดียวตลอดทั้งโปรแกรมเช่นเดียวกับ application เพียงแต่จะมีการแยกสำหรับแต่ละ session คือ แต่ละ client จะต้องมี sessionID ที่ถูกสร้างเมื่อเปิด browser จนไปถึงปิด เพื่อใช้เป็นตัวเชื่อมกับข้อมูล session ที่เก็บอยู่ใน server แปลว่าผู้ใช้จะเข้าถึง session attribute ของใครของมันได้เท่านั้น
Request เป็นระดับที่จะเก็บ attribute ไว้ก็ต่อเมื่อเปลี่ยนหน้าจอแบบ forward เท่านั้น(ถ้า redirect ก็หาย) ไม่ต้องพูดถึงการเปิดหน้าใหม่ แน่นอนว่าต้องคนละ request ชัวร์ๆ
Page ระดับนี้จากชื่อก็น่าจะพอเดาได้นะครับ attribute ก็จะมีอยู่เพียงแค่ใน page นั้นๆเท่านั้น จะ forward หรือ redirect ก็หายครับ
${test} เป็นการหาชื่อ attribute ใน page, request, session, application ตามลำดับ ในกรณีที่มีชื่อเดียวกันในหลายๆ scope จะได้ค่าจาก scope เล็กสุดเท่านั้น
Parameter อันนี้ไม่ได้เกี่ยวกับ scope อันไหน แต่เป็น parameter ที่ส่งมากับการ GET หรือ POST ซึ่งเราสามารถใช้ EL ดึงได้เช่นเดียวกัน
http://www.tutorialspoint.com/jsp/jsp_expression_language.htm
http://www.studytonight.com/jsp/expression-language.php