SpringMVC

原理:
1.用户发送请求给服务器。url:user.do
2.服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。
3.DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。
4.开始执行Controller。
5.Controller执行完毕,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息
6.DispatchServlet将执行视图对象中的数据,输出给服务器。
7.服务器将数据输出给客户端。

@Controller:SpringMVC的控制器是单例的,与Struts1一样。意味着会被多个请求线程共享。可以将控制器设计成无状态类。
@RequestMapping:在类前面定义,则将url和类绑定。在方法前面定义,则将url和类的方法绑定。
@RequestParam:一般用于将指定的请求参数付给方法中形参。
@SessionAttributes:将ModelMap中指定的属性放到session中。
@Service:用于Service业务组件。
@Respository:用于DAO数据访问组件

SpringMVC的核心控制器相当于Struts2的过滤器。
1.采用xml方式;
2.采用注解实现。注解方式的优点是使用方便,缺点是和Java代码掺和在一起,不好修改。 
xml方式的优点是修改方便,但是缺点是配置工作量较大。SpringMVC可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。
SpringMVC是基于方法的设计,拦截到方法后根据参数上的注解,把request数据注入进去。
SpringMVC框架IOC的核心思想:是用java反射和动态代理实现的。

注解形式的参数接收:
1.HttpServletRequest可以直接定义在参数的列表,通过该请求可以传递参数。
public String demo(HttpServletRequest request) { }

2.在参数列表上直接定义要接收的参数名称,只要参数名称能匹配的上就能接收所传过来的数据, 可以自动转换成参数列表里面的类型,注意的是值与类型之间是可以转换的。
a.传递多种不同类型的参数:public String demo(String name, Integer age, String address, Date birthday) { } 
b.传递数组:public String demo(String[] name) { }
c.传递自定义对象(可多个):public String demo(Person person, User user) { }

注解形式的结果返回:
1.HttpServletRequest可以直接定义在参数的列表,并且带回返回结果。
2.方法的返回值采用ModelAndView, new ModelAndView("index", map);相当于把结果数据放到Request里面,不建议使用。
3.直接在方法的参数列表中来定义Map,这个Map即使ModelAndView里面的Map,由视图解析器统一处理,统一走ModelAndView的接口,也不建议使用。
4.在参数列表中直接定义Model,model.addAttribute("p", person); 把参数值放到request类里面去,建议使用。

重定向:
controller内部重定向,redirect:加上同一个controller中的requestMapping的值。
controller之间的重定向:必须要指定好controller的命名空间再指定requestMapping的值,redirect:后必须要加/,是从根目录开始。

@Value作用:获取配置文件的值。
注入值:在Spring容器初始化(所有的bean)之后,在当前的所在容器中获取值,然后注入。

Spring容器——父容器
SpringMVC容器——子容器

父子容器的关系:
1.子容器能够访问父容器的资源(bean):示例:Controller可以注入Service
2.父容器不能访问子容器的资源(bean)

Springmvc和Spring的父子容器关系:
例如:
在applicationContext-service中配置:
<!-- 扫描包加载Service实现类 -->
<context:component-scan base-package="com.taotao"></context:component-scan>
会扫描@Controller、@Service、@Repository、@Compnent
Springmvc.xml中不扫描。
结论:springmvc。不能提供服务,因为springmvc子容器中没有controller对象。
项目的配置文件,项目的启动顺序,项目如何读取资源配置文件。先从web.xml文件开始。

懒加载:就是在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。

springmvc回调模式。(spring mvc对异步请求的处理)
要使用Spring MVC的异步功能,先确保用的是Servlet 3.0或以上的版本。
调用使用了“invoke”的方式,就是说调了之后直接返回,而不等待,这样请求处理线程就“自由”了。
传统的同步模式的Controller是返回ModelAndView,而异步模式则是返回DeferredResult<ModelAndView>。
为servlet或者filter设置启用异步支持:<async-supported>true</async-supported>。
这么做的好处避免web server的连接池被长期占用而引起性能问题,调用后生成一个非web的服务线程来处理,增加web服务器的吞吐量。
异步请求的核心原理主要分为两大类,一类是轮询,另一类是长连接。轮询就是定时自动发起请求检查有没有需要返回的数据,这种对资源浪费比较大。
长连接的原理是客户端发起请求,服务端处理并返回后并不结束连接,这样就可以在后面再次返回给客户端数据。Servlet对异步请求的支持其实采用的是长连接的方式,
也就是说,异步请求中在原始的请求返回的时候并没有关闭连接,关闭的只是处理请求的那个线程,只有在异步请求全部处理完之后才会关闭连接。

