Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以param=value1%2Cvalue2格式将复选框的多个值发送到后端?_Java_Javascript_Jquery_Jsp_Struts2 - Fatal编程技术网

Java 如何以param=value1%2Cvalue2格式将复选框的多个值发送到后端?

Java 如何以param=value1%2Cvalue2格式将复选框的多个值发送到后端?,java,javascript,jquery,jsp,struts2,Java,Javascript,Jquery,Jsp,Struts2,我的表单中有一个复选框列表,如下所示,我不知道在后端接收所选选项的最佳方式是什么 <s:form id="search" name="search" method="GET" action="search"> <s:checkboxlist name="mySearch.age" label="Age" list="@com.example.Lists@AGE"/> <s:checkboxlist name="mySearch.gender" lab

我的表单中有一个复选框列表,如下所示,我不知道在后端接收所选选项的最佳方式是什么

<s:form id="search" name="search" method="GET" action="search">
    <s:checkboxlist name="mySearch.age" label="Age" list="@com.example.Lists@AGE"/>
    <s:checkboxlist name="mySearch.gender" label="Gender" list="@com.example.Lists@GENDER"/>
    <s:select name="mySearch.education"  label="Education" list="@com.example.Lists@EDUCATION"/>
    <s:select name="mySearch.country" label="Country" list="@com.example.Lists@COUNTRY"/>
    <s:textfield id="mySearch.terms" name="mySearch.terms" label="Terms (Separate by comma)"/>
  <s:submit value="Submit"/>
</s:form>
1)目前情况如下

  private List<Integer> age; 
2)我使用javascript函数和简单html(与相同)发送值,也使用以下代码,但它以age=20&age=30的形式发送值

     $('#search').serialize()
3)我还使用以下代码将它们作为age=2,3发送,这很好,但我想知道如何将表单中其他字段的值与这些值一起发送

var formValues = $('#search').serialize();
    var obj={};
    obj.ages = $('input[name=age]:checked').map(function(){
        return this.value;
    }).get();
    alert(obj.ages);
