SpringMVC(二)

本文围绕SpringMVC展开,介绍了参数绑定,包括与包装类型pojo、数组、List和Map集合的绑定;阐述服务器端校验,使用hibernate validation;提及数据回显、异常统一处理、图片上传、与json交互、RESTful风格实现及拦截器使用等内容,涵盖开发各环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1springmvc的参数绑定
1.1与包装类型的pojo绑定
1.1.1需求
根据商品名称查询列表信息。
这里我们传递包装类型的pojo对象,因为在实际开发过程中我们的查询可能会分为简单查询和复杂查询,在复杂查询时,可能包含其他的很多信息,例如订单信息、用户信息等,这里在将mybatis的课程时已经讲解过,这里不再复述。
1.1.2分析
昨天的开发中,我们对商品的扩展类ItemsCustom已通过ItemsQueryVo包装,因此我们的jsp页面的传递的查询条件是不是ItemsQueryVo的属性呢?很明显是,但是我们知道该属性还是一个pojo对象,因此我们通过ognl表达式的方式传递值,因此,我们jsp页面中name属性设置应该是:itemsCustom.name,那么我们Controller方法的形参中接收的类型就是ItemsQueryVo对象。
1.1.3jsp添加查询条件
页面添加input框。
在这里插入图片描述
1.1.4Controller方法接收形参
在这里插入图片描述
1.2与Array数组绑定
1.2.1需求
将选择的商品删除(这里我们只要获取到商品id并传递到Controller方法中即可)
1.2.2分析
在实现了三个springmvc的参数绑定的案例中,我们发现,如果是与简单类型绑定,key与形参名称一致;如果是pojo对象或者包装类型的pojo,jsp页面的name与该对象的属性一致,如果该属性还是一个pojo,通过ognl方式设置name。因此这里我们需要传递id的集合,不是pojo,我们的名称input中的name应与Controller方法形参名一致。
1.2.3jsp添加checkbox
在这里插入图片描述
1.2.4Controller方法接收形参
在这里插入图片描述
1.3与List集合绑定
1.3.1需求
批量修改商品信息
1.3.2分析
之前的案例中是与单个pojo对象绑定,这里我们需要与多个pojo对象绑定,那么我是是不是需要在ItemsQueryVo对象中添加List itemsList属性呢?既然需要添加这个属性,我们是不是在页面上要传递该属性的值?在单个pojo中我们直接填写该属性的名称,那么传递多个pojo时我们就通过list[0].name,list[1].name的方式传递值,这样是不是就可以了呢?我们只要抓住重点,与pojo对象如何绑定并如何传值的。
1.3.3在ItemsQueryVo对象中添加属性
在这里插入图片描述
1.3.4在Controller方法中添加批量修改的方法
添加方法。
在这里插入图片描述
1.3.5添加jsp页面
在这里插入图片描述
1.3.6添加批量保存方法
在这里插入图片描述
1.4与Map集合绑定
在这里插入图片描述
在这里插入图片描述
user[‘name’]就是该map的key,并将填写的值作为value。
2服务器端校验
所谓的服务器端的校验就是在后台代码中进行校验。
2.1为什么需要在服务器端校验
我们在项目开发中,项目与项目之间数据的交互我们需要对这些数据校验,而且这些校验只能在服务器端;在jsp页面提交的时候也会做校验,例如form表单提交,可能会有人说页面不是由前端js等技术去校验么,为什么还需要在服务器端校验呢?在浏览器端我们可以禁用JavaScript,这样前端校验就无法进行,那这个时候我们就需要服务器端校验了,为什么我们还需要提供前端校验呢?为了更好的用户体验。
2.2使用hibernate validation校验
hibernate validation是遵循JSR(Java specification requests)Java规范提案。
2.3需求
验证用户名称长度:1-32位;商品的创建时间:不能为null
2.4jar包以及配置相关文件信息
2.4.1jar包
在这里插入图片描述
2.4.2配置校验器
在这里插入图片描述
2.4.3加载校验器
在这里插入图片描述
2.4.4定义校验器的资源文件
在这里插入图片描述
2.5校验
注解说明:
@AssertTrue //用于boolean字段,该字段只能为true
@AssertFalse//该字段的值只能为false
@CreditCardNumber//对信用卡号进行一个大致的验证
@DecimalMax//只能小于或等于该值
@DecimalMin//只能大于或等于该值
@Digits(integer=2,fraction=20)//检查是否是一种数字的整数、分数,小数位数的数字。
@Email//检查是否是一个有效的email地址
@Future//检查该字段的日期是否是属于将来的日期
@Length(min=,max=)//检查所属的字段的长度是否在min和max之间,只能用于字符串
@Max//该字段的值只能小于或等于该值
@Min//该字段的值只能大于或等于该值
@NotNull//不能为null
@NotBlank//不能为空,检查时会将空格忽略
@NotEmpty//不能为空,这里的空是指空字符串
@Null//检查该字段为空
@Past//检查该字段的日期是在过去
@Size(min=, max=)//检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
@URL(protocol=,host,port)//检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件
@Valid//该注解只要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用,
//这样在检查当前对象的同时也会检查该字段所引用的对象
2.5.1校验全部字段
2.5.1.1使用注解说明需要校验的字段
在这里插入图片描述
2.5.1.2Controller方法添加注解
我们需要在Controller方法的形参中添加@Validated注解和BindingResult形参,格式为:@Validated 形参 BindingResult bingdingResult
在这里插入图片描述
2.5.1.3错误信息展示
在这里插入图片描述
2.5.2分组校验
分组校验就是可能在该Controller中需要对该两个字段都要校验,但是对于另一个Controller的方法中,可能只对其中一个字段进行校验,那么这个时候我们就可以通过分组校验来完成。
2.5.2.1定义两个接口
我们只需要定义两个接口,无需定义方法。
在这里插入图片描述
2.5.2.2在pojo的属性上添加组信息
在这里插入图片描述
2.5.2.3在@Validated注解中添加组信息
这里说明我们只对name做校验,如果还对createtime做校验,我们再加上group2的信息即可。
在这里插入图片描述
2.5.2.4规则
如果添加组信息,在Controller中不添加组信息,则只会对没有分组的进行校验;
3数据回显
3.1默认支持的数据回显
我们刚刚校验的案例中,其实我们已经发现,我们在提交失败后,我们的修改页面的数据依旧显示在页面,这是springmvc默认支持的数据回显。它默认将Controller方法中接收形参的pojo类型作为key,而且首字母小写,并将接收的形参作为value设置到request域中,因此完成数据回显的。request.setAttribute(“key”,value);。经测试能验证我们的想法。
在这里插入图片描述