springMVC里面,responboby的作用。
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。

@Resource和@Autowired区别:
1.都是做bean的注入时使用,其实@Resource并不是Spring的注解,
它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

2.@Resource默认按照name属性名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配

@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。

@Autowired自动注解,举个例子吧,一个类,俩个实现类,Autowired就不知道注入哪一个实现类,而Resource有name属性,可以区分。

Spring定义bean的三种方式和自动注入:
方法一:基于XML的bean定义(需要提供setter方法)

方法二:基于注解的bean定义(不需要提供setter方法):使用这些注解的时候还有一个地方需要注意,就是需要在applicationContext.xml中声明<contex:component-scan...>一项,指明Spring容器扫描组件的包目录。

方法三:基于Java类的bean定义(需要提供setter方法)

Spring的自动注入:
Spring提供了五种自动装配的类型
no:顾名思义, 显式指明不使用Spring的自动装配功能
byName:根据属性和组件的名称匹配关系来实现bean的自动装配
byType:根据属性和组件的类型匹配关系来实现bean的自动装配,有多个适合类型的对象时装配失败
constructor:与byType类似是根据类型进行自动装配,但是要求待装配的bean有相应的构造函数
autodetect:利用Spring的自省机制判断使用byType或是constructor装配

基于XML的自动装配:而是使用autowired="byName"代替。

基于注解的自动装配:

Spring依赖注入(DI)的三种方式,分别为:
1.接口注入
2. Setter方法注入
3.构造方法注入

对于Spring的依赖注入,最重要的就是理解他的,一旦理解了,将会觉得非常的简单。
无非就是让容器来给我们实例化那些类,我们要做的就是给容器提供这个接口,这个接口就我们的set方法或者构造函数了。

关于SpringMVC的更多相关文章

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. Springmvc数据校验

    步骤一:导入四个jar包 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  3. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  4. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  5. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  6. redis集成到Springmvc中及使用实例

    redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...

  7. 流程开发Activiti 与SpringMVC整合实例

    流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...

  8. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  9. springMVC初探--环境搭建和第一个HelloWorld简单项目

    注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...

  10. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

随机推荐

  1. dedecms 在模版页面获取当前栏目id

    在模版中单独调用当前栏目id {dede:type}[field:ID /]{/dede:type} 在{dede:sql}中调用当前栏目id {dede:sql sql='Select * from ...

  2. python学习(四)

  3. 『PyTorch × TensorFlow』第十七弹_ResNet快速实现

    『TensorFlow』读书笔记_ResNet_V2 对比之前的复杂版本,这次的torch实现其实简单了不少,不过这和上面的代码实现逻辑过于复杂也有关系. 一.PyTorch实现 # Author : ...

  4. oracle导出大数据

    Sqluldr是什么:是一个oracle数据导出小工具. Sqluldr作用介绍:Sqluldr可以快速导出oracle数据库中的数据.该小工具可以将数据库中的数据,导出多种不同的格式(如.txt.. ...

  5. 3、简单了解Angular应用的启动过程

    首先,了解一下目录结构: 然后,简明扼要的说一下应用的启动过程: 1.首先找到main.ts(模块启动入口),main.ts去找到app中的根模块app.module.ts 2.根模块app.modu ...

  6. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)

    梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...

  7. spoj periodni

    题解: dp 方程弄出来就好做了 代码: #include<bits/stdc++.h> ,M=; typedef int arr[N]; typedef long long ll; in ...

  8. elastic search 常用查询

    1.查询mapping curl -X GET "10.0.38.111:1200/metric_data_bus_2018-08-07/_mapping/data_bus?pretty&q ...

  9. VBS下载者助以一臂之力

    当拿到shell到手,服务器是内网,你又没有条件映射,服务器又穿不上东西 是不是很郁闷,还有我们还有vbs,能执行cmd命令就有希望 一.VBS下载者: 复制代码 代码如下: Set Post = C ...

  10. 积累的关于linux的安装卸载软件基本命令

    Linux安装.卸载软件   在linux环境中,尤其是cenos中安装过一些软件,一般是二进制安装与源码安装,现小结一下linux中的安装与卸载. 一.通常Linux应用软件的安装包有三种: 1)  ...