ビューにフォームがあります。たとえば、次のように言います。
フォーム.xhtml
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Name" />
<h:inputText value="#{bean.name}" />
<h:outputLabel value="Age" />
<h:inputText value="#{bean.age}"
converter="#{ageConverter}" />
<h:outputLabel value="" />
<h:commandButton action="#{bean.submit}"
value="Submit" />
</h:panelGrid>
</h:form>
次の Bean でサポートされています。
Bean.java
@Named
// Scope
public class Bean implements Serializable {
@Inject private Service service;
private String name;
private int age;
private List<Person> people;
public void submit() {
people= service.getPeople(name, age);
}
// getters & setters for name & age
// getter for people
}
のビューの結果people
:
結果.xhtml
<h:form>
<h:dataTable value="#{bean.people}"
var="person">
<h:column>
<f:facet name="header">Name</f:facet>
#{person.name}
</h:column>
<h:column>
<f:facet name="header">Day of Birth</f:facet>
#{person.dayOfBirth}
</h:column>
</h:dataTable>
</h:form>
- form.xhtmlを使用してフォームを送信する- Bean.java を使用してサービスからユーザーを取得する - result.xhtml を使用してユーザーを表示する
この例では、まだパズルの一部が不完全です。たとえば、スコープはpeople
、結果にまったく含まれているかどうかで決定的であり、さらに、結果のページへの転送 (または同様のもの) はありません。
今、これを達成するための最良の(または少なくとも良い)方法が何であるかはわかりません。ここに私が考えることができたいくつかの方法があります:
- (JSF2.2) と暗黙のナビゲーション ( fromを
@ViewScoped
返す)を使用して、2 番目のページに移動します。ただし、これはビュースコープを壊します(とにかくこれを達成するために)?String
submit()
- いくつかの EL
@ViewScoped
に基づいて、適切なファイル (form.xhtml または result.xhtml) を使用して含めます。rendered=''
これは、送信時に Ajax 呼び出しを使用して実行できます。 - result.xhtml へのリクエストで値
name
をGET パラメータとして渡し、ロジックを実行します(ただし、フォームが「巨大」な場合はどうなりますか?)。この場合は十分でしょう。age
@PostConstruct
@RequestScoped
私の質問は、このユースケースを達成するための効率的で良い (最良の) 方法は何でしょうか?
ご意見ありがとうございます。