当前位置: 首页 > news >正文

Spring MVC数据绑定的几种方法(一)

这篇文章包含spring mvc的默认数据类型绑定和简单数据类型绑定。内容来自实验。


准备:

1)在IDEA环境中从archetye创建webapp类型的maven项目exp6

2)在src\main目录下创建并标注java源代码文件夹和resources资源文件夹。

3)在pom.xml文件中,添加Spring MVC的相关依赖。

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency>

 4)在resources文件夹下创建配置文件spring-mvc.xml并完成相关配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置创建 springMVC 容器要扫描的包  --><context:component-scan base-package="com.itheima.controller"></context:component-scan><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean>
</beans>

 5)配置web.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置初始化参数,读取Spring MVC的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

 6)配置Maven启动项。在pom.xml文件中引入tomcat插件:

<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/exp6</path></configuration></plugin>

添加Maven启动项,使用命令tomcat7:run启动应用程序。

项目目录结构如下:

 


 

数据绑定:

1.默认数据类型绑定

src\main\java文件夹下创建com.itheima.controller的类包,在类包中创建UserController类,在UserController类中定义方法getUserId( ),用于获取客户端请求中userid参数的值。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;@Controller
public class UserController {@RequestMapping("/getUserId")public void getUserId(HttpServletRequest request){String userid= request.getParameter("userid");System.out.println("userid="+userid);}
}

启动项目后,访问地址http://localhost:8080/exp6/getUserId?userid=2,控制台打印userid信息如下:

2.简单数据类型绑定

1)在UserController类中新增getUserNameAndId( )方法,用来接收客户端请求中的用户名和id参数。

@RequestMapping("/getUserNameAndId")public void getUserNameAndId(String username,Integer id) {System.out.println("username="+username+", id="+id);}

 访问地址http://localhost:8080/exp6/getUserNameAndId?username=Spring&id=1,运行结果如下:

2@RequestParam注解来定义参数的别名,完成请求参数名称和处理器的形参名称不一致时的数据绑定。在UserController类中新增getUserName ( )方法,给username形参定义了别名name,同时设定了请求的name参数不是必须的,访问没携带name参数时会将defaultValue属性设定的值赋给形参username

@RequestMapping("/getUserName")public void getUserName(@RequestParam(value="name", required = false,defaultValue = "itheima") String username){System.out.println("username="+username);}

 访问http://localhost:8080/exp6/getUserName?name=Spring,运行结果如下:

 3)使用@PathVariable注解将URL中占位符参数绑定到处理器的形参中。在UserController类中新增getPathVariable( )方法, value属性将占位符参数“name”和处理方法的参数username进行绑定。

@RequestMapping("/user/{name}")public void getPathVariable(@PathVariable(value = "name") String username){System.out.println("username="+username);}

 

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

src\main\java目录下,创建一个com.itheima.pojo包,在该包下创建一个User类封装用户信息。

public class User {private String username;		//用户名private String password;		//用户密码public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

 UserController.java类中,定义registerUser( )方法用于接收用户注册信息。

// 接收表单用户信息@RequestMapping("/registerUser")public void registerUser(User user) {String username = user.getUsername();String password = user.getPassword();System.out.println("username="+username+",password="+password);}

src\main\webapp目录下,创建register.jsp文件,编写用户注册表单。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">用户名:<input type="text" name="username" /><br />密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" /><br /><input type="submit" value="注册"/>
</form>
</body>
</html>

启动后访问地址http://localhost:8080/exp6/register.jsp,结果如下:

分别填写注册的用户名和密码,点击“注册”按钮完成数据的提交,控制台打印信息:

注:输入的用户名为中文时,控制台打印信息可能会出现乱码,可以使用Spring提供的编码过滤器来统一编码,只需要在web.xml中添加如下代码:

<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

5)自定义类型转换器:Spring MVC默认提供了一些常用的类型转换器,然而默认类型转换器并不能将提交的参数转换为所有的类型。此时需要开发者自定义类型转换器,来将参数转换为程序所需要的类型。

①下面演示自定义类型转换器转换特殊数据类型并完成数据绑定,实现Date类型的数据绑定。

在项目src\main\java目录下,创建一个com.itheima.convert包,在该包下创建日期转换类DateConverter,并在DateConverter类中定义convert()方法, 实现String类型转到Date类型的转换。

import org.springframework.core.convert.converter.Converter;import java.text.SimpleDateFormat;
import java.util.Date;public class DateConverter implements Converter<String, Date> {private String datePattern = "yyyy-MM-dd";//定义日期格式@Overridepublic Date convert(String source) {SimpleDateFormat sdf = new SimpleDateFormat(datePattern);try {return sdf.parse(source);} catch (Exception e) {throw new IllegalArgumentException("无效的日期格式,请使用这种格式:"+datePattern);}}
}

