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

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

Wicket 处于开发模式。

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

我的应用程序位于 localhost 8080

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

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

【问题讨论】:

  • 您可以使用Jrebel 强制重新加载应用服务器上更改的源。不过,这是有代价的。

标签: java wicket reload


【解决方案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页面上很少添加静态组件。

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        相关资源
        最近更新 更多