2017-12-12 16 views
0

JSF로 Java EJB를 사용하고 있습니다.Ajax가 첫 번째 제출시 작동하지 않습니다. 페이지 새로 고침 후 결과가 새로 고침됩니다.

내가 뭘하고있는 것은 데이터베이스에서 간단한 검색 결과이며 JSF를 사용하여 테이블에 표시하는 것입니다. 그러나 처음 제출할 때 결과가 나타나지 않는 이유는 무엇입니까? 두 번째로 결과 만 나타납니다.

다음은 내 JSF 페이지 코드

<h:form id="wholeForm"> 
    <p:panelGrid id="resultTable" styleClass="result_table1" > 
     <p:row> 
      <p:column> 
       <div align="center" id="font-size1"> 
        <h:selectOneRadio value="#{scanResult.typeOfScan}"> 
         <f:selectItem itemValue="Carrier" itemLabel="Carrier"></f:selectItem> 
         <f:selectItem itemValue="Slot" itemLabel="Slot"></f:selectItem> 
         <f:selectItem itemValue="HD" itemLabel="HD"></f:selectItem> 
         <p:ajax event="change"></p:ajax> 
        </h:selectOneRadio> 
        Scan: <p:inputText styleClass="searchField" id="counter" value="#{scanResult.serialNumber}" a:autofocus="true"> 
         <p:ajax event="keydown" update="wholeForm" onstart="if (event.keyCode != 13) { return false;}" listener="#{scanResult.checkResult()}" /> 

        </p:inputText> 
        <br/><br/> 
       </div> 
      </p:column> 
     </p:row> 
    </p:panelGrid> 

    <p:panelGrid id="resultTable1" styleClass="result_table1" rendered="#{not empty scanResult.scanResultCarrier}" > 

     <c:forEach items="#{scanResult.scanResultCarrier}" var="result" > 
      <!-- ..do something and call out result --> 
       </p:column> 
      </p:row> 
     </c:forEach> 
    </p:panelGrid> 
</h:form> 

입니다 그리고 내 관리 빈은 내 결과를 인쇄 할 System.out.println(lsitofresult.size());를 사용

@Named(value = "scanResult") 
@SessionScoped 
public class scanResult implements Serializable { 

    //Some code here 

    public void checkResult() { 
     scanResultCarrier = new ArrayList<>(); 
     scanResultSlot = new ArrayList<>(); 

     System.out.println("checking"); 
     if (typeOfScan.equals("Carrier")) { 
      System.out.println("Serial " + serialNumber); 
      scanResultCarrier = scanresultcarrierFacade.searchResultCarrier(serialNumber); 
      System.out.println(scanResultCarrier.size()); 
     } else if (typeOfScan.equals("Slot")) { 
      scanResultSlot = scanresultslotFacade.searchResultSlot(serialNumber); 
     } else if (typeOfScan.equals("HD")) { 

     } else { 

     } 
     serialNumber = ""; 
    } 
} 

다음과 같이하고 결과가 비어 있지. 데이터베이스에서 결과를 성공적으로 검색한다는 의미입니다.

그러나 입력 결과를 클릭하면 내 결과 테이블을 볼 수 없습니다.
는 그럼 난 내 urlhttp://localhost:8080/outgoingScanSystem-war/faces/index.xhtml;jsessionid=8b6cefa932ff60984607ee38ec13

아래

같은 것을 알 내가 내 페이지를 새로 고침 한 후, 그 결과는 다시 나타납니다.
그리고 내 URL 변화 :

나는 이유를 알고있다

http://localhost:8080/outgoingScanSystem-war/faces/index.xhtml

? URL과 관련이 있습니까? 어디에서 문제를 해결해야할지 모르겠습니다. 누구나 가이드 라인을 줄 수 있습니까?

+0

https://stackoverflow.com/questions/9010734/why-do -i-need-to-nest-a-component-with-another-component-w/ –

+0

JSF 2를 사용하고 있다고 가정하고 대답했습니다. .엑스. –

답변

0

여기에 몇 가지 문제점이 있습니다. 우선, 관리 범위가 뷰 범위 여야하는 동안 세션 범위를 사용하고 있습니다 (여기 세션을 사용할 이유는 없습니다, 아래 링크 참조). 이것이 페이지를 새로 고침 할 때 결과가 표시되는 이유입니다.

둘째, 양식에서 검색 결과를 제외하고 싶습니다. 검색과 동일한 형태로 존재할 이유가 없습니다. 당신이 Primefaces를 사용하고, 나는이에 - 아약스 기반 호출을 수행하기 위해 그 p:remoteCommand 도구를 살펴 보시기 바랍니다,

<p:ajax event="keydown" update="resultTable1" onstart="if (event.keyCode != 13) { return false;}" listener="#{scanResult.checkResult()}" /> 

셋째하십시오 searh을 수행 할 때 다음, 당신은 단지 결과 목록을 업데이트해야합니다 JS 코드에서 콩을 직접. 이 방법을 사용하면 두 번째 문제를 피할 수 있습니다. 아약스 시작 이벤트 (표준 호출은 호출되지 않을 수도 있음)를 보내는 표준 양식을 방해하는 것으로 보입니다. 당신이 뭔가를 할 수 있습니다 :

<p:remoteCommand name="search" update="resultTable1" actionListener="#{scanResult.checkResult}" /> 
<p:inputText styleClass="searchField" id="counter" value="#{scanResult.serialNumber}" 
    a:autofocus="true" onkeypress="if (event.keyCode != 13) {search(); return false;}"> 
    <!-- Update the input text value in the bean for each pressed key --> 
    <p:ajax event="keydown" /> 
</p:inputText> 

항목 :

+1

좋아 .. 그것은 일이야 .. 고마워! –