2012-04-05 374 views
2

我在付費角色系統上工作,一旦用戶刷新瀏覽器,我需要刷新該頁面中可用的統計數據(統計數據應該從數據庫中獲取並顯示)。但是現在它不能正常工作,因爲在頁面刷新中,java代碼沒有被調用,而是使用先前的數據加載緩存頁面。 我試着修復它添加下面的代碼,但它沒有工作。在瀏覽器刷新中刷新導覽面板

@Override 
protected void setHeaders(WebResponse response) { 
    response.setHeader("Cache-Control", 
      "no-cache, max-age=0,must-revalidate, no-store"); 
} 

任何人都知道這個問題的解決方法? 謝謝!
這是最初的代碼

ManageCredits.html

<wicket:head> 
    <wicket:link> 
    <link rel="stylesheet" type="text/css" href="../css/style.css"/> 
    </wicket:link> 
</wicket:head> 
<wicket:panel xmlns:wicket="http://wicket.apache.org/"> 
     <div class="offercount-container round-border"> 
     <div class="manage-credits-lbl"><span>Manage Credits</span></div> 

       <div> 
       <ul> 
        <li>Balance amout:<span wicket:id="balanceAmtLbl" >0</span></li> 
        <li>Number if transactions<span wicket:id="transactionLbl" >0</span></li> 
        </ul> 
       </div> 
     </div> 
</wicket:panel> 


ManageCredits.java

import com.payrole.service.Offer; 
import com.payrole.service.OfferService; 
import com.payrole.service.ServiceLocator; 
import com.payrole.wicket.PayroleLabel; 
import java.text.Format;`enter code here` 
import org.apache.wicket.markup.html.panel.Panel; 

public class OfferFanSummaryPanel extends Panel{  
     private long balance; 
     private long transactionCount; 

     public OfferFanSummaryPanel(String id){ 
      super(id); 
     } 
     public OfferFanSummaryPanel(String id, Offer offer) { 
       super(id); 
       balance = (client.getBalance()==null) ? 0 : client.getBalance(); 
       transactionCount = (client.getTransactionCount()==null) ? 0 : client.getTransactionCount(); 
       initTransactionSummary();    
     } 
     private void initTransactionSummary(){ 
       PayroleLabel balanceAmtLbl = new PayroleLabel("balanceAmtLbl", String.valueOf(balanceAmt), PayroleLabel.NUMBER); 
       add(balanceAmtLbl); 
       PayroleLabel transactionLbl = new PayroleLabel("transactionLbl", String.valueOf(transaction), PayroleLabel.NUMBER); 
       add(transactionLbl);     
     }  
} 

回答

5

您必須使用動態模型。例如,如果你使用類似

add(new Label("name", Model.of(person.getName())); 

你將永遠有顯示相同的字符串:您提供的person.getName()結果的標籤。相反,您必須使用模型實現來計算每個呈現請求的值,例如PropertyModelAbstractReadOnlyModel,並覆蓋getObject()

Wicket只在您的頁面上創建組件一次,並且每個請求都會要求組件呈現它們自己。我想你的代碼不會被調用,因爲它在組件(頁面,面板)的構造函數或onInitialze()中。

如果這不夠清楚,請張貼一些代碼,你在做什麼。

編輯:據猜測,您使用的是靜態模型(與具有固定值的模型相比,在每個渲染請求上計算其值的模型)。我沒有在你的代碼中看到emailFanCount和openCount來自哪裏,但是假設這些得到了計算。嘗試在你的對象任何一個使用PropertyModel(客戶端,..),或添加public String getXXX() {}你面板和構建類似的標籤是:

Label label = new Label("someID", new PropertyModel(this, "XXX")); 

其中this是面板。

有在in the Wicket Wiki看看一個解釋

+0

非常感謝您的答覆,但它不是我真的不清楚。所以我添加了一段代碼。 – user1266343 2012-04-09 00:37:26

+0

@ user1266343我更新了我的答案 – bert 2012-04-09 13:41:01

+0

我試過這種方式,但它仍然不會在頁面更新中更新:( – user1266343 2012-04-10 07:36:56

0

在HTML中,<head>標籤添加這些行:

<meta http-equiv="cache-control" content="no-cache"/> 
    <meta http-equiv="pragma" content="no-cache" /> 
    <meta http-equiv="expires" content="-1" /> 

這將是l強制瀏覽器從服務器檢索詳細信息。 您也可以在每次刷新頁面時實施url重寫以從服務器獲取數據。 希望這有助於。

0

使用元標記並不能確保您的中間代理不會緩存頁面。嘗試將「Cache-Control」標頭與「Expires」(HTTP 1.0標頭)以及所有瀏覽器和代理支持結合使用。

Wikipedia

此頭字段(緩存控制)是HTTP 1.1版的一部分,並且是通過 一些高速緩存和瀏覽器忽略。可以通過設置 將Expires HTTP版本1.0標題字段值設置爲比響應時間早 的時間來模擬。

Here你有一個很好的關於HTTP緩存的教程。