还需要在配置文件spring-mvc.xml中配置类型转换器。

<!-- 配置类型转换器工厂 --><bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean"><!-- 给工厂注入一个新的类型转换器,配置自定义类型转换器 --><property name="converters"><array><bean class="com.itheima.convert.DateConverter"/></array></property></bean><mvc:annotation-driven conversion-service="converterService"/>

UserController.java类中定义方法getBirthday(),用于绑定客户端请求中的日期数据。

/*** 使用自定义类型数据绑定日期数据*/@RequestMapping("/getBirthday")public void getBirthday(Date birthday) {System.out.println("birthday="+birthday);}

启动后访问地址http://localhost:8080/exp6/getBirthday?birthday=2020-11-11,控制台打印信息:

②上述方法中日期类型的格式转换是基于XML配置自定义转换器实现的。除了XML方式之外,还可以通过@DateTimeFormat注解来简化日期类型的格式转换,无需自定义转换器,也无需在配置文件中定义转换器工厂或格式化工厂。

将上述在spring-mvc.xml中配置的转换器工厂和自定义类型转换器都删除,由于注解方式的类型转换依赖注解驱动的支持,配置文件中必须显式定义<mvc:annotation-driven>元素,此时spring-mvc.xml中的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置创建 springMVC 容器要扫描的包  --><context:component-scan base-package="com.itheima.controller"></context:component-scan><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 配置注解驱动 --><mvc:annotation-driven />
</beans>

修改UserController.java类中getBirthday()方法,修改后的具体代码如下。

/*** 使用@DateTimeFormat注解绑定日期数据*/@RequestMapping("/getBirthday")public void getBirthday(@DateTimeFormat(pattern = "yyyy-MM-dd")Date birthday) {System.out.println("birthday="+birthday);}

启动项目,访问http://localhost:8080/exp6/getBirthday?birthday=2020-11-11,控制台打印信息:

 


复杂数据类型绑定下次再写。


加油加油^_^

相关文章:

Spring MVC数据绑定的几种方法(一)

这篇文章包含spring mvc的默认数据类型绑定和简单数据类型绑定。内容来自实验。 准备&#xff1a; &#xff08;1&#xff09;在IDEA环境中从archetye创建webapp类型的maven项目exp6。 &#xff08;2&#xff09;在src\main目录下创建并标注java源代码文件夹和resources资源文…...

CSP-坐标变换(其二)

问题描述 对于平面直角坐标系上的坐标 (x,y)&#xff0c;小 P 定义了如下两种操作&#xff1a; 拉伸 k 倍&#xff1a;横坐标 x 变为 kx&#xff0c;纵坐标 y 变为 ky&#xff1b; 旋转 θ&#xff1a;将坐标 (x,y) 绕坐标原点 (0,0) 逆时针旋转 θ 弧度&#xff08;0≤θ<…...

docker 安装jekins

echo Asia/Shanghai >/etc/timezone&#xff0c;容器中操作报错&#xff1a;docker容器中 Permission denied 使用该-u选项时&#xff0c;可以使用root用户(ID 0)&#xff0c;而不是用默认用户登录docker容器 docker exec -u 0 -it f8a2b3d91455 /bin/bash 或者&#xff…...

ChatGPT 问世一周年之际,开源大模型能否迎头赶上?

就在11月30日&#xff0c;ChatGPT 迎来了它的问世一周年&#xff0c;这个来自 OpenAI 的强大AI在过去一年里取得了巨大的发展&#xff0c;迅速吸引各个领域的用户群体。 我们首先回忆一下 OpenAI和ChatGPT这一年的大事记&#xff08;表格由ChatGPT辅助生成&#xff09;&#x…...

数据结构和算法-哈夫曼树以相关代码实现

文章目录 总览带权路径长度哈夫曼树的定义哈夫曼树的构造法1法2 哈夫曼编码英文字母频次总结实验内容&#xff1a; 哈夫曼树一、上机实验的问题和要求&#xff08;需求分析&#xff09;&#xff1a;二、程序设计的基本思想&#xff0c;原理和算法描述&#xff1a;三、调试和运行…...

Kafka 的起源和背景

Apache Kafka 是一个分布式流处理平台&#xff0c;被广泛用于构建实时数据流应用程序和大数据处理系统。本文将深入探讨 Kafka 的起源、设计原则以及它在大数据领域中的重要作用。 大数据和实时数据处理背景 在大数据时代&#xff0c;处理海量数据和实时数据成为了一项关键挑…...

三极管在数字电路中的应用

