访问Java Servlet中的JavaScript表DOM

时间:2009-07-06 20:19:39

标签: javascript java html dom html-table

我想编写可重用的代码,该代码从JSP获取HTML表并将其转换为Excel格式以导出到用户。我想利用HTML DOM表对象,而不是用Java解析HTML来提取相同的信息。这样做的最大好处是检查每个单元格的复选框,按钮等,以便在将单元格写入Excel之前将其删除。在我看来,设置将是这样的:

HTML表:

<a href="javascript: export();">Export to Excel</a>
<table id="exportTable">
  ...
</table>

JavaScript的:

function export() {
  var table = document.getElementById("exportTable");
  // Send table object to Servlet somehow
}

JavaScript将使用某种common.js,以便可以在网站的任何页面中的任何表格上使用该概念。

**更新**

JSP将使用Java对象生成表,但每次表本身都会不同。我正在寻找一个通用的解决方案,我可以获得Table的DOM结构,从而利用已经完成的table.rows和table.cells,检查每个单元格以删除我不想在Excel中使用的标签(例如按钮) ,复选框等),并将响应类型设置为excel的用户写出来。那更有意义吗?

2 个答案:

答案 0 :(得分:1)

我将数据从单元格序列化为一个简单的JSON对象,然后使用Java端可用的许多JSON libraries之一将其转换回可用对象。

这样的事情:

function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var x=0, y=tableObj.rows.length; x < y; x++) {
            var tableRow = tableObj.rows[x];
            var jsonRow = [];
            for (var i=0, j=tableRow.cells.length; i < j; i++) {
                var tableCell = tableRow.cells[i];
                // removes any line feeds or tabs
                jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
            }
            jsonTable.push(jsonRow)
        }
    }
    return JSON.stringify(jsonTable);
}

这使用公共域JSON.stringify()例程,可直接使用here

现在可以使用此字符串,将其传递给服务器,并在Java-land中重新保存对象。您将获得一个直接对应于表内容的多维数组值。

注意:这将检索整个表。如果你只想获得表格的主体,你将不得不修改上面的代码来迭代tBodies,如下所示:

function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var a=0, b=tableObj.tBodies.length; a < b; a++) {
            var tBody = tableObj.tBodies[a];
            for (var x=0, y=tBody.rows.length; x < y; x++) {
                var tableRow = tableObj.rows[x];
                var jsonRow = [];
                for (var i=0, j=tableRow.cells.length; i < j; i++) {
                    var tableCell = tableRow.cells[i];
                    // removes any line feeds or tabs
                    jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
                }
                jsonTable.push(jsonRow)
            }
        }
    }
    return JSON.stringify(jsonTable);
}

答案 1 :(得分:0)

将表格发布到服务器。如果您想像在JavaScript中一样访问DOM,则需要Rhino。但我建议只是坚持使用JDOM之类的内容。然后回显表格,并在标题中修改内容类型为“application / ms-excel”。