อะไรคือความแตกต่างระหว่างการกำหนด View Params ดังนี้:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
และกำหนดคุณสมบัติใน ManagedBean ดังนี้:
@ManagedProperty(value = "#{param.id}")
private Integer id;
อะไรคือความแตกต่างระหว่างการกำหนด View Params ดังนี้:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
และกำหนดคุณสมบัติใน ManagedBean ดังนี้:
@ManagedProperty(value = "#{param.id}")
private Integer id;
คำตอบ:
<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 ใดก็ได้
สามารถใช้กับ@RequestScoped
bean ได้ แต่ต้องการให้ 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
จำเป็น คุณจะไม่สามารถใช้การแปลงแบบละเอียด / การตรวจสอบความถูกต้องได้อีกต่อไป
@ManagedProperty
พารามิเตอร์การร้องขอเป็นไปไม่ได้
<f:event type="preRenderView">
หรือ JSF จะเกิดขึ้น <f:viewAction>
2.2
2 ความแตกต่างอื่น ๆ :
@ManagedProperty
สามารถใช้ได้กับถั่วที่จัดการโดย JSF เท่านั้นไม่ใช่กับถั่วที่จัดการโดย CDI ( @Named
)
<f:viewParam>
ใช้งานได้กับพารามิเตอร์ของคำขอ GET เท่านั้น