views:

43

answers:

1

I am building a site in Wicket. I need to serve a JavaScript file, xyz.js, for other people/websites to read directly — that is, not to be included in one of my HTML pages.

xyz.js needs some dynamic contents based on the path_info that is provided to it during the request, so it needs to be a template that can be interpolated.

Is there a way for me to build and serve this JS file using Wicket?

If not, what is the best alternative solution? A JSP file?

+2  A: 

EDIT: In my initial answer I overlooked the requirement to make this JavaScript file available from public URL. While researching for a way to to that, I realized that my whole approach was flawed. So, I move my original answer to the end and provide a more-to-the-point answer up here.

On order to publish a text resource on a public URL (JavaScript or CSS), you need to edit your init() method in WicketApplication by adding:

String resourceKey = "DYN_RES_KEY";
//load your text template
final TextTemplate textTemplate = new PackagedTextTemplate(MyPage.class, "script.js", "text/javascript", "UTF-8");
//add the resource
getSharedResources().add(resourceKey, new Resource() {
    @Override
    public IResourceStream getResourceStream() {
        String queryParam = getParameters().getString("paramName");
        //...do whatever you need with the parameters...
        Map<String,Object> vars = new HashMap<String,Object>();
        vars.put("param", queryParam);
        String stringValue = textTemplate.asString(vars);
        return new StringResourceStream(stringValue, textTemplate.getContentType());
    }
});
//mount the resource at some public URL
mountSharedResource("/resource", Application.class.getName() + "/" + resourceKey);
//make alias, optional
getSharedResources().putClassAlias(MyPage.class, "scripts");

DISCLAIMER: This code is not written in IDE and never ran. As such, it might not even compile. Still, it should be enough to illustrate the way this could be accomplished.

This answer is based on "Dynamically Generate a CSS Stylesheet" and "Wicket Dynamic Image URL", see those sources for more details.

ORIGINAL ANSWER (useful if you want to add JavaScript or CSS as externally referenced file to your Wicket page, but not make it publicly visible):

Check out "Dynamically Generate a CSS Stylesheet" page in Wicket wiki and WICKET-2890 issue in JIRA. Since Wicket 1.4.10, the TextTemplateResourceReference class is now part of Wicket core, so you do not need to copy-paste it anymore.

The wiki page mentions CSS page, but the approach is the same for JavaScript or any other non-markup text content.

Neeme Praks
Hi, how do you then make a call to that css/javascript from another site? The instructions only show how to include it on your own pages. Thanks, Tom
Tom
edited my answer
Neeme Praks
Hi Neeme - thanks for that - I shall try it out.
Tom
Don't forget to accept my answer if it turns out to be useful ;-)
Neeme Praks