【问题标题】:Unable to map javascript array in struts 2 action as List<String>无法将 struts 2 动作中的 javascript 数组映射为 List<String>
【发布时间】:2012-10-21 18:26:14
【问题描述】:

在一个 html 页面中,我有如下复选框:

<input name="serviceareas" type="checkbox" id="cb1" value="1">
<input name="serviceareas" type="checkbox" id="cb2" value="2">
...

在 jquery 的帮助下,我为所有选中的复选框创建了 javascript 值数组

getSelectedValues : function() {
            var allVals = [];
            $('#checkboxTable :checked').each(function() {
                   allVals.push($(this).val());
              });
            //alert("allVals: "+allVals);

            return allVals;
        }

,并将其发送到 Struts 2 Action。例如在萤火虫请求中,我看到:-

服务区 21,26,30

在 Action 中我尝试将其映射到

private List<String> serviceareas = new ArrayList<String>();

但是 SOP 将其打印为 Object 并且无法将其强制转换为 java List

public class CreateEventAction extends ActionSupport {

    private List<String> serviceareas = new ArrayList<String>();

    public List<String> getServiceareas() {
        return serviceareas;
    }
    public void setServiceareas(List<String> serviceareas) {
        this.serviceareas = serviceareas;
    }

    @Override
    public String execute() throws Exception {

        if(this.serviceareas != null) {

                for (String serviceAreaId : this.serviceareas) {

                        System.out.println("String :"+serviceAreaId);

                }

            }

        return SUCCESS;
    }

输出: 字符串:21,26,30

请帮忙。提前致谢。

【问题讨论】:

  • 你是如何创建 javascript 数组的?你能显示那个代码吗?另外,当您可以在表单中提交复选框时,为什么需要创建一个数组?这也应该工作actionUrl?serviceareas=21,26,30
  • @Anu - 我不是很擅长 JS,但我可以告诉你我在做什么。我没有提交表单,而是进行了 ajax 调用。我已经粘贴了上面创建数组的javascript函数。

标签: javascript arrays list struts2 mapping


【解决方案1】:

假设您提交给操作有效,请尝试像这样构造您的参数:

serviceareas=21&serviceareas=26&serviceareas=30

【讨论】:

    【解决方案2】:

    Aleksandr M's answer 应该可以工作。我发布这个答案只是为了更清楚地说明如何实现它。

    不是提交javascript数组,而是提交一个字符串。

    getSelectedValues : function() {
        var allVals = '';
        $('#checkboxTable :checked').each(function() {
             allVals += "serviceareas="+$(this).val()+"&";  //prepare the string
        });
        if(allVals.length>0){
             allVals = allVals.substring(0,allVals.length-1); //remove last '&'
        }    
        return allVals; //submit this string as parameter
    }
    

    【讨论】:

    • 谢谢。我会试一试,明天让你知道。
    • 感谢@anu 提供上述方法。我真的很感激:)
    【解决方案3】:

    我认为这是不可能的。当您在 servlet 中提交具有复选框或多个列表的表单时,我们通常调用 getPrameterValues() ,此方法在内部将逗号分隔的字符串转换为数组并将其作为字符串数组返回。但是在您的情况下,您只需提交一个逗号分隔的字符串和动作 servlet 调用 interanlly 调用 getPrameter() ,所以这将是一个刺痛并用一个字符串初始化您的列表。要完成它,您必须提交具有复选框组的表单。

    在这里,您可以通过在您的操作类中拆分这个逗号分隔的字符串来进行快速修复......或者您需要找出如何在您的 actionFor(struts 1.2) 中使用相应属性提交的方式。让我快速参考一下struts 2。无论如何,目前的方法是错误的。

    【讨论】:

    • 因为所有的复选框都有相同的名称,即name="serviceareas",它实际上是一个复选框组,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多