2

ペイロールシステムで作業しています。ユーザーがブラウザを更新したら、そのページで利用可能な統計を更新する必要があります(統計はDBから取得して表示する必要があります)。しかし、現在は正しく機能していません。ページのcosで、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);                
        }     
}
4

3 に答える 3

5

動的モデルを使用する必要があります。たとえば、次のようなものを使用する場合

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

常に同じ文字列が表示されます。ラベルに結果を指定しperson.getName()ます。代わりに、たとえばPropertyModel、またはオーバーライドAbstractReadOnlyModelして、各レンダリングリクエストの値を計算するモデル実装を使用する必要があります。getObject()

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

これが十分に明確でない場合は、あなたがしていることについていくつかのコードを投稿してください。

編集:推測どおり、静的モデル(各レンダリング要求で値を計算するモデルとは対照的に、固定値を持つモデル)を使用しています。私はあなたのコードでemailFanCountとopenCountがどこから来ているのかわかりませんが、これらが何らかの方法で計算されると仮定しています。オブジェクト(クライアント、..)のいずれかでPropertyModelを使用するか、public String getXXX() {}パネルにを追加して、次のようなラベルを作成してみてください。

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

thisパネルはどこにありますか。

説明については、WicketWikiをご覧ください。

于 2012-04-05T08:31:57.030 に答える
0

<head>HTMLで、次の行をタグに追加します。

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

これにより、ブラウザはサーバーから詳細を取得するように強制されます。また、ページを更新するたびにサーバーからデータを取得するためにURL書き換えを実装することもできます。お役に立てれば。

于 2012-04-05T06:09:20.060 に答える
0

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

ウィキペディアから:

このヘッダー フィールド (Cache-Control) は HTTP バージョン 1.1 の一部であり、一部のキャッシュやブラウザーでは無視されます。Expires HTTP バージョン 1.0 ヘッダー フィールドの値を応答時間よりも早い時間に設定することでシミュレートできます。

ここには、HTTP キャッシングに関する優れたチュートリアルがあります。

于 2012-04-05T07:47:23.620 に答える