而我们的页面获取值是:value="${itemsCustom.name }",因此数据回显是很显然的。

3.2@ModelAttribute注解实现数据回显
3.2.1如果jsp页面的name与提交方法形参不一致
如果jsp页面的name的pojo与Controller方法形参的pojo不一致,那么我们怎么让数据回显呢?我们之间在将绑定简单类型时是不是遇到过key与形参的名称不一致的问题,这里其实也就是pojo名称不一致的问题,我们通过在形参前加@ModelAttribute注解实现
在这里插入图片描述
其实这个注解就是完成该操作:request.setAttribute(“items”, itemsCustom)

3.2.2将方法返回值作为模型数据在视图显示
在这里插入图片描述
在这里插入图片描述
3.3数据回显的最佳实现方式
我们可以直接在提交的方法内,通过model将值设置到域对象中。
在这里插入图片描述
4异常的统一处理
4.1什么是异常以及处理方式
所谓的异常就是程序有问题,异常一般分为:运行时异常(RuntimeException)和非运行时异常,对于运行时异常,如500错误等这些信息,我们在开发中是不处理的;而对于非运行时异常,我们有两种处理方式,捕获(try…cache)或者抛出(thow new Exception(…))
4.2springmvc异常处理
在springmvc中,其异常统一由异常处理器HandlerExceptionResolver完成。但是一旦出现了异常信息反馈给用户的是xxxException等错误信息,这是不友好的,而且也是用户无法接受的,因此我们应该返回给用户“xxx信息出错了”或者“未知错误”等信息。
我们的这里处理异常的原则是,还是通过向上不断抛出并有springmvc的异常处理器完成,但是我们知道如果是有该异常处理器处理,那么返回的错误信息是用户看不懂的,因此我们需要完成一个统一的异常处理器,既然要完成一个我们自己的异常处理器,那么我们需要自定义自己的异常信息,既然需要自定义自己的异常信息,所以我们首先得开发一个自定义异常类。
4.3自定义异常类
在这里插入图片描述
4.4自定义的异常处理器
作用:自定义的异常处理器来处理我们抛出的异常信息。
在这里插入图片描述
4.5配置使用自定义的异常处理器
在这里插入图片描述
4.6测试
我们这里测试需要注意,我们既然处理方式是抛出异常,因此我们可以在Controller层抛出或者在service层抛出,但是建议在service层抛出,在实际开发中,根据自己单位的异常处理来处理自己的异常。
在这里插入图片描述

