#SpringMVC
回顾三层架构:
一.表现层(web层)
负责与客户端连接,响应结果,通常客户端使用Http协议请求web层。
表现层:MVC设计模式
M(midel 模型):用于封装数据
V(view视图):展示层,负责结果的展示
C(controller控制器):控制层,负责接收客户端请求。用于处理逻辑的
二.业务层(service层)
负责处理逻辑业务,web层依赖于业务层,而业务层不依赖web层
三.持久层(Dao层)
主要负责与数据库进行交互,负责数据的持久化,对数据库中的数据进行增删改查。
SpringMVC是一个表现层框架
###涉及的组建
DispatcherService:前端控制器
相当于一个中心控制器,负责处理用户请求,调动其他组建,从而降低程序间的耦合性
HandlerMapping:处理映射器
负责根据用户请求找到Handler 提供了不同的映射器实现不同的映射方式
Handler:处理器
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理
HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
View Resolver :视图解析器
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
View :视图
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
##SpringMVC基础案例实现步骤
第一步:
配置springMVC的控制器:
1. 配置 spring mvc 的核心控制器
<servlet>
<servlet-name> SpringMVCDispatcherServlet </servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
2. 配置初始化参数,用于读取 SpringMVC 的配置文件
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
3. 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺序
<load-on-startup>1</load-on-startup>
</servlet>
4. 设置拦截
<servlet-mapping>
<servlet-name>SpringMVCDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第二步:
创建SpringMVC配置文件:
1. 配置创建 spring 容器要扫描的包
<context:component-scan base-package="com.itheima"></context:component-scan>
2.配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
创建路径的拼接
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
3. 设置加载处理器
<mvc:annotation-driven>
自 动加载 RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用
<mvc:annotation-driven>替代注解处理器和适配器的配置。
第三步:
编写控制器并使用注解配置
主要注解:
@Controller("helloController")
在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用
@RequestMapping("/hello")
出现 位置:
类上:
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
它出现的目的是为了使我们的 URL 可以按照模块化管理:
例如:
账户模块:
/account/add
/account/update
/account/delete
...
订单模块:
/order/add
/order/update
/order/delete
红色的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。
方法上:
请求 URL 的第二级访问目录。
属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
例如:
params = {"accountName"},表示请求参数必须有 accountName
params = {"moeny!100"},表示请求参数中 money 不能是 100。
headers:用于指定限制请求消息头的条件。
注意:
以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
小结: 从入门案例中可以看到的是:
1、HelloController 和 InternalResourceViewResolver,但是远不止这些。
2、浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发的路径是根据请求 URL,匹配@RequestMapping 中的内容。
3、匹配到了后,执行对应方法。该方法有一个返回值。
4、根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
5、渲染结果视图,响应浏览器。
###自定义类型转换器
在表单提交的时候
1. 在表单提交的任何数据类型都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring 框架内部会默认转换
2. 如果想自定义类型转换,可以实现Converter的接口
定义一个转换字符的类,继承Converter<要转换类型,转换后的类型>接口并给泛型。
在配置文件中编写配置
1.注册类型转换器
<bean id="conversionService"class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.utils.StringToDateConverter"/>
</set>
</property>
</bean>
2.开启SoringMVC的支持
<mvc:annotation-driven conversion-service="conversionService"/>