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