囫囵吞枣之Springmvc框架

Springmvc框架作用的位置

服务器端开发一般分为三层:表现层(springMvc框架),业务层(spring框架),持久层(mybatis框架)。
前端提交数据,到了springmvc,和客户端进行交互。
M:model JavaBean
V:view JSP
C:controller(控制器,以前就是主要是servlet)
在这里插入图片描述


选择springmvc框架的优势

struts2:多例的,每次请求都会创建一个对象,相对来说,速度还是比较慢的
springmvc:单例的,利用多线程来处理,所以会比struts2快一点。
1.编写前端页面
2.编写前端控制器(Controller类,就相当于编写servlet)
3.跟servlet开发差不多,会有一个前端控制器(有点类似于web开发的xml,所有请求会通过这个东西来找到Controller类)
4.还要编写一个springmvc.xml配置文件,(spring的配置,例如开启注解的扫描等等)。


Controller类

配置Controlller类
下面的写RequestMapping(value=“配置映射的配置”,method=“配置请求的方式”)
这里面,其实value,和path都是可以得,他们是别名来的
![在这里插入图


前端核心控制器

配置前端核心控制器:一定要配置的,所有的请求都会经过这个servlet,经过这个servlet去找到对应的controller。里面的< initi-param>配置的是一个springmvc.xml文件的加载,就是我们加载前端控制器的时候,会把这个配置文件的内容加载到tomcat服务器之中。其实这个springmvc.xml类似于一个spring的配置文件,我们可以把一些类什么的交给它管理。还有我们上面配置的controller类,我们也要开启注解扫描,这样它才能够被IOC容器所管理
在这里插入图片描述


配置springmvc.xml文件:相当于spring框架的applicationContext.xml文件,里面我们可以开启注解的扫描【这样我们配置的controller才能被IOC容器所管理,还有我们可以配置一些类什么的都可以】。
在这里插入图片描述


视图解析器

在springmvc.xml中配置一个视图解析器,方便我们进行页面的跳转。如图,我们执行完controller之后,想要跳转到这个/WEB-INF/pages/suc.jsp.这里,但是我们可以把这个跳转页面的利用视图解析器来进行配置,把前缀和后缀取出来,进行配置,这样,万一以后我们将跳转页面的代码进行迁移,就不用到源码里面将每一个页面都修改一遍,可以单独修改配置文件即可。而源码里面主要就写我们要跳转页面的主要部分

在这里插入图片描述
配置一个视图解析器,id=“视图解析器名称”【目前的作用还不清楚】clas=“org.springframework.web.servlet.view.InternalResourceViewResolver”这个类的类名是一定要这样子写的。
< protery name=“prefix” value="/WEB-INF/pages">配置要跳转页面的前缀
< protery name=“suffix” value=".jsp"> 配置要跳转页面的后缀
在这里插入图片描述


springmvc框架中一个请求的执行流程

springmvc框架是基于组件式开发的一个框架:
在我们这个测试中,我们在前端发一个请求,
然后到了DispatcherServlet类,前端核心控制器这里,
然后,它调用解析器组件,解析出我们要请求的路径是/hello.do,
然后,它再调用适配器组件,找到我们要请求的路径/hello.do
然后,调用处理器组件执行Controller方法去执行,这个时候我们返回一个字符串【本来是我们处理成功之后要执行的地址】,
然后,他再去调用视图解析器组件,分析出我们要跳转的页面并到我们要跳转的页面那里。
加粗样式
基于组件式开发的详细流程:
c5MA==,size_16,color_FFFFFF,t_70)
加上这一个标签,让映射器,适配器和处理器生效(默认不配置也是可以的),他们也会生效,但是如果以后我们配置其他的组件,这一句就必须加上去,不然其他的处理器是不会生效的。
在这里插入图片描述


@requestMappsing(path=“请求路径”)把请求方法和路径联系起来,也可以利用这个把请求路径和类联系起来
下面这种方法就是利用requestMapping(path=“路径”) 把一个大类与请求路径联系起来,这样子的话,我们可以利用多级路径,把方法和路径联系起来,可以不用重复写方法前面的路径代码
在这里插入图片描述

requestMapping 里面的一些属性

