Spring MVC框架
Spring MVC框架知识点:
1、Spring MVC的本质?
Spring MVC的是通过spring-web和spring-webmvc两个包实现的,spring-web中提供了一个监听器,能够在web项目启动的时候就加载applicationContext.xml文件,生成IoC 容器;spring-mvcweb提供了Servlet前端控制器,使得所有的请求都会进入该Servlet(其实也不是所有请求,当请求是jsp的话,可以直接返回,其他都会进入,这样会导致静态资源无法访问而报错的问题,也需要进行相应的配置), 然后在这一个Servlet中根据请求的参数调用不同Bean对象的方法。
备注:在web项目中,tomact、spring、springmvc都是容器,tomcat管理的是Servlet 对象,spring管理的service层和dao层的对象,springmvc管理的是controller层的对象。
spring和springmvc容器不是同一个容器,因此在进行配置的时候,将所属对应容器的对象分开配置,同时spring容器是采用监听器进行配置的,而springmvc容器是在配置 前端控制器DispatcherServlet时指定的。
Spring MVC的工作流程:
1、前端请求进入前端控制器(DispatcherServlet);
2、前端控制器(DispatcherServlet)使用处理器映射器(HandleMapping)解析请求,返回处 理器执行链(HandleExecutionChain);
3、前端控制器调用处理器适配器(HanderAdaptor);
4、HandlerAdaptor调用处理器(Controller);
5、处理器返回ModelAndView对象;
6、前端处理器再将该对象给视图解析器(ViewResolver)进行解析渲染;
7、然后返回给前端。
由上面Spring MVC的工作流程可知,Spring MVC主要是一个前端控制器,该前端控制 器包括各个组件,当请求进入该前端控制器之后,使用各个组件完成相应的功能,组件包括:处理器映射器(HandlerMapping)、处理器适配器(HandlerAdaptor)、处理器 (Handler)、视图解析器(ViewResolver)、视图(View)
在进行前端控制器DispatcherServlet配置的时候,也可以对上述组件进行配置,如果不 配置则会采用默认配置,如果配置了将会对生成的相关组件进行配置,比较常进行配置 的是InternalResourceViewResolever,对视图资源的前后缀进行配置。
2、web项目中的监听器
在web项目中,可以使用ServletContextListenter监听web项目的启动,可以编写这个监听器,实现项目启动时数据的加载。
(可以使用该监听器加载applicationContext.xml,生成applicationContext对象并将其放入servletContext域中)
3、web项目中的全局初始化参数
web项目中可以配置全局初始化参数,由于2中使用到applicationContext.xml的位置参数,因此可以使用全局初始化参数进行设置,
结合2完成spring容器在web项目启动的时候就加载。
4、Spring提供获取应用上下文监听器(是对2和3的封装)
Spring提供了一个监听器ContextLoadListener,该监听器可以监听web项目的启动并且 自动加载applicationContext.xml的配置文件生成IoC容器(应用上下文对象),然后将 该应用上下文对象存储进ServletContext域中,同时Spring还提供了 WebapplicationContextUtils工具类用于从ServletContext域中获取该应用上下文对象。
备注:上述相关的类存在于spring-web包中,因此需要导入相应的包。该监听器还是需 要提供applicationContext.xml的路径,因此该路径还是需要配置到全局初始化参数中。
5、Spring MVC理解
Spring MVC是基于java实现的MVC设计模型的请求驱动类型的轻量级框架,属于 SpringFrameWork的后续产品,已经融入在Spring Web Flow中。
Spring MVC可以通过一套注解让一个简单的java类成为处理请求的控制器,而无须实 现任何接口,同时它还支持RESTful编程风格的请求。
备注:在web项目中,如果前端访问web项目的静态资源,可以直接将项目中的静态 页面返回,但是如果前端访问的是web项目中的动态资源,该请求对应的是一个Servlet 资源,可以在该Servlet中进行逻辑判断、请求转发和跳转等操作。
理解:Spring MVC底层做了什么?
由上可知,每个Servlet本质上就是一个方法,在该方法中实现一定的逻辑功能,可以看作是一个动态资源,都需要在web.xml中进行配置,配置比较繁琐。
如何简化呢?(思路参考)
1)可以将原本需要用的很多Servlet中的方法放在Java对象中
2)配置一个Servlet
3)配置一个过滤器(spingmvc在配置的时候只配置一个缺省的servlet,优先级低,表示匹配不到的情况下,请求才会进入这个servlet,过滤器还是需要配置,因为post请求会出现乱码问题,可以使用过滤器解决)
4)该过滤器将前端的所有请求都转发到该Servlet中
5)这个Servlet中对请求进行解析,创建相应的java对象并调用相应的方法(在配置前端控制器的时候已经指定了spring-mvx.xml,表示生成springmvc容器,并且将扫描到的controller层对象放入该容器)。
备注:Spring MVC实现了对上述思想的封装,提供了前端控制器(一个Servlet,存在于springmvc包中)
6、Spring MVC的配置
6.1 web.xml的配置
1)配置监听器,监听web服务的启动,在启动的时候加载applicationContext.xml文件, 生成IoC容器,为了使spring容器和springmvc容器分开,该配置文件只扫描service 层和dao层;(备注:该监听器需要指定applicationContext.xml的路径,通过全局 初始化参数指定,applicationContext.xml配置组件扫描,扫service和dao层, spring-mvc.xml配置组件扫描,扫controller层)
2)配置前端控制器(DispatcherServlet),这个前端控制器的本质就是一个Servlet,因此按普通Servlet进行配置即可(只不过这个Servlet是springvc提供的而已),该 Servlet的路径指定为反斜线/,表示所有的请求都进入该Servlet。
6.2 controller层的配置
该层使用注解进行配置。
@Controller:使用该注解修饰controller层的类,项目会将该对象放入springmvc容器 中,供前端控制器使用。
该注解用于修饰类。
@RequestMapping:作用是将前端请求的URL与方法之间建立映射关系,当前端请求进 入前端控制器之后,前端控制器解析URL,根据URL选择需要调用的方法。
该注解可用于修饰类和方法。
该注解的参数:
value:指定访问路径。
method:指定访问的方法。
params:用于限定请求参数的条件,支持简单的表达式。
params = {“name”}表示请求中必须有name参数;
params={“name!abc”}表示请求中name参数不能是abc;
@ResponseBody:作用是直接将方法返回的字符串显示在页面中
等价于response.getWriter().println(“字符串”)
@RequestParam:作用是参数绑定,默认情况下参数的封装是key值与形参相同,可以使用@RequestParm,显示指定将key值匹配到那个形参。
public void test(@RequestParam(“name” String username)表示将请求中的key为name与形参username进行绑定,username接收请求中 name的值。
该注解的参数:
value:请求数据中key的名称;
required:设置为true,表示请求中必须要有该key,否则报错;
默认是false,表示可有可没有
defaultValue:表示如果请求中如果没有该key,则使用默认值