关于SpringMVC
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的更多相关文章
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- Springmvc数据校验
步骤一:导入四个jar包 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- redis集成到Springmvc中及使用实例
redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
- springMVC初探--环境搭建和第一个HelloWorld简单项目
注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...
- springmvc的拦截器
什么是拦截器 java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...
随机推荐
- [spring源码] 小白级别的源码解析IOC容器的依赖注入(三)
上一篇介绍了ioc容器的初始化过程,主要完成了ioc容器建立beanDefinition数据映射.并没有看到ioc容器对bean依赖关系进行注入. 接口getbean就是出发依赖注入发生的地方.下面从 ...
- safari图片跨域
http://blog.csdn.net/renfufei/article/details/51675148
- Git:一个简单示例
初始状态:两个分支master/dev都只有一个文件readme.txt 待解决问题:在master分支新增文件,并且修改readme.txt文件,将上述操作同步至远程master分支,最后同步到de ...
- LSTM如何解决梯度消失或爆炸的?
from:https://zhuanlan.zhihu.com/p/44163528 哪些问题? 梯度消失会导致我们的神经网络中前面层的网络权重无法得到更新,也就停止了学习. 梯度爆炸会使得学习不稳定 ...
- python -- 字典 集合
1.字典 定义:字典是以 key :value 的形式来保存数据,用{} 来表示,存储的是 key : value 查找效率比较高(注:字典存储数据时,用的是hash值 ...
- jdk安装环境变量配置
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- jq demo 点击评分组件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQL-42 删除emp_no重复的记录,只保留最小的id对应的记录
题目描述 删除emp_no重复的记录,只保留最小的id对应的记录.CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary ...
- Centos7安装xenserver tools
mount /dev/cdrom /mnt [root@192 ~]# mount /dev/cdrom /mntmount: /dev/sr0 写保护,将以只读方式挂载[root@192 ~]# c ...
- offsetWidth与clientWidth 区别
offsetWidth //元素宽度.内边距和边框,不包括外边距 offsetHeight //元素高度.内边距和边框,不包括外边距 clientWidth //元 ...