ทุกคนสามารถชี้แจงได้อย่างไรว่าเราสามารถใช้งานทั่วไปหรือตัวอย่างในโลกแห่งความเป็นจริงตัวอย่างข้อมูลนี้ได้หรือไม่
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
ทุกคนสามารถชี้แจงได้อย่างไรว่าเราสามารถใช้งานทั่วไปหรือตัวอย่างในโลกแห่งความเป็นจริงตัวอย่างข้อมูลนี้ได้หรือไม่
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
คำตอบ:
<f:viewParam>
จัดการการตั้งค่าการแปลงและการตรวจสอบของ GET พารามิเตอร์ มันเหมือน<h:inputText>
แต่สำหรับพารามิเตอร์ GET
ตัวอย่างต่อไปนี้
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
ทำโดยทั่วไปดังต่อไปนี้:
id
ได้รับค่าพารามิเตอร์คำขอตามชื่อrequired
, validator
และconverter
คุณลักษณะและรัง<f:converter>
และ<f:validator>
ในนั้นเช่นเดียวกับ<h:inputText>
)#{bean.id}
ค่าหรือหากไม่มีvalue
แอตทริบิวต์ให้ตั้งค่าเป็นชื่อผู้ร้องขอid
เพื่อให้สามารถใช้งานได้#{id}
ในมุมมองดังนั้นเมื่อคุณเปิดหน้าfoo.xhtml?id=10
ดังนั้นค่าพารามิเตอร์10
จะถูกตั้งค่าใน bean ด้วยวิธีนี้ก่อนที่จะแสดงผลมุมมอง
สำหรับการตรวจสอบความถูกต้องตัวอย่างต่อไปนี้ตั้งค่าพารามิเตอร์เป็นrequired="true"
และอนุญาตเฉพาะค่าระหว่าง 10 และ 20 ความล้มเหลวในการตรวจสอบความถูกต้องใด ๆ จะส่งผลให้มีข้อความปรากฏขึ้น
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
</f:metadata>
<h:message for="id" />
คุณสามารถใช้<f:viewAction>
สำหรับสิ่งนี้
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
<f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />
กับ
public void onload() {
// ...
}
<f:viewAction>
อย่างไรก็ตามใหม่ตั้งแต่ JSF 2.2 (คน<f:viewParam>
มีอยู่แล้วตั้งแต่ JSF 2.0) หากคุณไม่สามารถอัปเกรดได้แสดงว่าทางออกที่ดีที่สุดของคุณคือใช้<f:event>
แทน
<f:event type="preRenderView" listener="#{bean.onload}" />
อย่างไรก็ตามสิ่งนี้ถูกเรียกใช้ในทุกคำขอ คุณต้องตรวจสอบอย่างชัดเจนว่าคำขอไม่ใช่ postback หรือไม่:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
เมื่อคุณต้องการข้ามกรณี "การแปลง / การตรวจสอบความถูกต้องล้มเหลว" เช่นกันให้ทำดังนี้:
public void onload() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
การใช้<f:event>
วิธีนี้เป็นวิธีแก้ปัญหา / แฮ็คนั่นคือเหตุผลที่<f:viewAction>
แนะนำใน JSF 2.2
คุณสามารถ "pass-through" พารามิเตอร์มุมมองในลิงค์การนำทางโดยการตั้งค่าincludeViewParams
คุณลักษณะtrue
หรือโดยการเพิ่มincludeViewParams=true
พารามิเตอร์คำขอ
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
ซึ่งสร้างด้วย<f:metadata>
ตัวอย่างข้างต้นโดยทั่วไปลิงค์ต่อไปนี้
<a href="next.xhtml?id=10">
ด้วยค่าพารามิเตอร์ดั้งเดิม
วิธีการนี้จะต้องใช้ที่next.xhtml
มียัง<f:viewParam>
พารามิเตอร์เดียวกันมากมิฉะนั้นจะไม่ได้รับการส่งผ่าน
<f:viewParam>
นอกจากนี้ยังสามารถใช้ร่วมกับ "ธรรมดา HTML" ฟอร์ม GET
<f:metadata>
<f:viewParam id="query" name="query" value="#{bean.query}" />
<f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
<label for="query">Query</label>
<input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
<input type="submit" value="Search" />
<h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
...
</h:dataTable>
ด้วยพื้น@RequestScoped
ถั่วนี้:
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
โปรดทราบว่า<h:message>
สำหรับ<f:viewParam>
HTML ไม่ใช่แบบธรรมดา<input type="text">
! นอกจากนี้โปรดทราบว่าค่าอินพุตจะแสดง#{param.query}
เมื่อ#{bean.query}
ว่างเปล่าเนื่องจากค่าที่ส่งจะไม่ปรากฏขึ้นเลยเมื่อมีข้อผิดพลาดในการตรวจสอบหรือการแปลง โปรดทราบว่าโครงสร้างนี้ไม่ถูกต้องสำหรับองค์ประกอบการป้อนข้อมูล JSF (กำลังทำ "ภายใต้ครอบคลุม" แล้ว)