Wicket:刷新浏览器时未加载对 HTML 或 Java 源的更改

Posted

技术标签:

【中文标题】Wicket:刷新浏览器时未加载对 HTML 或 Java 源的更改【英文标题】:Wicket: Changes to HTML or Java Source is not loaded when browser is refreshed 【发布时间】:2014-10-03 17:53:48 【问题描述】:

我正在关注 Wicket 用户指南的“Hello World”项目。

Wicket 处于开发模式。

当我更改 HomePage.html 并重新加载浏览器时,未显示更改。如果我重新启动 WicketApplication,则会显示更改。

我的应用程序位于 localhost 8080

我的所有研究都表明,当应用程序处于开发模式(确实如此)时,应该自动加载更改。

我没有更改默认 Wicket 安装的任何配置。

【问题讨论】:

您可以使用Jrebel 强制重新加载应用服务器上更改的源。不过,这是有代价的。 【参考方案1】:

我想出了一个不同的解决方案。因为我使用的是 Google App Engine,所以当我添加代码时 getResourceSettings().setResourcePollFrequency(Duration.ONE_SECOND) 到我的应用程序 init() 方法,应用程序无法加载页面。这与 App Engine 不支持多线程这一事实有关。正因为如此,我不得不找到一个不同的解决方案。相反,我决定当我处于开发模式时,我会完全删除 MarkupCache。为此,我需要创建一个新的无缓存 MarkupFactory。

public class CachelessMarkupFactory extends MarkupFactory 

  @Override
  public IMarkupCache getMarkupCache() 
    return null;
  

  @Override
  public boolean hasMarkupCache()
  
    return false;
  

然后在我的 WebApplication 代码中,我将新的 CachlessMarkupFactory 设置为默认 MarkupFactory。

@Override
protected void init()

    super.init();

    //in dev mode, disable markup cache
    if(isDevelopmentServer())
    
        getMarkupSettings().setMarkupFactory(new CachelessMarkupFactory());
    

【讨论】:

【参考方案2】:

这是我找到的解决方案。

对于类重载问题,我在 IntelliJ 中通过调试模式运行“启动”应用程序。在调试模式下,IntelliJ 会重新加载已更改的类。

对于 HTML 重新加载问题,我将以下代码放在 WicketApplication init() 方法中:

// add your configuration here
getResourceSettings().setResourcePollFrequency( Duration.ONE_SECOND);
getResourceSettings().setDefaultCacheDuration(Duration.ONE_SECOND);

List list = new ArrayList();
list.add( new IResourceFinder() 
    @Override
    public IResourceStream find( Class<?> clazz, String pathname ) 
        File f = new File( "C:/MyProject/src/main/java/" + pathname );
        if ( f.exists() ) 
            return new FileResourceStream( f );
        
        return null;
    
 );

getResourceSettings().setResourceFinders( list );

getResourceSettings().setUseDefaultOnMissingResource(true);

【讨论】:

【参考方案3】:

不,如果您将应用程序部署到应用程序服务器(如 tomcat、glassfish 等),那么真正的 .html 会显示在位于应用程序服务器文件夹某处的浏览器中。

对于 glassfish,它可以是“/path_to_glassfish/glassfish/domains/domainXX/applications/APP_NAME/WEB-INF/classes/...”。 因此,即使您在项目中更改了 .html,也必须重新部署这些更改。

Wicket JavaDoc 说:

如果配置类型为 DEVELOPMENT,则轮询资源 变化...

是的,但适用于位于相应文件夹的资源。我认为this wicket forum thread 会给你一些关于如何实现你想要的行为的答案。这篇文章实际上是针对旧的wicket版本的,但我认为它也适用于较新的版本。

在我们公司,我们使用firebug或chrome控制台直接在浏览器中对组件进行样式化,而无需重新部署应用程序,这对我们来说已经足够了,因为html页面上很少添加静态组件。

【讨论】:

以上是关于Wicket:刷新浏览器时未加载对 HTML 或 Java 源的更改的主要内容,如果未能解决你的问题,请参考以下文章

当我在 Chrome 中保存对 html 文件的更改时自动重新加载浏览器?

刷新页面时未触发 Angular callHooks

使用 ajax 加载模板时未呈现脚本

列表视图在 jQuery mobile/phonegap 中初始时未加载

Ajax中的load()方法实现指定区域加载或刷新html与jsp

手动加载 nib 文件时未调用 init 或 initWithNibName