RichFaces - แนวคิดพื้นฐาน
ในบทนี้เราจะเห็นแนวคิดพื้นฐานบางประการของ RichFaces และเราจะเรียนรู้ว่า RichFaces จัดการกับการประมวลผลคำขอ AJAX และฟังก์ชันอื่น ๆ อีกมากมายอย่างไร
กำลังดำเนินการตามคำขอ AJAX
ดังที่ได้กล่าวไว้ก่อนหน้านี้ RichFaces มีส่วนประกอบ UI ที่หลากหลายซึ่งเปิดใช้งานฟังก์ชัน AJAX ในเว็บแอปพลิเคชันโดยไม่ต้องใช้รหัส AJAX ใด ๆ ความสามารถของ AJAX ทั้งหมดนี้ได้รับการแนะนำผ่านทางa4:j ห้องสมุดแท็ก <a4j:commandLink> , <a4j:commandButton>, <a4j:support>และ <a4j:poll>เป็นแท็กสี่แท็กที่ช่วยให้นักพัฒนารวมฟังก์ชัน AJAX ลงในเว็บแอปพลิเคชัน เราจะเรียนรู้เพิ่มเติมเกี่ยวกับไลบรารีแท็กในบทต่อไป
การแปรรูปต้นไม้บางส่วน
ในแอปพลิเคชัน AJAX ทั่วไปช่องป้อนข้อมูลทั้งหมดจะถูกประมวลผลเป็นโหนดต่างๆของต้นไม้อย่างไรก็ตามใน RichFaces เรามีตัวเลือกในการส่งโหนดต้นไม้บางส่วนและตรวจสอบความถูกต้องของฟิลด์ที่ต้องการ
ให้เราพิจารณาตัวอย่างเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับเรื่องนี้ สมมติว่า HTML มีองค์ประกอบทั้งหมด 5 องค์ประกอบ ได้แก่ "ชื่อ" "รหัสพนักงาน" "เงินเดือนพนักงาน" "ที่อยู่ของพนักงาน" และ "แผนกพนักงาน" ตอนนี้คุณต้องการตรวจสอบหรือประมวลผลเฉพาะรหัสพนักงานซึ่งสามารถทำได้โดยใช้ RichFaces แต่ไม่สามารถทำได้โดยใช้ AJAX คุณต้องส่งแบบฟอร์มทั้งหมดไปยังเซิร์ฟเวอร์ RichFaces จัดเตรียมแอ็ตทริบิวต์ execute ที่สามารถระบุส่วนประกอบเฉพาะและประมวลผลเหมือนกัน ต่อไปนี้เป็นระดับต่างๆของแอ็ตทริบิวต์ execute ที่พร้อมใช้งาน
@all - แอตทริบิวต์นี้จะประมวลผลข้อมูลทั้งหมดของคุณ
@none - สามารถใช้เมื่อคุณไม่ต้องการประมวลผลข้อมูลใด ๆ
@this - จะดำเนินการตามส่วนประกอบที่ร้องขอเท่านั้น
@form - การดำเนินการนี้จะประมวลผลแบบฟอร์มทั้งหมดที่มีส่วนประกอบที่ร้องขอ
@region - การดำเนินการนี้จะประมวลผลพื้นที่เฉพาะของหน้าเว็บ
การอัปเดตมุมมองบางส่วน
เช่นเดียวกับช่องป้อนข้อมูล RichFaces มีตัวเลือกที่คล้ายกันในการอัปเดตมุมมองต่างๆ นักพัฒนาสามารถปรับแต่งมุมมองตามที่พวกเขาเลือก เช่นเดียวกับแอ็ตทริบิวต์ execute มีแอ็ตทริบิวต์ render ที่ทำงานคล้ายกับแอ็ตทริบิวต์ execute แอตทริบิวต์ทั้งหมดนี้ทำงานโดยยึดตามตัวระบุรหัสของหน้าเว็บ
ต่อไปนี้เป็นระดับต่างๆของแอตทริบิวต์การแสดงผลที่พร้อมใช้งาน
@all - สิ่งนี้จะอัปเดตส่วนประกอบทั้งหมด
@none - สิ่งนี้จะไม่อัปเดตส่วนประกอบใด ๆ ของคุณ
@this - สิ่งนี้จะอัปเดตเฉพาะส่วนประกอบที่ร้องขอเท่านั้น
@from - สิ่งนี้จะอัปเดตแบบฟอร์มที่มีข้อมูลที่ร้องขอ
@region - การดำเนินการนี้จะอัปเดตพื้นที่เฉพาะของหน้าเว็บ
แท็ก a4j อื่น ๆ
จนถึงตอนนี้เราได้กล่าวถึงคุณสมบัติเชิงแนวคิดเกี่ยวกับแอปพลิเคชัน RichFaces ในส่วนนี้เราจะเรียนรู้เกี่ยวกับพวกเขาโดยละเอียดพร้อมตัวอย่างลงมือปฏิบัติ
<a4j: AJAX>
นี่เป็นหนึ่งในองค์ประกอบหลักที่ RichFaces นำเสนอ นี่ไม่ใช่อะไรนอกจากส่วนขยายของแท็ก JSF2.0 f: AJAX แท็กนี้เรียกใช้คำขอ AJAX เมื่อใดก็ตามที่มีเหตุการณ์ JS เกิดขึ้นในหน้าเว็บ ตัวอย่างต่อไปนี้อธิบายเพิ่มเติมเกี่ยวกับแท็กนี้ สร้างหน้า“ xhtml” ภายใต้โฟลเดอร์ของหน้าเว็บและตั้งชื่อเป็น“ a4jAJAXExample.xhtml” จากนั้นวางโค้ดต่อไปนี้
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://xmlns.jcp.org/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head>
<title>a4j:AJAX Tag Example</title>
</h:head>
<h:body>
<h:form id = "form">
<h:inputText value = "#{managedBean.message}">
<a4j:AJAX render = "ShowMessage" />
</h:inputText>
<h:outputText value = "#{managedBean.message}" id = "ShowMessage"
style = "animation-duration"/>
</h:form>
</h:body>
</html>
นอกจากนี้เรายังต้องสร้างถั่วที่มีการจัดการเพื่อเก็บอินพุตจากเว็บเพจ สร้างคลาส java ภายใต้ไดเร็กทอรีแพ็กเกจต้นทาง ต่อไปนี้คือไฟล์managedbean.java รหัสชั้นเรียน
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class managedBean {
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
บันทึกทั้งไฟล์และเรียกใช้ซึ่งจะให้ผลลัพธ์ต่อไปนี้ในเบราว์เซอร์
<a4j: param>
a4j: param เป็นส่วนขยายของแท็ก f: param ใช้เพื่อกำหนดค่าให้กับคุณสมบัติหรือตัวแปรอินสแตนซ์ แท็กนี้สามารถกำหนดค่าให้กับตัวแปรอินสแตนซ์ได้อย่างถาวร ต่อไปนี้คือโค้ด“ a4jparamExample.html”
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://xmlns.jcp.org/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head>
<title>Param tag example</title>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0"/>
</h:head>
<h:body>
<h:form id = "form">
<h:panelGrid columns = "2">
<a4j:commandButton value = "TutorialsPoint" render = "rep">
<a4j:param value = "Tutorials point" assignTo = "#{managedBean.message}" />
</a4j:commandButton>
<a4j:commandButton value = "RichFace Tutorials" render = "rep">
<a4j:param value = "RichFace Tutorials" assignTo = "#{managedBean.message}" />
</a4j:commandButton>
</h:panelGrid>
<br />
<h:outputText id = "rep" value = "Selected Name:#{managedBean.message}" />
</h:form>
</h:body>
</html>
ต่อไปนี้เป็นรหัสคลาส bean ที่มีการจัดการที่สอดคล้องกัน
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class managedBean {
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
System.out.println("This method is getting called with"+message);
// we have added this line in order to check how the AJAX call
// happens to the class methods without any direct communication
this.message = message;
}
}
ไปข้างหน้าและเรียกใช้ไฟล์ ต่อไปนี้เป็นผลลัพธ์ในเบราว์เซอร์
ตอนนี้ในคอนโซลเซิร์ฟเวอร์คุณจะเห็นผลลัพธ์ต่อไปนี้ซึ่งพิสูจน์ได้ว่าไฟล์ xhtml กำลังสื่อสารกับถั่วที่มีการจัดการเพื่อตั้งค่าตัวแปรอินสแตนซ์ในขณะทำงาน
<a4j: commandButton>
เราได้ใช้แท็กปุ่มคำสั่งในตัวอย่างก่อนหน้านี้แล้ว ใช้เพื่อสร้างปุ่มภายในเพจ xhtml ซึ่งจะสร้างและสื่อสารกับเอ็นจิน AJAX เพื่อประมวลผลคำขอเฉพาะ ใช้อินพุตและประมวลผลเหมือนกันและแสดงผลลัพธ์ในเว็บเบราว์เซอร์
ในตัวอย่างก่อนหน้านี้เราได้สร้างปุ่มสองปุ่ม -“ TutorialsPoint” และ“ RichFace Tutorials” แท็กปุ่มคำสั่งของเราสื่อสารภายในกับ bean ที่ถูกจัดการและตั้งค่าตัวแปรอินสแตนซ์ที่ต้องการ นอกจากนี้ยังรับผิดชอบในการแสดงผลค่า
<a4j: commandLink>
ลิงก์คำสั่งทำงานเหมือนกับคอมโพเนนต์ <h: commandlink> ของ JSF 2.0 ปุ่มคำสั่งสร้างคำขอ AJAX แบบส่งเมื่อใดก็ตามที่ลิงก์คำสั่งทำงานบนเหตุการณ์คลิก JS นี่เป็นข้อแตกต่างเดียวที่เรามีในปุ่มคำสั่งและลิงค์คำสั่ง ตัวอย่างต่อไปนี้จะช่วยให้คุณเข้าใจแท็ก lib ได้ดีขึ้น สร้างไฟล์“ a4jCommandLink.xhtml” และวางโค้ดต่อไปนี้
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://xmlns.jcp.org/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head>
<title>Example of command Link</title>
</h:head>
<h:body>
<h:form id = "form">
<h:panelGrid columns = "3">
<h:outputText value = "Name:" />
<h:inputText value = "#{managedBean.message}" />
<a4j:commandLink value = "Click Me" render = "out" execute = "@form" />
</h:panelGrid>
</h:form>
<br />
<a4j:outputPanel id = "out">
<h:outputText value = "Welcome to #{managedBean.message} !" />
</a4j:outputPanel>
</h:body>
</html>
ไม่จำเป็นต้องเปลี่ยนแปลงอะไรในคลาส bean ที่มีการจัดการ เรียกใช้ไฟล์นี้และต่อไปนี้จะเป็นผลลัพธ์ในเบราว์เซอร์
<a4j: outputPanel>
แผงผลลัพธ์ทำงานเป็นช่วงของหน้า HTML ใช้เพื่อจัดกลุ่มส่วนประกอบต่างๆของเว็บเพจแทนที่จะระบุทีละรายการ ในตัวอย่างก่อนหน้านี้เราได้ใช้แผงเอาต์พุตเพื่อแสดงข้อความที่ให้ไว้ในกล่องข้อความอินพุต ต่อไปนี้เป็นไวยากรณ์ของแผงเอาต์พุต
<a4j:outputPanel id = "out">
<h:outputText value = "Welcome to #{managedBean.message} !" />
</a4j:outputPanel>
<a4j: region>
นี่คือคุณสมบัติหลักของ RichFaces ที่ช่วยให้สามารถประมวลผลบางส่วนของหน้าเว็บจาก การใช้แท็กนี้การประมวลผลแบบต้นไม้บางส่วนจะเกิดขึ้นใน RichFaces ส่วนใหญ่จะใช้เพื่อเพิ่มกระบวนการแสดงผล ตัวอย่างต่อไปนี้จะช่วยให้คุณเข้าใจโดยละเอียด โปรดสร้างไฟล์“ a4jregionExample.xhtml” โดยใช้รหัสต่อไปนี้
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j" >
<h:head>
<title>Region Example</title>
</h:head>
<h:body>
<h:form>
<h:inputText value = "#{managedBean.message}"/>
<h:inputText value = "#{managedBean.job}"/>
<a4j:commandLink id = "one" value = "one"/>
<a4j:region>
<h:inputText value = "#{managedBean.message}"/>
<a4j:commandLink id = "two" value = "two"/>
</a4j:region>
</h:form>
</h:body>
</html>
พร้อมกับหน้า xhtml นี้โปรดอัปเดต ManagedBean ของเราตามลำดับ
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class managedBean {
String message;
String job;
public String getMessage() {
return message;
}
public void setMessage(String message) {
System.out.println("setMessage method is getting called with--"+message);
this.message = message;
}
public String getJob() {
return job;
}
public void setJob(String job) {
System.out.println("setJob method is getting called with--"+job);
this.job = job;
}
}
โค้ดด้านบนจะให้ผลลัพธ์ต่อไปนี้ในเบราว์เซอร์
เมื่อใดก็ตามที่คลิกลิงก์คำสั่ง“ หนึ่ง” มันจะประมวลผลแบบฟอร์มทั้งหมดอย่างไรก็ตามเมื่อเราคลิกลิงก์คำสั่ง“ สอง” อินสแตนซ์ข้อความเท่านั้นที่จะถูกประมวลผลตามที่อยู่ในแท็กภูมิภาค ในทำนองเดียวกันหากเราใส่ลิงก์คำสั่ง 'one' ไว้ในแท็กภูมิภาคอื่นระบบจะประมวลผลพารามิเตอร์อินพุตสองตัวแรกเท่านั้น ต่อไปนี้เป็นภาพหน้าจอของคอนโซลเซิร์ฟเวอร์เมื่อใดก็ตามที่คลิกลิงก์คำสั่ง“ สอง”
เมื่อใดก็ตามที่คลิกลิงก์คำสั่ง“ one” ผลลัพธ์ต่อไปนี้จะเป็นผลลัพธ์
<a4j: repeat>
แท็กซ้ำทำงานคล้ายกับแท็ก <ui: repeat> ของ JSF ช่วยในการทำซ้ำรายการในเว็บเพจ ในตัวอย่างต่อไปนี้ของไฟล์“ a4jRepeat.xhtml” เรากำลังทำซ้ำผ่านรายการจากคลาส bean ที่มีการจัดการของเรา
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head></h:head>
<h:body>
<h:form id = "form">
<h:panelGrid columns = "1" style = "width: 640px">
<a4j:outputPanel id = "panel" layout = "block">
<a4j:repeat value = "#{managedBean.subjectList}" var = "sub">
<li>
<h:outputText value = "#{sub}"/>
</li>
</a4j:repeat>
</a4j:outputPanel>
</h:panelGrid>
</h:form>
</h:body>
</html>
เมื่อคุณเรียกใช้ไฟล์เฉพาะนี้ในเบราว์เซอร์คุณจะได้รับผลลัพธ์ต่อไปนี้
<a4j: สถานะ>
ตามชื่อที่แนะนำแท็กนี้มีประโยชน์ทุกครั้งที่คุณต้องการแสดงสถานะของคำขอ AJAX ของคุณในส่วนหน้า คุณสามารถใส่ข้อความปกติหรือ gif หรือสถานะตามรูปภาพได้ตามที่คุณเลือก สำหรับแอปพลิเคชันขนาดเล็กเช่นต่อไปนี้คุณจะเห็นสถานะในส่วนหน้าได้อย่างรวดเร็วอย่างไรก็ตามเมื่อใดก็ตามที่คุณเรียกใช้คำขอ AJAX ที่ซับซ้อนสถานะนี้จะปรากฏให้เห็นได้มาก โปรดแก้ไข“ a4jregionExample.xhtml” ตามที่แสดงด้านล่าง
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head>
<title>Region Example</title>
</h:head>
<h:body>
<h:form>
<a4j:status startText = "Working..." />
<h:inputText value = "#{managedBean.message}"/>
<h:inputText value = "#{managedBean.job}"/>
<a4j:commandLink id = "one" value = "one"/>
<a4j:region>
<h:inputText value = "#{managedBean.message}"/>
<a4j:commandLink id = "two" value = "two"/>
</a4j:region>
<a4j:status startText = "Done" />
</h:form>
</h:body>
</html>
เมื่อใดก็ตามที่คุณใช้งานแอปพลิเคชันนี้คุณจะเห็นสถานะสองสถานะ "ทำงาน ... " และ "เสร็จสิ้น" สถานะเหล่านี้จะหายไปโดยอัตโนมัติเมื่อคำขอเสร็จสมบูรณ์
<a4j: include> / <a4j: keepAlive>
รวมและ keepAlive แท็กทั้งสองได้รับการแนะนำใน RichFaces 3.0 แต่ใน RichFaces 4 แท็กเหล่านี้ถูกหักค่าใช้จ่ายเนื่องจากฟังก์ชันเหล่านี้สามารถทำได้อย่างง่ายดายโดยใช้แท็กอื่น ๆ ที่ใช้ใน Facelets เช่น <ui: include> และ <ui: insert> ตามชื่อที่แนะนำคือ include ถูกนำมาใช้เพื่อรวมเพจหนึ่งไว้ในอีกเพจและ KeepAlive ถูกนำมาใช้เพื่อควบคุมขอบเขตของการเชื่อมโยง bean ที่มีการจัดการกับเพจ JSF ขอแนะนำให้ใช้ซอฟต์แวร์ API เวอร์ชันที่อัปเดตและใช้คอมโพเนนต์ <UI> และการใช้ "คำอธิบายประกอบ" เพื่อให้บรรลุเป้าหมายทางธุรกิจ
<a4j: log>
ตามชื่อที่แนะนำส่วนประกอบ a4j นี้ช่วยในการสร้างข้อมูลการบันทึกลงในเว็บเบราว์เซอร์ ตัวอย่างต่อไปนี้จะอธิบายเพิ่มเติมเกี่ยวกับแท็กนี้ แก้ไขไฟล์“ a4jregionExample.xhtml” ด้วยวิธีต่อไปนี้
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:ui = "http://java.sun.com/jsf/facelets"
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head>
<title>Region Example</title>
</h:head>
<h:body>
<h:form>
<a4j:status startText = "Working..." />
<h:inputText value = "#{managedBean.message}"/>
<h:inputText value = "#{managedBean.job}"/>
<a4j:commandLink id = "one" value = "one"/>
<a4j:region>
<h:inputText value = "#{managedBean.message}"/>
<a4j:commandLink id = "two" value = "two"/>
</a4j:region>
<a4j:log></a4j:log>
<a4j:status startText = "Done" />
</h:form>
</h:body>
</html>
ตอนนี้เรียกใช้โค้ดด้านบนในเบราว์เซอร์และต่อไปนี้จะเป็นผลลัพธ์ a4j: บันทึกจะสร้างบันทึกที่จำเป็นของทุกระดับเมื่อจำเป็น
<a4j: jsFunction>
นี่เป็นคุณลักษณะขั้นสูงที่สุดของ RichFaces ซึ่งสามารถสร้างฟังก์ชัน JS อัตโนมัติได้โดยไม่ต้องใช้รหัส JavaScript CDK จะสร้างโค้ด JavaScript อัตโนมัติโดยอิงตามเหตุการณ์ JS
ในตัวอย่างต่อไปนี้เรากำลังสร้างฟังก์ชัน JavaScript ที่จะถูกเรียกเมื่อใดก็ตามที่เราวางเมาส์บนค่าที่ระบุ
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:ui = "http://java.sun.com/jsf/facelets"
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:a4j = "http://richfaces.org/a4j">
<h:head>
<title>Example of JS Function</title>
</h:head>
<h:body>
<table width = "500" border = "1">
<tbody>
<tr>
<td>
<span onmouseover = "showMySkill('core java,J2EE')"
onmouseout = "showMySkill('')">BackEnd developer</span>
</td>
<td>
<span onmouseover = "showMySkill('DB,RDBMS,unix')"
onmouseout = "showMySkill('')">Database Admin</span>
</td>
<td>
<span onmouseover = "showMySkill(
'JS frameworks,html,java scripts')"
onmouseout = "showMySkill('')">Front End Developer</span>
</td>
</tr>
<tr>
<td colspan = "3">You need to know:
<b><h:outputText id = "showSkillset" value = "#{managedBean.message}"/></b>
</td>
</tr>
</tbody>
</table>
<h:form id = "form">
<a4j:jsFunction name = "showMySkill" render = "showSkillset">
<a4j:param name = "name" assignTo = "#{managedBean.message}" />
</a4j:jsFunction>
</h:form>
</h:body>
</html>
โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ในเบราว์เซอร์ ขึ้นอยู่กับเหตุการณ์ JS CDK จะแทนที่เมธอดชื่อ“ showMySkill ()” และค่าที่ต้องการจะถูกพิมพ์ในเบราว์เซอร์
<a4j: AJAXListener>
แท็กนี้ใช้เมื่อคุณต้องการเรียกใช้ Listener เฉพาะก่อนที่จะแสดงผลลัพธ์ไปยังเบราว์เซอร์ แท็กนี้ไม่พร้อมใช้งานใน RichFaces 4 เนื่องจากมีฟังก์ชันการทำงานเดียวกันใน
<rich:panel>
<f:facet name = "header">Using a4j:actionListener</f:facet>
<a4j:commandButton value="Submit" reRender = "#{AJAXBean.areas}">
<a4j:AJAXListener binding = "#{AJAXBean.renderAreasListener}"/>
</a4j:commandButton>
</rich:panel>
ในตัวอย่างข้างต้นเมื่อคลิกปุ่ม "ส่ง" เหตุการณ์ JS จะถูกสร้างขึ้นซึ่งจะเรียกเมธอด "พื้นที่" ที่ใช้งานภายในคลาส bean และผลลัพธ์ที่เกี่ยวข้องจะแสดงเป็นผลลัพธ์