Spring MVC中Controller如何获取Form表单提交的数据

博客介绍表单提交数据分为Get和Post两种方式,Controller有三种获取表单数据的方式,分析了优缺点并推荐使用添加自定义Java类型入参的方式,还给出了使用该方式接收表单数据的demo,包括Controller代码、页面及Spring MVC配置等,最后提供项目demo链接。

表单提交的数据也就是请求数据,分为Get和Post两种方式提交。

Controller中有三种方式获取表单数据:

  •  Controller的方法,添加HttpServletRequst类型入参,通过HttpServletRequst.getParameter()获取请求数据
  •  Controller的方法,添加对应表单字段name的参数,有几个表单字段就添加多少个对应的入参,如下     
    @RequestMapping(value="/user/save", method=RequestMethod.POST)  
    private String doSave(@RequestParam("userName") String userName, 
    @RequestParam("age") Integer age, HttpSession session){  

     

  •  Controller的方法,添加自定义Java类型的入参,并添加@ModelAttribute注解(实际上,可以不添加@ModelAttribute注解) ,由这个入参对象接收表单提交的数据,如下
    @RequestMapping(value="/user/save", method=RequestMethod.POST)  
    private String doSave(@ModelAttribute User user, HttpSession session){

    在后台用@ModelAttribute获取整个POJO类的数据。当获取的还有不是POJO里面的参数的时候使用@RequestParam获取。

     public ModelAndView register(@ModelAttribute("form") Users usrs,RedirectAttributes arrt,  
            @RequestParam("confirm_password")String repassowrd,
    @RequestParam("kaptchaImage")String kaptchaImage){  

    比如上面这个验证码和新密码就不属于user这个pojo 用@RequestParam获取。

从上述描述,可以看出这几种方式的优缺点。

在这里,我推荐使用第三种方式,添加自定义Java类型的入参

下面我们就看看demo,如何使用第三种方式实现接收表单提交的数据

处理表单提交的Controller,FormSubmitController.java:

package edu.mvcdemo.controller;  

import javax.servlet.http.HttpSession;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import edu.mvcdemo.model.User;

/**

  • @编写人: yh.zeng

  • @编写时间:2017-7-15 下午12:14:41

  • @文件描述: 表单提交demo
    */
    @Controller
    @Scope(“singleton”) //只实例化一个bean对象(即每次请求都使用同一个bean对象),默认是singleton
    public class FormSubmitController {

    private Logger logger = Logger.getLogger(FormSubmitController.class);

    @RequestMapping(value="/user/view/{userId}", method=RequestMethod.GET)
    private String viewUser(@PathVariable(“userId”) String userId){
    return “user/view”;
    }

    @RequestMapping(value="/admin/user", method=RequestMethod.GET, params=“add”)
    private String addUser(){
    return “user/add”;
    }

    @RequestMapping(value="/user/save", method=RequestMethod.POST)
    private String doSave(@ModelAttribute User user, HttpSession session){

     user.setNo(RandomUtils.nextInt(<span class="hljs-number">1000</span>)); <span class="hljs-comment">//模拟数据库持久化  </span>
       
     <span class="hljs-comment">/** 
      * 进行数据库的持久化,省略 
      */</span>  
    
     logger.info(ReflectionToStringBuilder.toString(user));  
       
     session.setAttribute(<span class="hljs-string">"user"</span>, user);  
       
     <span class="hljs-keyword">return</span> <span class="hljs-string">"redirect:/user/view/"</span>+user.getNo();  
    

    }
    }

添加用户页面add.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>添加用户</title>  
</head>  
<body>  
   <form action="${pageContext.request.contextPath}/user/save" method="post">  
              用户名:<input type="text" name="userName"/> <br><br>  
              年龄:<input type="text" name="age"/> <br><br>  
       <input type="submit" value="提交"/>  
   </form>  
</body>  
</html>  

查看用户信息页面view.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>查看用户信息</title>  
</head>  
<body>  
              用户编号: ${sessionScope.user.no} <br>  
              用户名: ${sessionScope.user.userName} <br>  
              年龄:${sessionScope.user.age}   
</body>  
</html>  

Spring MVC配置的视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
    <property name="prefix" value="/jsp/" />  
    <property name="suffix" value=".jsp" />  
</bean>  

效果:

点击【提交】之后,跳转到查看新添加的用户信息的页面



 

 项目demo见https://github.com/zengyh/MavenSpringMvcDemo.git

原文地址:点击

<think>好的,我现在需要帮助用户了解在Spring MVC中处理表单提交和文件上传的方法,并提供一个示例教程。根据用户提供的引用资料,我需要整合这些信息,确保回答结构清晰,步骤正确,并且符合系统级指令的要求。 首先,回顾用户提供的引用内容。引用[1]提到了处理表单提交的基本步骤,包括配置控制器、模型对象、表单视图和数据验证。引用[2]和[4]则涉及文件上传的配置和控制器处理。引用[3]提到了一些其他处理方式,但用户主要关注表单提交和文件上传的示例教程。 接下来,我需要按照用户的要求,将回答分成处理表单提交和处理文件上传两个部分,每个部分都要有步骤说明和代码示例。同时,确保使用正确的中文表达,行内公式和独立公式的格式(虽然这个问题可能不涉及数学公式,但要注意其他格式要求)。 处理表单提交部分: 1. 配置控制器:使用@Controller和@RequestMapping注解。 2. 创建模型对象:用POJO类绑定表单数据,可能需要使用@ModelAttribute。 3. 创建表单视图:使用Thymeleaf或JSP,表单字段与模型对象属性对应。 4. 数据验证:使用@Valid注解和BindingResult,结合Hibernate Validator进行验证。 处理文件上传部分: 1. 添加依赖:可能需要Apache Commons FileUpload或Servlet 3.0+的Multipart配置。 2. 配置MultipartResolver:在Spring配置文件中定义Bean,如CommonsMultipartResolver。 3. 编写表单:enctype设置为multipart/form-data,包含文件输入字段。 4. 控制器处理:使用@RequestParam接收MultipartFile,处理文件保存。 需要确保代码示例正确,比如控制器的注解、表单的enctype设置,以及文件保存的路径处理。此外,注意引用标记的位置,例如在提到配置MultipartResolver时引用[4],在处理文件上传的控制器方法时引用[2]。 可能遇到的问题包括依赖配置是否正确,MultipartResolver的Bean名称是否必须为"multipartResolver",以及文件保存路径是否存在权限问题。在回答中需要提到这些注意事项,帮助用户避免常见错误。 最后,生成相关问题,参考用户提供的示例,相关问题应围绕Spring MVC表单处理、文件上传配置、验证机制以及异常处理等。确保问题相关且有引导性,帮助用户深入学习。 总结回答结构: 1. 处理表单提交的步骤和代码示例 2. 处理文件上传的配置和代码示例 3. 注意事项和常见问题 4. 相关问题列表 现在需要将这些内容组织成自然流畅的中文段落,正确引用资料,并符合格式要求。</think>在Spring MVC中处理表单提交和文件上传需要配置控制器、模型对象和视图,并正确使用Multipart请求处理。以下是详细步骤和示例: ### 一、处理表单提交 #### 1. 配置控制器 使用`@Controller`注解定义控制器,并通过`@RequestMapping`映射请求: ```java @Controller public class FormController { @GetMapping("/form") public String showForm(Model model) { model.addAttribute("user", new User()); return "form-page"; } @PostMapping("/submit") public String handleSubmit(@Valid @ModelAttribute("user") User user, BindingResult result) { if (result.hasErrors()) { return "form-page"; // 返回表单页显示错误 } return "success-page"; } } ``` #### 2. 创建模型对象 定义POJO类绑定表单数据: ```java public class User { @NotBlank(message = "姓名不能为空") private String name; @Email(message = "邮箱格式无效") private String email; // 省略getter/setter } ``` #### 3. 表单视图(Thymeleaf示例) ```html <form action="/submit" method="post" th:object="${user}"> <input type="text" th:field="*{name}" placeholder="姓名"> <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span> <input type="email" th:field="*{email}" placeholder="邮箱"> <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span> <button type="submit">提交</button> </form> ``` #### 4. 数据验证 通过`@Valid`注解触发校验,`BindingResult`捕获错误[^1]。 --- ### 二、处理文件上传 #### 1. 添加依赖 ```xml <!-- Servlet 3.0+ 文件上传 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> ``` #### 2. 配置MultipartResolver 在`spring-servlet.xml`中配置: ```xml <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 10MB --> </bean> ``` 此步骤确保Spring能解析文件上传请求[^4]。 #### 3. 文件上传表单 ```html <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">上传</button> </form> ``` #### 4. 控制器处理文件 ```java @PostMapping("/upload") public String handleUpload(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { String path = "/upload-dir/" + file.getOriginalFilename(); file.transferTo(new File(path)); return "upload-success"; } catch (IOException e) { e.printStackTrace(); } } return "upload-fail"; } ``` 通过`MultipartFile`接收文件并保存到指定目录[^2]。 --- ### 三、注意事项 1. **文件保存路径权限**:确保服务器目录有写入权限。 2. **MultipartResolver Bean名称**:必须命名为`multipartResolver`。 3. **大文件处理**:可配置`maxUploadSize`和`maxInMemorySize`防止内存溢出。 4. **安全限制**:限制上传文件类型(如仅允许图片)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值