如何根据数据大小在具有固定行和可变列的JSP中动态呈现HTML表?

时间:2012-09-08 15:00:24

标签: jsp html-table

我必须动态显示一个表,如下所示:

如果有3个名字:

╔══════╗
║      ║
║ Jack ║
║ Jill ║
║ John ║
╚══════╝

但是如果有超过3个名字:

╔════════╦══════╦═══════╗
║        ║       ║       ║
║ Jack   ║ Jill  ║ Jabar ║
║ John   ║ Joe   ║ Jabio ║
║ Jordan ║ Juan  ║       ║
╚════════╩══════╩═══════╝

行数不应超过3,但列数会动态增加。

最好的方法是什么?这些名称作为名称列表进入JSP,目前我使用JSTL <c:for each..来显示表。


N.B。 Table creation tool

1 个答案:

答案 0 :(得分:1)

您需要应用一些基本的算术逻辑。检查以下实施。

由于我没有足够的JSTL经验,我不得不使用JSP Scriptlets。


控制器中的示例输入创建

// number of students
final int numStudents = 17;
String array[] = new String[s];
for (int i = 0; i < numStudents; i++) {
    array[i] = "Student " + (i + 1);
}

List<String> students = Arrays.asList(array);


视图中的表格创建代码

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
    <c:if test="${not empty students}">
        <c:set var="numStudents" value="${fn:length(students)}" />

        <%-- Variable initialization, arithmetic operations --%>
        <%
            int numStds = Integer.valueOf("" + pageContext.getAttribute("numStudents"));

            int numStdCol1, numStdCol2, numStdCol3;
            numStdCol1 = numStdCol2 = numStdCol3 = numStds / 3;
            if (numStds % 3 == 1) {
                numStdCol1 ++;          
            } else if (numStds % 3 == 2) {
                numStdCol1 ++;
                numStdCol2 ++;
            }

            pageContext.setAttribute("numCol1", numStdCol1);
            pageContext.setAttribute("numCol2", numStdCol2);
            pageContext.setAttribute("numCol3", numStdCol3);
        %>

        <%-- Table creation --%>
        <table border="1" cellspacing="0" cellpadding="0">
            <tr>
                <c:forEach var="student" begin="0" end="${numCol1 - 1}" items="${students}">
                    <td>${student}</td>                 
                </c:forEach>
            </tr>
            <tr>
                <c:forEach var="student" begin="${numCol1}" end="${numCol1 + numCol2 - 1}" items="${students}">
                    <td>${student}</td> 
                </c:forEach>
            </tr>
                <c:forEach var="student" begin="${numCol1 + numCol2}" end="${numStudents - 1}" items="${students}">
                    <td>${student}</td>     
                </c:forEach>
            </tr>
        </table>
    </c:if>
</body>
</html>


示例输入的输出

<table border="1" cellspacing="0" cellpadding="0">
    <tr>
            <td>Student 1</td>                  
            <td>Student 2</td>                  
            <td>Student 3</td>                  
            <td>Student 4</td>                  
            <td>Student 5</td>                  
            <td>Student 6</td>                  
    </tr>
    <tr>
            <td>Student 7</td>  
            <td>Student 8</td>  
            <td>Student 9</td>  
            <td>Student 10</td> 
            <td>Student 11</td> 
            <td>Student 12</td> 
    </tr>
            <td>Student 13</td>     
            <td>Student 14</td>     
            <td>Student 15</td>     
            <td>Student 16</td>     
            <td>Student 17</td>     
    </tr>
</table>