尽管(正如Aleksandr所评论的)这不是标准做法,但我认为您可以通过以下方式实现您的目标:

  • 在表单中添加一个新的隐藏的字段,比如mySearch.ages
  • onSubmit迭代选中的mySearch.age字段,连接结果并将其作为值添加到mySearch.age
  • 禁用所有mySearch.age输入
  • 然后像往常一样序列化/提交

  • 让我知道这是工作的预期或你需要更多的帮助

    如果问题是使在服务器端构建列表更容易,您可以这样做:

    String[] ages = request.getParameterValues("age");
    if(ages!=null)
    {
        List<Integer> listAgesInt = new LinkedList<Integer>();
        try
        {
            for(String s : ages )
            {
               listAgesInt.add(Integer.valueOf(s));
            }
        }
        catch(Exception ex)
        {
            out.print("Error converting to integer");
        }
        for(int i : listAgesInt )
        {
           out.print("<br/>" + i);
        }
    }
    
    String[]ages=request.getParameterValues(“age”);
    如果(年龄!=null)
    {
    List listAgesInt=new LinkedList();
    尝试
    {
    用于(字符串s:年龄)
    {
    listAgesInt.add(Integer.valueOf);
    }
    }
    捕获(例外情况除外)
    {
    输出打印(“转换为整数时出错”);
    }
    用于(int i:listAgesInt)
    {
    打印输出(“
    ”+i); } }
    这样,您就不需要更改浏览器发送数据的方式。您可以轻松地将其转换为一个函数,该函数接受一个
    字符串[]
    ,并返回一个
    列表
    。然后您只需调用
    List listAgesInt=somelib.funcname(request.getParameterValues(“age”)

    如何将表单中其他字段的值与这些字段一起发送 价值观

    您可以使用JSON数据格式发送所有字段值,要发送JSON,请添加此jquery helper函数以从表单元素创建JSON对象:

    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };
    
    然后在表单提交上创建JSON对象,如:

    $(function() {
        $('form#search').submit(function() {
            var sendData = {};
            sendData["searchModel"] = $(':input:visible', this).serializeObject();
            $('#input').text(JSON.stringify(sendData));
            $.ajax({
                url : "writeJSON",
                type : 'POST',
                data : JSON.stringify(sendData),
                dataType: 'json',
                contentType:"application/json;charset=utf-8",                       
                success : function(res) {
                    console.log('success');
                    $('#output').text(JSON.stringify(res));             
                },error: function(jqXHR, textStatus, errorThrown) {
                    console.log('Error: '+textStatus+' : '+ errorThrown);
                }
                });
            return false;
        });
    });
    
    这里,
    $(':input:visible',this).serializeObject()
    将只返回可见元素值,即所有复选框选中的值、选择框选中的选项和文本输入值等。这里还要注意AJAX方法是
    POST

    创建一个模型bean,通过使用以下命令序列化和反序列化JSON:

    Action类将如下所示:

    public class SearchAction extends ActionSupport {
    
        private static final long serialVersionUID = 1L;
        private SearchModel searchModel;
    
        public String readJSON() {
                //do your work here..
            return SUCCESS;
        }
    
        public String writeJSON() {     
            System.out.println("writeJSON Method invoked");
            System.out.println(searchModel);
            return SUCCESS;
        }
    
        // SearchModel getter and setter
    
    }
    
    struts.xml
    中,配置以返回和接收json结果,如下所示:

    <package name="default" namespace="/" extends="json-default">     
    
           <interceptors>
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="json">
                    <param name="enableSMD">true</param>
                </interceptor-ref>
            </interceptor-stack>
           </interceptors>
           <default-interceptor-ref name="defaultStack" />
    
           <action name="writeJSON" class="com.actions.SearchAction" method="writeJSON">          
              <result type="json"/>
           </action>
           <action name="readJSON" class="com.actions.SearchAction" method="readJSON">          
              <result type="json"/>
           </action>
    
    </package>
    
    
    真的
    
    并以jsp格式:

    <s:form id="search">
        <s:checkboxlist name="ages"
                        label="Age" list="ages"/>
        <s:checkboxlist name="gender"
                        label="Gender" list="genders"/>
        <s:select name="education"
                    label="Education" list="educations"/>
        <s:select name="country" 
                    label="Country" list="countrys"/>
        <s:textfield id="terms"
                    name="terms" label="Terms (Separate by comma)"/>
      <s:submit value="Submit"/>
    </s:form>
    Input:
     <div id="input"></div>
    Output:
     <div id="output"></div>
    
    
    输入:
    输出:
    
    选中多个复选框时,您可以在场景中将它们分配给字符串和整数数组。例如,如果您的年龄列表有选项:10、20、30和40,其中选择了10、20,您可以将它们存储在整数数组中,以逗号分隔10、20,并通过它们的getter在操作中重新设置它。 例如

        <s:form id="search" name="search" method="GET" action="search">
            <s:checkboxlist name="age" label="Age" list="ageList"/>
            <s:checkboxlist name="gender" label="Gender" list="genderList"/>
            <s:select name="education"  label="Education" list="educationList"/>
            <s:select name="country" label="Country" list="countryList"/>
          <s:submit value="Submit"/>
        </s:form>
    

    另外,确保性别列表、教育列表、国家列表都已填充。

    您的代码就快到了

    $.serialize()
    只返回一个字符串,这样您就可以像处理任何其他字符串一样处理它

    var formValues = $('#search input, #search select, #search textarea').not("[name='age']").serialize();
    var ages = $('input[name=age]:checked').map(function () {
        return this.value;
    }).get();
    formValues += "&age=" + ages;
    alert(formValues);
    
    第一行序列化除年龄以外的所有字段。然后我们只需将年龄添加到字符串中,并将最后一个字符串发送到服务器

    如果您有多个值的其他字段,只需扩展
    .not(“[name='age'],[name='otherfield']”)以包含这些其他字段,然后重复上述过程


    编辑:这里有一个JSFIDEL:

    模型驱动并不复杂,而是将代码分成模块很难。您还想随年龄发送哪些字段?@Rembo问题更新了为什么不使用模型类接收数据?@JackMoore:标准做法是将参数发送为
    mySearch.age=20&mySearch.age=30
    这种方法不符合一般做法。我关心的是服务器端和地址栏上请求的简单性。表单上还有很多其他字段,这不是一种好的做法。
    <package name="default" namespace="/" extends="json-default">     
    
           <interceptors>
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="json">
                    <param name="enableSMD">true</param>
                </interceptor-ref>
            </interceptor-stack>
           </interceptors>
           <default-interceptor-ref name="defaultStack" />
    
           <action name="writeJSON" class="com.actions.SearchAction" method="writeJSON">          
              <result type="json"/>
           </action>
           <action name="readJSON" class="com.actions.SearchAction" method="readJSON">          
              <result type="json"/>
           </action>
    
    </package>
    
    <s:form id="search">
        <s:checkboxlist name="ages"
                        label="Age" list="ages"/>
        <s:checkboxlist name="gender"
                        label="Gender" list="genders"/>
        <s:select name="education"
                    label="Education" list="educations"/>
        <s:select name="country" 
                    label="Country" list="countrys"/>
        <s:textfield id="terms"
                    name="terms" label="Terms (Separate by comma)"/>
      <s:submit value="Submit"/>
    </s:form>
    Input:
     <div id="input"></div>
    Output:
     <div id="output"></div>
    
        <s:form id="search" name="search" method="GET" action="search">
            <s:checkboxlist name="age" label="Age" list="ageList"/>
            <s:checkboxlist name="gender" label="Gender" list="genderList"/>
            <s:select name="education"  label="Education" list="educationList"/>
            <s:select name="country" label="Country" list="countryList"/>
          <s:submit value="Submit"/>
        </s:form>
    
    public Integer[] age;
    public String[] gender;
    public String[] education;
    public String[] country;
    //Mutators for these
    
    var formValues = $('#search input, #search select, #search textarea').not("[name='age']").serialize();
    var ages = $('input[name=age]:checked').map(function () {
        return this.value;
    }).get();
    formValues += "&age=" + ages;
    alert(formValues);