Jsp 使用显示标记为表的每一行提供编辑和删除按钮

Jsp 使用显示标记为表的每一行提供编辑和删除按钮,jsp,dojo,struts2,action,displaytag,Jsp,Dojo,Struts2,Action,Displaytag,我使用display标记在JSP上的表中显示数据(使用struts 2)。现在我想为每一行提供两个链接,一个用于编辑,一个用于删除该行 我的jsp结构和我目前正在尝试的是: <s:url id="editReport" action="editReport" /> <sd:div href="%{editReport}" listenTopics="editReport" formId="actionForm" showLoadingText="false" preload="

我使用display标记在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>

//这是没有得到填充。
编辑
删除
我在这里面临的问题是,与display标记中的每一行关联的表单的
名称
。因此,当我尝试访问action类中的
rowId
变量时,无论单击哪一行的按钮,我都只会获取第一行的rowId值

我在stack overflow和google上看到了一些使用URL重写的例子,但我不想使用这些

请告知


谢谢

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

dojo.event.topic.publish('editReport')
因此,我不知道“editReport”事件的订阅者如何知道您要删除哪一行,以及必须删除哪一行

显示可以将参数传递给发布函数。将rowId作为参数传递给subscribe函数,并在编辑/删除行的函数中使用此参数

编辑:


页面末尾显示了一个示例,该示例动态更改div的href,然后刷新div。我将使用类似的策略:使用唯一的表单(而不是每行一个表单)来编辑(或删除)页面中的报告。让每个行链接将事件发布到以行ID为参数的主题。让JavaScript函数监听主题,动态更改唯一表单的隐藏rowId字段的值,然后告诉div刷新自己。

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

dojo.event.topic.publish('editReport')
因此,我不知道“editReport”事件的订阅者如何知道您要删除哪一行,以及必须删除哪一行

显示可以将参数传递给发布函数。将rowId作为参数传递给subscribe函数,并在编辑/删除行的函数中使用此参数

编辑:


页面末尾显示了一个示例,该示例动态更改div的href,然后刷新div。我将使用类似的策略:使用唯一的表单(而不是每行一个表单)来编辑(或删除)页面中的报告。让每个行链接将事件发布到以行ID为参数的主题。让JavaScript函数监听主题,动态更改唯一表单的隐藏rowId字段的值,然后告诉div刷新自己。

对于那些仍然坚持要做什么的人,下面是我最后为使其工作所做的

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中的相应函数(并传递rowId)。每个函数首先将隐藏字段的值设置为rowId值(该值作为函数的参数),然后它将punlishe一个主题。当主题发布时,repective div调用一个操作并使用新内容刷新。在这里,我在div标记中提到了表单的表单id,因此操作具有隐藏字段的值,该字段在javascript中被设置为rowId

希望这有帮助


Kanishk

对于那些仍然坚持要做的事情的人,这里是我最后为让它工作所做的

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中的相应函数(并传递rowId)。每个函数首先将隐藏字段的值设置为rowId值(该值作为函数的参数),然后它将punlishe一个主题。当主题发布时,repective div调用一个操作并使用新内容刷新。在这里,我在div标记中提到了表单的表单id,因此操作具有隐藏字段的值,该字段在javascript中被设置为rowId

希望这有帮助


Kanishk

此问题不应被标记为javascript@Munter我希望,如果我能在javascript中设置一个请求参数或类似的东西,然后在action类中访问相同的参数,它应该可以做到这一点。然后,我将能够将参数值设置为“rowId”,并在action类中访问它,以了解单击了哪一行。有没有办法做到这一点?这个问题不应该被标记为javascript@Munter我希望,如果我能在javascript中设置一个请求参数或类似的东西,然后在action类中访问相同的参数,它应该可以做到这一点。然后,我将能够将参数值设置为“rowId”,并在action类中访问它,以了解单击了哪一行。有没有办法做到这一点?这里我不使用subsciber函数。div“侦听”某个主题,当该主题“发布”时,该div将从提到的href(即action类)中刷新其内容。是否有一种方法可以在javascript中设置参数或会话变量,稍后可以在action类中访问。这是一个好方法吗?div将formId作为一个属性值,该属性值指示其字段将被序列化并作为参数传递给action类的表单。但是这里有多个表单(每行1个),如何为每个表单指定不同的名称。或者,实现此场景的其他方法是什么。谢谢JB。有些部分我懂了,有些部分我不懂。所以我会尝试一下,然后再给你回复,让它发挥作用。谢谢只有一种形式的想法