2012-12-27 50 views
2

我在發佈到外部信用卡處理器的JSF頁面上有以下表單。 我想使用JSF操作方法,所以我可以編寫一些業務邏輯。我如何從操作方法發佈帖子,幷包含以下字段?在POST到外部URL之前執行一些JSF業務邏輯

 <form action="#{checkoutBean.sagepayURL}" method="post" 
      id="SagePayForm" name="SagePayForm"> 

      <input type="hidden" name="VPSProtocol" 
       value="#{checkoutBean.sagepayMessage.vpsProtocol}" /> <input 
       type="hidden" name="TxType" 
       value="#{checkoutBean.sagepayMessage.transactionType}" /> <input 
       type="hidden" name="Vendor" 
       value="#{checkoutBean.sagepayMessage.vendor}" /> <input 
       type="hidden" name="Crypt" class="crypt" 
       value="#{checkoutBean.sagepayMessage.crypt}" /> <input 
       type="submit" 
       value="Proceed to Checkout" /> 

     </form> 

回答

2

您可以使用JavaScript提交隱藏的JSF ajax表單,該表單又會呈現提交付款表單的腳本。

<form action="#{checkoutBean.sagepayURL}" method="post" 
    id="SagePayForm" name="SagePayForm"> 
    ... 
    <input type="button" value="Proceed to Checkout" 
     onclick="document.getElementById('hiddenForm:link').click()" /> 
</form> 

<h:form id="hiddenForm" style="display:none"> 
    <h:commandLink id="link" action="#{checkoutBean.preprocess}"> 
     <f:ajax render="@form" /> 
    </h:commandLink> 
    <h:outputScript rendered="#{checkoutBean.preprocessed}"> 
     document.getElementById("SagePayForm").submit(); 
    </h:outputScript> 
</h:form> 

private boolean preprocessed; // +getter 

public void preprocess() { 
    // ... 

    preprocessed = true; 
} 

根據您的問題的歷史,你似乎可以用OmniFaces,在這種情況下,你也可以把它簡化使用<o:commandScript>如下:

<form action="#{checkoutBean.sagepayURL}" method="post" 
    id="SagePayForm" name="SagePayForm"> 
    ... 
    <input type="button" value="Proceed to Checkout" onclick="preprocess()" /> 
</form> 

<h:form> 
    <o:commandScript name="preprocess" action="#{checkoutBean.preprocess}" 
     oncomplete="document.getElementById('SagePayForm').submit()" /> 
</h:form> 
+0

這沒有工作...我得到以下錯誤:httpError:HTTP傳輸返回0狀態代碼。這通常是混合Ajax和完整請求的結果。 –

+0

如果答案中沒有使用「dead」'',則在'onclick'結尾添加'return false;'以阻止按鈕的默認操作被調用。 – BalusC