เมื่อใดควรใช้ f: viewAction / preRenderView เทียบกับ PostConstruct


97

เมื่อใดควรใช้f:viewActionหรือpreRenderViewเหตุการณ์เพื่อเริ่มต้นข้อมูลสำหรับเพจเทียบกับการใช้@PostConstructคำอธิบายประกอบ เป็นเหตุผลที่จะใช้อย่างใดอย่างหนึ่งตามประเภทของขอบเขตของ backing bean เช่นถ้า backing bean เป็น@RequestScopedตัวเลือกในการใช้f:viewActionหรือpreRenderViewมากกว่า@PostConstructเพื่อเริ่มต้น backing bean ก่อนที่จะแสดงผลมุมมองจะไม่เกี่ยวข้องเหมือนทั้งสองอย่าง ได้ผลเหมือนกันไหม

f: viewAction หรือ preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

หรือ

@ โพสต์คอนสตรัค

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

คำตอบ:


122

เมื่อใดควรใช้เหตุการณ์ f: viewAction หรือ preRenderView เพื่อเริ่มต้นข้อมูลสำหรับข้อหน้าโดยใช้คำอธิบายประกอบ @PostConstruct

ใช้<f:viewAction>เมื่อคุณต้องการเรียกใช้เมธอดก่อนที่ HTML จะถูกแสดงผล สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณต้องการดำเนินการตามค่าแบบจำลองที่กำหนดโดย<f:viewParam>ในระหว่างขั้นตอนการอัปเดตค่าโมเดล กล่าวคือไม่สามารถใช้งานได้ในขณะที่@PostConstructวิ่ง ใน JSF 2.0 / 2.1 ไม่มีแท็กนี้และคุณต้องใช้preRenderViewวิธีแก้ปัญหาชั่วคราว

ถ้าถั่วสำรองคือ @RequestScoped พวกเขาจะทำสิ่งเดียวกันได้อย่างมีประสิทธิภาพหรือไม่? (แล้วมันขึ้นอยู่กับตัวเลือกของนักพัฒนาหรือเปล่า (@PostConstruct ดูเหมือน "สะอาดกว่า")

ไม่พวกเขาไม่ได้ทำสิ่งเดียวกันอย่างมีประสิทธิภาพอย่างแน่นอน @PostConstructเป็น intented เพื่อดำเนินการโดยตรงหลังจากการก่อสร้างถั่วและการตั้งค่าการอ้างอิงฉีดทั้งหมดและมีการจัดการคุณสมบัติเช่น@EJB, @Inject, @ManagedPropertyฯลฯ คือการพึ่งพาการฉีดจะไม่สามารถใช้ได้ภายในคอนสตรัคถั่ว ซึ่งจะทำงานเพียงครั้งเดียวต่อการดูเซสชันหรือแอปพลิเคชันเมื่อ bean ถูกดูเซสชันหรือขอบเขตของแอปพลิเคชัน <f:viewAction>เป็นค่าเริ่มต้นเรียกเฉพาะใน GET ขอเริ่มต้น แต่สามารถผ่านonPostback="true"แอตทริบิวต์กำหนดค่าที่จะเรียกร้องขอ postback เช่นกัน preRenderViewเหตุการณ์ถูกเรียกตามคำขอ HTTP ทุก (ใช่นี้ยังรวมถึงการร้องขอของอาแจ็กซ์)

สรุปการใช้งาน@PostConstructถ้าคุณต้องการที่จะดำเนินการในการอ้างอิงฉีดและคุณสมบัติการจัดการที่ถูกกำหนดโดย@EJB, @Inject, @ManagedPropertyฯลฯ ในระหว่างการก่อสร้างถั่ว ใช้<f:viewAction>ถ้าคุณยัง<f:viewParam>ต้องการที่จะดำเนินการเกี่ยวกับคุณสมบัติที่กำหนดโดย หากคุณยังใช้ JSF 2.0 / 2.1 ให้ใช้preRenderViewแทน<f:viewAction>ไฟล์. คุณสามารถเพิ่มการตรวจสอบได้หากจำเป็นFacesContext#isPostback()เพื่อดำเนินpreRenderViewการตามคำขอเริ่มต้นเท่านั้น

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


ขอบคุณ. ขออภัยฉันแก้ไขคำถามเดิมของฉันในขณะที่คุณกำลังเขียนคำตอบ ...
BestPractices

ฉันพูดถึง bean scope เพราะ @PostConstruct จะถูกเรียกเพียงครั้งเดียวถ้า bean เป็น SessionScoped (ณ เวลาที่สร้าง bean ครั้งแรก) แต่ preRenderView จะถูกเรียกทุกครั้งที่เข้าถึงเพจ หรือว่าฉันเข้าใจผิด?
BestPractices

ใช่ที่ถูกต้อง. เหตุการณ์มุมมองก่อนการแสดงผลถูกเรียกใช้ในขั้นตอนการดำเนินการเรียกใช้ โครงสร้างโพสต์ถูกเรียกใช้หลังจากการสร้างของถั่ว เซสชันที่กำหนดขอบเขตถั่วไม่ได้สร้างขึ้นในทุกคำขอ HTTP
BalusC

ฉันสงสัยว่าวิธีการของฉันถูกเรียกในระหว่างการร้องขอ ajax โทร isPostBack () บันทึกวัน !!
jacosta

เพื่อความสมบูรณ์เราควรพูดถึงOmnifaces '@Param : "สำหรับพารามิเตอร์การร้องขอ HTTP โดยทั่วไปจะเป็นเช่น<f:viewParam>นั้น แต่ด้วยความแตกต่างที่สำคัญคือพารามิเตอร์ที่ฉีดเข้ามานั้นมีให้ใช้งานได้โดยตรงในระหว่าง@PostConstructนั้นทำให้สามารถประมวลผลได้ง่ายขึ้นมากโดยไม่จำเป็นต้องมี<f:event type="preRenderView">หรือ<f:viewAction>ใน ดู."
Jens Piegsa

1

คุณต้องการเริ่มต้นคุณสมบัติของถั่วที่มีการจัดการหรือไม่? -> จากนั้นใช้ @ PostConstruct มิฉะนั้นคุณต้องทำงานกับพารามิเตอร์ที่ส่งผ่านจากมุมมองอื่นหรือไม่? -> จากนั้นใช้ " preRenderView "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.