Programmer
Programmer

Reputation: 1294

Is there a more effective way to output html in servlet?

I have a servlet below and it retrieves lots of information from a database and then prints it in a table form. I'm using out.println(html code) to output everything on this page. Is there a more effective way of writing this html code in servlet? For every html element/attribute etc I want to add, I have to use out.println(<head>) for example.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class PersonalInfoOutput extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();

            HttpSession session = request.getSession(false);
            String employeeid = ""; 

                       if(session != null) { 
                           employeeid = (String)session.getAttribute("employeeid"); 
                       }


            boolean st = false;
            try { 
                Class.forName("com.mysql.jdbc.Driver").newInstance(); 
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/payroll_system", "root", ""); 
                PreparedStatement ps = con.prepareStatement("select employeeID,  FirstName, LastName, Admin, DOB, Address, Email, HourlyRate, Gender, ALeaveBalance, SLeaveBalance, ActiveStatus, Role, BSB, BankName, AccNumber, SuperNumber, SuperCompany from payroll_system.employee_info where employeeID = ?");
                ps.setString(1, employeeid);
                ResultSet rs = ps.executeQuery(); 
                st = rs.next(); 
                if(st){
                boolean adminTrue = rs.getBoolean("Admin"); 
                boolean activeTrue = rs.getBoolean("ActiveStatus"); 

                out.println("<html>");
                out.println("<head>");
                out.println("<style>"); 
                out.println("table { border-collapse: collapse; width: 50%; } th, td { text-align: left; padding: 8px; } tr:nth-child(even){background-color: #f2f2f2}");
                out.println("tr:hover {background-color: #e2f4ff;}");
                out.println("</style>");
                out.println("<link rel = stylesheet type = text/css href = main.css>");
                out.println("<link rel = stylesheet type = text/css href = sidebar.css>");
                out.println("<title>Personal Information</title>");
                out.print("</head>");

                out.println("<body>");

                if(adminTrue){ 
                    out.println("<ul>");
                    out.println("<li><a class=active >View Personal Information</a></li>");
                    out.println("<li><a href=xyz>View Expense Claims</a></li>");
                    out.println("<li><a href=xyz>View Payslips</a></li>");
                    out.println("<li><a href=changePassAdmin.html>Change Password</a></li>");
                    out.println("<li><a href=xyz>Maintain Employee Information</a></li>");
                    out.println("<li><a href=xyz>Maintain Tax Information</a></li>");
                    out.println("<li><a href=xyz>Maintain Payroll Items</a></li>");
                    out.println("<li><a href=xyz>Maintain Timesheet</a></li>");
                    out.println("<li><a href=xyz>Maintain Employee Expenses</a></li>");
                    out.println("<li><a href=xyz>Run Payroll</a></li>");
                    out.println("<li><a href=xyz>Generate Reports</a></li>");
                    out.println("</ul>");
                    out.println("<div style=margin-left:25%;padding:1px 16px;height:1000px;>");
                    out.println("</div>");
                }
                else if(!adminTrue){ 
                    out.println("<ul>");
                    out.println("<li><a class=active href=PersonalInfoOutput>View Personal Information</a></li>");
                    out.println("<li><a href=xyz>View Expense Claims</a></li>");
                    out.println("<li><a href=xyz>View Payslips</a></li>");
                    out.println("<li><a href=.html>Change Password</a></li>");
                    out.println("</ul>");
                    out.println("<div style=margin-left:25%;padding:1px 16px;height:1000px;>");
                    out.println("</div>");

                }


                out.println("<h1>Personal Information</h1>");
                out.println("<table border =1>");

                out.println("<tr>");
                out.println("<td>Name</td>");
                out.println("<td>"+ rs.getString("FirstName") + " " + rs.getString("LastName") + "</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Employee ID</td>");
                out.println("<td>"+ rs.getString("employeeID")+"</td>");
                out.println("</tr>");

                if(adminTrue) { 
                    out.println("<tr>");
                    out.println("<td>Admin</td>");
                    out.println("<td>Yes</td>");
                    out.println("</tr>");
                }
                else{ 
                    out.println("<tr>");
                    out.println("<td>Admin</td>");
                    out.println("<td>No</td>");
                    out.println("</tr>");
                }

                out.println("<tr>");
                out.println("<td>Date Of Birth</td>");
                out.println("<td>"+ rs.getString("DOB")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Residential Address</td>");
                out.println("<td>"+ rs.getString("Address")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Email</td>");
                out.println("<td>"+ rs.getString("Email")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Hourly Income</td>");
                out.println("<td>"+ "$" + rs.getString("HourlyRate")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Gender</td>");
                out.println("<td>"+ rs.getString("Gender")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Annual Leave Balance</td>");
                out.println("<td>"+ rs.getString("ALeaveBalance")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Sick Leave Balance</td>");
                out.println("<td>"+ rs.getString("SLeaveBalance")+"</td>");
                out.println("</tr>");

                if(activeTrue) { 
                    out.println("<tr>");
                    out.println("<td>Currently Active</td>");
                    out.println("<td>Yes</td>");
                    out.println("</tr>");
                }
                else { 
                    out.println("<tr>");
                    out.println("<td>Currently Active</td>");
                    out.println("<td>No</td>");
                    out.println("</tr>");
                }

                out.println("<tr>");
                out.println("<td>Role</td>");
                out.println("<td>"+ rs.getString("Role")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>BSB</td>");
                out.println("<td>"+ rs.getString("BSB")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Bank Name</td>");
                out.println("<td>"+ rs.getString("BankName")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Bank Account Number</td>");
                out.println("<td>"+ rs.getString("AccNumber")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Superannuation Company</td>");
                out.println("<td>"+ rs.getString("SuperCompany")+"</td>");
                out.println("</tr>");

                out.println("<tr>");
                out.println("<td>Superannuation Number</td>");
                out.println("<td>"+ rs.getString("SuperNumber")+"</td>");
                out.println("</tr>");

                out.println("</table>");
                out.println("</body>");
                out.println("</html>");

                }
             }catch(Exception e)
              {
                  e.printStackTrace();
              }
            out.close();
    }

    }

Upvotes: 2

Views: 3822

Answers (2)

Jan
Jan

Reputation: 13858

out.println () is a little ugly in terms of readability - but the cost of these calls will be small compared to I/O times.

Using + for String concatenation inside your loop might harm your memory footprint (and it's not the fastest way either). Consider this line you have:

     out.println("<td>"+ rs.getString("FirstName") + " " + rs.getString("LastName") + "</td>");      

You could gain readability and speed and have less char [] left to be garbage collected by coding with format():

    out.format ("<td>%s %s</td>", rs.getString  ("FirstName"), rs.getString  ("LastName"));

More Notes

You create and connect a new database connection every time your servlet is called. This will severly impact your performance and scalability. You should consider using a connection pool from which you fetch pre-connected Connections. The performance you gain will make up for very many String concats or println calls.

Upvotes: 3

Jason Sperske
Jason Sperske

Reputation: 30416

If you look at the pre compiled output of the Jasper JSP compiler (the JSP compiler in Apache Tomcat) this is what it turns JSP into. The only effective strategy for increasing effencency is to consider shipping the data of the table in the server and convert it into a table with JavaScript in the browser. I use this approach for systems that ship more than 10,000 rows (I also use paging to keep the payload manageable)

Upvotes: 0

Related Questions