requestMapping里面的一些属性:
value(作用与path一样,可以省略)
path(作用与value一样,不可以省略)
method(决定当前请求允许的请求方式,比如get、post、delete、put),也可以一次性配置多个 method=({RequestMethod.GET,Request.POST})【可以配置多个】
parames=“属性名”【设置的话,要求请求中必须有一个属性名为你设置的属性传过来,没有的话就要报错】


请求参数的绑定

在这里插入图片描述

我们需要获取表单的名称,在前端,我们 input里面的name属性写的是username,那么我们只需要在我们处理的controller类里面,加入一个参数类型(String)和参数名称(前端里面的name属性),这样,springmvc框架就会自动帮助我们获取到这个参数。【名称必须是相同的,名称如果不相同是封装不上的,底层利用反射的原理会直接帮你封装到属性里面】

在这里插入图片描述
以上我们只是封装了单个属性,一般如果我们接受多个值,还是要封装在实体类里面比较好
在这里插入图片描述
注意:这里等待封装的属性名称必须和前端的属性名称是一模一样的。
在这里插入图片描述
在这里插入图片描述

在等待封装的引用对象里面又有一个引用对象addres【address里面有个属性money】。
在这里插入图片描述
在这里插入图片描述
为了把属性封装到User类里面的address对象的money属性里面,前端不能单纯写一个money,应该是要指明address.money【指明address对象里面的money属性】


封装一个list
在这里插入图片描述
在这里插入图片描述
就要这样写,表明封装在list的哪个下标的元素中。


解决请求中文乱码的问题

我们可以配置一个过滤器即可。
< filter-class>里面的类 org.springframework.web.filter.CharacterEncodingFilter是固定写法,上面的名称可以自己取,下面的我们可以指定使用的编码集,< param-name>里面写encoding是固定写法, < param-value>是一个指定我们要使用的编码集,下面的< url-pattern>我们可以配置要拦截哪些请求。
在这里插入图片描述


日期格式转换的问题

有时候可能会出现这种传过来的日期无法封装的问题,我们只要在日期这个属性上面指定一种格式(比如 “yyyy-MM-dd”,表示以后这种格式的日期传过来,框架就会自动转成Date类型。【一般前端我们输入日期是不用手动输入的,而是利用第三方插件来生成,比如你点那个框的时候,就弹出一个框架让你选择日期,保证我们前端输入的格式是一定的就可以了】)
缺点:只能在一个方法里面使用,如果有多个方法呢?比如,我user类,pole类,等多个类都有这个东西,那我们岂不是都要每个类配置一次?
在这里插入图片描述
解决上面的缺点:自己写一个类型转换器,我们得自己写和配置【不单单局限于日期,这里我们以日期为例】。
转换器类:必须实现一个接口 Converter< 数据类型1,数据类型2>,数据类型1是我们要转换的类型,数据类型2是我要转换之后的类型。必须实现方法convert(),参数s就是用户输入的内容,
在这里插入图片描述
步骤1:定义一个类型转换器
在这里插入图片描述
参数s是用户传来的内容,如果非空,我们就定义要转化的格式,然后进行转化即可。

步骤2:将它配置到springmvc框架之中
我们定义完成之后,还需要把它配置一下,我们才能够使用
在springmvc.xml中配置该格式转换器
id随便写,class是一个spring中指定的一个类,就是一个格式转换器
class=“org.springframeworl.context.support.ConversionServiceFactoryBean”
里面的protery 属性其实是一个set类型,所以,我们要在它的字标签里面配置set字标签。
< bean class=“我们自己写的格式转换器”>
这样就在springmvc框架中配置成功了。
在这里插入图片描述
步骤3:上面我们说过,需要有一个标签来使得组件生效。【映射器,适配器和处理器这三个是无论写不写都生效的】,所以我们还要使得我们自己写的这个类型转换器生效。
下面这一句话,就是使得我们自己配的类型转化器生效。

在这里插入图片描述


使用Servlet原生的API

想在controller里面拿到request对象和response对象,咋办?
在这里插入图片描述
只要在controller里面加上这两个对象即可


springmvc框架里面几个常用的注解

