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. ml交叉验证

    https://blog.csdn.net/guanyuqiu/article/details/86006474 https://blog.csdn.net/weixin_42660173/artic ...

  2. 完美解决xhost +报错: unable to open display "" 装oracle的时候总是在弹出安装界面的时候出错

    详细很多朋友在装oracle的时候总是在弹出安装界面的时候出错,界面就是蹦不出来. oracle安装 先切换到root用户,执行xhost + 然后再切换到oracle用户,执行export DISP ...

  3. Linux进程间通信机制

    Linux支持管道.信号.unix system V三种IPC(Inter-Process-Communication)机制.以下分别对三种机制加以简单介绍. 一.信号机制: 信号又称作软中断,用来通 ...

  4. echarts和highcharts比较

    echarts底层为canvas,highcharts底层为svg canvas特点: ①依赖分辨率 ②不支持事件处理器 ③弱的文本渲染能力 ④能够以.jpg..png格式保存结果图像 ⑤最适合图像密 ...

  5. Nearest Common Ancestors (POJ 1330)

    A rooted tree is a well-known data structure in computer science and engineering. An example is show ...

  6. String.valueOf() ,其他类型转为字符型

    1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...

  7. JAVA中解决Filter过滤掉css,js,图片文件等问题

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOE ...

  8. selenium 常用操作

    官方文档: https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver. ...

  9. Android : 跟我学Binder --- (5) C++实现

    目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...

  10. My IELTS result has come out 我的雅思成绩出来了

    Thanks to god, I finally get a score of 6.5, although my socres of  listening  and writing are only ...