underbar
underbar

Reputation: 588

Pass Spring model vars from JSP template to javascript

Within a <script> tag in a jsp file I have some code that looks like this:

var chart = new myChart({'id': ${user.id}, 'type': ${user.type}, 'name': {user.name});

Where user is a Spring model attribute set on the server side. My problem is that passing each different field of user feels clunky. It would be nice if I could do something like this:

var chart = new myChart('user': "${user}");

However when done this way the value of ${user} will be an object string that looks like this:
User{id=1, type='admin', name='foo'}
I know that I could just parse this string into an object in my external js, but it feels like there should be a cleaner way to do this. Thanks for the help.

EDIT: Going off of Cameron's answer below I could add this to my server-side controller code:

model.put("user", user);  
String userJSON = MyJSONSerializer.serialize(user);  
model.put("userJSON", userJSON);

Then in my JSP I could do:

var chart = new myChart({'user': JSON.parse('${userJSON}')});

This does solve my problem of having a messy options object, but it brings up the issue of using two model attributes for the same exact data. It would be ideal if I could use one model attribute for the user object, and then could somehow encode it to JSON on the fly.

Upvotes: 1

Views: 655

Answers (1)

Cameron
Cameron

Reputation: 1918

You can convert the Object to JSON using a library like Jackson:

public static String objectAsJSON(Object obj) {

  try
  {
    // This could be optimized by making a static ObjectMapper
    return new ObjectMapper().writeValueAsString(obj);
  }
  catch (IOException e)
  {
    // Log exception and re-throw or return null
    return null; 
  }
}

You could either call this method before putting the objectin your model and reference the String in your JSP like this:

var chart = ${jsonChart};

Or you could write a custom taglib and call objectAsJSON() from there. Then the actual myChart object could go in your model once. Your JSP might look like:

var chart = <chartlib:toJson obj="${chart}" />;

Upvotes: 1

Related Questions