关于SpringMVC

时间:2023-03-09 17:21:25
关于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方法或者构造函数了。