在刷新浏览器刷新一个小门面板(Refreshing a wicket Panel in browse

2019-09-16 08:32发布

进出口工作付费角色系统上,一旦用户刷新浏览器,我需要刷新该页面提供的统计数据(统计资料应当从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);                
        }     
}

Answer 1:

你必须使用动态模型。 例如,如果你使用类似

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

你将永远有显示相同的字符串:您提供的标签与结果person.getName() 。 相反,你必须使用计算每个渲染请求中的值,例如模型实现PropertyModelAbstractReadOnlyModelgetObject()覆盖。

检票创建你的页面上的组件只有一次,每个请求要求组件来呈现自己。 我猜你的代码不会被调用,因为它是在构造函数或onInitialze()的组件(页,面板)的。

如果这还不够清晰,请发表你在做什么,一些代码。

编辑:猜,你正在使用静态模型(模型,有一个固定的值,而不是该计算其价值在每个渲染要求的​​型号)。 我不中你的代码,看到emailFanCount和openCount从何而来,但假设这些莫名其妙地得到计算。 尝试在你的对象任何一个使用PropertyModel(客户端,..),或添加一个public String getXXX() {}你面板和构建类似这样的标签:

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

其中, this是面板。

看看在在检票维基作出解释



Answer 2:

在你的HTML,添加这些行<head>标签:

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

这将迫使浏览器来检索服务器的详细信息。 您也可以实现URL重写在每次刷新页面时从服务器获取数据。 希望这可以帮助。



Answer 3:

使用meta标签不向您保证,中间代理将不缓存页。 尝试使用“缓存控制”头结合“到期”这是一个HTTP 1.0标头和所有的浏览器和代理的支持。

从维基百科 :

此报头字段(缓存控制)是HTTP 1.1版的一部分,并且由一些高速缓存和浏览器忽略。 它可以通过设置过期HTTP版本1.0报头字段值,以早于该响应时间的时间进行模拟。

在这里您对HTTP缓存一个很好的教程。



文章来源: Refreshing a wicket Panel in browser refresh