在个人Spring ——简介及环境搭建跑通Hello提到关于Spring的基本结构与功能html
SpringMVC前端
先上一张SpringMVC的流程图web
Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架创建在中央前端控制器servlet(DispatcherServlet),它负责发送每一个请求到合适的处理程序,使用视图来最终返回响应结果的概念。Spring MVC 是 Spring 产品组合的一部分,它享有 Spring IoC容器紧密结合Spring松耦合等特色,所以它有Spring的全部优势。他跟Struts同样是一个控制器spring
1.首先须要导入他所须要的jar包,能够上官网下载express
2.须要在web.xml中配置这个spring-mvc
前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。mvc
视图名称解析器,将ModelAndView渲染到页面app
<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 此处也能够配置成 *.do 形式 过滤 --> <url-pattern>/</url-pattern> </servlet-mapping>
@RestController框架
负责注册一个bean 到spring 上下文中
@RequestMappingpost
注解为控制器指定能够处理哪些 URL 请求
@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,而后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
@ResponseBody
该注解用于将Controller的方法返回的对象,经过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区,我通常都是用于注解接口的
@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法
在方法的入参前使用 @ModelAttribute 注解:能够从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中
@RequestParam
在处理方法入参处使用 @RequestParam 能够把请求参 数传递给请求方法
@PathVariable
绑定 URL 占位符到入参
@ExceptionHandler
注解到方法上,出现异常时会执行该方法
@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法能够处理全部Controller发生的异常
关系:父子关系
首先配置的是Spring容器的初始化加载的application文件,而后是SpringMVC的前端控制器(DispatchServlet),当配置完DispatchServlet后会在Spring容器中建立一个新的容器。其实这是两个容器,Spring做为父容器,SpringMVC做为子容器。
这里须要说一些规则:儿子能够拿到父亲的Bean对象,而父亲不能拿到儿子的Bean,因此有时候会由于违法了这个而出现了报错,二者之间的顺序是很重要的
按照官方推荐根据不一样的业务模块来划分不一样容器中注册不一样类型的Bean:Spring父容器负责全部其余非@Controller注解的Bean的注册,而SpringMVC只负责@Controller注解的Bean的注册,使得他们各负其责、明确边界。配置方式以下
1.在applicationContext.xml中配置:
<!-- Spring容器中注册非@controller注解的Bean -->
<context:component-scan base-package="com.test.www"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
2.applicationContext-MVC.xml中配置
<!-- SpringMVC容器中只注册带有@controller注解的Bean -->
<context:component-scan base-package="com.test.www" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
即上面提到的 springmvc 只扫描controller的包, spring扫描其余组件。
springmvc 配置以下:
<context:component-scan base-package="com.xxx.**.cotroller"/>
springmvc只会扫描com.xxx下任意目录或子目录下的controller包下的类
spring的配置以下:
<context:component-scan base-package="com.xxx.**.service.impl,com.xxx.**.dao"/>
也能够用<context:include-filter/> 或 <context:exclude-filter/> 指定或排除某些类
假设springmvc扫描以下:
<context:component-scan base-package="com.xxx.**.service.impl,com.xxx.**.dao"/>
spring扫描以下:
<context:component-scan base-package="com.xxx"/>
那么就会重叠,springmvc会扫描service和dao,能够这样修改springmvc的配置:
<context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context>
用 <context:exclude-filter/> 排除了@Service 和 @Repository 两种注解标注的类,意思是告诉springmvc在扫描时,若是碰到这两个注解标注的类直接忽略,不要建立和注入对象。