• 从一个例子认识Spring MVC数据绑定


    源码地址:链接:https://pan.baidu.com/s/15yRipxMVzgjBoTbTqJ9uMA?pwd=h7gk 
    提取码:h7gk

    活动地址:CSDN21天学习挑战赛

    目录

    一.简单数据绑定

    二.绑定POJO类型

    三.绑定包装POJO

     四.绑定数组

     五.绑定集合


    一.简单数据绑定

    ​1.先用Eclipse创建一个动态web项目,导入Spring MVC依赖的包,jre设置为JavaSE-15(需要用到注解,否则会出现版本错误)

     

     2.在WEB-INF目录下创建web.xml,配置Spring MVC的前端控制器等信息

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    4. http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. id="WebApp_ID" version="4.0">
    6. <servlet>
    7. <servlet-name>springmvcservlet-name>
    8. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    9. <init-param>
    10. <param-name>contextConfigLocationparam-name>
    11. <param-value>classpath:springmvc-config.xmlparam-value>
    12. init-param>
    13. <load-on-startup>1load-on-startup>
    14. servlet>
    15. <servlet-mapping>
    16. <servlet-name>springmvcservlet-name>
    17. <url-pattern>/url-pattern>
    18. servlet-mapping>
    19. web-app>

    3.在src目录下创建Spring MVC的核心配置文件springmvc-config.xml,在该文件中配置组件扫描器和视图解析器

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans
    5. http://www.springframework.org/schema/beans/spring-beans.xsd
    6. http://www.springframework.org/schema/context
    7. http://www.springframework.org/schema/context/spring-context.xsd">
    8. <context:component-scan base-package="controller" />
    9. <bean id="viewResoler"
    10. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    11. <property name="prefix" value="/" />
    12. <property name="suffix" value=".jsp" />
    13. bean>
    14. beans>

    4.创建一个包命名为controller,在类中创建UserController类用于用户操作

    1. package controller;
    2. import javax.servlet.http.HttpServletRequest;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. @Controller
    6. public class UserController {
    7. @RequestMapping(value = "/selectUser")
    8. public String selectUser(HttpServletRequest request) {
    9. String idString=request.getParameter("id");
    10. System.out.println("id="+idString);
    11. return "success";
    12. }
    13. }

    由于标注在类上的@RequestMapping注解的value值为"/selectUser",因此,类中所有请求方法的路径都需要加上"/selectUser"

    return "success"表示返回的是一个名为success的jsp

     5.创建一个视图success.jsp

    1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    2. pageEncoding="ISO-8859-1"%>
    3. html>
    4. <html>
    5. <head>
    6. <meta charset="ISO-8859-1">
    7. <title>Insert title heretitle>
    8. head>
    9. <body>
    10. <h1>ok,thank you!!!h1>
    11. body>
    12. html>

    6.运行:localhost:8848/chapter12/selectUser?id=1

    视图界面:

     从后台我们可以看到我们已经通过HttpServletRequest获取的id

     这就是绑定默认数据类型

    7.绑定简单数据类型

    简单数据类型的绑定,就是指Java中几种基本数据类型的绑定,如int、String、Double等类型。

     给UserController类添加addUser方法

    1. @RequestMapping(value = "/addUser")
    2. public String addUser(Integer id) {
    3. System.out.println("id="+id);
    4. return "success";
    5. //访问:http://localhost:8848/chapter12/selectUser?id=1
    6. }

    有时候,前端请求中参数名和后台控制器类方法中的形参名不一样,就会导致后台无法正确绑定并接收不到前端请求的参数,为此,SpringMVC提供了@RequestParam注解来进行间接数据绑定。

    例如:

    1. @RequestMapping(value = "/addUser")
    2. public String addUser(@RequestParam(value = "user_id") Integer id) {
    3. System.out.println("id="+id);
    4. return "success";
    5. //访问:http://localhost:8848/chapter12/selectUser?user_id=1
    6. }

    运行结果与上图一致。

    二.绑定POJO类型

    在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较烦琐。此时就可以使用POJO类型进行数据绑定。

    POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。

    1.在src目录下创建一个包命名为po,在包内创建User类

    1. package po;
    2. public class User {
    3. private Integer id;
    4. private String username;
    5. private String password;
    6. public Integer getId() {
    7. return id;
    8. }
    9. public void setId(Integer id) {
    10. this.id = id;
    11. }
    12. public String getUsername() {
    13. return username;
    14. }
    15. public void setUsername(String username) {
    16. this.username = username;
    17. }
    18. public String getPassword() {
    19. return password;
    20. }
    21. public void setPassword(String password) {
    22. this.password = password;
    23. }
    24. }

    2.在控制器UserController类中编写向注册页面跳转和接受用户注册信息的方法

    1. @RequestMapping("/toRegister")
    2. public String toRegister() {
    3. //访问http://localhost:8848/chapter12/toRegister跳转到register.jsp
    4. return "register";
    5. }
    6. @RequestMapping("/registerUser")
    7. public String RegisterUser(User user) {
    8. String username=user.getUsername();
    9. String password=user.getPassword();
    10. System.out.println("username="+username);
    11. System.out.println("password="+password);
    12. return "success";
    13. }

    3.在webapp目录下创建register.jsp该界面编写用户注册表单,表单以POST方式提交

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. HTML>
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>注册title>
    8. head>
    9. <body>
    10. <form action="${pageContext.request.contextPath}/registerUser" method="post">
    11. 用户名:<input type="text" name="username" /> <br />
    12.    码:<input type="password" name="password" /> <br />
    13. <input type="submit" value="注册" />
    14. form>
    15. body>
    16. html>

    4.运行查看效果

    可以看到访问http://localhost:8848/chapter12/toRegister跳转到register.jsp

     输入用户名和密码后跳转到了success.jsp

     Eclipse的控制台上也会显示我们输入的信息

     由此可知,使用POJO类型同样可以获取前端请求传递过来的数据信息。

    在前端请求中,难免有中文信息传递,虽然浏览器显示中文信息,但是控制台上会出现中文乱码。可以使用Spring提供的编码过滤器来统一编码,只需要在web.xml中添加以下代码:

    1. <filter>
    2. <filter-name>CharacterEncodingFilterfilter-name>
    3. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    4. <init-param>
    5. <param-name>encodingparam-name>
    6. <param-value>UTF-8param-value>
    7. init-param>
    8. filter>
    9. <filter-mapping>
    10. <filter-name>CharacterEncodingFilterfilter-name>
    11. <url-pattern>/*url-pattern>
    12. filter-mapping>

    三.绑定包装POJO

    所谓的包装POJO,就是在一个POJO中包含另一个简单POJO。例如,在学生对象中包含班级对象。这样在使用时,就可以通过学生查询到班级信息。

    1.在po包下创建Banji和Student类

    1. package po;
    2. public class Banji {
    3. private Integer banji_id;
    4. private String banji_name;
    5. public Integer getBanji_id() {
    6. return banji_id;
    7. }
    8. public void setBanji_id(Integer banji_id) {
    9. this.banji_id = banji_id;
    10. }
    11. public String getBanji_name() {
    12. return banji_name;
    13. }
    14. public void setBanji_name(String banji_name) {
    15. this.banji_name = banji_name;
    16. }
    17. }
    1. package po;
    2. public class Student {
    3. private Integer stu_id;
    4. private String stu_name;
    5. private Banji banji;
    6. public Banji getBanji() {
    7. return banji;
    8. }
    9. public Integer getStu_id() {
    10. return stu_id;
    11. }
    12. public void setStu_id(Integer stu_id) {
    13. this.stu_id = stu_id;
    14. }
    15. public String getStu_name() {
    16. return stu_name;
    17. }
    18. public void setStu_name(String stu_name) {
    19. this.stu_name = stu_name;
    20. }
    21. public void setBanji(Banji banji) {
    22. this.banji = banji;
    23. }
    24. }

    2.在controller包下创建一个StudentController类

    1. package controller;
    2. import org.springframework.web.bind.annotation.RequestMapping;
    3. import po.Banji;
    4. import po.Student;
    5. public class StudentController {
    6. @RequestMapping("/tofindStudentWithBanji")
    7. public String tofindStudentWithBanji() {
    8. return "student";
    9. }
    10. @RequestMapping("/findStudentWithBanji")
    11. public String findStudentWithBanji(Student student) {
    12. Integer stu_id=student.getStu_id();
    13. Banji banji=student.getBanji();
    14. String banji_name=banji.getBanji_name();
    15. System.out.println("stu_id="+stu_id);
    16. System.out.println("banji_name="+banji_name);
    17. return "success";
    18. }
    19. }

    3.在webapp目录下创建student.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. HTML>
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>学生查询title>
    8. head>
    9. <body>
    10. <form action="${pageContext.request.contextPath}/findStudentWithBanji" method="post">
    11. 学生编号:<input type="text" name="stu_id" /> <br />
    12. 所属班级:<input type="text" name="banji.banji_name" /> <br />
    13. <input type="submit" value="查询" />
    14. form>
    15. body>
    16. html>

    4.运行结果

    访问:http://localhost:8848/chapter12/tofindStudentWithBanji跳转到student.jsp

     

     输入信息点击查询后跳转到success.jsp

     控制台可以收到前端输入的内容

     四.绑定数组

    实际项目开发中,除了简单数据类型,还会经常遇到一些比较复杂的数据绑定问题,比如数组的绑定、集合的绑定。

    在实际开发时,可能会遇到前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),此时不合适采用简单数据绑定,而可以使用绑定数组的方式。

     1.在webapp目录下创建course.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. HTML>
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>课程列表title>
    8. head>
    9. <body>
    10. <form action="${pageContext.request.contextPath}/deleteCourse" method="post">
    11. <table>
    12. <tr>
    13. <td>选择td>
    14. <td>课程名td>
    15. tr>
    16. <tr>
    17. <td><input name="ids" value="1" type="checkbox">td>
    18. <td>JAVA程序设计td>
    19. tr>
    20. <tr>
    21. <td><input name="ids" value="2" type="checkbox">td>
    22. <td>MySQL数据库td>
    23. tr>
    24. <tr>
    25. <td><input name="ids" value="3" type="checkbox">td>
    26. <td>JavaEE应用开发td>
    27. tr>
    28. table>
    29. <input type="submit" value="删除"/>
    30. form>
    31. body>
    32. html>

    2.在controller包下创建CourseController类

    1. package controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. @Controller
    5. public class CourseController {
    6. @RequestMapping("/toCourse")
    7. public String toCourse(){
    8. //访问http://localhost:8848/chapter12/toCourse
    9. return "course";
    10. }
    11. @RequestMapping("/deleteCourse")
    12. public String deleteCourse(Integer[] ids){
    13. if(ids!=null){
    14. for(Integer id:ids){
    15. System.out.println("删除了id为"+id+"的课程");
    16. }
    17. }else{
    18. System.out.println("ids=null");
    19. }
    20. return "success";
    21. }
    22. }

    3.运行结果

    访问http://localhost:8848/chapter12/toCourse跳转到course.jsp

    选择课程删除后,跳转到success.jsp,同时eclipse的控制台可以打印出删除的课程

     

     五.绑定集合

     在项目中,前端请求传递过来的数据可能就会批量包含各种类型的数据,如 Integer、String等。这种情况使用数组绑定是无法实现的。针对这种情况,可以使用集合数据绑定,即在包装类中定义一个包含对象类的集合,然后在接收方法中将参数类型定义为该包装类的集合。

     1.在src目录下创建vo包,在包内创建UserVo类

    1. package vo;
    2. import java.util.List;
    3. import po.User;
    4. public class UserVo {
    5. private List users;
    6. public List getUsers() {
    7. return users;
    8. }
    9. public void setUsers(List users) {
    10. this.users = users;
    11. }
    12. }

    2.在UserController类中添加批量修改用户的方法

    1. @RequestMapping("/toUserEdit")
    2. public String toUserEdit() {
    3. //访问:http://localhost:8848/chapter12/toUserEdit
    4. return "user_edit";
    5. }
    6. @RequestMapping("/editUsers")
    7. public String editUsers(UserVo userlist) {
    8. List<User> users=userlist.getUsers();
    9. for(User user:users) {
    10. if(user.getId()!=null) {
    11. System.out.println("删除了id为"+user.getId()+"的用户名为"+user.getUsername());
    12. }
    13. }
    14. return "success";
    15. }

    3.在webapp目录下创建user_edit.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. HTML>
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>修改用户title>
    8. head>
    9. <body>
    10. <form action="${pageContext.request.contextPath}/editUsers" method="post">
    11. <table>
    12. <tr>
    13. <td>选择td>
    14. <td>用户名td>
    15. tr>
    16. <tr>
    17. <td><input name="users[0].id" value="1" type="checkbox">td>
    18. <td><input name="users[0].username" value="zhangsan" type="text">td>
    19. tr>
    20. <tr>
    21. <td><input name="users[1].id" value="2" type="checkbox">td>
    22. <td><input name="users[1].username" value="lisi" type="text">td>
    23. tr>
    24. table>
    25. <input type="submit" value="修改"/>
    26. form>
    27. body>
    28. html>

    4.运行结果

    访问:http://localhost:8848/chapter12/toUserEdit

     点击修改后,跳转到success.jsp并在控制台上可以获取前端修改的信息

     

  • 相关阅读:
    【SQL】SQL语句执行顺序
    学习.NET验证模块FluentValidation的基本用法
    【软件测试】快速入行软件测试
    微服务笔记
    CLion用于STM32开发
    NC16679 [NOIP2003]神经网络
    Go :测试涉及NaN的浮点比较(附完整源码)
    @Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
    CSMACD协议与CSMACA协议
    PicPick工具
  • 原文地址:https://blog.csdn.net/weixin_52473454/article/details/126183944