一、认识三极管 三极管拥有3个引脚&#xff0c;分别对应3个级&#xff1a;基极(Base)、发射极&#xff08;Emitter&#xff09;、集电极(Collector)&#xff0c;如下图所示&#xff1b;下图横向左侧的是基极&#xff0c;带箭头的那个引脚就是发射极&#xff0c;另一个就是集电…...

java后端自学错误总结

java后端自学错误总结 MessageSource国际化接口总结 MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口&#xff0c;提供了国际化信息的能力。MessageSource用于解析 消息&#xff0c;并支持消息的参数化…...

CLion安装与配置教程

目录 一、下载并安装CLion1、下载1、官网&#xff1a;2、注意&#xff1a; 2、安装1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。2、开始安装&#xff0c;然后下一步3、可以在此处自定义地址&#xff0c;然后下一步4、根据系统版本选择&#xff0c;然后下一步…...

初识主力投资者

在股票市场中&#xff0c;真正赚钱的散户并不多。“七亏二平一赚”似乎已经成为了大家公认的一个股市定律。 为什么散户炒股赚的人少呢&#xff1f;原因很简单&#xff0c;就是因为市场上除了散户之外&#xff0c;还存在着一个重要的投资主体——主力。股市交易的过程&#xff…...

vue项目报错及解决npm run build:prod打包错误

vue项目报错及解决npm run build:prod打包错误 执行dev环境时加载失败了该变量&#xff0c;在package.json文件中 删掉 解决方法&#xff1a; 打包成功&#xff1a;...

Go连接mysql数据库

package main import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" ) //go连接数据库示例 func main() {// 数据库信息dsn : "root:roottcp(192.168.169.11:3306)/sql_test"//连接数据库 数据库类型mysql,以及数据库信息d…...

⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新

写 Unity Shader的时候&#xff0c;只有播放状态下的 Game 面板能看到Shader 顺畅的动态效果&#xff0c;不方便。 想要带有动态效果的 Shader 在 Scene 面板持续更新动画&#xff0c;只需要打开一个开关就能让 Scene 持续刷新动画了。 感谢大家的观看&#xff0c;您的点赞和关…...

面试--各种场景问题总结

1.在开发过程中&#xff0c;你是如何保证机票系统的正常运行的&#xff1f; 用户、测试、监控和日志、安全措施、数据备份、系统设计、需求分析 2.在机票系统开发过程中&#xff0c;你最有成就的事情&#xff0c;为什么&#xff1f; 用户体验感、高可用和稳定性、客户满意度、系…...

solidity实现ERC721代币标准发布NFT

文章目录 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科2、IERC1653、IERC7214、IERC721Receiver5、IERC721Metadata6、ERC7217、ERC721 NFT 的实现8、编译部署 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科 非同质化代币&#xff08;英语&#xff1a;Non-F…...

Failed building wheel for opencv-python which use PEP 517

这主要是opencv-python版本更新以后wheels也更新了&#xff0c;但是相关安装软件没有及时适配&#xff0c;所以不管是使用pip直接安装还是换源其实效果都是报错&#xff0c;解决方法就是直接指定安装旧版opencv-python完事儿&#xff0c;例如&#xff1a; pip3 install opencv…...

HTML5 的全局属性 hidden 和 display:none 的关系

目录 1&#xff0c;hidden 和 display:none 的关系2&#xff0c;其他隐藏元素的方式2.1&#xff0c;语意上的隐藏2.2&#xff0c;视觉上的隐藏 1&#xff0c;hidden 和 display:none 的关系 hidden - MDN 参考 一句话总结&#xff1a;hidden 是HTML5 新增的全局布尔属性&…...

CCKS2023-面向上市公司主营业务的实体链接评测-亚军方案

赛题分析 大赛地址 https://tianchi.aliyun.com/competition/entrance/532097/information 任务描述 本次任务主要针对上市公司的主营业务进行产品实体链接。需要获得主营业务中的产品实体&#xff0c;将该实体链接到产品数据库中的某一个标准产品实体。产品数据库将发布在竞赛…...

关于我离破500粉丝感受

嘿嘿快破500粉丝啦&#xff0c;加油喔&#xff0c;感谢支持 首先&#xff0c;恭喜我在CSDN上的粉丝数量即将突破500大关&#xff01;这说明你在这个平台上的内容受到了很多人的关注和认可。 1. 保持高质量的内容输出&#xff1a;粉丝数量的增长与你在CSDN上发布的内容质量密切…...

锁表的原因及解决办法

引言 作为开发人员&#xff0c;我们经常会和数据库打交道。 当我们对数据库进行修改操作的时候&#xff0c;例如添加字段&#xff0c;更新记录等&#xff0c;没有正确评估该表在这一时刻的使用频率&#xff0c;直接进行修改&#xff0c;致使修改操作长时间无法响应&#xff0…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...