我正在做一种计算器,客户端需要输入数据来执行计算。
我正在验证客户端的信息,但我也希望从服务器端进行验证。 This是我正在关注的示例,但我不知道如何使其与我的问题兼容。
@RestController
@RequestMapping(value = "/api")
public class CalculationController {
...
@RequestMapping(value = "calculate", method = RequestMethod.POST)
public double[] calculate(@ModelAttribute("calcForm") @Validated CalculationForm form,
BindingResult result,
final RedirectAttributes redirectAttributes) {
double[] ans = new double[4];
// Calculate and fill ans
return ans;
}
我的AJAX POST:
function calculate() {
if ($('#zone').val() === '' || $('#roofArea').val() === '' || $('#roofType').val() === '') {
alert("Missing data");
} else {
var dataIn = $("#myForm").serialize();
$.ajax({
type: "POST",
url: "api/calculate",
data: dataIn,
dataType: "json",
success: function (data) {
// Update labels in page
},
error: function (e) {
alert("Error: " + e);
},
done: function (msg) {
alert("Done: " + msg);
},
async: false
});
return false;
};
我的验证员:
@Component
public class BasicValidator implements Validator {
private Pattern pattern;
private Matcher matcher;
private static final String AREA_PATTERN = "^\\d+(\\.\\d{1,2})?$";
@Override
public boolean supports(Class<?> clazz) {
return CalculationForm.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
CalculationForm form = (CalculationForm) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "zone", "You must select a city or area of the map.");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "roofArea", "You must enter the roof area.");
pattern = Pattern.compile(AREA_PATTERN);
matcher = pattern.matcher(String.valueOf(form.getRoofArea()));
if (!matcher.matches())
errors.rejectValue("roofArea", "You must enter a valid number.");
}
}
我正在使用AJAX,因为我需要在表单完成时只更新某些特定标签的值,所以我无法重新加载页面。
问题在于,如果一切正确,/api/calculate
将返回我用来填充页面的双精度数组。但是如果发生错误(没有填写必填字段),我需要告诉我发生错误的位置,以便显示相应的消息。
答案 0 :(得分:1)
您需要使用以下域对象来发送响应:
public class JsonResponse {
private String status = null;
private Object result = null;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
它包含两个属性,“status”和“result”。 “status”字段的类型为String,包含“FAIL”或“SUCCESS”。 “result”将包含要发送回浏览器的其他数据。
现在更改您的控制器方法以返回成功和失败案例的JsonResponse。
@RequestMapping(value = "calculate", method = RequestMethod.POST)
public JsonResponse calculate(@ModelAttribute("calcForm") @Validated CalculationForm form,
BindingResult result,
final RedirectAttributes redirectAttributes) {
JsonResponse res = new JsonResponse();
if(!result.hasErrors()) {
double[] ans = new double[4];
-----------------------------
-----------------------------
res.setResult(ans);
res.setStatus("SUCCESS");
res.setResult(userList);
} else {
res.setStatus("FAIL");
res.setResult(result.getAllErrors());
}
return res;
}
现在在你的ajax成功函数中检查验证。
success: function (data) {
if(data.status == "SUCCESS") {
// Update labels in page
} else {
errorInfo = "";
for(i =0 ; i < data.result.length ; i++) {
errorInfo += "<br>" + (i + 1) +". " + data.result[i].code;
}
//add a div with id error to show errors.
$('#error').html("Please correct following errors: " + errorInfo);
}
},