ContextSwitch
ContextSwitch

Reputation: 2837

JSP variable initialization is happening after JS runs

I'm initializing a JSP string inside a Liferay portlet:

String json = "{}";

// returns json
json = LiferayPortlet.makeCurlCall();

...

<script>

$(window).load(function(){

    //initialize js variable
    jsData = "${json}"; 

    // initialize the page
    initializePage(jsData);
});


</script> 

The issue I'm having is that LiferayPortlet.makeCurlCall(); is returning json, but jsData is not being initialized to it, instead its being set to "". Is there a way to initialize jsData to the json that is being returned from the function above?

Upvotes: 0

Views: 276

Answers (1)

Chris Maggiulli
Chris Maggiulli

Reputation: 3824

Don't do it

You cannot initialize a JavaScript variable with a scriptlet or JSTL. The Java code is executed on the server and will not execute in top down order on your jsp page.

While I don't recommend this you can use the following

<script type="text/javascript">
var message = '<c:out value="${json}"/>';
</script>

That will technically work - however I want to stress that I do not recommend this. Maybe you can explain exactly what you are trying to accomplish and we can recommend a more optimal way of doing it.

JSTL v. Scriplets

You might also have a scope issue using JSTL and scriplets together indiscriminately. They are of different scopes. JSTL works with the following scopes.

  • page
  • request
  • session
  • application

Scriplets are in the page scope always. So while your code doesn't contain this issue it most likely will be something you will encounter.

Recommendation

If you are using Liferay, I suggest you learn Alloy UI (a JavaScript library) and become comfortable with their AJAX modules. Generally, when I see the code you posted, it is better to have an AJAX function that makes a GET call to your portlet for the JSON when it is needed.

Upvotes: 2

Related Questions