primefacesのデータテーブルを利用して、データベースの内容を表示しています。このデータテーブルには検索機能をつけたのですが、この検索機能を使って検索すると正しい詳細ページへのリンクができなくなります。検索してから一番上のコラムのリンクをクリックして詳細ページに飛んでも、検索機能を実行する前の一番上のコラムのリンクをクリックするときと同じページの飛んでしまうのです。
Bb.java
Java
1 2@ManagedBean(name = "bb", eager = true) 3@SessionScoped 4public class Bb extends SuperBb implements Serializable { 5 6 protected List<OldCoupleInformation> coupleList; 7 private String search; 8 9 @PostConstruct 10 public void filt() { 11 System.out.println("filt()"); 12 coupleList = db.getAll(); 13 if (search != null) { 14 coupleList = db.filterTable(search); 15 System.out.println("coupleList = db.filterTable(search);\n"); 16 17 } 18 19 } 20 21 public String detail(Integer id) { 22 System.out.println("detail()"); 23 oci = db.find(id); 24 return "detail-content.xhtml"; 25 } 26//getter, setter 27}
Db.java
Java
1@Stateful 2 3public class Db<T> implements Serializable { 4 5 @PersistenceContext 6 private EntityManager em; 7 protected Class<T> entityClass; 8 9public Information find(Integer id) throws IllegalArgumentException { 10 return em.find(Information.class, id); 11 } 12public List<Information> filterTable(String search) { 13 if(search == null) return null; 14 Query query = em.createQuery("SELECT c FROM Information c WHERE c.addressOne LIKE :search", Information.class); 15 query.setParameter("search", "%" + search + "%"); 16 return query.getResultList(); 17 }
find.xhtml
xhtml
1 <h:form> 2 <p:inputText id="search" value="#{bb.search}" style="width:150px"/> <br/> 3 <br/> 4 <h:commandLink type="submit" value="検索" action="#{bb.filt()}" class="Button"/> 5 6 7 <p:dataTable id="examplej" class="table couple-table" 8 var="info" value="#{bb.coupleList}" widgetVar="couple" rows="10" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" 9 rowsPerPageTemplate="5,10,15" paginator="true" emptyMessage="住所を入力して検索してください"> 10 <f:facet name="header"> 11 <!--<p:outputPanel>--> 12 <h:outputText value="地域で検索" /> 13 14 <p:column class="column-couple"> 15 <h:outputText value="#{info.firstName}" />さん 16 <h:outputText value="#{info.id}" /> 17 18 19 </p:column> 20 21 <p:column class="column-couple"> 22 <h:outputText value="#{info.addressOne}" /> 23 </p:column> 24 25 26 <p:column class="column-couple"> 27 <h:commandLink action="#{bb.detail(info.id)}"><!-- 試したもの:bb.oci, bb.coupleList, filt()でOldcoupleInformationをflashでdetail()に渡す--> 28 詳細へ 29 </h:commandLink> 30 </p:column> 31 32 33 </p:dataTable> 34 </h:form> 35
”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できなくなった覚えがあります。
長くなりましたが、なんとかこの機能を実装したいと思っているので、お分かりになる方ご回答のほうよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー