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);                
        }     
}
4

3 回答 3

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小组在哪里。

Wicket Wiki中查看解释

于 2012-04-05T08:31:57.030 回答
0

在您的 HTML 中,在<head>tag 中添加这些行:

  <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

使用元标记并不能确保中间代理不会缓存页面。尝试将“Cache-Control”标头与 HTTP 1.0 标头以及所有浏览器和代理支持的“Expires”结合使用。

来自维基百科

此标头字段 (Cache-Control) 是 HTTP 1.1 版的一部分,并且被某些缓存和浏览器忽略。可以通过将 Expires HTTP 版本 1.0 标头字段值设置为早于响应时间的时间来模拟它。

Here你有一个关于HTTP缓存的好教程。

于 2012-04-05T07:47:23.620 回答