【问题标题】:Providing edit and delete button for each row of a table using display tag使用显示标签为表格的每一行提供编辑和删除按钮
【发布时间】:2011-12-19 12:21:44
【问题描述】:

我正在使用显示标签在 JSP 上的表中显示数据(使用 struts 2)。现在我想为每一行提供两个链接,一个用于编辑,一个用于删除该行。

我的 jsp 结构和我目前正在尝试的是:

<s:url id="editReport" action="editReport" />
<sd:div href="%{editReport}" listenTopics="editReport" formId="actionForm" showLoadingText="false" preload="false">
    <s:url id="updLists" action="updLists" />
    <sd:div href="%{updLists}" listenTopics="updLists" formId="enterDayReport" showLoadingText="false" preload="false">
        <s:form id="enterDayReport" action="enterDayReport">
            <sd:autocompleter  label="Customer " name="customer" list="customerList"  valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <sd:autocompleter  label="Contact "  name="contact"  list="contactList"   valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <s:select          label="Stage "    name="stage"    list="stageList"     headerKey="0" headerValue="Select" />
            <s:select          label="Type "     name="type"     list="typeList"      headerKey="0" headerValue="Select" />
            <sd:datetimepicker label="Date"      name="date"     formatLength="small" displayFormat="dd - MMM - yyyy"/>
            <s:textarea        label="Summary"   name="summary"  cols="40" rows="10"/>
            <s:submit          value="Save Report"/>
        </s:form>
    </sd:div>
</sd:div>

<s:url id="deleteReport" action="deleteReport" />
<sd:div href="%{deleteReport}" listenTopics="deleteReport" formId="actionForm" showLoadingText="false" preload="false">
    <disp:table name="dayReportsList" export="true" class="dataTable">
        <disp:column property="contactCode" title="Contact"/>
        <disp:column property="customerCode" title="Customer"/>
        <disp:column property="stage" title="Stage"/>
        <disp:column property="type" title="Type"/>
        <disp:column property="summary" title="Summary"/>
        <disp:column property="reportDate" title="Date" format="{0,date,dd-MMM-yyyy}" />
        <disp:column property="rowId" href="%{editReport}" paramId="rowID" paramProperty="rowId" title="Action">
            <s:form id="actionForm" name="actionForm">
                <s:hidden id="rowId" name="rowId" value="%{rowId}"/>  // This is not getting populated.
                <s:a onclick="dojo.event.topic.publish('editReport')">Edit<s:property value="rowId"/></s:a><br>
                <s:a onclick="dojo.event.topic.publish('deleteReport')">Delete</s:a>
            </s:form>
        </disp:column>
    </disp:table>
</sd:div>

我在这里面临的问题是,与显示标签中每一行关联的表单的name 是相同的。因此,当我尝试访问我的操作类中的rowId 变量时,我只获取第一行的rowId 的值,无论单击哪一行的按钮。

我看过一些关于堆栈溢出和 google 的使用 URL 重写的示例,但我不想使用它。

请指教。

谢谢!!

【问题讨论】:

  • 不应将此问题标记为 javascript
  • @Munter 我希望如果我可以在 javascript 中设置一个请求参数或类似的东西,然后在操作类中访问它,它应该可以解决问题。然后我将能够将参数值设置为“rowId”并在操作类中访问它以了解单击了哪一行。有没有办法做到这一点?

标签: jsp dojo struts2 action displaytag


【解决方案1】:

我认为这归结为您如何使用 dojo 发布事件。我不太清楚 dojo 是如何工作的,但你的按钮可以

dojo.event.topic.publish('editReport')

所以我看不到“editReport”事件的订阅者如何知道您要删除哪一行,以及它必须删除哪一行。

documentation for publish 表明可以将参数传递给发布函数。将 rowId 作为参数传递给订阅函数,并在编辑/删除行的函数中使用此参数。

编辑:

页面末尾http://struts.apache.org/2.1.8/docs/ajax-div-template.html展示了一个动态改变div的href然后刷新div的例子。我会使用类似的策略:使用唯一的表单(而不是每行一个表单)来编辑(或删除)页面中的报告。让每个行链接将事件发布到以行 ID 作为参数的主题。让监听主题的 JavaScript 函数动态改变唯一表单的隐藏 rowId 字段的值,然后告诉 div 自己刷新。