测试结果:
在这里插入图片描述
5图片上传
5.1jar包
这里我们通过commons-fileupload组件进行文件上传
在这里插入图片描述
5.2新建图片服务器
在实际开发中,特别是在电商项目中,我们的图片都是专门存储在图片服务器上的,这里我们就模拟一个服务器(文件夹)专门用于存放图片。这里我们直接通过tomcat建立。
在这里插入图片描述
为什么说pic是绝对路径:
在这里插入图片描述

我们也可以在tomcat的配置文件配置服务器地址。
在这里插入图片描述
5.3表单提交
既然是表单提交并保存我们的图片信息,因此我们的form表单的属性需要加enctype=“multipart/form-data”
在这里插入图片描述
5.4配置文件上传解析器
在这里插入图片描述
5.5Controller形参接收
既然我们上传文件,因此我们需要在形参中添加Moutipart来接收我们的附件信息。而且形参的名称与页面的name的名称一致。
在这里插入图片描述
文件处理代码:
在这里插入图片描述
6springmvc与json交互
6.1与json交互好处
1、当两个系统之间进行数据交互时,如果是序列化后的对象效率会非常低;如果传递的是存储大量对象的数组,效率更加低的可怕,但是如果将对象或数组转成json串进行传输的效率会大大提升。
2、json与服务器端交互时,由于json串格式简单,而且json语法有事JavaScript语法的子集,因此在jsp页面解析json数据时非常简单
6.2springmvc与json交互的过程
在这里插入图片描述
6.3所需jar包
这里我们通过jackson组件将我们的Java对象与json直接进行相互转换。
在这里插入图片描述
6.4通过ajax发送请求
为什么这里我们通过ajax发送请求呢?通过ajax发送请求异步处理我们需要验证或者其他的请求信息,例如填写表单时,我们填写邮箱信息时,填完信息离开焦点后我们发送ajax请求判断邮箱是否存在,将数据作为json返回,解析json判断邮箱是否已注册过。
因此,这里我们需要导入jQuery的js文件。由于mvc:annotation-driver默认加载了json的转换器,因此无需配置。
在这里插入图片描述
6.5测试
6.5.1发送json格式数据
6.5.1.1jsp方法定义
在这里插入图片描述
6.5.1.2Controller定义
在这里插入图片描述
6.5.2发送key/value格式数据
6.5.2.1jsp方法定义
在这里插入图片描述
6.5.2.2Controller方法定义
在这里插入图片描述
7RESTful风格
7.1什么是RESTful
RESTful(Representational State Transfer,表现层状态传输),它是一种软件架构,结构清晰、符合标准、易于理解、方便扩展。RESTful是一种风格不是一种标准,极其依赖http协议,显示的使用不同http的请求方法(get、post、put、delete等),公开目录结构URI
我们在web应用中处理来自客户端的请求时,通常会考虑get或post请求方法,实际上还有put、delete等方法,而在RESTful架构中,用不同的http请求的方法来处理对应的资源,通过判断http请求的方法类型去执行对应的post、get、put等方法。