1.@RequestParam
@RequestParam,跟mybatis里面的resultMap有点类似
这里使用了这个@RequestParam(value=“username”)
表示,前端必须传过来一个username的属性,然后,我们给封装到那么属性中去
required的值,默认是true,就是必须传过来这样的一个值,不传过来会报错。但是如果我们设置为false,就可以不用传。
defaultValue,默认值,如果没有传过来这个参数,那么我们就可以使用默认值,
在这里插入图片描述
2.RequestBody注解,获得请求体中的内容。【在异步传输中十分常见】
通过这个注解,我们可以拿到请求体重的内容
在这里插入图片描述
3.PathVarible注解【有特定的使用场景的,也就是在restful这种编程风格下要使用到】
1.首先,我们得理解一下什么是restful编程风格。
传统编程风格:我们在一个类里面有要对数据库进行操作,有5个方法,我们就要写5个路径。【即使使用二级路径,也需要写5个二级路径】
缺点:
1.麻烦,编码量大
2.因为浏览器对于每个路径都要产生缓存,这个会增加浏览器的压力。
restful编程风格:利用一个同样的请求路径,因为我们可以配置哪个方法去处理特定的请求方式【比如get、post、put、delete】,来对应不同的请求,这样就可以减少编码量,降低浏览器的缓存压力

