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. yii2 adminlte后台搭建

    加载第三方扩展, composer require dmstr/yii2-adminlte-asset "2.*" composer require mdmsoft/yii2-ad ...

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

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

  3. laravel框架实现数据的删除和修改

    //模型层的调用 <?phpnamespace App;use Illuminate\Support\Facades\DB;use Illuminate\Database\Eloquent\Mo ...

  4. Python---遍历序列的各种方式

    本文主要列举使用for循环遍历类似list结果的方式,因为老是使用for e in w_list真的是太没创意了,这显然不是我的风格,嘿嘿... 1. for item in s: 遍历s中的元素 2 ...

  5. python中字符串格式化

    username='小黑'age=18high=1.88s2='欢迎%s,年龄是%d,身高是%.2f'%(username,age,high)#%s是通用的,%d就必须传整数,%f就必须是小数,想保留 ...

  6. elastic search 重要的系统配置

    文章翻译自 https://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html 1.文件描述符 ...

  7. SSH登录异常(someone is doing something nasty)

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  8. .net core WebApi Interlocked配合ManualResetEventSlim实现并发同步

    由于项目有某种需求,在WebApi中,有大量的请求需要操作相同的数据,因此需要用到并发同步机制去操作共享的数据. 本次配合使用Interlocked和ManualResetEventSlim来实现并发 ...

  9. Python测试框架之Unittest梳理

    1. 2.

  10. `ifdef、`else、`endif 用法

    一般情况下,Verilog HDL源程序中所有的行都参加编译.但是有时候希望对其中的一部份内容只有在条件满足的时候才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足条件 ...