Spring MVC的入门

1.SpringMVC是什么

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图:

在这里插入图片描述
MVC 设计概述
在早期 Java Web 的开发中,统一把显示层、控制层、数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1:
在这里插入图片描述

出现的弊端:
JSP 和 Java Bean 之间严重耦合,Java 代码和 HTML 代码也耦合在了一起
要求开发者不仅要掌握 Java ,还要有高超的前端水平
前端和后端相互依赖,前端需要等待后端完成,后端也依赖前端完成,才能进行有效的测试
代码难以复用
正因为上面的种种弊端,所以很快这种方式就被 Servlet + JSP + Java Bean 所替代了,早期的 MVC 模型(Model2)就像下图这样:

在这里插入图片描述

首先用户的请求会到达 Servlet,然后根据请求调用相应的 Java Bean,并把所有的显示结果交给 JSP 去完成,这样的模式我们就称为 MVC 模式。

M 代表 模型(Model)
模型是什么呢? 模型就是数据,就是 dao,bean
V 代表 视图(View)
视图是什么呢? 就是网页, JSP,用来展示模型中的数据
C 代表 控制器(controller)
控制器是什么? 控制器的作用就是把不同的数据(Model),显示在不同的视图(View)上,Servlet 扮演的就是这样的角色。
扩展阅读:Web开发模式

Spring MVC 的架构
为解决持久层中一直未处理好的数据库事务的编程,又为了迎合 NoSQL 的强势崛起,Spring MVC 给出了方案:
在这里插入图片描述

传统的模型层被拆分为了业务层(Service)和数据访问层(DAO,Data Access Object)。 在 Service 下可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足异军突起的 NoSQL 的使用了,它可以大大提高互联网系统的性能。

特点:
结构松散,几乎可以在 Spring MVC 中使用各类视图
松耦合,各个模块分离
与 Spring 无缝集成

以上引用信息:

作者:我没有三颗心脏
链接:https://www.jianshu.com/p/91a2d0a1e45a
来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

SpringMVC的入门:

在这里插入图片描述
首先,用户的请求会落在DispatcherServlet(老大)上,这个东西就是一个servlet容器相当于SpringMVC的心脏,然后把真实的工作分发到Handler处理器上,然后把干完活后的结果返回给DispatcherServlet,结果要给用户去看的,Handler返回的结果可能是list,数组的集合,因此要把返回结果扔到JSP页面处理,在JSP页面打了标签,标签的作用就是从list集合我们的Pojo对象取得数据,填充到jsp页面,Jsp页面一旦被填充数据就相当于页面的渲染,当标签被拿下了,就形成一个完整的HTML页面

首先我要在这里介绍一下,我们的大部分web服务都是运行在一个叫Tomcat的容器中的,那为什么要运行在这一个容器中呢,Tomcat是设计于运行我们javaweb项目的,我们的项目项目在不同平台上运行,因为Tomcat是个容器,比较容易部署到各个平台上面,Tomcat才是真正与我们客户端打交道的,它监听端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。servlet是我们容器中的一个应用程序,接收请求的处理,我们写的接口就是一个service,请求先落到servlet上再去到真实做东西的程序上。用到Tomcat就一定会用到servlet

servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:你初始化时要做什么你销毁时要做什么你接受到请求时要做什么这是Java给的一种规范!servlet是一个规范,那实现了servlet的类,就能处理请求了吗?

在这里插入图片描述
上图xml设置了拦截的方式,这里url-pattern所谓的拦截指的是通过URL访问我们的servlet,如第二个,我路径结尾里带有.action,或do的,就会走到我servlet里找到RequestMapping对应的方法工作。
1.程序设计
第一步:设置web.xml,这里是指定.action结尾的请求
在这里插入图片描述
第二步:设置servlet,就是我们的Controller层,将这个层交给Spring管理,反正符合我这个路径的就走到我这个方法上进行处理。这里ModelAndView是SpringMVC提供的
在这里插入图片描述
在这里插入图片描述
下图就是方法所用到的pojo类。
在这里插入图片描述

SpringMVC架构

在这里插入图片描述这里处理器就是指我们的@Controller,那这个请求怎么落到我们的处理器上呢,首先前端控制器会拿到我们这个请求,会将我们请求路径的后半段给我们的处理器映射器,就是说前端控制器拿到我们的请求开始查询Handler,就是告诉Handler谁符合这个路径,这个HandelerMapping干的是什么呢,就是到Spring容器中,比如我们程序设计的ItemController被打标签了,就会被实例化在Spring容器里,就会去找我们的实例,哪一个符合我们的路径,然后返回给前端控制器的是包名+类名+方法名,如ItemController就是类名,itemList()就是方法名,就是我们的第三步,第三步中的Handler就是我们的包名+类名+方法名的字符串,之前的就是拦截器,拦着不让我们进去处理器,不符合规则就不让我们进去处理器,比如判断用户有没有登陆,拦截器可以设置多个。然后前端控制器拿到Handler就相当于拿到我们的itemList()方法整体,由于前端控制器是不干活的,就告诉处理器适配器执行Handler,处理器适配器再命令处理器执行这个函数然后返回ModelAndView给处理器适配器,处理器适配器再返回给前端控制器,然后前端控制器拿到ModelAndView再发出请求,请求视图解析器叫ViewResolver,ViewResolver解析ModelAndView,怎么解析,说白了第七步返回ModelAndView时装了一个webinfo的路径,ViewResolver把我们的JSP读取到内存中,形成View对象,View对象装的就是我们的页面路径与数据, DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)生成Html,这个是由View对象自己做的。整个过程就是这个过程.

