0

I want to generate a PDF with a list of users. This is the first time I have used Jasper to create a PDF. I have tried different methods to generate a PDF with a list of users. But I could not find the right way. I retrieved the data from mysql database. then I want to create the pdf. I used Spring mvc and mysql. The thing I want to do is generate a PDF with a user table when I click the download button. I think my problem is in the controller or the jrxml file. I have already generated a PDF for a single user. For that I Followed this post -> How to use JasperReports with Spring MVC?.

enter image description here

Is this correct, how did I set the filed name?

 <field name="registerStudent.getUsername()" class="java.lang.String"/>

This is my controller

@RequestMapping(value = "/downloadstudentspdf", method = RequestMethod.GET)
public void studentsdetailspdf(HttpServletResponse response) throws JRException, IOException {
    try {
        InputStream jasperStream = this.getClass().getResourceAsStream("/reports/studentlist.jasper");
        List<RegisterUser> registerStudent = userDao.studentList();
        Map<String, Object> map = new HashMap<String, Object>();
        JRBeanCollectionDataSource datasource = new JRBeanCollectionDataSource(registerStudent);
        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, datasource);
        /* response.setContentType("application/pdf"); */
        response.setContentType("application/x-download");
        response.setHeader("Content-disposition", "inline; filename=studentsdetails.pdf");
        final OutputStream outStream = response.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, outStream);
    } catch (Exception e) {
        System.out.println("Exception " + e);
    }

}

UserDaoImpl class

public List<RegisterUser> studentList() {
    List<RegisterUser> list = jdbcTemplate.query("SELECT * FROM users WHERE role_id='1'",
            new RowMapper<RegisterUser>() {

                @Override
                public RegisterUser mapRow(ResultSet rs, int rowNum) throws SQLException {
                    RegisterUser user = new RegisterUser();

                    user.setUsername(rs.getString("username"));
                    user.setFname(rs.getString("fname"));
                    user.setLname(rs.getString("lname"));
                    user.setEmail(rs.getString("email"));
                    user.setYear(rs.getString("year"));
                    user.setBirthday(rs.getDate("birthday"));
                    user.setContact(rs.getString("contact"));
                    user.setGender(rs.getString("gender"));
                    user.setRole_id(rs.getString("role_id"));
                    return user;
                }

            });
    return list;
}

DAO class

package net.spring.dao;

import java.util.List;

import net.spring.model.LoginUser;
import net.spring.model.RegisterUser;

public interface UserDao {
    int register(RegisterUser user);

    RegisterUser loginThreeRoles(LoginUser login);

     List<RegisterUser> studentList();
     
     List<RegisterUser> lecturerList();

    int editstudent(RegisterUser user);
    int editlecturer(RegisterUser user);
    int deletestudent(String username);
    int deletelecturer(String username);
    int studentprof(RegisterUser user);
    RegisterUser studentprof(LoginUser user);

    RegisterUser getStudentByUsername(String username);
    RegisterUser getLecturerByUsername(String username);
}

