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所评论的)这不是标准做法,但我认为您可以通过以下方式实现您的目标:
让我知道这是工作的预期或你需要更多的帮助 如果问题是使在服务器端构建列表更容易,您可以这样做:
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);