เมื่อใดที่ฉันควรใช้ h: outputLink แทน h: commandLink


129

เมื่อใดที่ฉันควรใช้<h:outputLink>แทน<h:commandLink>?

ฉันเข้าใจว่ามีการcommandLinkสร้างโพสต์ HTTP ฉันคาดเดาว่าoutputLinkจะสร้าง HTTP gets ที่กล่าวว่าเนื้อหาการสอน JSFส่วนใหญ่ที่ฉันอ่านใช้commandLink(เกือบ?) เท่านั้น

บริบท: ฉันกำลังใช้โครงการสาธิตเล็ก ๆ น้อย ๆ ที่แสดงลิงก์ส่วนหัวไปยังหน้าผู้ใช้เหมือนกับ Stack Overflow ...

ต้องการ jquery เพิ่มเติม

... และฉันไม่แน่ใจว่าcommandLink(อาจจะใช้?faces-redirect=trueสำหรับบุ๊กมาร์ก) หรือoutputLinkเป็นตัวเลือกที่ถูกต้อง

คำตอบ:


195

<h:outputLink>วาทกรรม HTML fullworthy <a>องค์ประกอบที่มี URL ที่เหมาะสมในhrefแอตทริบิวต์ซึ่ง fires ร้องขอ GET บุ๊คมาร์ค ไม่สามารถเรียกใช้เมธอดการดำเนินการ bean ที่มีการจัดการโดยตรง

<h:outputLink value="destination.xhtml">link text</h:outputLink>

<h:commandLink>แสดงผลแบบ HTML <a>องค์ประกอบที่มีonclickสคริปต์ซึ่งยื่น (ซ่อน) แบบฟอร์มการโพสต์และสามารถเรียกใช้วิธีการดำเนินการจัดการถั่ว นอกจากนี้ยังต้องวางไว้ในไฟล์<h:form>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>

?faces-redirect=trueพารามิเตอร์ใน<h:commandLink>ซึ่งก่อให้เกิดการเปลี่ยนเส้นทางหลังจากที่โพสต์ (ตามโพสต์การเปลี่ยนเส้นทาง-รับรูปแบบ) เพียง แต่ช่วยเพิ่ม bookmarkability ของหน้าเป้าหมายเมื่อการคลิกลิงก์จริง (URL จะไม่เป็น "หนึ่งที่อยู่เบื้องหลัง" อีกต่อไป) แต่มันจะไม่เปลี่ยนแปลงhrefของ<a>องค์ประกอบที่จะเป็น URL fullworthy #มันยังคงอยู่

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>

เนื่องจาก JSF 2.0 ยังมีสิ่ง<h:link>ที่สามารถใช้ view ID (ผลลัพธ์ของกรณีการนำทาง) แทน URL ได้ มันจะสร้าง<a>องค์ประกอบHTML พร้อมกับ URL ที่เหมาะสมในhref.

<h:link value="link text" outcome="destination" />

ดังนั้นถ้ามันเป็นระบบนำทางสำหรับหน้าไปหน้าบริสุทธิ์และบุ๊คมาร์คเช่นการเชื่อมโยงชื่อผู้ใช้ดังนั้นแล้วใช้หรือ<h:outputLink> <h:link>นอกจากนี้ยังดีกว่าสำหรับ SEO เนื่องจากบอทมักจะไม่เข้ารหัสรูปแบบ POST หรือรหัส JS นอกจากนี้ UX จะได้รับการปรับปรุงให้ดีขึ้นเนื่องจากตอนนี้สามารถบุ๊กมาร์กหน้าได้และ URL จะไม่ "อยู่ข้างหลัง" อีกต่อไป

เมื่อจำเป็นคุณสามารถทำงานก่อนการประมวลผลในตัวสร้างหรือ@PostConstructของ@RequestScopedหรือ@ViewScoped @ManagedBeanที่แนบมากับเพจปลายทางที่เป็นปัญหา คุณสามารถใช้@ManagedPropertyหรือ<f:viewParam>ตั้งค่าพารามิเตอร์ GET เป็นคุณสมบัติ bean

ดูสิ่งนี้ด้วย:


2
ไม่จำเป็นต้องเป็น UICommandส่วนประกอบเท่านั้นที่ต้องอยู่ในUIFormส่วนประกอบ
BalusC

3
ไม่มีจริง โดยทั่วไปเมื่อคุณสามารถติดh:outputLinkหรือh:linkเชื่อมโยง SEO ไม่ควรประมาท โดยวิธีการที่ดีสำหรับส่วนที่เหลือเหมือน URL เหมือนที่นี่ใน SO, มีลักษณะที่PrettyFaces
BalusC

1
ไม่ความแตกต่างคือh:linkใช้รหัสมุมมอง JSF (เช่นpage) เป็นค่าและh:outputLinkใช้ URL จริง (เช่น/page.xhtmlหรือ/page.jsfหรืออื่น ๆ ขึ้นอยู่กับFacesServletการแมปของคุณ) เป็นค่า การเข้ารหัส URL ยังคงเกิดขึ้นในทั้งสองกรณี ไม่มีความแตกต่างระหว่างพฤติกรรมการแสดงผลของ EL ในข้อความเทมเพลต#{...}และh:outputText. ทั้งสองหลีกเลี่ยงเอนทิตี XML ที่กำหนดไว้ล่วงหน้า (ไม่ซึ่งไม่เหมือนกับการเข้ารหัส URL) h:outputTextข้อเสนอเพียง attribtues ชอบมากขึ้นid, styleClassฯลฯ ในการควบคุมองค์ประกอบและ / หรือมาร์กอัป
BalusC

1
@BalusC คำว่า "Fullworthy HTML" ในบรรทัดแรกของคำตอบของคุณหมายความว่าอย่างไร
Geek

1
@ Geek: <a>องค์ประกอบHTML เพียงจุดเดียวไม่มีอะไรมากไม่
เพ้อฝัน

4

ฉันยังเห็นว่าการโหลดหน้าเว็บ (ประสิทธิภาพ) ใช้เวลานานในการใช้ h: commandLink กว่า h: link h: link เร็วกว่าเมื่อเทียบกับ h: commandLink


1
ฉันพบว่ามันยากที่จะเชื่อ นอกเหนือจากคำบอกเล่า / หลักฐานของคุณเองคุณมีอะไรที่จะสนับสนุนสิ่งนั้นหรือไม่?
Matt Ball

5
@Matt: ฉันนึกภาพออกว่ามันช้าลงเมื่อคุณมีลิงก์การนำทาง POST นี้ภายในรูปแบบ "พระเจ้า" ในหน้าที่มีตัวอย่างข้อมูลที่มี> 1,000 แถวที่มีช่องป้อนข้อมูล 3 ช่องต่อแถว แต่หน้าดังกล่าวก็มีปัญหาร้ายแรงอื่น ๆ อยู่ดี :)
BalusC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.