Java中的@RequestBody和@RequestParam注解的用法
1.spring 的 RequestParam 注解接收的参数是来自于 requestHeader 中,即请求头,也就是在 url 中,格式为 xxx?username=123&password=456,
而 RequestBody 注解接收的参数则是来自于 requestBody 中,即请求体中。
2. 如果是从 js 通过 ajax 请求传送 json 字符串到 controller 层,在接受数据的形参用 @RequestBody 注解时,ajax 请求时内容类型为 contentType:"application/json",且将要传送的数据从 json 对象转为 json 字符串 data: JSON.stringify(param);
3. 如果在 ajax 的请求地址中带有参数,则在 controller 层中可以加 @RequestParam 注解获取参数,常用于 get 请求,也可以不加,加的话因为 @RequestParam 是 key-value 类型,那地址的参数中必须有形参中的 key 值
4.ajax 请求参数中也可以有数组类型,如例子中的 taskTemplateValueList
5. 遇到复杂的数据格式,一般来说还是 json 比较好处理,即用 @RequestBody 接收
js:
/**
* 点击预览按钮
*/
function smsPreLook() {
var templateId = $('#templateId').val();
var templateContent = $('#templateContent').val();
if (templateContent == null || templateContent == '') {
msgInfoModal("提示",'请编辑文本内容');
return;
}
// 关键字
var taskTemplateValueList=[];
var checkValue=true;
$("tr[name='taskTemplateValueListTr']").each(function(){
var paramName=$(this).find('input[name=paramName]').val();
var paramValue=$(this).find('input[name=paramValue]').val();
var taskTemplateValue={};
taskTemplateValue.paramName = paramName;
taskTemplateValue.paramValue = paramValue;
taskTemplateValueList.push(taskTemplateValue);
if (paramValue == null || paramValue == '') {
checkValue=false;
}
});
if (!checkValue) {
msgInfoModal("提示",'请输入关键字的替换内容');
return;
}
var smilResourceId=$('#smilResourceId').val().trim();
var isdetail=false;
var param = {
smilResourceId: smilResourceId,
smsMsgContent:templateContent,
templateContent:templateContent,
templateId:templateId,
taskTemplateValueList:taskTemplateValueList// 数组类型
};
$.ajax({
url: WEB_ROOT + "/mall/task/preLook?isdetail="+isdetail,
type: "html",// 返回值类型
data: JSON.stringify(param),// 将要传送的数据从 json 对象转为 json 字符串
contentType:"application/json",// 定义数据内容类型为 "application/json"
method: "post",
success: function (page) {
$("#preLook").html(page);
$('#preLookModal').modal('show');
}
});
}
java:
/** * 预览显示 */ @RequestMapping(value = "/preLook")
// 如果在 isdetail 参数前有 @RequestParam(value="isdetail",required = true), 则在从 js 传来的请求地址后的参数必须有 isdetail 作为 key 值的参数,required 则控制该参数的 value 值是否必传
public String examineInit(Model model, @RequestBody TaskVO taskVO, Boolean isdetail) throws Exception {
AuthStaffVO staff = StaffUtil.getStaffVO(session);
if (isdetail && taskVO.getId() != null) {
taskVO = itTaskSV.selectTaskVOById(taskVO.getId());
} else {
// 校验文本内容的权限(部分自定义的话,只能用模板;完全自定义可以不用模板)
if (TaskConstant.TASK_RIGHT_1.equals(staff.getTaskRight())) {
// 必须使用模板
if (taskVO.getTemplateId() == null) {
return null;// R.failure("请选择模板 ~")
}
setTaskSmsMsgContentByTemplate(taskVO);
} else if (TaskConstant.TASK_RIGHT_2.equals(staff.getTaskRight())) {
// 可以不用模板
if (taskVO.getTemplateId() != null) {
setTaskSmsMsgContentByTemplate(taskVO);
} else {
taskVO.setSmsMsgContent(taskVO.getTemplateContent());
}
} else {
return null;//R.failure("您当前没有权限进行此操作哦 ~");
}
}
List<TaskVO> taskVOList = new ArrayList<TaskVO>();
try {
taskVOList = itTaskSV.selectTaskVOList(taskVO);
} catch (Exception e) {
log.error("短信任务管理 ( 后台)-- 数字短信预览异常", e);
}
model.addAttribute("taskVOList", taskVOList);
return "homeMain/myCenter/task/mall-smsPreLook";
}