springMVC框架 (三层架构+springMVC)
一:三层架构:
1:表现层 WEB层,用来和客户端进行数据交互的,表现层一般采用MVC设计模式
2:业务层 处理公司具体业务逻辑的
3:持久层 用来操作数据库的
二:MVC模型(模型视图控制器)
1:model 数据模型 Javabean的类,用来进行数据封装
2:view 指 jsp,HTML用来展示数据给客户
3:controller 用来接收客户的请求,对整个流程的控制,进行数据的校验
三:springMVC设计模式
M:model模型=JavaBean
V:view视图 JSP
C:controller控制器 Servlet
springMVC框架在表现层
spring框架在业务层
MyBatista框架在持久层
四:springMVC是什么
定义:
1. 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
2. Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供 了构建 Web 应用程序的全功能 MVC 模块。
3. 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的 SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。
优势:模块化分工明确+清晰的角色划分+分工明确扩展点灵活+和spring框架无缝集成+强大的JSP标签库
和Struts2对比
优势:它们都是表现层框架,基于MVC框架设计的
它们的底层都离不开原始的ServletAPI
它们的处理请求机制都是一个核心控制器
区别:1-springMVC的入口是servlet,而struts是FilterspringMVC是基于方法设计的,而Struts2是基于类,Struts2每次执行都会创建一个动作类,所以springMVC会稍微比Struts2快些
2-springMVC使用更加简洁,同时还支持JSR303,处理ajax的请求更方便
Struts2的OGNL,表达式使页面的开发效率相比SpringMVC更高些,但执行效率并没有比JSTL提升,尤其是Struts2的表单标签,远没有thml开发效率高。
springMVC的@contr0ller是单例的
@Scope("request"):多例。
五:使用springMVC
1:配置核心控制器--一个servlet
使用标签<servlet><servlet-name></servlet-name><servlet-class></servlet-class>
配置初始化参数,用于读取springMVC的配置文件
使用标签<init-param><param-name></param-name><param=value></param=value>
配置servlet的对象的创建时间点,应用加载时创建,取值只能是非0正整数,表示启动数据
<load-on-startup>1</load-on-startup>
配置mapping
<servlet-mapping><servlet-name></servlet-name><url-pattern></url-pattern>
2:创建配置文件-springmvc.xml
添加约束
配置创建spring容器要扫描的包
使用的标签<context:component-scan base-package="com.it"></context:component-scan>
配置视图解析器
使用的标签<bean class="org.springfreamwork...">
<property name="prefix" value="/WEB-INF/pages"></property>//prefix是指访问页面的前 缀,指定页面存放的文件夹
<property name="suffix" value=".jsp"></property></bean>//suffix:是指文件的后缀名, 常见的后缀名有html,jsp,php,txt,mp3
3:编写控制器并使用注解配置
控制器添加注解@Controller("helloController")
控制器内方法添加注解@RequestrianMapping("/hello")
从此过程得到结论:
HelloController和InternalResourceViewResolver,但远不止这些
#浏览器发送请求,被DispatherServlet捕获,该servlet并不是处理请求,而是把请求转发出去,转发的路径是根据请求URL,匹配@RequestrianMapping中的内容
#匹配到后,执行对应的方法,该方法有一个返回值
#根据方法的返回值,借助InternalResourceViewResoulver找到对应的结果视图
#渲染结果视图,响应浏览器
该过程中涉及到的组件
1:DispatcherServlet:前端控制器:用户请求到达这里,它调用其他组件处理用户请求,它的存在降低了组件之间的耦合性
2:HandlerMapping处理器映射器:它负责根据用户请求找到Handler即处理器,SpringMVC提供了不同映射器实现不同的映射方式(如:配置文件方式 实现接口方式 注解方式等)
3:Handler处理器:它是开发中要编写的具体业务控制器,由DispatcherServlet把用户请求转发到Handler,Handler对具体用户请求进行处理
4:HandlAdapter处理器适配器:通过它对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
5:View Resolver视图解析器:负责将处理结果生成View视图,首先根据逻辑视图名解析成物理视图,即具体的页面地址再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户
6:View视图:springMVC框架提供很多的View视图类型的支持,如:jstView,freemarkerView,pdfView.最常用的是jsp。一般情况下需要通过页面标签或者页面模板技术奖模型通过页面展示给用户,需要程序员根据业务需求开发具体的页面
7:<mvc:annotation-driven>说明:在springMVC的各个组件中,处理器映射器 处理器适配器 视图解析器成为springMVC的三大组件。使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理映射器和RequestHandlerAdapter(处理适配器),可用在Spring.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
它相当于在xml中配置了如下配置:
RequestMapping注解
源码
作用:用于建立请求URL和处理请求方法之间的对应关系
出现位置:
类上:请求URL的第一级目录,不写默认为根目录,写的话需要以/开头,它的目的是为了使URL可以按照模块化管理
例如:账户模块 :/account/add
/account/update
订单模块:/order/add
/order/update
红色部分就是把RequestMapping写在类上,使我们的URL更加精细
方法上:请求URL的第二级访问目录
属性:
value:用于指定请求的URL。它和path属性的作用是一样的
method:用于指定请求的方式
parame:用于指定限制请求参数的条件,它支持简单的表达方式,要求请求参数的KEY和value必须和配置一样
headers:用于指定限制请求消息头的条件
注意:以上四个属性只要出现2个或以上,他们的关系是与关系
六:绑定说明
1:绑定的机制:表单中请求参数都是基于key=value的,springMVC绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的
例如:<a href="account/findAccount?accountId=10">查询账户</a>
请求参数是:accountId=10
2:支持的数据类型:
基本的数据类型:包含基本类型和String类型
POJO类型参数:包含实体类,以及关联的实体类
数据和集合类型参数:包含List和Map结构的集合(包括数组)
springMVC绑定请求参数是自动实现的,但是想要使用必须遵循使用要求
3:使用要求:
如果是基本类型或者String类型的:
要求参数名称必须和控制器中方法的形参名称保持一致(严格区分大小写)
如果是POJO类型或者和它的关联对象
要求表单中参数名称和POJO类的属性名称保持一致,并且控制器方法的参数类型是POJO类型
如果是集合类型,有两种方式
第一种:要求类型参数必须在POJO中,在表单中请求参数名称要和POJO中集合属性名称相同
给List集合中的元素复制,使用下标
给Map集合中的元素赋值,使用键值对
第二种:接收的请求参数是json格式数据,需要借助一个注解实现