ViewParam กับ @ManagedProperty (value =“ # {param.id}”)


97

อะไรคือความแตกต่างระหว่างการกำหนด View Params ดังนี้:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

และกำหนดคุณสมบัติใน ManagedBean ดังนี้:

@ManagedProperty(value = "#{param.id}")
private Integer id;

คำตอบ:


144

<f:viewParam>:

  • ตั้งค่าระหว่างเฟสค่าโมเดลการอัพเดตเท่านั้น (เนื่องจากขยายUIInput)

  • ค่าที่ตั้งไว้จะไม่พร้อมใช้งานในระหว่าง@PostConstructนั้นดังนั้นคุณต้องมีข้อมูลเพิ่มเติม<f:event type="preRenderView" listener="#{bean.init}" />ภายใน<f:metadata>เพื่อทำการเริ่มต้น / การโหลดล่วงหน้าตามค่าที่ตั้งไว้ เนื่องจาก JSF 2.2 คุณสามารถใช้<f:viewAction>แทนได้

  • อนุญาตให้มีการซ้อน<f:converter>และ<f:validator>สำหรับการแปลง / การตรวจสอบที่ละเอียดยิ่งขึ้น แม้กระทั่ง<h:message>สามารถติดได้

  • สามารถรวมเป็นสตริงการสืบค้น GET โดยใช้includeViewParamsแอตทริบิวต์ของ<h:link>หรือincludeViewParams=trueพารามิเตอร์การร้องขอใน URL ใดก็ได้

  • สามารถใช้กับ@RequestScopedbean ได้ แต่ต้องการให้ bean เป็น@ViewScopedถ้าคุณต้องการให้พารามิเตอร์มุมมองรอดจากความล้มเหลวในการตรวจสอบความถูกต้องที่เกิดจากฟอร์มที่อยู่ในมุมมองมิฉะนั้นคุณจะต้องเก็บพารามิเตอร์คำร้องขอทั้งหมดไว้ด้วยตนเองสำหรับคำร้องขอที่ตามมาโดย<f:param>ในคำสั่ง ส่วนประกอบ

ตัวอย่าง :

<f:metadata>
    <f:viewParam id="user_id" name="id" value="#{bean.user}"
        required="true" requiredMessage="Invalid page access. Please use a link from within the system."
        converter="userConverter" converterMessage="Unknown user ID."
    />
</f:metadata>
<h:message for="user_id" />

ด้วย

private User user;

และ@FacesConverter("userConverter"). การเรียกหน้าโดยhttp://example.com/context/user.xhtml?id=123จะส่งผ่านidพารามิเตอร์ผ่านตัวแปลงและตั้งค่าUserวัตถุเป็นคุณสมบัติ bean


@ManagedProperty:

  • ตั้งค่าทันทีหลังจากสร้างถั่ว

  • ค่าที่ตั้งไว้จะพร้อมใช้งาน@PostConstructซึ่งช่วยให้สามารถเริ่มต้น / โหลดคุณสมบัติอื่น ๆ ล่วงหน้าได้ง่ายตามค่าที่ตั้งไว้

  • ไม่อนุญาตให้มีการแปลงแบบเปิดเผย / การตรวจสอบความถูกต้องในมุมมอง

  • ทรัพย์สินของการบริหารจัดการไม่ได้รับอนุญาตในถั่วมีขอบเขตที่กว้างกว่าขอบเขตการร้องขอเพื่อให้ถั่วจะต้อง#{param}@RequestScoped

  • หากคุณอาศัยคุณสมบัติที่มีการจัดการ#{param}ซึ่งมีอยู่ในคำขอ POST ที่ตามมาคุณจะต้องรวมไว้<f:param>ในUICommandคอมโพเนนต์

ตัวอย่าง :

@ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

แต่คุณต้องจัดการการตรวจสอบตัวเองเมื่อใดก็ตามที่userเป็นnullโดยการเล่นซอกับFacesContext#addMessage()หรือบางสิ่งบางอย่าง


คุณสามารถใช้ทั้งสองอย่างเมื่อจำเป็น@PostConstructและincludeViewParamsจำเป็น คุณจะไม่สามารถใช้การแปลงแบบละเอียด / การตรวจสอบความถูกต้องได้อีกต่อไป


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


1
มีทางเลือกอื่นในการดึงพารามิเตอร์คำขอในกรณีพิเศษ: FacesContext.getCurrentInstance (). getExternalContext (). getRequestParameterMap (). get ("parametername");
angelcervera

1
@angel: เฉพาะเมื่อ bean มีขอบเขตที่กว้างกว่าขอบเขตการร้องขอซึ่งทำให้@ManagedPropertyพารามิเตอร์การร้องขอเป็นไปไม่ได้
BalusC

สวัสดี @BalusC ฉันอาศัยค่าของ id ที่ดึงมาจาก param.id โดยใช้ managedproperty ในโพสต์ที่สอง ฉันจะรวมโดยใช้ f: param ได้อย่างไร ขอบคุณมาก
sys_debug

1
@thufir: ตั้งค่าระหว่างขั้นตอนการอัปเดตค่าโมเดล postconstruct ดำเนินไปไกลก่อนหน้านั้นหลังจากการสร้างถั่วและการฉีดพึ่งพา มันมีอยู่ในวิธีการฟังซึ่งถูกเรียกโดย<f:event type="preRenderView">หรือ JSF จะเกิดขึ้น <f:viewAction>2.2
BalusC


6

2 ความแตกต่างอื่น ๆ :

  • @ManagedPropertyสามารถใช้ได้กับถั่วที่จัดการโดย JSF เท่านั้นไม่ใช่กับถั่วที่จัดการโดย CDI ( @Named)
    • <f:viewParam> ใช้งานได้กับพารามิเตอร์ของคำขอ GET เท่านั้น

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