Codebox Software
Accessing JSP values from JavaScript
Published:
This technique provides a safe and easy way to access data held in JSP variables from JavaScript. The normal method for doing this involves putting some code like this in your JSP file:
var num = <c:out value="${accountNumber}" />;
which would make a line in the resulting HTML file something like this:
var num = 123456;
This does indeed have the desired effect - the value of the JSP variable accountNumber is written to the JavaScript
variable num and thereafter can be used from within JavaScript code on the page. However, there is a problem
with this approach - namely that if, for some reason, the JSP variable (accountNumber in our example) does not exist, then the
resulting code is no longer valid JavaScript and will cause a syntax error:
var num = ; // JSP 'accountNumber' variable did not exist
The jspArgs object declared below can be used as a safe container for JSP variable values, overcoming the problem described:
var jspArgs = (function(){
var jspArgsValues = {}; // Values stored here, protected by a closure
var jspArgsObj = {}; // This gets augmented and assigned to jspArgs
jspArgsObj.set = function(name){
return function(value){
name && (jspArgsValues[name] = value);
};
};
jspArgsObj.get = function(name){
return jspArgsValues[name];
};
return jspArgsObj;
})();
The object is used as follows:
jspArgs.set('num')(<c:out value="${accountNumber}" />); // stores the value of 'accountNumber' inside jspArgs
...
var num = jspArgs.get('num'); // retrieves the value
Pay particular attention to the syntax of the jspArgs.set function call, it is unusual:
jspArgs.set('num')(123456);
The set method accepts the name of the value that you are storing as its argument, and then it returns a function
which accepts the value to be stored as its argument. The code above above could be written more verbosely as
follows:
var putValueHereFunction = jspArgs.set('num');
putValueHereFunction(123456);
but the shorthand version is much more readable. Splitting the set operation into 2 parts in this way has the advantage
that the resulting JavaScript code is still valid if either (or both) arguments are omitted:
jspArgs.set('num')(123456);
jspArgs.set()(123456);
jspArgs.set('num')();
jspArgs.set()();