【问题标题】:Generating commented-out content with Wicket使用 Wicket 生成注释掉的内容
【发布时间】:2011-04-25 10:30:05
【问题描述】:

出于调试原因,并且一时兴起,我想在 Wicket 页面的 HTML 输出中包含某些信息,该输出包含在 HTML cmets 中

输出将类似于...

<!-- 
<div wicket:id="foo"> 1234 </div>
-->

...其中“1234”是一些有趣的、动态创建的信息。

我试过了,没用:

  • &lt;!-- &lt;div wicket:id="foo"&gt;&lt;/div&gt; --&gt; → Wicket 抱怨 HTML 页面中缺少 id 为“foo”的元素
  • 包含在&lt;wicket:remove&gt;中→此类部分不能包含带有wicket:id的元素
  • label.setVisible(false) → Wicket 根本不输出标签
  • new Label("foo", "&lt;!-- " + foo + " --&gt;")&lt;&gt; 被转义

那么,你可以用 Wicket 做到这一点(很容易),还是我应该忘记它?

【问题讨论】:

    标签: java comments wicket


    【解决方案1】:

    这个怎么样?

    class CommentOutModifier extends AbstractBehavior {
        private static final long serialVersionUID = 1L;
    
        @Override
        public void beforeRender(Component component) {
            component.getResponse().write("<!--");
        }
    
        @Override
        public void onRendered(Component component) {
          component.getResponse().write("-->");
        }
    }
    
    add(new Label("tohide", "Hi, can you see me?").add(new CommentOutModifier()));
    

    然后,把:

    <span wicket:id="tohide"></span>
    

    在您的标记中将产生:

    <!--<span>Hi, can you see me?</span>-->
    

    【讨论】:

    • 该解决方案的好处是您可以将其应用于任何组件而无需更改组件本身。
    • 谢谢!这看起来很优雅。
    • 如果这如我所怀疑的那样有效,那么它是一个非常优雅的解决方案,感谢 :) 为了完整起见,我正在修改我的答案以实施此方法,但我认为 Eelco 应该得到这个答案.
    • 有效;测试它以确保。但是不要相信我的话,让它旋转:-)
    • 对于 Wicket 1.5,解决方案略有改变。它应该扩展 Behavior,而不是 AbstractBehavior,第二种方法应该是 afterRender() 而不是 onRendered()
    【解决方案2】:
    Label l = new Label("foo", "<!-- " + foo + " -->");
    l.setEscapeModelStrings(false);
    

    它并不漂亮,但它又快又容易。我还相信有一个特定的检票口设置(在应用程序中的某个位置),您可以打开它以防止它剥离 cmets,但老实说我不记得我在哪里看到它。

    编辑:添加评论工作者

    Edit2:为了完整性而实施了 Eelco 的行为。反正比我的方法好。

    public enum Comment {
    ;
        /**
         * creates a wicket comment (extends label
         */
        public static Label newComment(String id, String comment) {
            Label label = new Label(id, comment);
            label.add(commentBehaviour());
            return label;
        }
    
        /**
         * Adds &lt;!-- and --&gt around the component.
         */
        public static AbstractBehavior commentBehaviour() {
            return new AbstractBehavior() {
                private static final long serialVersionUID = 1L;
    
                @Override
                public void beforeRender(Component component) {
                    component.getResponse().write("<!--");
                }
    
                @Override
                public void onRendered(Component component) {
                    component.getResponse().write("--!>");
                }
            };
        }
    }
    
    add(Comment.newComment("comment","Something worth commenting upon"));
    

    【讨论】:

    • 谢谢;这可以满足我目前的需要。 (并且可以使用String.format() 使其更简洁一些。)我会在一段时间后接受这个,除非出现明显更好的东西。
    • @Jonik 我认为这是 的方法,所以不要屏住呼吸 :)
    • 你启发了我做这个:public enum Comment { ; public static Label newComment(String id, String comment) { Label label = new Label(id, String.format("", comment)); label.setEscapeModelStrings(false);返回标签; } } add(Comment.newComment("comment","foo bar going here"));
    • @Bjorn,您之前的评论如果编辑成答案会更容易阅读。 :) 但出于可重用性,我个人更喜欢这个(类似于我对Tim's answer 的评论):创建自定义组件(CommentedLabel 扩展标签),其构造函数负责添加 HTML cmets 并调用 setEscapeModelStrings(false)。
    • 你说得对,它不是枚举的典型用法,但是我在这种编码风格上取得了巨大的成功,尤其是在 WicketEnvironment 中。枚举是隐式可序列化和单例的(如果需要并且此示例是可实例化的)。它也非常适合较短的类,不需要可序列化的 ID、私有构造函数等,Eclipse 很好地接受了它们。不管你是对的,如果我们有一个 WicketUtil,它当然应该去那里:)
    【解决方案3】:

    玩了一会儿就到了这个:

    Label label = new Label("commented", "Content") {
        @Override
        protected void onComponentTag(ComponentTag tag) {
            tag.setName("!--");
            super.onComponentTag(tag);
        }
    };
    add(label);
    

    但这并不漂亮..:&lt;span wicket:id="commented"&gt;This will be replaced&lt;/span&gt;
    变为:&lt;!-- wicket:id="commented"&gt;Content&lt;/!--&gt;

    但至少不会干扰布局/css样式。

    【讨论】:

    • +1,有趣的 hack。 :) 这样做的好处是您可以创建一个覆盖 onComponentTag() 的自定义组件(CommentedLabel 扩展标签),然后在页面上使用它非常干净。
    • ...当然,您也可以使用 Bjorn 的解决方案来做到这一点,所以没有太大的区别。我想这是一个品味问题,其中哪一个不那么“不漂亮”。 :)
    • Wicket 是否转换结束标签?还是您的意思是&lt;!-- wicket:id="commented"&gt;Content&lt;/!--&gt;? (注意! - 这并不重要。)
    • 是的,@jensgram 是对的:它显示为 &lt;/!--&gt;(但仍然有效)
    • @jensgram 是的,你是对的..关闭标签有一个!以及..(没有复制过去那部分.. =\)
    猜你喜欢
    • 2014-05-04
    • 2015-08-07
    • 2017-12-26
    • 2017-09-21
    • 2014-03-05
    • 2020-07-25
    • 2014-01-08
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多