シームでパラメータを渡すことを理解していません
-
05-07-2019 - |
質問
Seam アプリケーションをデバッグしていると、パラメーターの受け渡しがどのように機能するかを実際には理解していないことに気づきました。次の用語は本当に混乱します。したがって、私はこの非常に一般的な質問をしていますが、何が何と連携するのか、そして特定のものは何のためにあるのかについての良い説明を得ることを望んでいます。
まず、あるページから次のページに移動するには、h:commandButton または s:button を使用します。s:button はフォームを送信しないことは理解していますが、違いが理解できません。ページから次のページに移動してフォームを送信していない場合は、何をしているのでしょうか?
私のアプリでは、フォームに情報を入力し、ボタンを押し、クエリの実行後に結果を表示する新しいページに移動します。このアクティビティが s:button で行われるのを見たことがありますが、「フォームの送信」ではない場合はどうなるのでしょうか?ここで何か基本的なことが欠けていると感じます。
パラメーター自体に関しては...私が見たところ、次の 3 つの方法のいずれかを使用してパラメーターを渡すことができます。
- f:パラメータ。これは、h:commandbutton よりも s:button と組み合わせた場合に発生することが多いようです。何故ですか?
- また、page.xml ファイルを使用してパラメータ (または何か) を「渡す」こともできます。URL にパラメータを表示するには、ソース page.xml とターゲット page.xml の両方にパラメータを含める必要があるようです。
- 最後に、バッキング Bean に @RequestParameter アノテーションを追加するオプションがあります。これはビューに f:param を設定するときにも使用されると思います。それは、page.xml 内のものが無視されるという意味ですか?Seam ディストリビューションの登録例では、f:param の page.xml 経由でパラメータが渡されずにユーザー Bean が設定されていることに気付きました。そんなことがあるものか?
この質問はかなりの無知を明らかにしていると確信しています。
雄弁な皆さんの誰かが、私が求めていることを「理解し」、このプロセスについて説明してくれることを願っています。
前もって感謝します。
TDR
解決
あるページから次のページに進んでフォームを送信していない場合、何をしていますか?
フォームフィールドを送信せずに別のページに移動する。
私のアプリでは、フォームに情報を入力し、ボタンを押してから、クエリを実行した後に結果を表示する新しいページに移動します。このアクティビティがs:ボタンで行われるのを見たようです
s:button はフォームを送信しないため、ページ上の値はモデルに適用されません。これにはコマンドボタン/リンクを使用する必要があります。すでに入力されている値を別のページに渡すアクティビティを目にしたことがあるかもしれません。
f:パラメータ
これらはナビゲーションによく使用されるため、s:button/link とともに使用されることが多くなります。f:param を使用すると、すでに入力されている値を別のページに渡すことができます。h:commandButton/Link はフォームの送信に使用されるため、値はフォーム フィールドに含まれます。もちろん、このために f:param を使用することを妨げるものは何もありません。
ページ.xml
ここで使用されるパラメータは、リクエストパラメータをモデルに適用するため、またはその逆に使用されます。
@RequestParameter
上記のすべてと組み合わせて使用できますが、page.xml パラメータと一緒に使用すると、同じジョブを実行するために使用できるため、少し無意味です。
例
このページから始める場合:
http://mydomain.com/myapp/home.seam?name=damo
そして、home.page.xml には次の内容が含まれています。
<param name="name" value="#{person.name}"/>
その後、ページが読み込まれると、 person.setName("damo")
URL 内に一致するリクエスト パラメータがあるため呼び出されます。
次のページへのリンクにパラメータの値を保存できます。
<s:link value="Go to Page 2" view="/page2.xhtml">
<f:param name="name" value="#{person.name}"/>
</s:link>
リンクをクリックして移動すると、 http://mydomain.com/myapp/page2.simそして、page2.page.xml には次の内容が含まれています。
<param name="name" value="#{someOtherBean.name}"/>
それから someOtherBean.setName("damo")
呼ばれます。
Page2 には次のような s:button がある場合があります。
<s:button value="Say Hello" action="#{someOtherBean.sayHello}">
<f:param name="subject" value="#{someOtherBean.name}"/>
</s:button>
そして、その方法は次のようになります。
@Name("someOtherBean")
public class SomeOtherBean {
@RequestParameter("subject") //same value as the 'name' in f:param
private String subject;
public void sayHello() {
System.out.println("Hello "+subject);
}
}
お役に立てれば!
他のヒント
この質問にはすでに素晴らしい答えがあります。追加情報を追加しようとしています。
あるページから次のページに移動してフォームを送信しない場合、何をしていますか?
- @Damoの回答で既に検証済み
- ボタンの
onclick
属性を使用して次のページに移動する前に、クライアント側の検証を行うか、JavaScriptを実行します。 -
action
属性を使用してBeanのメソッドを呼び出します。
私のアプリでは、フォームに情報を入力し、ボタンを押してから、クエリの実行後に結果を表示する新しいページに移動します。私はこのアクティビティがs:buttonで行われているのを見たようです
- @Damoの回答に記載されているように、
<s:button>
/<s:link>
はフォームを送信しないため、2番目のページでクエリを実行できますが、以前にデータを入力する必要はありません。 - ただし、最初のページの入力フィールドで
<a4j:support>
/<a4j:ajax>
タグを使用している場合、長時間実行される会話内またはBeanがセッションスコープの場合、2番目のページのそのデータにアクセスできます。 2ページ目にフォームデータが表示される場合、これが原因である可能性があります。
バッキングBeanに@RequestParameterアノテーションを追加するオプションがあります。ビューでf:paramを設定するときにも使用されます。それは、page.xmlの1つが見落とされることを意味しますか?
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp;はい、値はpage.xml
は上書きされます。次の例を見てください。
getter
に次の行があると仮定します。
<param name="name" value="#{myBean.name}"/>
およびBeanにはsetter
およびname
プロパティのsetName
およびproperty
メソッドがあり、以下のように変数<=>を定義します。
@RequestParameter
String name;
このようにページを呼び出すと、
http://...../app_name/home.seam?name=william
<=>が呼び出され、名前<=>が<!> quot; william <!> quot;に設定されます。
次のように変数を定義するとします。
@RequestParameter("userName")
String name;
そして、このようなページを呼び出します。
http://...../app_name/home.seam?name=william&userName=tony
それから<=>メソッドが呼び出され、<=>プロパティが<!> quot; william <!> quot;に設定されます。ただし、この値は値<!> quot; tony <!> quot;によってオーバーライドされます。