1、显示的使用不同的http的请求方法
创建资源,使用post方法
非RESTful:http://www.example.com/photo/logo/create
RESTful: http://www.example.com/photo/logo 【POST】
检索某个资源,使用get方法
非RESTful:http://www.example.com/photo/logo
RESTful: http://www.example.com/photo/logo 【GET】
更新资源,使用put方法
非RESTful:http://www.example.com/photo/logo/update
RESTful:http://www.example.com/photo/logo 【PUT】
删除资源,使用delete方法
非RESTful:http://www.example.com/photo/logo/delete
RESTful: http://www.example.com/photo/logo 【DELETE】
通过RESTful架构,规范资源的使用,可以通过一致的URI暴露给外界,对资源提供一致的操作服务,也就是说根据http请求的方法,去执行对应的资源信息。

2、无状态
RESTful架构中,它认为web是由一系列的抽象资源组成,这些抽象资源具有不同的表现形式,可以是xml文件,可以是HTML,还可以是图片等。这些具体的表现分布在不同的物理位置上。
3、通过URI定位资源
此类URI具有层次结构,从根分支开始是公开服务的子路径。例如需要展示相册信息,http://www.example.com/photo/topics/home,它展示的是以home为主题的相册信息,http://www.example.com/photo/2010/02/22/{topic},以时间为目录的展示相册信息。
7.2springmvc实现RESTful风格
7.2.1web.xml中配置RESTful风格访问
在这里插入图片描述
7.2.2Controller方法定义
在这里插入图片描述
访问地址:http://localhost:8080/springmvc_mybatis1109/items/queryItemsByRESTful/1/mobile

这就是springmvc支持的RESTful风格。
7.3静态资源的访问
实现了RESTful风格的访问格式,我们是无法访问我们的静态资源的,如:
在这里插入图片描述

因此,我们需要配置将静态资源过滤。也就是说不拦截我们的静态资源。
在这里插入图片描述
8springmvc拦截器
与Struts2不同的是,在Struts2中拦截器是其核心,而在springmvc中,拦截器不是其主要内容,一般我们使用springmvc拦截器只需要实现HandlerInterceptor接口即可,用于加载用户的权限信息等使用场景。如12306登录后判断当前是否是购票时间等。
8.1自定义拦截器及方法说明
需要实现springmvc的HandlerInterceptor接口。
8.1.1preHandle
在这里插入图片描述
8.1.2postHandle
在这里插入图片描述
8.1.3afterCompletion
在这里插入图片描述
8.2配置加载自定义拦截器
在这里插入图片描述
如果有多个拦截器,继续配置拦截器信息。
8.3特点
8.3.1加载顺序
如果配置多个拦截器,其加载的先后顺序与其配置在文件的先后顺序有关。这里先加载拦截器1,在加载拦截器2
在这里插入图片描述
8.3.2嵌套
嵌套执行,什么意思呢?在两个拦截器都放行的情况下,执行完第二个拦截器后才执行第一个拦截器的剩下两个方法。
8.3.3第二拦截器不放行
第一个拦截器放行,第二个拦截器不放行的情况下,第一个拦截器的afterCompletion会执行,它认为只要自己的放行,说明就执行了Controller中的方法,因此该方法执行。
8.4模拟用户登录
8.4.1需求
在用户访问某个页面时,判断其是否登录,如果登录让其访问,如果没有登录踢回登录页面。
8.4.2用户登录from表单
在这里插入图片描述
8.4.3用户登录Controller
登录后跳转至商品列表页面
在这里插入图片描述
8.4.4用户登录Interceptor
在这里插入图片描述
8.4.5在配置文件中添加拦截器信息
在这里插入图片描述
8.4.6测试访问
地址:http://localhost:8080/springmvc_mybatis1109/items/queryItems.action

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值