Monday, December 20, 2010

Spring 3 MVC - Jasper Integration Tutorial

In this tutorial we will integrate Jasper reporting with a simple Spring 3 MVC application. We will provide a custom data source where Jasper will retrieve its data. We will use Spring's built-in Jasper support to render our report in Excel, PDF, HTML, and CSV formats. To design the report layout we will use iReport to create the template.

Note: I suggest reading the following updated tutorial instead:
Spring MVC 3.1 and JasperReports: Using iReport and AJAX

What is Jasper Reports?
JasperReports is the world's most popular open source reporting engine. It is entirely written in Java and it is able to use data coming from any kind of data source and produce pixel-perfect documents that can be viewed, printed or exported in a variety of document formats including HTML, PDF, Excel, OpenOffice and Word.

What is iReport?
iReport is the free, open source report designer for JasperReports. Create very sophisticated layouts containing charts, images, subreports, crosstabs and much more. Access your data through JDBC, TableModels, JavaBeans, XML, Hibernate, CSV, and custom sources. Then publish your reports as PDF, RTF, XML, XLS, CSV, HTML, XHTML, text, DOCX, or OpenOffice.

Similar with our previous tutorial. We will setup our Spring 3 MVC application first. If you need a review with Spring MVC, I suggest you read the other tutorials I've posted. Or you can also Google for related tutorials.

Here's a screenshot of the report that we will be generating:

This is just basic. You can add more features such as charts,custom calculations, and other report related functions with Jasper. If you need to design the layout, you can use iReport to do the job.

Our first task is to setup the main controller that will handle the download request.

This controller declares three mappings:
/main/download - for showing the download page
/main/download/xls - for retrieving the actual Excel report
/main/download/pdf - for retrieving the actual PDF report
To add support for HTML and CSV formats, just copy any of the methods. Rename the value of the @RequestMapping and follow the pattern. I will leave that part as an exercise for my reader.

In each request handler, we return the datasource:

We then placed the datasource in the a Map:

Then we added it to the ModelAndView.
For XLS, we did the following:
modelAndView = new ModelAndView("xlsReport", parameterMap);

And for PDF, we did the following:
modelAndView = new ModelAndView("pdfReport", parameterMap);

The only thing that changed are the view names: xlsReport and pdfReport. These view names are declared on a separate XML file under /WEB-INF/jasper-views.xml


We've declared four beans in this config. Each bean uses a Spring built-in view for Jasper that corresponds to a specific format. For example, JasperReportsXlsView is used for rendering Excel reports.

Each report has a reportDataKey that references the datasource from the controller. It also has a reference to the Jasper template tree-template.jrxml

Let's complete our Spring MVC setup.

To enable Spring MVC we need add it in the web.xml


Take note of the URL pattern. When accessing any pages in our MVC application, the host name must be appended with

In the web.xml we declared a servlet-name spring. By convention, we must declare a spring-servlet.xml as well.


Notice we declared two view resolvers here: an InternalResourceViewResolver and an XmlViewResolver. If you've been following my other tutorials, you'll notice that we always declare an InternalResourceViewResolver only.

We must declare an extra view resolver this time to help Spring to choose the correct view to render our reports. If we just use InternalResourceViewResolver, all view references will point to /WEB-INF/jsp/ and will be appended with a .jsp extension. We don't want that because that location is for JSPs. Our report views are internal within Spring's package and we indicate that inside the /WEB-INF/jasper-views.xml file.

We're done with the spring-servlet.xml file.

By convention, we must declare an applicationContext.xml as well.


This XML config declares three beans to activate the Spring 3 MVC programming model.

Now we move to the crucial point of our tutorial. Remember earlier we had a reference to a template file named tree-template.jrxml

tree-template.jrxml (a partial view)

If you notice our report template is just plain XML! Nothing magical here. Actually we used a special tool to generate this XML template. It's called iReport. To get started with this tool, visit the Getting Started guide from JasperForge.

For this tutorial, we need to do the following:

1. Download and install iReport.

2. Run iReport

3. Go to File. Then click on New

4. Select the Tree template . Any template will do, even a blank one.

You should see a ready-made template:

5. We need to add four new fields in this layout. On the upper-left side, click on Fields.

6. Right-click and add four fields:

7. Make sure to set the correct types:
id: Long
name: String
price: Double
description: String

On the upper-right side, there's a panel where you can modify the properties of the fields we declared.

8. Now we need to drag each of those fields to the main layout. See below:

9. Then modify the title and subtitle. This isn't really mandatory. Just make sure you placed those four fields.

10. Click on the main layout again. On the right-side panel, you should see a list of properties for the main report layout. You need to change the default Language from Groovy to Java. Failure to do so will result to multiple compilation errors. Unless you know Groovy and familiar with its dependencies, it's best you stick with Java for now.

11. Save the document.

12. Now you need to locate that document. Copy and place it in the classpath of your web application. If you look carefully on the directory where the original document is saved, there are two images that had been saved as well. Make sure to copy them as well! Failure to copy them to your classpath will cause an Exception in the application.

Here's how our final directory should look like:

Remember we declared four fields in this layout. Where exactly do we get our data to fill-in these fields? It's assigned by the controller.

See that line:
JRDataSource datasource  = dataprovider.getDataSource();
That's where we get our data.

The datasource
Here we provide a custom datasource made from in-memory list of Sales items. We use the DAO name here to indicate that the data can come from a DAO or other persistence means.


Our datasource returns a list of Sales. This is a simple Data Transfer Object for containing our data from the database.

Our application is now finished. We've managed to setup a simple Spring 3 MVC application. Then we added reporting using Jasper. We use Spring's built-in support to render the Jasper views. We've used iReport to design the report document. We've also leveraged Spring's MVC programming model via annotation.

