2015-01-07 2 views
0

파일을 제출하기 전에 사용자에게 비밀번호를 입력하라고합니다. 그러므로 <h:panelGroup>은 제출 버튼을 누른 후에 렌더링되어야합니다. 그러나 <h:panelGoup>은 렌더링되지 않습니다.빈 필드 값을 기반으로 양식 렌더링

test.xhtml

<ui:define name="body"> 
    <h:form id="uploadForm" enctype="multipart/form-data"> 
     <table> 
      <t:inputFileUpload id="uploadedFile" storage="file" 
           value="#{UpdateBean.uploadedFile}"/> 
      <h:commandButton value="Submit" action="#{UpdateBean.submit()}"/> 
     </table> 
    </h:form> 

    <h:panelGroup id="checkPassword" rendered="#{UpdateBean.submitIsPerformed}"> 
     <h:outputText id="message" value="${UpdateBean.message}" /> 
     <h:inputText id="password" value="#{UpdateBean.password}" /> 
     <h:commandButton value="submit" action="#{UpdateBean.submitPassword()}"/> 
    </h:panelGroup> 
</ui:define> 

UpdateBean.java

@ManagedBean(name = "UpdateBean") 
@SessionScoped 
public class UpdateBean { 
    protected boolean submitIsPerformed = false; 
    protected String password = ""; 
    protected String message = "Input your password "; 

    // omit getter and setter 

    public void submit() { 
     this.setSubmitIsPerformed(true); 
     System.out.println(submitIsPerformed); // output is true 

     while(true) { 
      if(password.equals("123")) { 
       break; 
      } 
     } 

     // then process uploadedFile 
    } 

    public void submitPassword(){ 
     if(password.equals("123")) { 
      message = "Password confirmed !"; 
     } else { 
      message = "Password is wrong !"; 
     } 
    } 
} 
+0

은 (참)'정의? – ryanyuyu

+0

@ryanyuyu submitIsPerformed에 대한 설정자입니다. – Bryan

+0

@Tiny 당신이 의미하는 ? 나는 이것을 시도했지만 작동하지 않는다. – Bryan

답변

2

귀하의 실수는 submit() 방법에 있습니다

while(true)
while(true) { 
    if(password.equals("123")) { 
     break; 
    } 
} 

는 복귀 작업 방법을 방지 할 수 있습니다. 조치 메소드가 리턴하지 않는 한, 서버는 갱신 된보기로 HTTP 응답을 리턴하지 않습니다. 효과적으로 서버의 CPU 중 하나가 100 %로 고정되어 있으며 클라이언트가 무한히 HTTP 응답을 기다리고 있습니다. 브라우저의 진행 표시기가있는 경우 브라우저에서 확인하십시오.

당신은 기본적으로 즉시 부울 전환 후 반환해야합니다 :

public void submit() { 
    submitIsPerformed = true; 
} 

그리고 암호 검사를 수행하고 submitPassword() 방법으로 저장 파일을 업로드합니다. 그러나 동일한 형식이 아니므로 업로드 된 파일이 손실됩니다. 같은 양식에 넣어도 2 번 업로드됩니다. 그러나 그것은 다른 문제입니다. 나는 그 일을 다른 방향으로하는 것이 좋습니다.

+0

고마워요! 당신은 해결책을 찾았습니다. 나는 또한 uploadFile을 알아 냈다. – Bryan

+0

반갑습니다. 당신이 여기 새로 왔기 때문에 구체적인 문제를 이해하고 해결하는 데 도움이 될 때마다 대답을 표시하는 것을 잊지 마십시오. 또한 [답변 수락 방법은 무엇입니까?] (http://meta.stackexchange.com/a/5235) [이전에 질문한 질문] (http://stackoverflow.com/users/3987006/bryan)도 마찬가지입니다. 해당되는 경우,? tab = questions). – BalusC

+0

다시 한번 감사드립니다! 귀하의 의견에 대해 질문이 있습니다. "조치 방법이 반환되지 않으면 서버는 업데이트 된보기로 HTTP 응답을 반환하지 않습니다." 한 시나리오에서 파일을 업로드 한 다음 데이터를 데이터베이스에 유지하려고합니다. 새로운 데이터가있는 경우 사용자에게 데이터를 유지할지 여부를 묻는 창을 표시하려고합니다. 따라서 양식을 사용하여이 문제를 해결할 수는 없습니까? 어떤 제안이 있으십니까? – Bryan

0

@BalusC에서 제안한 내용을 따르십시오. 이것이 내 업데이트 된 코드입니다.

test.xhtml

<ui:define name="body"> 
     <h:form> 
         <h:commandButton value="Upload a file" action="#{UpdateBean.submit()}"> 
          <f:ajax render=":checkPassword" /> 
         </h:commandButton> 
     </h:form> 

     <h:form id="checkPassword" styleClass="toggle" rendered="#{UpdateBean.submitIsPerformed}"> 
      <table> 
       <tr> 
        <td><h:outputText value="Password" /></td> 
        <td><h:inputText id="password" value="#{UpdateBean.password}" /></td> 
        <td> 
        <h:commandButton value="Submit" action="#{UpdateBean.submitPassword()}"> 
         <f:ajax execute="password" render=":uploadFile" /> 
        </h:commandButton> 
        </td> 
       </tr> 
      </table> 
     </h:form> 

     <h:form id="uploadFile" enctype="multipart/form-data" 
       styleClass="toggle" rendered="#{UpdateBean.uploadFileIsPerformed}"> 

      <t:inputFileUpload id="uploadedFile" storage="file" 
           value="#{UpdateBean.uploadedFile}"> 
      </t:inputFileUpload> 
      <h:commandButton value="Submit" action="#{UpdateBean.uploadFile()}" /> 
     </h:form> 
    </ui:define> 

UploadBean.java는`this.setSubmitIsPerformed됩니다

public String submit() { 

     setSubmitIsPerformed(true); 
     return "SUCCESS"; 
    } 

    public String submitPassword(){ 
     if(password.equals("123"){ 
      setUploadFileIsPerformed(true); 
      setSubmitIsPerformed(false); 
     } 
     return "SUCCESS"; 
    } 

    public String uploadFile(){ 
     return "SUCCESS"; 
    } 
관련 문제