如何从jsp页面获取所选行的列表或所选复选框的列表到liferay 6中的portlet的动作类方法?

时间:2012-10-31 13:49:30

标签: jsp liferay portlet checkbox liferay-6

我正在开发自定义portlet,在我的一个视图页面中,我需要一些帮助。

以下是我的表格,其中每行都有复选框,每行都会在运行时创建(动态):

<form method="post" name="editform">
   <table class="table table-bordered table-striped" id="dt_gal_res">
      <thead>
         <tr>
            <th class="table_checkbox"><input type="checkbox"
                    name="select_rows" class="select_rows"
                    data-tableid="dt_gal_rest" /></th>
            <th>Name</th>
            <th>Contact Person</th>
            <th>Website</th>
            <th>EDIT</th>
            <th>DELETE</th>
          </tr>
      </thead>

 <%
       List<restaurant> rest_listOBJ = restaurantLocalServiceUtil.getAllAvailableRestaurant();

       for (int i = 0; i < (rest_listOBJ.size()); i++) {
                restaurant temprest = rest_listOBJ.get(i);
  %>

     <tbody>
         <tr>
            <td><input type="checkbox" name="row_sel" class="row_sel" /></td>
            <td><%=temprest.getName() %></td>
            <td><%=temprest.getContactno() %></td>
            <td><%=temprest.getWebsite() %></td>
            <td>
                <input type="submit" id="1" value="edit"
                            onclick="return getbuttonId('<%=temprest.getPrimaryKey() %>')" />
            </td>
            <td>
                <input type="submit" id="2" value="DELETE"
                            onclick="return getdeletebuttonId('<%=temprest.getPrimaryKey() %>')" />
                </td>
        </tr>
     </tbody>
        <%
            }
        %>
</table>

    <div style="visibility: hidden;">
        <input type="hidden" name="hide1" id="hiddenkey" value="">
    </div>
</form>

现在我有删除按钮,并且通过其他逻辑,我将逐一删除该行 但现在我想要的是在选中行的复选框之后的一个或多个复选框 我提交了一个按钮,然后单击该按钮,我想删除所有选中复选框的行。

如果有人能指导我如何在我的portlet类的操作方法中获取所选复选框列表的列表,那么即使这对我来说也足够了。

我对jsp很新,所以任何有任何想法的人都请建议我。

正如你的家伙所说,我已经采取了同样的方式。但是没有取得任何成功。请纠正我这里的错误是我的行动类

public void deleteMultipleRestaurant(ActionRequest ar, ActionResponse ap)
            throws Exception {

        log.info("ENTERED");
        List<restaurant> restaurants = restaurantLocalServiceUtil.getAllAvailableRestaurant();



        for (restaurant restaurantitem : restaurants) {        
            if (Boolean.valueOf(ar.getParameter("row_sel" + restaurantitem.getPrimaryKey()))) {
               // This is a selected checkbox so add you remove code here

                log.info(restaurantitem);

                restaurantitem.setIsdeleted(true);
                restaurantLocalServiceUtil.updaterestaurant(restaurantitem);


            }
        }
    }

在我的视图文件中执行如下操作

这是我的ul之一,我的删除链接就在那里

<portlet:actionURL name="deleteMultipleRestaurant"
                        var="multideleteURL">
                    </portlet:actionURL>

                    <button data-toggle="dropdown" class="btn dropdown-toggle">
                        Action <span class="caret"></span>
                    </button>
                    <ul class="dropdown-menu">                          
                        <li><aui:button name="DELETE" value="DELETE" onClick="<%=multideleteURL.toString() %>"/></li>                           
                        <li><a href="javascript:void(0)">Lorem ipsum</a></li>
                        <li><a href="javascript:void(0)">Lorem ipsum</a></li>
                    </ul>

以下是在视图页面

<tbody>
                                <%
                                    List<restaurant> rest_listOBJ = restaurantLocalServiceUtil
                                                                    .getAllAvailableRestaurant();

                                                              for (int i = 0; i < (rest_listOBJ.size()); i++) {

                                                                restaurant temprest = rest_listOBJ.get(i);
        %>

<tr>                                            
      <td><input type="checkbox" id="row_sel<%= temprest.getPrimaryKey() %>" name="<portlet:namespace/>row_sel<%= temprest.getPrimaryKey() %>" class="row_sel" />
      </td>

    <td><%=temprest.getName()%></td>
    <td><%=temprest.getContactno()%></td>
    <td><%=temprest.getWebsite()%></td>
    <td><input type="button" id="1"
                                            onclick="return getbuttonId('<%=temprest.getPrimaryKey()%>')"
                                            style="border:none;width:20px" class="icon-pencil"/>
                                        <input type="button" id="2"
                                            onclick="return getdeletebuttonId('<%=temprest.getPrimaryKey()%>')"
                                            style="border:none;width:20px" class="icon-trash" /></td>
                                    </tr>                               
                                <%
                                    }
                                %>
                            </tbody>

