有没有更有效的方法在 servlet 中输出 html?

Posted

技术标签:

【中文标题】有没有更有效的方法在 servlet 中输出 html?【英文标题】:Is there a more effective way to output html in servlet? 【发布时间】:2016-04-28 14:18:09 【问题描述】:

我在下面有一个 servlet,它从数据库中检索大量信息,然后以表格形式打印出来。我正在使用 out.println(html code) 输出此页面上的所有内容。有没有更有效的方法在 servlet 中编写这个 html 代码?对于我想添加的每个 html 元素/属性等,我必须使用 out.println(<head>) 例如。

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();
    

    

【问题讨论】:

查看 JSP。如果您愿意,也可以使用其他模板引擎,例如 Freemarker 或 Velocity。 标准的java方式是将HTML放入JSP文件中。 【参考方案1】:

out.println() 在可读性方面有点难看 - 但与 I/O 时间相比,这些调用的成本会很小。

在循环中使用 + 进行字符串连接可能会损害您的内存占用(而且这也不是最快的方法)。考虑一下您拥有的这一行:

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

您可以获得可读性和速度,并通过使用format() 编码减少被垃圾收集的 char []:

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

更多说明

每次调用 servlet 时,您都会创建并连接一个新的数据库连接。这将严重影响您的性能和可扩展性。您应该考虑使用从中获取预连接​​连接的连接池。您获得的性能将弥补很多 String concats 或 println 调用。

【讨论】:

【参考方案2】:

如果您查看 Jasper JSP 编译器(Apache Tomcat 中的 JSP 编译器)的预编译输出,这就是 JSP 变成的内容。提高效率的唯一有效策略是考虑将表的数据传送到服务器中,并在浏览器中使用 javascript 将其转换为表。我将这种方法用于发送超过 10,000 行的系统(我还使用分页来保持有效负载的可管理性)

【讨论】:

据我所知,OP 没有使用 JSP。 我只是提到它是因为 Jasper 编译器已经非常高效,并且它生成的代码输出 HTML 的方式相同 嗯,JSP 编译器只是将每个 JSP 页面转换成一个 servlet,所以我猜应该是:将 JSP 用于您的表示层,让 JSP 编译器将其转换成一个 servlet,而不是编写servlet 手动。 确实如此,或许关注的效果更好的是要管理的代码量而不是输出字符串的速度 编译器只会编译一次 JSP,无论是在首次访问时还是在应用程序/服务器启动时,取决于配置。我看不出“输出字符串的速度”是如何发挥作用的。

以上是关于有没有更有效的方法在 servlet 中输出 html?的主要内容,如果未能解决你的问题,请参考以下文章

Java基础面试题及答案

最常见的Java面试题及答案汇总

最常见的Java面试题及答案汇总

如何更有效地将嵌套列表扁平化为一个列表而不是使用 unlist 方法?

servlet原理

有没有更有效的方法从同一个表中追加多个列?