在这里插入图片描述
到了这里,我们就有疑问了?同样是获取数据,那么,如果都是get请求方式,那会去执行findAll还是findById呢?这里,就要用到@PathVarible注解了。我们可以在请求路径上做文章,如果是利用id值来获得数据的,
在这里插入图片描述
如下情况,根据GET方式,执行哪个方法呢?
在这里插入图片描述
所以我们要作出如下改变:
我们在请求路径后面附带一个请求的id值。/emp/{id}.这样,当我们的请求附上这样的id值之后,就会根据这个路径找到对应的方法去执行,那么我们如何获得路径上的id值呢?
利用@PathVariable注解(value=“id”【这里的id就是你这个方法的映射路径的大括号里面的id】)
在这里插入图片描述
4.RequestHeader【上面的RequestBody是获得请求体中的内容,这里是获得请求头中的内容】
我们这里利用,@RequestHeader注解,value=“请求头中一个key值”,我们就可以获得对应的值并封装到后面的数据中
在这里插入图片描述
5.CookieValue注解【获取到cookie中的值】
这里利用@CookieValue(valu="cookie中的一个key值’)我们就可以获得对应cookie中的一个值。
在这里插入图片描述


Springmvc框架的各种返回值

1.返回一个字符串【配置一个视图解析器,就可以找到对应的页面】
2.返回值是void,默认回去找请求路径对应的页面。【一般是不使用的,如果是这种返回值为void的请求,我们一般在末尾使用请求转发,手动把页面跳转,或者是在末尾直接response.write.print(“打印内容!”),直接打印一些内容到页面上】
3.返回ModelAndView,可以把你要转发的一些对应或者是你要跳转的页面存储到ModelAndView对象里面。【常用】
在这里插入图片描述
model:模型,也可以理解为类
view:视图
我们首先需要创建一个ModelAndView对象,然后,把我们要存放的对象或者是要存放的页面放进去ModelAndView对象中。
mv.addObject(“属性名称”,“属性值”);//把我们要设置的属性名称和值存入到ModelAndView对象中
mv.setViewName(“要跳转的页面的名称”);//因为我们前面配置了视图解析器,所以这里可以简写。
到了要跳转的页面,我们利用EL表达式,就可以将想要的数据从ModelAndView对象中取出来。
在这里插入图片描述


springmvc的重定向或者请求转发

利用关键字进行请求转发,需要用到forward关键字。
1.return “forward:要跳转页面的全路径”【路径不能简写】
在这里插入图片描述
2.利用关键字进行请求重定向
return "redorect:要重定向的全路径【用得非常少,因为不能传值】
在这里插入图片描述


接收和响应异步数据

前后端利用json格式进行数据交互的过程
在这里插入图片描述
如果我们在前端引入js,html,css,img等静态资源,等他们经过我们的前端核心控制器的时候【如果我们设置所有的请求都拦截】,他们就被拦截下来了。所以我们要在springmvc.xml中配置一个不拦截js,css等静态资源的配置。
配置js不被拦截:只要是在js文件夹下面的,所有的资源都不会被拦截下来,写/js/**表示js文件夹下的子文件,子子文件都不会被拦截,写js/*表示js文件夹中所有的文件都不会被拦截,建议使用第一种
在这里插入图片描述
在这里插入图片描述

前端的代码:产过来的json数据
在这里插入图片描述

利用@RequestBody将数据封装到实体类之中【非常方便】

在这里插入图片描述
把请求体中的json数据直接封装到user对象里面。
在这里插入图片描述
把响应数据作为json格式返回到前端之中,我们只需要在返回数据类型面前加上一个@RequestBody的注解,springmvc框架就会自动把我们返回的对象的值给封装为json数据的格式传回给前端。【非常方便,极大简化了开发】
在这里插入图片描述


SpringMVC实现文件上传

流程:比如我们前端传过来一个文件,然后,DispatcherServlet会判断我们是否正在做文件上传。如果是的话,回去调用文件上传解析器,解析request请求,然后把上传文件封装到MultipartFile对象当中,返回这个MultipartFile对象给前端核心控制器,然后我们只要在controller里面利用这个对象生成我们要的对象,就可以调用对应的方法来做相关的工作了。
在这里插入图片描述

springmvc文件上传

1.前端代码:必须指明一个属性,enctype=“multipart/form-data”,这个相当于把文件切片后上传的效果。
在这里插入图片描述
2.配置文件上传解析器
id="multipartResolver"是固定的,不能修改
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"也是一个固定类,这个就是专门的文件上传解析器的类
我们可以在字标签里面配置很多属性
1.默认编码格式defaultEncoding
2.maxInMemorySize 单个文件上传最大值
3.maxUploadSize 总的文件上传最大值
4.uploadTempDir 临时文件存储目录【因为上传文件的过程中会产生一些临时文件】
在这里插入图片描述
在这里插入图片描述
测试方法:
注意:上传文件我们需要确定文件的位置,文件的名称。如果我们上传的文件都是重名的,那么它就会覆盖。因此我们可以利用uuid生成一个唯一的id值,加在前面,这样就可以避免上传重复文件被覆盖掉了
在这里插入图片描述


springmvc 的异常处理

在这里插入图片描述
前端发过来一个请求,前端核心控制器调用controller,controller调用service,service调用dao层,然后发生了异常。于是,dao层向上抛出,service也向上抛出。这个时候,异常到了controller层。我们可以把异常抛出给dispatcherServlet。由前端核心控制器去做出处理。如果我们没有对它做出什么处理,那么就会把异常信息直接显示在页面上,显得非常不友好,所以,我们可以自己定义一个异常处理器,发生了异常,就由前端核心控制器去处理。然后将跳转到一个比较友好的页面,比如什么服务器繁忙,不会显得很low的样子。
系统的异常类:
在这里插入图片描述
定义一个异常处理器:如果程序出现了异常,调用异常处理器中的方法

在这里插入图片描述
在这里插入图片描述
配置一下异常处理器
在这里插入图片描述


springmvc框架中的拦截器

拦截器:可以拦截我们的请求,其实这东西跟javaweb里面的过滤器filter有点像【底层也是spring框架中的AOP来实现的】
区别:
1.过滤器是web三大组件之一【servlet,监听器,过滤器】,过滤器是任何场景下【任何框架】都可以使用,但是拦截器只是springmvc框架独有的【各个框架的拦截器都是依赖于自己的框架】。
2.过滤器配置了 /* 会拦截掉所有的资源,但是拦截器只拦截controller的方法进行拦截。
3.拦截器需要实现HandlerInterceptor接口。




下面是一个拦截器类,return false就是拦截不放行,return true就是放行。
在这里插入图片描述
配置拦截器:
在这里插入图片描述
下面这两个方法
第一个postHandle() 这个方法是在controller控制器被执行后才执行的
第二个afterCompletion()这个方法是我们在执行完跳转后的jsp页面才继续执行的。
在这里插入图片描述
在这里插入图片描述


springmvc拦截器链

按照配置文件从上到下被拦截就可以了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值