使用AJAX将一个数据传到后台,但是java后台的request为null,无法getParameter,该怎么解决?
JS代码:
callback: {
message: '用户名已被占用',
callback: function (value, validator) {
var res = true;
var checkvalue = $("#username").val();
if(checkvalue.length > 5){
$.ajax({
url: '${pageContext.request.contextPath}/user/userCheckExist.vk',
type: 'post',
dataType: 'text',
async: false,
data: {'checkvalue': checkvalue},
success: function (responseText) {
alert(responseText);
if (responseText != 'success') {
res = false;
}
}
}
后台代码:
public void userCheckExist(@RequestParam(value = "checkvalue", required = false)HttpServletRequest request,HttpServletResponse response) throws IOException{
String sss = "";
response.setContentType("text/html;charset=UTF-8");
try{
String checkName = request.getParameter("checkvalue");// 因为request为空,所以此处报错
// ··· ···
}catch (Exception e) {
e.printStackTrace();
response.getWriter().write("success");
}
response.getWriter().write("success");
return;
}
报错信息为:
DEBUG [http-nio-8080-exec-6] - DispatcherServlet with name 'mybatis' processing POST request for [/VenkSOS/user/userCheckExist.vk]
DEBUG [http-nio-8080-exec-6] - Looking up handler method for path /user/userCheckExist.vk
DEBUG [http-nio-8080-exec-6] - Returning handler method [public void com.venk.sos.controller.UserController.userCheckExist(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.io.IOException]
DEBUG [http-nio-8080-exec-6] - Returning cached instance of singleton bean 'userController'
java.lang.NullPointerException
at com.venk.sos.controller.UserController.userCheckExist(UserController.java:94)
at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
DEBUG [http-nio-8080-exec-6] - Null ModelAndView returned to DispatcherServlet with name 'mybatis': assuming HandlerAdapter completed request handling
DEBUG [http-nio-8080-exec-6] - Successfully completed request
感谢各位大神的回答,今天早上终于把代码改好了,功能可以用了,是后台注解和取值的问题。
顺便贴一下修改后的代码。
前端页面部分:
callback: {
message: '用户名已被占用',
callback: function (value, validator) {
var res = true;
var checkvalue1 = $("#userId").val();
if(checkvalue1.length > 4){
console.info("checkvalue is :"+checkvalue1);
$.ajax({
url: '${pageContext.request.contextPath}/user/userCheckExist.vk',
type: 'post',
dataType: 'text',
async: false,
data: {"checkvalue": checkvalue1},
success: function (responseText) {
if (responseText != 'success') {
console.info(checkvalue1 + " 用户已存在");
res = false;
}else{
console.info(checkvalue1 + " 可以注册");
}
},error: function (responseText){
console.info("后台异常,执行注册时再检查用户是否存在");
}
});
return res;
}
}
}
后台:
@RequestMapping("userCheckExist")
public void userCheckExist(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=UTF-8");
try {
String checkName = request.getParameter("checkvalue");
User u = new User();
u.setUserName(checkName);
User ifExist = userService.selectOne(u);
if (ifExist != null) {
response.getWriter().write("exist");
log.info("----- 【用户已存在,不可提交注册】 -----");
} else {
response.getWriter().write("success");
log.info("----- 【用户不存在,可以提交注册】 -----");
}
} catch (Exception e) {
e.printStackTrace();
response.getWriter().write("error");
log.warn("----- 【Ajax注册验证用户是否存在时后台出错】-----", e);
return;
}
return;
}
验证界面效果:
发送到时json,但是标识的是form data。contentType默认值: "application/x-www-form-urlencoded,而你data是json,你spring MVC方法使用用的是form data,所以框架无法将json注入到参数,所以参数是null。
将data拼接成form data,checkvalue=111,这样。
ps:查看http请求返回是解决这种问题最快的办法
在后端,你把@RequestParam
注解加在了HttpServletRequest
上面,导致request
没有注入HttpServletRequest
,而去尝试注入@RequestParam("checkvalue")
了。
然后前端你发送的请求不是form-data类型,所以后端没法用@RequestParam
接受数据,所以后端的request
就是null
。
请求头要加content-type:application/json,,加了吗