要求

1. form里是习题和选择的答案包含内容较多,直接用ajax获取页面元素较多,麻烦。

2. 也不能直接用form提交,form提交后会跳转页面,如果出错想在本页面获取错误信息(ajax提交)且保存用户选择的答案,不用重复作答。

问题

1. 将form表单中提交的内容转给ajax提交。

2. 获取哪道题没做(上篇已解决)。

3. 需要替换form中参数的部分内容。

4. ajax 提交中文到后台是乱码。

解决

1. 用jquery的 var str = $("form").serialize(); 方法获得form提交的内容。

3. 用js的replace()方法,可以用正则表达式匹配,str = str.replace(/&optionId\d{1,3}/g, "&optionId"); 这里是将&option1,&option2等 替换成&option(因为后台接收的对象里包含的option是个数组)

4. 用js的encodeURL()方法,将中文编码两次,第一次var str = $("form").serialize(); 的str已经是编码一次的了,还需encodeURI(str)一次。

页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <div class="u_main fr">
<div class="u_i_detail bodr u_height">
<div class="u_hd">
<h3>投资者风险评估</h3>
</div>
<div class="fx_pg">
<form id="riskEvauationSubmit"> <div class="pg_tit" align="center">
<h3>投资者风险评估测试</h3>
</div>
<div class="pg_tit">${riskEvaluation }</div> <c:forEach items="${list}" var="risk" varStatus="status">
<div class="pg_item">
<div class="pgt_bt">
${status.index+1}、<input type="text" name="title"
value="${risk.title }" /> <input type="hidden" name="stemId"
value="${risk.id }" /> <input type="hidden" name="type"
value="${risk.type }" />
</div>
<c:forEach items="${risk.option}" var="option"
varStatus="optionStatus">
<label class="pgt_list"> <c:if test="${risk.type == 1}"> <input type="radio" name="optionId${status.index}" /* redio每道题的name不能一样 要不然就是同一个redio了 */
class="optionId${status.index+1}" value="${option.id}">${option.content} </c:if> <c:if test="${risk.type == 2}"> <input type="checkbox" name="optionId${status.index}"
class="optionId${status.index+1}" value="${option.id}">${option.content} </c:if>
</label>
</c:forEach>
</div>
</c:forEach>
<div class="pg_butt">
<input id="submit" class="isave" value="立即评测"> <input
type="text" id="uuid" name="uuid" value="${uuid}" hidden="hidden" />
</div>
</form>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$("#menu_loaningInvest").attr("class", "z_cur"); }) $("#submit") .click(
function() {
var count = parseInt("${count}"); for (var i = 1; i <= count; i++) {
var flag = false;
if ($("input[class='optionId" + i + "']:checked").length > 0) {
flag = true;
} if (flag == false) {
alert("第 " + i + " 题未作答,请选择答案!");
return false;
}
}
var str = $("form").serialize();
str = str.replace(/&optionId\d{1,3}/g, "&optionId");
$
.post(
"${pageContext.request.contextPath}/riskAssessment/saveRiskEvaluation?"
+ encodeURI(str),
function(data) {
if (data.code == 1) {
window.location.href = '../riskAssessment/riskEvaluationResult';
} else if (data.code == 0) {
alert("请勿重复点击,多次提交。");
$("#uuid").val(data.msg);
} else {
alert(data.msg);
}
});
})
</script>

后台接收的springMVC controller

@ResponseBody
@RequestMapping("/saveRiskEvaluation")
public ErrorInfo saveRiskEvaluation(HttpServletRequest request, RiskEvaluation riskEvaluation,String uuid){ ErrorInfo error = new ErrorInfo();
int result = 0;
Users user = userService.currentUser(request); //uuid防重复提交
if(!captchaUtil.checkUUID(uuid)){
String uuidNew = captchaUtil.getUUID();
error.code = 0;
error.msg=uuidNew;
return error;
} try {
result = riskEvaluationService.saveRiskEvaluation(riskEvaluation,user);
} catch (HandleException e) {
error.code = -1;
error.msg="网络异常,请稍后重试";
return error;
} if(result <= 0){
error.code = -1;
error.msg="网络异常,请稍后重试";
return error;
}
error.code = 1;
return error;
}

接收前台传过值的model

public class RiskEvaluation {

    private String title[];        //题干 form里的name都一样

    private String stemId[];    //题干id

    private String optionId[];    //选项id 这是为什么传过来的optionId1,optionId2都必须是optionId