【讨论】:

  • 这里我没有使用订阅功能。 div“监听”一个主题,当该主题被“发布”时,这个 div 会从提到的 href (即动作类)刷新其内容。有没有一种方法可以让我在 javascript 中设置参数或会话变量,以便稍后在操作类中访问。这会是一个好方法吗?
  • div 以formId 作为属性值,表示表单的字段将被序列化并作为参数传递给动作类。但是这里有多种表格(每行 1 个)我如何为每个表格指定不同的名称。或者还有什么其他方法可以实现这个场景。
  • 谢谢 JB。有些部分我明白了,有些不明白。所以我会试试这个并回复你。
  • 搞定了。谢谢 !!只有一种表格并将表格放入其中的想法使之成为可能。谢谢。
【解决方案2】:

对于那些仍然坚持要做的事情的人,这是我最终为使其正常工作所做的事情。

JSP:

<s:url id="editReport" action="editReport" />
<sd:div href="%{editReport}" listenTopics="editReport" formId="actionForm" showLoadingText="false" preload="false">
    <s:url id="updLists" action="updLists" />
    <sd:div href="%{updLists}" listenTopics="updLists" formId="enterDayReport" showLoadingText="false" preload="false">
        <s:form id="enterDayReport" action="enterDayReport">
            <sd:autocompleter  label="Customer " name="customer" list="customerList"  valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <sd:autocompleter  label="Contact "  name="contact"  list="contactList"   valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <s:select          label="Stage "    name="stage"    list="stageList"     headerKey="0" headerValue="Select" />
            <s:select          label="Type "     name="type"     list="typeList"      headerKey="0" headerValue="Select" />
            <sd:datetimepicker label="Date"      name="date"     formatLength="small" displayFormat="dd - MMM - yyyy"/>
            <s:textarea        label="Summary"   name="summary"  cols="40" rows="10"/>
            <s:hidden          id="filedOnDate"  name="filedOnDate"/>
            <s:submit          value="Save Report"/>
        </s:form>
    </sd:div>
</sd:div>

<s:url id="deleteReport" action="deleteReport" />
<sd:div href="%{deleteReport}" listenTopics="deleteReport" formId="actionForm"  showLoadingText="false" refreshOnShow="true" preload="false">
    <s:form id="actionForm" name="actionForm" action="">
        <disp:table uid="dayReport" name="dayReportsList" export="true" class="dataTable">
            <disp:column property="contactCode" title="Contact"/>
            <disp:column property="customerCode" title="Customer"/>
            <disp:column property="stage" title="Stage"/>
            <disp:column property="type" title="Type"/>
            <disp:column property="summary" title="Summary"/>
            <disp:column property="reportDate" title="Date" format="{0,date,dd-MMM-yyyy}" />
            <disp:column title="Action">
                <s:a href="" onclick="editEvent(event,%{#attr.dayReport.rowId});">Edit</s:a><br>
                <s:a href="" onclick="deleteEvent(event,%{#attr.dayReport.rowId});">Delete</s:a>
            </disp:column>
        </disp:table>
        <s:hidden id="rowId" name="rowId"/>
    </s:form>
</sd:div>

JS文件:

function editEvent(e,rowId)
{
    dojo.byId('rowId').value=rowId;
    dojo.event.topic.publish('editReport');
}

function deleteEvent(e,rowId)
{
    dojo.byId('rowId').value=rowId;
    dojo.event.topic.publish('deleteReport');
}

这就是这里发生的事情:

当点击编辑或删除时,会调用js中的相应函数(并传递rowId)。每个函数首先将隐藏字段的值设置为 rowId 值(作为函数的参数),然后它会惩罚一个主题。当主题发布时,相应的 div 调用一个动作并用新内容刷新。这里我在div标签中提到了表单的表单id,这样action就有了隐藏字段的值,在javascript中已经设置为rowId。

希望对你有帮助

卡尼什克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2019-12-03
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多