但没有得到......只是重新加载页面..正好是数据

3 个答案:

答案 0 :(得分:4)

现在你在做:

  1. 将单Id发送到processAction方法
  2. 根据按钮editdelete
  3. 执行操作

    你想:

    1. 选择多个复选框
    2. 点击某处的Delete按钮
    3. 删除所有选定的项目
    4. 解决方案(可能还有很多其他方法):

      1. 你的复选框应该是这样的:

        <input type="checkbox" name="<portlet:namespace/>row_sel" class="row_sel" value="<%=temprest.getPrimaryKey() %>" />
        

        如果您使用<aui:input />代码,则不必费心将name属性添加到<portlet:namespace/>

      2. 以逗号分隔格式收集隐藏输入字段Id中的所有<input type="hidden" name="<portlet:namespace/>allCheckedIds" />,然后将其发送到服务器。

      3. 这可以使用javascript完成,点击Delete按钮调用javascript方法,该方法将从已检查的复选框的值构造所有Id s的字符串。您可以获取this link的帮助来构建javascript方法。
      4. 然后在{javascript方法本身的帮助下submit form
      5. 然后在您的processAction方法中,您可以将Id s与以逗号分隔的字符串分隔为:

        String allIds = ParamUtil.getString(actionRequest, "allCheckedIds");
        //allIds = "1,2,3,4,5,6"; // this is how the Ids might look
        long[] idArray = StringUtil.split(allIds, ",", 0); // were 0 is the default value
        
      6. 现在将这些ID传递给服务层以删除它们。

      7. 就是这样。简单不是。

        liferay使用了类似的方法,您可以检查Document Library Display portlet。如果您使用<liferay-ui:searchContainer>来显示您的列表,那么您可以利用liferay为您做到这一点。

        我将在这方面提供一些指示,你可以查看来源:
        view_file_entries.jspf,请查看rowChecker="<%= entriesChecker %>"行,为您创建复选框,然后签出实际将请求发送到操作类的['<portlet:namespace />deleteEntries'][4], javascript方法。有jsps和行动课你可以退房,但我会告诉你去探索。 : - )

        快乐探索。

答案 1 :(得分:3)

我不知道它是以这种简单的方式完成的。如果我错了,请纠正我。我刚用以下代码解决了我的问题:

<td><input type="checkbox" name="row_sel" class="row_sel" /></td>

和我的行动方法

String[] camp_id = request.getParameterValues("row_sel");
// boolean booln = false;

for(String camp_iditem:camp_id){ ... }

它只是给我camp_iditem变量中的选中按钮的值。

我得到了我想做的事。如果我做错了,请纠正我?

感谢所有人的指导......

答案 2 :(得分:2)

您需要做的第一件事是更改name属性并在您的复选框中添加id属性。所以不要这样:

<td><input type="checkbox" name="row_sel" class="row_sel" /></td>

你应该有这样的东西:

<td><input type="checkbox" id="row_sel<%= temprest.getPrimaryKey() %>" name="<portlet:namespace/>row_sel<%= temprest.getPrimaryKey() %>" class="row_sel" /></td>

这将确保在processAction方法中唯一标识每个复选框。

然后在您的流程操作方法中,您可以使用以下逻辑来确定是否选中了复选框:

List<Restaurant> restaurants = RestaurantLocalServiceUtil.getAllAvailableRestaurant();

for (Restaurant restaurant : restaurants) {        
    if (Boolean.valueOf(actionRequest.getParameter("row_sel" + restaurant.getPrimaryKey())) {
       // This is a selected checkbox so add you remove code here
    }
}

那应该以粗暴的方式帮助你!

此外,如果这个答案(或您的一个问题的任何其他答案)对您有帮助,请“接受”该答案以帮助社区,并确认那些花时间帮助您的人。

~~编辑~~

正如Olaf在下文中提到的,您的<form>标记应如下所示:

<form method="post" name="editform" action="<portlet:actionURL/>">

~~编辑02/11/12 ~~

以下代码可用于查看传递给Action方法的所有参数及其值:

for (String key : actionRequest.getParameterMap().keySet()) {
    log.info("Param " + key + " has value: " + actionRequest.getParameter(key));
}