JSP/Struts2:如何访问所选表行中的对象bean

JSP/Struts2: how to access object bean in selected table row

本文关键字:bean 对象 访问 Struts2 何访问 JSP      更新时间:2023-09-26

在我的Struts2应用程序中,我有一个表,它是用来自数据库的数据动态填充的(通过Eclipselink JPA)。在该表下面有一个按钮,一旦在表中选择了一行,该按钮就会被启用(jQuery)。现在,当单击该按钮时,我需要知道当前选择了哪一行,这样我就可以访问相应的对象bean,因为我需要将bean ID(target_id)传递到下一个页面(createexperiment2操作)。简而言之,问题是:如何访问包含在所选(单击)表行中的Struts2对象bean

1.屏幕截图:

在行选择之前->在行选择之后

2.JSP代码:

<table id="targets" class="ink-table grey tableSection">
    <thead>
        <tr>
            <th colspan="5" class="align-left">Select your target:</th>
        </tr>
    </thead>
    <tbody>
        <s:if test="targets.size > 0">
            <s:iterator value="targets">
                <tr id="row_<s:property value="i"/>">
                    <td class="all-100"><a href="<s:url action="showtarget"><s:param name="id"><s:property value="target_id"/></s:param></s:url>"><s:property value="name"/></a></td>
                    <td class="all-15"><a href="<s:url action="edittarget"><s:param name="id"><s:property value="target_id"/></s:param></s:url>">edit</a></td>
                    <td class="all-5">|</td>
                    <td class="all-15"><a href="<s:url action="deletetarget"><s:param name="id"><s:property value="target_id"/></s:param></s:url>">delete</a></td>
                    <td class="all-5"><a href="help.jsp">?</a></td>
                </tr>
            </s:iterator>
        </s:if>
    </tbody>
</table>

[…]

<a href="createexperiment2" class="ink-button double-vertical-space all-25 buttonSection" id="next" disabled>Next &gt;</a>

3.j查询代码:

$(document).ready(function(){
    $('.tableSection tbody tr').click(function()
    {
        var selected = $(this).hasClass("highlight");
        $('.tableSection tbody tr').removeClass("highlight");
        $('.buttonSection').attr("disabled", false);
        if(!selected)
          $(this).addClass("highlight");
    });
});

编辑1:

在Andrea的帮助下,我终于能够使用jQuery访问Struts2函数,问题是我只能访问表上最后一个bean的属性(在呈现JSP时访问的最后一个bean,这是有道理的)。请参阅下面的更新代码,同时我将尝试一个解决方法:

JSP:

<s:if test="targets.size > 0">
    <s:iterator value="targets">
        <tr onclick="<s:set var="tid" value="target_id"/>">

[…]

        </tr>
    </s:iterator>
</s:if>

[…]

<script type="text/javascript">
    $(function () {
        $('.tableSection tbody tr').click(function(event) {
            alert ('<s:property value="%{#tid}" />');
        });
    });
</script>

编辑2:

现在我知道点击了哪个表行索引,但经过数小时的尝试(使用Struts标记)将其分配给一个变量并发送给操作,我仍然没有得到我想要的。我甚至无法将此行索引发送到Action。这令人沮丧。尽管如此,这就是我如何知道哪一行被选中的原因:

<tr onclick="getRow(this)">

[…]

<script>
function getRow(x) 
{
    alert("Selected row: "+x.rowIndex);
    //return x.rowIndex;
}
</script>

编辑3:

这一次,我终于能够将行ID(一个字符串)发送到操作。唯一剩下的问题是,该操作被调用了两次,第一次是在单击事件上,另一次是因为aHTML元素的href属性,该属性重定向到所需的Struts2操作。除了明显不足之外,这自然会使变量在第二次调用操作时变为null。你知道我怎么能把这两个对createxperiment2动作的调用"合并"成一个吗?我尝试过将AJAX调用中的async选项设置为false,但没有成功。

[首先,从表tr中删除了onclick事件,因为我只需要知道按下"下一步"按钮时高亮显示的是哪一行]。目前的代码如下:

<script type="text/javascript">
        $('#next').click(function(event)
        {
            var row = $('.highlight').index();
            alert (row);
            $.ajax({
                method: "POST",
                url: "createexperiment2.action",
                data: { row : row }
                });
        });
</script>

Q: 我为每一行表分配了一个ID。我怎么知道哪一个是被选中的?

使用this关键字获取对象的id:

$('.tableSection tbody tr').click(function(event) {
    alert (this.id);
    ...

Q: 如何使用选定的表行ID来访问相应的bean对象(在行本身中表示)?

这还不清楚:只需提交id并检索对象服务器端,无论是通过AJAX还是标准表单提交。

最后,解决方案:

首先获取对象的ID(我是用Struts创建的)。然后,在AJAX调用的帮助下,将ID发送到所需的操作(url:属性)。此操作成功后,使用success:回调选项定义要重定向的位置。

Struts/JSP:

<s:if test="targets.size > 0">
    <s:iterator value="targets">
        <tr id="<s:property value="target_id"/>" class="highlight">
[...]
        </tr>
    </s:iterator>
</s:if>

jQuery:

<script type="text/javascript">
    $('#next').click(function(event)
    {
        var tid = $('.highlight').attr("id");
        $.ajax({
            method: "POST",
            url: "createexperiment2.action",
            data: { tid : tid },
            success:
                function()
                {
                    //alert("TID -> "+tid);
                    window.location = "loadworkloads.action";
                }
        });
    });
</script>