业务:前端页面ajax传递json字符串传递到后台实现业务逻辑
环境:springmvc+spring+mybatis+freemarker+js+css
maven+mysql
springmvc配置文件配置支持返回json数据:
配置spring-servlet.xml:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json; charset=UTF-8</value>
<value>application/x-www-form-urlencoded; charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
前端ajax格式:
// 请求参数
var params = {
"customRow"=["solutionName","id","status","budget","metricImpression","metricClick","cpm", "cpc"]
};
$.ajax({
type: "POST",
url: "../updateCustomRow.do",
data: JSON.stringify(params),//响应数据
contentType: "application/json; charset=utf-8",//响应数据格式
dataType: "json", // 响应数据类型
success: function(data) {
console.log(data);
},
error: function(jqXHR) {
console.log('发生错误:' + jqXHR.status);
}
});
备注:上诉ajax请求注意data和dataType,contentType
后台接受:
@PostMapping("/updateCustomRow")
public ResponseEntity<BaseResponse> updateSolutionCustomRow(
@RequestBody
@Validated
@NotBlank
CustomRowUpdateDto customRow, HttpServletRequest request) {
xxxService.updateSolutionCustomRow(customRow);
return ResponseEntity.ok(BaseResponse.success());
}
dto:
@Data
public class CustomRowUpdateDto implements Serializable {
private static final long serialVersionUID = 4825543977191828653L;
//{"customRow":"[\"solutionName\",\"id\",\"status\",\"budget\",\"metricImpression\",\"metricClick\",\"cpm\",
// \"cpc\"]"}
private String customRow;
}
备注:前台定义的json字符串或者对象数组形式,后台用@RequestBody接受,参数用dto封装,属性名跟前端定义的参数名保持一致,否则接受的参数值为null
service层用gson解析上诉得到的json字符串:
/**
* 更新自定义列
* @param customRow 自定义列JsonArray
*/
@Transactional
public void updateCustomRow(CustomRowUpdateDto customRow) {
JsonArray customRowJson = null;
try {
customRowJson = new JsonParser().parse(customRow.getCustomRow()).getAsJsonArray();
} catch (JsonSyntaxException e) {
log.info("updateCustomRow", "自定义列数据有误,exception e={}" + e);
}
}
本地postman测试:
{
"customRow":"[\"solutionName\",\"id\",\"status\",\"budget\",\"metricImpression\",\"metricClick\",\"cpm\"cpc\"]"
}
注意:传递的时json字符串,不要换行,否则后台接受会异常,估计是postman工具的问题