在这里插入图片描述

SpringMVC配置三大组件

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开发的组件有handler、view

我们没有做任何配置,就可以使用这些组件因为框架已经默认加载这些组件了,就是前端控制器一实例化以后马上加载他的默认组件,springmvc包.配置文件位置如下图:
在这里插入图片描述
1.处理器映射器:
注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。
HandlerMethod对象中封装url对应的方法Method。

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。
在这里插入图片描述
有两种方式:注解式还有配置式,如果有注解,默认走注解式,这个3.1版本后已经废弃使用,不自行配置,默认的仍然使用这个,配置的话要以下操作:在这里插入图片描述

2.处理器适配器
在这里插入图片描述
注解方法上的处理器适配器,取决于映射器的处理方法,从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。在这里插入图片描述
直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。
SpringMVC使用mvc:annotation-driven自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter
可以在springmvc.xml配置文件中使用mvc:annotation-driven替代注解处理器和适配器的配置。
在这里插入图片描述

3.视图解析器
在这里插入图片描述
这是属于JSP的视图解析。
在这里插入图片描述
不使用自行配置,要把路径,后缀写上,用了以后就写文件名就可以了,前后缀在配置文件写上
在这里插入图片描述

整合springMVC+Mybatis

第一步:先把Spring与Mybatis的资源整合包,配置文件弄过来,其中XML的配置为什么要这样做已经注释清楚了。
在这里插入图片描述
1.applicationContext
在这里插入图片描述
2.sqlMapConfig
在这里插入图片描述
3.springMVC
在这里插入图片描述
通过以上的配置,其实SSM就是Spring-SpringMVC-Mybatis就已经整合完毕了。

这里要注意的是如果是使用Maven来搭建项目的话,要引入

案例:查询Mysql中的商品

1.由于此时是在web工程,不会像java工程那样有个junit加载xml文件,因此需要配置监听器,在项目启动时读取我们的applicationContext.xml,相当于我们的main函数一样。在这里插入图片描述
2.通过拦截以action结尾的请求就进入我们的controller方法中
在这里插入图片描述
3.service层:springMvc
在这里插入图片描述
4.dao层:Mybatis
在这里插入图片描述
在这里插入图片描述

5.结果view层,也是springMVC管,结果:
在这里插入图片描述
在这里插入图片描述

参数绑定

单例模式下是如何触发多线程的,像这个controller,有100个人同时访问就一个方法,如果没多线程就会产生冲突(特别是牵涉到成员变量的时候),Spring,Tomcat等框架已经帮我们实现好了多线程,只不过不是我们写的,例如spring:第一个人访问时会复制一个模板到本地线程中,方法的副本。我们的任务只要写模板,如我们的controller。
在这里插入图片描述
1.默认参数绑定
例子:首先要显示商品详情(就是主页面),需要根据商品id查询商品信息,然后展示到页面。
请求的url:/itemEdit.action
参数:id(商品id)
响应结果:商品编辑页面,展示商品详细信息。

1.就是主页面,点击修改就跳转到itemEdit.action,然后传入id参数
在这里插入图片描述
2.跳转进来以后,其实有三种方法可以取得id的值,第一种是原始servlet开发,从request里面获取,
第二种是如下使用包装类型数据,会根据名称相同且类型相同传入值(像Mybatis的映射处理一样),因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0。
第三种:使用@RequestParam常用于处理简单类型的绑定。
value:参数名字,即入参的请求参数名字,如value=“itemId”表示请求的参数 区中的名字为itemId的参数的值将传入
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错
TTP Status 400 - Required Integer parameter ‘XXXX’ is not present
defaultValue:默认值,表示如果请求中没有同名参数时的默认值

在这里插入图片描述
成功跳转页面:
在这里插入图片描述

2.参数绑定pojo实体类型
需求:请求的url:/updateItem.action,然后修改表单内容,然后确认后显示更新成功,响应回更新成功页面。
在这里插入图片描述
在这里插入图片描述
点击提交后,数据库出现乱码
在这里插入图片描述
如何解决POST提交数据库乱码:在web.xml中配置过滤器,有action提交时将其编码变为utf-8
在这里插入图片描述
在这里插入图片描述
3. 绑定包装pojo
1.创建pojo的包装QueryVo
在这里插入图片描述
2.controller直接使用QueryVo
在这里插入图片描述
3.传入参数变成items.
在这里插入图片描述
4, 自定义参数绑定
在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。,由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。

过程原理:前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。就是会适配传入的参数进行绑定,像这里日期是字符串转Date的,转换器识别到我们createtime是要转成Date的,所以修改createtime都要走到我们转换器,因此输入格式要写成"yyyy:MM-dd HH_mm-ss"不然会报错,转不了日期格式。而其他String参数由于不是转为Date的因此不会经过这个转换器的try-catch();正常执行。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SpringMVC与struts2的不同

1、 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
2、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、 Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值