表单提交的数据过大,后台接受到的数据为null

最近,工作上面我遇到了一个问题,当我用excel导入用户数据时,后台解析到excel的数据常为null。

tip:excel里面存放了百万级别的用户信息。

可以采用如下方法进行避免:在tomcat的server.xml里面配置post提交的数据大小不做限制。

<Connector executor="tomcatThreadPool"

port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

maxPostSize="-1"

/>

tomcat server.xml里面配置对post提交的数据大小不做限制

 

<think> 我们正在讨论JSP提交表单数据后,Java后台使用Context接受请求数据的方法。这里的“Context”可能指的是ServletContext,但更常见的做法是通过HttpServletRequest对象来获取请求参数。不过,如果用户确实想了解如何使用ServletContext,需要注意的是ServletContext是应用级别的上下文,通常不用于存储单个请求的数据(因为它是全局的,所有用户共享)。然而,我们可以通过HttpServletRequest对象(它代表一个请求)来获取请求参数,而HttpServletRequest对象可以看作是一个请求上下文(request context)。 根据引用[1],我们可以看到表单提交数据后台可以通过数组形式接收(当表单中有多个同名输入时)。引用[3]提到Spring MVC中Controller可以通过添加自定义Java类型的入参并加上@ModelAttribute注解来接收表单数据。 不过,用户的问题似乎更偏向于传统的Servlet方式(非Spring框架)如何使用类似上下文的方式获取数据。在Servlet中,我们通常使用HttpServletRequest对象来获取表单数据。 因此,我将解释在Servlet中如何通过HttpServletRequest(请求上下文)获取表单数据,并给出示例。 步骤: 1. 在Servlet中,重写doPost方法(因为表单提交通常用POST方法)。 2. 在doPost方法中,通过HttpServletRequest对象的getParameter或getParameterValues方法获取表单字段的值。 3. 如果需要将数据传递给其他Servlet或JSP,可以将数据存储在请求作用域(request scope)、会话作用域(session scope)或应用作用域(application scope)中。 注意:这里的“上下文”可以理解为不同的作用域: - 请求上下文:HttpServletRequest对象,数据在一次请求中有效(包括forward)。 - 会话上下文:HttpSession对象,数据在一次会话中有效(同一个用户)。 - 应用上下文:ServletContext对象,数据在整个Web应用中有效(所有用户)。 用户问题中提到的“Context”如果是指请求上下文,那么就是使用HttpServletRequest。 示例代码(Servlet中): ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码,防止中文乱码 request.setCharacterEncoding("UTF-8"); // 获取单个参数值(对于单个值的字段) String username = request.getParameter("username"); // 获取多个参数值(对于多选框等有多个同名字段) String[] hobbies = request.getParameterValues("hobby"); // 将数据存入请求上下文(request作用域),以便在转发后的JSP页面中使用 request.setAttribute("username", username); request.setAttribute("hobbies", hobbies); // 也可以存入会话上下文(session作用域)或应用上下文(ServletContext),但要注意作用域的生命周期 // 转发到另一个JSP页面显示数据 RequestDispatcher dispatcher = request.getRequestDispatcher("/showData.jsp"); dispatcher.forward(request, response); } ``` 在JSP页面(showData.jsp)中,我们可以通过EL表达式获取这些数据: ```jsp 用户名:${username}<br> 兴趣爱好: <ul> <c:forEach items="${hobbies}" var="hobby"> <li>${hobby}</li> </c:forEach> </ul> ``` 另外,如果用户的问题是在非Servlet的普通Java类中如何获取请求数据,那么通常无法直接获取,因为请求数据与Servlet容器相关。此时,应该将HttpServletRequest作为参数传递给业务方法。 关于引用[3]提到的Spring MVC方式,这里也简要说明: 在Spring MVC中,我们可以直接在Controller方法中使用@ModelAttribute绑定对象,也可以使用HttpServletRequest作为参数,然后从request中获取参数。 示例(Spring MVC): ```java @Controller public class MyController { @PostMapping("/saveCustomer") public String saveCustomer(@ModelAttribute Customer customer, HttpServletRequest request) { // 方式1:使用@ModelAttribute自动绑定表单数据到Customer对象(表单字段名与Customer属性名一致) // 方式2:也可以通过request.getParameter获取 String custName = request.getParameter("custName"); // 然后可以将数据存入Model(相当于request作用域)或ModelAndView // ... return "success"; } } ``` 总结: - 在Servlet中,使用HttpServletRequest对象获取表单数据,并可以将其存储在请求作用域(request)、会话作用域(session)或应用作用域(application)中。 - 在Spring MVC中,除了直接使用HttpServletRequest,还可以使用@ModelAttribute自动绑定表单数据到JavaBean。 注意:表单重复提交问题(引用[2]提到)可以通过拦截器等方式防止,但不在本次问题讨论范围内。 如果用户确实想使用ServletContext(应用上下文),那么数据会被所有用户共享,而且生命周期很长,一般不用于存储请求数据,因为每个请求的数据都是独立的。 因此,我们主要使用请求上下文(HttpServletRequest)来接受请求数据。 相关问题: 1. 如何解决表单提交的中文乱码问题? 2. JSP中如何从会话作用域(session)中获取数据? 3. 在Spring MVC中使用@ModelAttribute绑定表单数据时需要注意什么? </think> 在JSP提交表单数据时,Java后台通过**请求上下文对象(HttpServletRequest)** 接收数据的核心方法是使用 `request.getParameter()` 系列方法。以下是具体实现方法和示例: ### 一、请求上下文获取数据的三种方式 #### 1. 获取单个参数值(`request.getParameter()`) ```java // Servlet示例 protected void doPost(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); String age = request.getParameter("age"); System.out.println("用户名: " + username); System.out.println("年龄: " + age); } ``` **说明**: - 用于获取单值字段(如文本框、单选框)[^1] - 参数名需匹配表单字段的 `name` 属性(如 `<input name="username">`) - 返回值始终为 `String`(需手动转换数据类型) #### 2. 获取多值参数(`request.getParameterValues()`) ```java // 处理同名多值字段(如复选框) String[] hobbies = request.getParameterValues("hobby"); if(hobbies != null) { for(String hobby : hobbies) { System.out.println("爱好: " + hobby); } } ``` **适用场景**: - 表单包含多个同名字段(如引用[1]的重复输入字段)[^1] - 复选框组(`<input type="checkbox" name="hobby">`) #### 3. 绑定到Java对象(Spring MVC的 `@ModelAttribute`) ```java // Spring MVC Controller @PostMapping("/saveCustomer") public String saveCustomer(@ModelAttribute Customer customer) { // 自动将表单字段映射到对象属性 System.out.println("客户名: " + customer.getCustName()); System.out.println("年龄: " + customer.getCustAge()); return "success"; } ``` **要求**: - Java对象的属性名需与表单字段名一致 - 支持嵌套对象(如 `customer.address.city`) --- ### 二、关键注意事项 1. **编码处理(防中文乱码)** 必须在获取参数前设置编码: ```java request.setCharacterEncoding("UTF-8"); ``` 2. **防重复提交机制** 引用[2]建议的拦截器方案: ```java // 实现原理示例 String requestKey = request.getRequestURI() + "|" + Arrays.toString(request.getParameterMap().values()); if (isDuplicateRequest(requestKey)) { // 检查请求指纹 response.sendError(HttpServletResponse.SC_CONFLICT, "请勿重复提交"); return; } ``` 3. **作用域选择原则** | 作用域 | 范围 | 典型场景 | |--------|------|----------| | `request` | 单次请求 | 表单处理、页面跳转数据传递 | | `session` | 用户会话 | 登录状态、用户偏好设置 | | `application` | 全局应用 | 全局配置、计数器 | --- ### 三、完整流程示例(Servlet版) **1. JSP表单(带重复字段)** ```jsp <form action="/submitCustomer" method="post"> 用户名称:<input type="text" name="custName"><br> 年龄:<input type="text" name="custAge"><br> 用户名称:<input type="text" name="custName"><br> <!-- 同名字段 --> 年龄:<input type="text" name="custAge"><br> <!-- 同名字段 --> <input type="submit" value="提交"> </form> ``` **2. Servlet处理** ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) { request.setCharacterEncoding("UTF-8"); // 获取同名多值字段 String[] names = request.getParameterValues("custName"); String[] ages = request.getParameterValues("custAge"); List<Customer> customers = new ArrayList<>(); for (int i = 0; i < names.length; i++) { Customer cust = new Customer(); cust.setCustName(names[i]); cust.setCustAge(Integer.parseInt(ages[i])); customers.add(cust); } // 将数据存入请求上下文 request.setAttribute("customerList", customers); request.getRequestDispatcher("/result.jsp").forward(request, response); } ``` **3. 结果页面(result.jsp)** ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:forEach items="${customerList}" var="cust"> ${cust.custName} - ${cust.custAge}<br> </c:forEach> ``` --- ### 四、最佳实践建议 1. **数据验证** 后台必须验证: ```java if (StringUtils.isEmpty(username)) { request.setAttribute("error", "用户名不能为空"); request.getRequestDispatcher("/form.jsp").forward(request, response); return; } ``` 2. **防XSS攻击** 对用户输入进行过滤: ```java String safeInput = request.getParameter("input") .replaceAll("<", "<") .replaceAll(">", ">"); ``` 3. **跨域提交防护** 验证来源页面: ```java if (!request.getHeader("Referer").contains("yourdomain.com")) { response.sendError(HttpServletResponse.SC_FORBIDDEN); return; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值