質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Java

    13494questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Java EE

    370questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • JSF

    118questions

    JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

データテーブルを検索→検索結果から詳細ページへ移動 がうまくいかない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 825

anonyrabbit

score 50

primefacesのデータテーブルを利用して、データベースの内容を表示しています。このデータテーブルには検索機能をつけたのですが、この検索機能を使って検索すると正しい詳細ページへのリンクができなくなります。検索してから一番上のコラムのリンクをクリックして詳細ページに飛んでも、検索機能を実行する前の一番上のコラムのリンクをクリックするときと同じページの飛んでしまうのです。

Bb.java

@ManagedBean(name = "bb", eager = true)
@SessionScoped
public class Bb extends SuperBb implements Serializable {

    protected List<OldCoupleInformation> coupleList;
    private String search;

  @PostConstruct
    public void filt() {
        System.out.println("filt()");
        coupleList = db.getAll();
        if (search != null) {
            coupleList = db.filterTable(search);
            System.out.println("coupleList = db.filterTable(search);\n");

        }

    }

    public String detail(Integer id) {
        System.out.println("detail()");
        oci = db.find(id);
        return "detail-content.xhtml";
    }
//getter, setter
}


Db.java

@Stateful

public class Db<T> implements Serializable {

    @PersistenceContext
    private EntityManager em;
    protected Class<T> entityClass;

public Information find(Integer id) throws IllegalArgumentException {
        return em.find(Information.class, id);
    }
public List<Information> filterTable(String search) {
        if(search == null) return null;
        Query query = em.createQuery("SELECT c FROM Information c WHERE c.addressOne LIKE :search", Information.class);
        query.setParameter("search", "%" + search + "%"); 
        return query.getResultList();
    }

find.xhtml

 <h:form>        
            <p:inputText id="search" value="#{bb.search}" style="width:150px"/> <br/>
            <br/>
            <h:commandLink type="submit" value="検索" action="#{bb.filt()}" class="Button"/>


            <p:dataTable id="examplej" class="table couple-table" 
                         var="info" value="#{bb.coupleList}" widgetVar="couple" rows="10" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                         rowsPerPageTemplate="5,10,15" paginator="true" emptyMessage="住所を入力して検索してください">
                <f:facet name="header">
                    <!--<p:outputPanel>-->
                    <h:outputText value="地域で検索" />

                <p:column class="column-couple">
                    <h:outputText value="#{info.firstName}" />さん
                    <h:outputText value="#{info.id}" />


                </p:column>

                <p:column class="column-couple">
                    <h:outputText value="#{info.addressOne}" />
                </p:column>


                <p:column class="column-couple">
                    <h:commandLink action="#{bb.detail(info.id)}"><!-- 試したもの:bb.oci, bb.coupleList, filt()でOldcoupleInformationをflashでdetail()に渡す-->
                        詳細へ
                    </h:commandLink>  
                </p:column>


            </p:dataTable>
        </h:form>        

”Q”で検索した時のログになります。

filt()で検索を実行

Info:   filt()
Info:   null
Info:   filt()
Info:   coupleList = db.filterTable(search);
Info:   Q
検索結果の一番上のカラムのリンクをクリック(detail()を実行)
Info:   filt()
Info:   null
Info:   detail()
Warning:   JSF1064: Unable to find or serve resource, resources/css/detail.css.
Info:   filt()
Warning:   JSF1064: Unable to find or serve resource, resources/css/detail.css.
Info:   null

ログを見る限り、detail()メソッドを実行したとき@PostConstructで指定したメソッド(filt())がdetail()メソッドより先に実行され、リストが初期化されてしまっているようなのですが@PostConstructを使わずにリストを初期化したところdetail()がinvokeできなくなった覚えがあります。
長くなりましたが、なんとかこの機能を実装したいと思っているので、お分かりになる方ご回答のほうよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • BlueMoon

    2017/01/12 09:31

    SessionScopeにおけるインスタンスの生成契機と、PostConstructを指定したメソッドの実行契機についてはお調べ済みでしょうか。。

    キャンセル

  • anonyrabbit

    2017/01/12 15:33

    それらについては調べましたが、この問題を解決するまでには至りませんでした。どこを直せば良いでしょうか。

    キャンセル

  • anonyrabbit

    2017/01/12 15:35

    余談ですが、契機とタイミングは違う言葉です。

    キャンセル

回答 2

checkベストアンサー

+2

以下の2点を教えていただけますでしょうか?

  • ご利用されているアプリケーションサーバとそのバージョン情報
  • import文の部分

手元のGlassFish4.1.1では、上記コードをベースにDB部分はダミーのリスト値として試しましたが、ちゃんと検索で絞られた後でも正常にリンクのオブジェクトが取得できました。ログでも、リンクを押したときにdetail()だけが呼び出され、filt()は呼ばれません。ただ、Beanの継承元となっているSuperBbクラスがわからないので、そこは入れていないコードで試してます。

実際に試す前に気になっていた所としては

  1. 番号リスト <f:facet>タグが閉じていない
  2. 番号リスト @SessionScopedがJSFかCDIのかで間違っていないか
  3. 番号リスト @ManagedBeanは使わず@Namedを使う(Java EE6,7なら)
  4. 番号リスト h:commandLinkのtype="submit"は不要

辺りでした。手元では1点目の<f:facet>タグは閉じるのを追加しましたが、3,4は上記コードのまま(2はimport javax.faces.bean.SessionScoped)でも動きました。可能でしたら、3,4変えて試して一度試してみていただけると嬉しいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/14 13:48

    import文を、import javax.faces.bean.SessionScoped;に変えたら即動きました!enterpriseの方にしていたのが悪かったのですね。両者の違いが全く分からず適当に使っていたのがよくなかったです。本当にありがとうございました。これからもブログの更新楽しみにしています。

    キャンセル

  • 2017/01/14 14:07

    良かったです!!JSF管理Bean(@ManagedBean)とCDI管理Bean(@Named)で世界が違っているのですが、@RequestScopedや@SessionScopedはどちらの管理Beanでも被ってしまっているのでホント間違えやすいでお気を付けください~。

    キャンセル

-2

ログを拝見しますと、

検索結果の一番上のカラムのリンクをクリック(detail()を実行)


の後に

Info:   filt() 
Info:   null 


が表示されているので、詳細画面が表示される直前でcoupleList = db.getAll()によってリストが全件抽出に戻っているのではないでしょうか。そうなる理由までは判りません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13494questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Java EE

    370questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • JSF

    118questions

    JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。