首页 > 使用AJAX将数据传到后台,但是后台的request为null,该怎么解决

使用AJAX将数据传到后台,但是后台的request为null,该怎么解决

使用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,,加了吗

【热门文章】
【热门文章】