studentlist.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="84feeac3-d1f7-4503-84bf-fc3fa153df55">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
  <parameter name="registerStudent" class="java.util.List">
    <field name="registerStudent.getUsername()" class="java.lang.String"/>
    <field name="registerStudent.getFname()" class="java.lang.String"/>
    <field name="registerStudent.getLname()" class="java.lang.String"/>
    <field name="registerStudent.getEmail()" class="java.lang.String"/>
    <field name="registerStudent.getYear()" class="java.lang.String"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="36" splitType="Stretch"/>
    </title>
    <pageHeader>
        <band height="51" splitType="Stretch">
            <staticText>
                <reportElement x="170" y="10" width="230" height="30" uuid="04d35299-5eb0-4a34-b340-3ca5cf8290fc"/>
                <textElement>
                    <font size="20" isBold="true"/>
                </textElement>
                <text><![CDATA[Student List]]></text>
            </staticText>
        </band>
    </pageHeader>
    <columnHeader>
        <band height="37" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="10" width="70" height="20" uuid="bcaf85c0-57ff-4a34-af27-cbf1330125ae"/>
                <textElement>
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[UserName]]></text>
            </staticText>
            <staticText>
                <reportElement x="90" y="10" width="100" height="20" uuid="faf9b9ee-7cf2-4ea5-80b8-d371c3c753b9"/>
                <textElement>
                    <font size="11" isBold="true"/>
                </textElement>
                <text><![CDATA[First Name]]></text>
            </staticText>
            <staticText>
                <reportElement x="210" y="10" width="70" height="20" uuid="93727672-9f69-4856-aa26-33837e8dc417"/>
                <textElement>
                    <font fontName="SansSerif" isBold="true"/>
                </textElement>
                <text><![CDATA[Last Name]]></text>
            </staticText>
            <staticText>
                <reportElement x="314" y="10" width="70" height="20" uuid="09b47abe-09b2-479a-bb76-9770e361a23c"/>
                <textElement>
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[Email]]></text>
            </staticText>
            <staticText>
                <reportElement x="410" y="10" width="100" height="20" uuid="c258f47b-da6a-418d-a5e0-892388ec65c5"/>
                <textElement>
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[Year]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="39" splitType="Stretch">
            <textField>
                <reportElement x="0" y="4" width="70" height="16" uuid="99fa4c16-cfe2-4482-828e-4439abb9e8f0"/>
                <textFieldExpression><![CDATA[$F{registerStudent.getUsername()}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="210" y="4" width="70" height="16" uuid="ba6e9cfa-6d4c-470b-8bc4-eb2e3411c21e"/>
                <textFieldExpression><![CDATA[$F{registerStudent.getFname()}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="310" y="4" width="70" height="16" uuid="447253d3-d268-4873-b0b7-9c174c6a7c9f"/>
                <textFieldExpression><![CDATA[$F{registerStudent.getLname()}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="410" y="4" width="145" height="16" uuid="8992d0ad-1f5e-4210-b50b-1e29dc66f119"/>
                <textFieldExpression><![CDATA[$F{registerStudent.getYear()}]></textFieldExpression>
            </textField>
            <line>
                <reportElement x="-3" y="27" width="521" height="1" uuid="9b493a65-a499-4199-90bb-b3fedbe45f85"/>
            </line>
            <textField>
                <reportElement x="90" y="4" width="100" height="16" uuid="fcdd8979-dc44-46e3-be56-11e5f33b8e0c">
                    <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="73fad7b3-74b5-4436-bd46-d2b9c3c113fd"/>
                </reportElement>
                <textFieldExpression><![CDATA[$F{registerStudent.getEmail()}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <columnFooter>
        <band height="45" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="42" splitType="Stretch"/>
    </summary>
</jasperReport>

student.jsp

<main class="page-content">
    <div class="container-fluid">
        <hr>
        <h2 style="background-color:white; opacity:0.8; padding:10px;">STUDENTS</h2>
        <hr>
    </div>

    <div class="container">
        <div align="right">
            <button class="btn btn-danger" style="margin-right: 20px;">
                <a href="${pageContext.request.contextPath}/registerStudent"
                    style="color: white">New Student</a>
            </button>
            <button class="btn btn-danger" style="margin-right: 20px;">
                <a href="${pageContext.request.contextPath}/downloadstudentspdf"
                    style="color: white">Download</a>
            </button>
            <div class="our-team">


                <table data-toggle="table" align="center"
                    class="table table-striped table-bordered" width="80%">
                    <thead>
                        <tr>
                            <th>Username</th>
                            <th>First Name</th>
                            <th>Last Name</th>
                            <th>Email</th>
                            <th>Year</th>
                            <th>Birthday</th>
                            <th>Contact</th>
                            <th>Gender</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody>
                        <c:forEach var="registerStudent" items="${listStudent}">
                            <tr>
                                <td><c:out value="${registerStudent.username}" /></td>
                                <td><c:out value="${registerStudent.fname}" /></td>
                                <td><c:out value="${registerStudent.lname}" /></td>
                                <td><c:out value="${registerStudent.email}" /></td>
                                <td><c:out value="${registerStudent.year}" /></td>
                                <td><c:out value="${registerStudent.birthday}" /></td>
                                <td><c:out value="${registerStudent.contact}" /></td>
                                <td><c:out value="${registerStudent.gender}" /></td>
                                <td><button class="btn btn-primary">
                                        <a
                                            href="${pageContext.request.contextPath}/editstudent/${registerStudent.username}"
                                            style="color: white">Edit</a>
                                    </button> ||
                                    <button class="btn btn-warning">
                                        <a
                                            href="${pageContext.request.contextPath}/deletestudent/${registerStudent.username}"
                                            style="color: white">Delete</a>
                                    </button></td>
                            </tr>
                        </c:forEach>

                    </tbody>


                </table>

            </div>


        </div>
    </main>

I searched answers for many times to solve my problem. But still no possible answer could be found.I think you get my problem. If not let me know. Hope your help to solve my issue. Thank you.

Dulani Maheshi
  • 1,070
  • 1
  • 10
  • 30
  • Since you are passing `RegisterUser` as datasource the fieldName should be same as in bean for example `` I closing this towards a duplicate that show how it is done, let me know if you had another problem – Petter Friberg Feb 01 '21 at 07:52
  • <![CDATA[$F{username}]]> Is this correct? But when I generate the report, I get a report with null values for all fields. – Dulani Maheshi Feb 01 '21 at 08:50
  • 1
    it's correct you need to put the text field in detail band and check that your field declarations don't have any description tag that points to other settings. Furthermore your bean RegisterUser needs a public String getUsername() and naturally getUsername() should not return null. Do some debbuging checking this – Petter Friberg Feb 01 '21 at 12:00
  • _remember also to recompile your jrxml every time you change it, since your application is loading the compiled version (.jasper)_ – Petter Friberg Feb 01 '21 at 12:03
  • Oky, Thanks. I'll apply those changes. – Dulani Maheshi Feb 01 '21 at 15:37

0 Answers0