在浏览器刷新中刷新wicket面板

时间:2012-04-05 05:29:13

标签: java wicket page-refresh browser-refresh

我在付费角色系统上工作,一旦用户刷新浏览器,我需要刷新该页面中的统计数据(统计数据应该来自数据库并显示)。但是现在它无法正常工作,在页面刷新中,不会调用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);                
        }     
}

3 个答案:

答案 0 :(得分: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是Panel。

查看in the Wicket Wiki以获取解释

答案 1 :(得分:0)

在HTML中,在<head>标记中添加以下行:

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

这将强制浏览器从服务器检索详细信息。 每次刷新页面时,您还可以实现URL重写以从服务器获取数据。 希望这会有所帮助。

答案 2 :(得分:0)

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

来自Wikipedia

  

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

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