To access the download page, enter the following URL:

Here's a final look to our download page:


If you want to download the report directly, enter the following URL for XLS format:

For PDF format, enter the following URL:

For HTML and CSV, I left this exercise for my readers.

The best way to learn further is to try the actual application.

Download the project
You can access the project site at Google's Project Hosting at

You can download the project as a Maven build. Look for the in the Download sections.

You can run the project directly using an embedded server via Maven.
For Tomcat: mvn tomcat:run
For Jetty: mvn jetty:run

If you want to learn more about Spring MVC and Jasper, feel free to read my other tutorials in the Tutorials section.
StumpleUpon DiggIt! Blinklist Yahoo Furl Technorati Simpy Spurl Reddit Google I'm reading: Spring 3 MVC - Jasper Integration Tutorial ~ Twitter FaceBook

Subscribe by reader Subscribe by email Share


  1. Nice tutorial,
    If you already have a dataSource configured you can inject it as a "jdbcDataSource" property

  2. it was help full i could run the report but its opening in the same window.........

    i want to open it in a new window........
    any idea

    1. target attribute for <a> element is what you are looking for ;-)

  3. thanks, helped me a lot this tutorial, but I fail to see the images when I change the report to HTML. Has anyone done it?

    1. got same problem

    2. Got the same problem and struggling alot.If you get the solution can you post it here.

    3. Same problem with HTML - but great tutorial

  4. thanks, very concise and helpful

  5. thanks dude, it was really helpful... this is best when it compared with other hectic tutorials.... keep it up.. - B.A.L.Ajith Kumara

  6. Thank you very much for publishing these tutorials. They are very helpful.

  7. It doesn't work :( page download/pdf is not found.

  8. It renders as a jsp file so it's not found

  9. tutorial very good and hopefully can help me in building a web application thanks

  10. whenever i try to download the excel file.. i encounter this problem..

    java.lang.ClassNotFoundException: org.springframework.ui.jasperreports.JasperReportsUtils

    what can be the cause?


    1. org.springframework

  11. i m not able to run the project, m using jetty server please explain me in brikef any one...

  12. Hello
    Thanks for such nice tutorials.
    I need to make a confirmation report in which I do not need any table
    My need is to represent only one value for any field
    So please tell me how can we do??

  13. I imported this as a Maven Project. I tried to run this on server and I get the message ""the resource spring-jasper-integration not found".
    Can u help me with this?

  14. My pdf report is not getting the proper name.I want to set proper name to my report.Any one have an idea.

  15. 'i keep getting a pdfreport.jsp is not available' error

  16. hi all, i am newbie for jasper, when i download this example i got an error like
    SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    can anybody help on this

    thanks to all

  17. Nice example.. Thanks.
    The most important thing here I guess is the language in iReport.
    By default, it is Groovy, needs to be changed to Java.
    I spent almost 3-4 hours untill I saw this blog.

  18. How I can define a single view (JasperReportsPdfView) for multiple jasper templates (*. jrxml)?

    1. Have you looked at the following guide: ?

  19. Hello,
    How add other parameters to report.

  20. thank you for this posting!
    now i have to make bills for client.
    u alrady know about my english skill is sosososososo bad.
    actually my english is suck!!
    but i can understand everything about Jasper.
    i would like to say ur posting is sosososososo easy!!
    have a good day!!

  21. Hi,

    I am struggling to integrate different characters in my xls report. I used code 2000 and chinese character from DB are coming fine in PDF. But when exporting in xls format it shows blankk.. Can you help?


  22. I am compiling this project, and after this project is not found

    Anybody help me ?

    Thank you

  23. This comment has been removed by the author.

  24. hi
    whenever i try to download the pdf file.. i encounter this problem..
    nested exception is java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V

    with iText-2.1.7 and jasperreports-5.1.0
    what can be the cause?
    Thank you

  25. how to give filename dynamically to jasper reports...

  26. Please can someone tell me how to pass parameters instead of a datasource ? ...

  27. What can be the response type if I try to call the get service by the use of resttemplate as it returns ModelView?

    ~~~~~~What should I submit as response type?

  28. i got this error
    Could not resolve view with name 'pdfReport' in servlet with name 'spring'
    how can i solve this??

  29. I have read your blog its very attractive and impressive. I like it your blog.

    Spring online training Spring online training Spring Hibernate online training Spring Hibernate online training Java online training

    spring training in chennai spring hibernate training in chennai

  30. Hello Krams sir,
    Thank you. I usually follows your tutorials. I need your help in creating Spring MVC MongoDB Jasper integration example. Could you please create it?

  31. Great post! I am see the great contents and step by step read really nice information.I am gather this concepts and more information. It's helpful for me my friend. Also great blog here with all of the valuable information you have.
    Java Training in Chennai

  32. All the points you described so beautiful. Every time i read your i blog and i am so surprised that how you can write so well.
    python training in chennai | python training in bangalore

    python online training | python training in pune

    python training in chennai

  33. This is ansuperior writing service point that doesn't always sink in within the context of the classroom. In the first superior writing service paragraph you either hook the reader's interest or lose it. Of course your teacher, who's getting paid to teach you how to write an good essay, 
    java training in chennai | java training in bangalore

    java online training | java training in pune

    java training in chennai | java training in bangalore

  34. Good Post! Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging.

    core java training in Electronic City

    Hibernate Training in electronic city

    spring training in electronic city

    java j2ee training in electronic city

  35. Its really an Excellent post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog. Thanks for sharing....
    python training in velachery
    python training institute in chennai

  36. Good Post! Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging.
    DevOps online Training