Dear Wicket Contributers,

first and foremost thank you for working on and maintaining Wicket for such a long time and doing such a stellar job with it!

I have been using Wicket for about 10 years now. So far it has worked great in a lot of cases. However, having separate markup files and having to do target.add(component) manually, are the 2 most annoying things in working with Wicket for me. If there is any interest, I can go into more detail.

So, for some time now, I have been thinking about a DSL for Wicket in Kotlin, akin to kotlinx.html to stop separating markup and components. You can find the dumbest and most naive thing I could possibly think of here:
https://gist.github.com/noobymatze/f27ca43f528f1d2e3fe1454baab5f0a6

The idea is, that there is a class DSLWebPage, which can be subclassed to implement an abstract render() method, which defines HTML and components at the same time.

```
class ExamplePage: DSLWebPage() {

    fun PageBuilder.render() = html {
        head {
        }

        body {
            h1 {
                component(Label("greet", "Hello World!"))
                text("Some long text.")
            }
        }
    }

}
```

The render() method will be called during getMarkupResourceStream. The component function will automatically create a suitable HTML fragment with a wicket:id='greet'. The problem with this naive approach is, that it renders the markup + components every time a request is made, sometimes even twice during a single request. That's because I disabled markup caching, because the default caching would only render the markup once.

There are a few approaches I can see here.

1. Define a cache key per instance (dunno maybe a UUID would do here). Assumption: There is no dynamic HTML. 2. Call render() in the constructor of DSLWebPage, which could cause serious troubles. 3. Cache the markup myself inside the page. I am not sure, whether this would have any bad consequences. I believe the markup cache may be able to optimize the storage, which would not be possible in that case. 4. Call render in onInitialize. That won't work, because getMarkupResourceStream is called before onInitialize and I haven't found another method suitable. Maybe I overlooked something.
5. Just don't cache, I am not sure, what that would mean for performance.

I would tend to go with Option 1, but is there anything I am overlooking here? Do you think, any of this might be problematic for performance or any other reason?

I apologize, if this should have been asked in the user mailing list.

Thanks for reading this far.

Best regards

Matthias

Reply via email to