2012-04-05 18 views
2

私は有料ロールシステムで作業しています。ユーザーがブラウザを更新すると、そのページで使用可能な統計情報を更新する必要があります(統計はDBとディスプレイから取得する必要があります)。しかし、今は正しく動作しません。ページリフレッシュでJavaコードが呼び出されるのではなく、キャッシュされたページを以前のデータでロードします。 以下のコードを追加して修正しようとしましたが、うまく機能しませんでした。ブラウザのリフレッシュでウィジェットパネルをリフレッシュ

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

誰でもこの修正を知っていますか? ありがとう!
これは、初期のコードをHTMLで

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()の結果にラベルを提供しています。代わりに、PropertyModelまたはAbstractReadOnlyModelgetObject()がオーバーライドされた場合など、各レンダリング要求の値を計算するモデル実装を使用する必要があります。

Wicketは、ページ上にコンポーネントを1回だけ作成し、各リクエストでコンポーネントを作成するように要求します。コンストラクタやコンポーネント(ページ、パネル)のonInitialze()にあるため、コードが呼び出されないと思います。

これで十分でない場合は、実行中のコードを投稿してください。

編集:推測するように、各レンダリング要求でその値を計算するモデルではなく、静的モデル(固定値を持つモデル)を使用しています。あなたのコードでemailFanCountとopenCountがどこから来たのか分かりませんが、これは何とか計算されると仮定しています。 thisがパネルで

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

:どちらかの一つのオブジェクト(クライアント、...)または、あなたパネルにpublic String getXXX() {}を追加し、これに似た、あなたのラベルを構築する上でPropertyModelを使用してみてください。

は説明

+0

返事をありがとうたくさんのためのin the Wicket Wikiで見てください、それは私のために本当に明確ではありませんでした。そこで私のコードのセクションを追加しました。 – user1266343

+0

@ user1266343私の回答を更新しました – bert

+0

私はこの方法を試しましたが、それでもページの更新で更新されません:( – user1266343

0

<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

メタタグを使用しても、中間プロキシがページをキャッシュしないことは保証されません。 HTTP 1.0ヘッダーで、すべてのブラウザーとプロキシがサポートする「Expires」と組み合わせて、「Cache-Control」ヘッダーを使用してみてください。 Wikipediaから

このヘッダーフィールド(のCache-Control)がHTTPバージョン1.1の一部であり、いくつかのキャッシュおよびブラウザによって無視 あります。 Expires HTTP version 1.0ヘッダーフィールドの値を より前の時間に設定することでシミュレートできます。

HereあなたはHTTPキャッシュについての良いチュートリアルを持っています。

関連する問題