ajax post提交数据时,request.getParameter不能取到数据的解决js代码。

本文介绍了一种在Web应用中使用JavaScript进行表单数据序列化的方法,通过自定义jQuery插件实现数据对象化,便于后台接收。同时,讨论了JFinal框架下如何正确使用getModel方法进行数据绑定。

   

1.在web上,js序列化提交数据为一个对象

   <script type="text/javascript">
            if ('ontouchstart'in document.documentElement)
                document.write("<script src='/res/ace-1.3.3/assets/js/jquery.mobile.custom.js'>" + "<" + "/script>");

            (function($) {
                $.fn.serializeJson = function() {
                    var serializeObj = {};
                    var array = this.serializeArray();
                    var str = this.serialize();
                    $(array).each(function() {
                        if (serializeObj[this.name]) {
                            if ($.isArray(serializeObj[this.name])) {
                                serializeObj[this.name].push(this.value);
                            } else {
                                serializeObj[this.name] = [serializeObj[this.name], this.value];
                            }
                        } else {
                            serializeObj[this.name] = this.value;
                        }
                    });
                    return serializeObj;
                }
                ;
            }
            )(jQuery);

 

     submitHandler: function(form) {
                        var $form = $("#validation-form");
                        var $btn = $("#submit-btn");
                        if ($btn.hasClass("disabled"))
                            return;
                        var postData = $("#validation-form").serializeJson();
                        $.post("http://localhost:8080/sys/user/saveAjax", postData, function(data) {
                            if (data.code == 0) {
                                parent.reloadGrid();
                                //重新载入
                                layer.msg('操作成功', {
                                    icon: 1,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function() {
                                    var index = parent.layer.getFrameIndex(window.name);
                                    //先得到当前iframe层的索引
                                    parent.layer.close(index);
                                    //再执行关闭 
                                });
                            } else {
                                layer.msg(data.msg, {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                });
                            }
                            $("#btn-submit").removeClass("disabled");
                        }, "json");
                        return false;
                    },

 

 

JFinal中controller getModel(),只能接name=类名.field字段的注入!

<input name="user.id" /> 这样才能直接 在Controller中  getModel(User.class),得到对象.

<think>嗯,用户在使用Java Servlet遇到了request.getParameter("token")返回空值或null的问题,需要排查原因。首先,我得回忆一下常见的导致这种情况的可能因素。首先,用户可能没有正确传递token参数,比如在GET请求中没有在URL里添加,或者在POST请求中没有放在请求体中。这候需要检查客户端发送请求的方式是否正确,参数名是否拼写正确。 然后,可能需要检查请求的编码问题。如果客户端发送的是POST请求,并且内容类型不是application/x-www-form-urlencoded,比如可能是multipart/form-data,这候直接用getParameter可能无法获取到参数,需要处理multipart请求,或者检查是否设置了正确的编码。比如,如果在POST请求中没有调用request.setCharacterEncoding("UTF-8"),可能会导致参数解析错误,进而返回null。 另外,还有可能是服务器端的配置问题。比如,某些过滤器或拦截器在请求到达Servlet之前已经读取了参数,导致后续的getParameter方法无法再次读取。这种情况需要检查是否有过滤器修改了请求或者提前消费了输入流,比如在处理文件上传,如果没有正确解析multipart请求,可能会导致参数无法获取。 还有可能是参数名拼写错误,比如前后端参数名不一致,比如大小写问题,或者有空格等。这候需要仔细核对参数名是否正确,或者是否有额外的空格。 另外,如果请求是通过forward或include转发过来的,可能需要检查是否使用了RequestDispatcher的正确方式来传递参数,或者是否在转发过程中丢失了参数。 此外,还要考虑是否有安全配置拦截了参数,比如某些安全框架可能会过滤掉某些参数,导致无法获取。这候需要检查安全配置,比如web.xml中的安全设置或者框架的配置。 还有一种可能是请求本身没有携带token参数,比如客户端未正确生成请求,或者在AJAX请求中未正确设置参数。这候需要检查客户端的请求是否确实包含了token参数,可以通过浏览器的开发者工具查看网络请求的详情,确认参数是否正确发送。 总结一下,可能的原因包括参数未正确传递、编码问题、请求类型处理不当、过滤器或拦截器的影响、参数名错误、请求转发问题、安全配置以及客户端未发送参数。需要逐一排查这些可能性,可以通过检查请求内容、服务器端日志、调试代码等方式来确定具体原因。</think>### Java Servlet中request.getParameter("token")返回空值的排查步骤 #### 1. 检查参数传递方式 - **GET请求**:确保参数通过URL的查询字符串传递,格式为`?token=value`。例如: ```java String token = request.getParameter("token"); // 需验证URL是否包含token参数 ``` - **POST请求**:检查请求体内容是否为`application/x-www-form-urlencoded`格式。若使用表单提交,需确认表单中是否存在`<input name="token">`字段[^1]。 #### 2. 编码问题排查 - **客户端编码**:若参数包含非ASCII字符(如中文),需确保客户端发送已正确编码。 - **服务端解码**:在读取参数前设置请求编码: ```java request.setCharacterEncoding("UTF-8"); // 需在调用getParameter()之前执行 ``` #### 3. 检查请求类型与内容格式 - **multipart/form-data**:若请求是文件上传类型,需使用`Part`接口或第三方库(如Apache Commons FileUpload)解析参数。例如: ```java // 使用Servlet 3.0+的Part接口 Part tokenPart = request.getPart("token"); String token = new BufferedReader(new InputStreamReader(tokenPart.getInputStream())).readLine(); ``` #### 4. 过滤器/拦截器干扰 - **输入流提前读取**:若过滤器调用过`request.getReader()`或`request.getInputStream()`,会导致后续无法读取参数。解决方法: - 使用`HttpServletRequestWrapper`缓存请求体(需自定义实现)。 - 检查AOP切面是否意外修改请求,例如引用[2]中的`@Before`和`@After`注解可能影响流程。 #### 5. 参数名匹配问题 - **严格匹配大小写**:`request.getParameter("token")`对参数名大小写敏感,需确认客户端传递的是`token`而非`Token`或`TOKEN`。 - **隐藏空格或特殊字符**:检查参数名是否存在不可见字符(如换行符)。 #### 6. 服务器配置检查 - **web.xml配置**:确认无全局过滤器或错误处理器覆盖参数逻辑。例如引用[1]中的`ErrorHandler`可能截获请求并修改参数。 #### 7. 请求转发场景 - **Forward/Include操作**:若通过`RequestDispatcher`转发请求,需确保参数通过`request.setAttribute()`显式传递,或原请求已包含参数。 #### 8. 安全框架限制 - **参数过滤**:检查是否配置了安全框架(如Spring Security)过滤特定参数。例如: ```xml <!-- web.xml中可能存在的安全约束 --> <security-constraint> <web-resource-collection> <url-pattern>/api/*</url-pattern> <http-method>POST</http-method> </web-resource-collection> <auth-constraint/> </security-constraint> ``` #### 9. 客户端调试 - **浏览器开发者工具**:通过Network面板查看实际发送的请求参数。 - **日志输出**:在服务端打印所有参数名: ```java request.getParameterMap().forEach((k, v) -> System.out.println(k + "=" + Arrays.toString(v))); ``` --- ### 常见问题总结表 | 原因分类 | 具体表现 | 解决方法 | |-------------------|------------------------------|-------------------------------------------| | 参数未传递 | 客户端请求中缺失token字段 | 检查请求内容或表单设计 | | 编码不一致 | 中文参数乱码 | 统一客户端和服务端编码为UTF-8 | | multipart请求未解析| POST请求中无法获取文件域参数 | 使用Part接口或第三方库解析 | | 输入流提前消费 | 过滤器读取了请求体 | 自定义HttpServletRequestWrapper缓存请求体 | | 安全框架拦截 | 特定参数被过滤 | 调整安全配置或白名单 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值