    private String type[];        //题目类型

    public String[] getStemId() {
return stemId;
} public void setStemId(String[] stemId) {
this.stemId = stemId;
} public String[] getType() {
return type;
} public void setType(String[] type) {
this.type = type;
} public String[] getTitle() {
return title;
} public void setTitle(String[] title) {
this.title = title;
} public String[] getOptionId() {
return optionId;
} public void setOptionId(String[] optionId) {
this.optionId = optionId;
} }

后台解码

title = java.net.URLDecoder.decode(title_arr[i],   "utf-8");

用ajax提交form表单及乱码问题的更多相关文章

  1. ajax提交form表单

    1. ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单. 2. from视图部分 <form id="loginF ...

  2. ajax提交form表单资料详细汇总

    一.ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单.通过在后台与服务器进行少量数据交换,ajax 可以使网页实现异步更新.这意味 ...

  3. jquery实现ajax提交form表单的方法总结

    本篇文章主要是对jquery实现ajax提交form表单的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一:  function AddHandlingFeeToRefund( ...

  4. jquery的ajax提交form表单方式总结

    方法一: function AddHandlingFeeToRefund() { var AjaxURL= "../OrderManagement/AjaxModifyOrderServic ...

  5. Ajax提交Form表单的一种方法

    待提交的表单 <form id="updatePublicKey" enctype="multipart/form-data"> <div c ...

  6. ajax提交form表单问题

    form表单提交数据可以省下大量大量获取元素的代码,局部刷新时也可以用ajax提交form表单,但是要先把表单序列化,再把后台javaBean对象序列化,但是你有可能前后台都执行了系列化,但是后台还是 ...

  7. Ajax提交form表单内容和文件(jQuery.form.js)

    jQuery官网是这样介绍form.js A simple way to AJAX-ify any form on your page; with file upload and progress s ...

  8. 使用ajax提交form表单,包括ajax文件上传【转载】

    [使用ajax提交form表单,包括ajax文件上传] 前言 转载:作者:https://www.cnblogs.com/zhuxiaojie/p/4783939.html 使用ajax请求数据,很多 ...

  9. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html

    使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },&qu ...

随机推荐

  1. 在windows 10中使用pip安装psutil 4.3.0

    环境版本:windows + python 2.7/3.5共存 使用的python是使用exe安装的,默认已经有pip并确保PATH设置正确,默认安装psutil 4.3.0 1:使用cmd安装2.7 ...

  2. tomcat安全加固

    -R 640 conf/*3. 首次安装完成后立即删除webapps下面的所有代码rm -rf /srv/apache-tomcat/webapps/*4. 注释或删除 tomcat-users.xm ...

  3. sql 多级内查询

    最近在开发一个外包的项目,其中有个需求,一直困扰我好几天,今天终于找到了解决方案.大致需求如下:公司总部发货给经销商,其中经销商包含四种级别,钻石.金牌.银牌和铜牌,等级依次下发,钻石包含金牌,金牌包 ...

  4. c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)

    1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...

  5. Android中的Service小结

    简介 Service适合执行不需要和用户交互,而且长期运行的任务.即使程序被切换回后台,服务仍然可以正常运行.Service并不自动开启线程,默认运行在主线程中. Service中需要重载的函数 on ...

  6. Easy51RTOS入门级初略分析

    main.c #include "reg51.h" #include "os_cfg.h" #define TASK_DELAY0 TIME_PER_SEC/1 ...

  7. Raspberry Pi I2C驱动 (Python)

    本文参考 http://www.instructables.com/id/Raspberry-Pi-I2C-Python/all/?lang=zh 作者 AntMan232 In this instr ...

  8. Java特性-HashMap

    想分享一个对HashMap的理解: 我们首先要知道一个HashMap对象的构成,一般的理解是:一个Map里面放了很多个键值对,合在一起就是一个键值对的数组: 大概这么理解没问题,可是有一点要说明一下, ...

  9. psp个人软件开发

    为开发人员提供一个PSP工具,简化时间记录工作:同时提供数据使用的工具,帮助开发人提高估算能力.  需求分析: 编号 特性 FEAT01 研发经理能够创建项目.指定或修改项目经理.删除尚未分配工作任务 ...

  10. C++初始化列表

    C++初始化列表 定义一个类对象时,常常使用初始化列表实例化一个对象,在进入构造函数函数体之前对成员变量完成初始化操作.普通成员变量既可以在初始化中初始化,也可以在函数体重赋值:const成员变量只能 ...