SpringMVC入门
1、什么是MVC?
MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离,也就是责任分离。
2、SpringMVC框架,
它解决了WEB开发中常见的问题(参数接收、页面跳转 、文件上传、表单验证、国际化、等等),而且使用简单,与Spring无缝集成。 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 (更安全,性能更好,更简单)。 支持 RESTful风格的 URL 请求 。 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
3、Spring的前端控制器DispatcherServlet
所有的请求都被该控制器统一处理,处理所有请求的共同操作。
4、使用SpringMVC的流程
第一步:搭建web项目,导入maven依赖spring-web spring-webmvc spring-context jstl servlet-api
第二步:配置web.xml配置前端控制器,本质上是一个servlet
第三步:处理器映射器、处理器适配器、视图解析器等都是框架已经写好的,在使用时会自动调用,不用配置
第四步:开发和配置控制器Controller
第五步:前端控制器关联SpringMVC配置文件
5、流程详解
第二步:web.xml配置前端控制器
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!--配置前端控制器,本质上是一个servlet--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联mvc.xml的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:mvc.xml</param-value> </init-param> <!--配置启动时自动加载--> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
注:配置前端控制器后发现无法访问静态资源,如/index.html,为什么呢?
- 因为Tomcat处理静态资源访问的servlet(defualt)的映射路径为 / 。在启动项目的时候,在Tomcat中的web.xml是先加载的,项目的web.xml是后加载的,如果配置了相同的映射路径,后面的会覆盖前者. 也就是说,SpringMVC中的DispatcherServlet的映射路径覆盖了Tomcat默认对静态资源的处理的路径。 如果SpringMVC要配置为/,那么就得设置Dispatcherservlet对静态资源进行支持。
解决方式:在配置文件中添加对静态资源的访问<mvc:default-servlet-handler/>
- 添加后将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 Tomcat默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet继续处理。
/ 和 /* 的区别:
- / 会匹配url请求/index等 ,也会匹配静态资源*.js,*.html等, 但不会匹配*.jsp文件。
- /* 会匹配url请求/index等 ,也会匹配静态资源*.js,*.html等, 会匹配*.jsp文件。如果使用JSP,直接响应JSP代码,没有渲染.
第三步:配置视图解析器,用来添加前后缀,会给返回的字符串添加上前后缀(下一篇博客中会用到)
<!--视图解析器(前后缀控制器)--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/> </bean>
第四步:开发和配置Controller
public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { System.out.println("Hello springMVC"); ModelAndView mv = new ModelAndView(); //设置跳转视图页面 mv.setViewName("test"); //将数据共享到前台页面,如果没有设置key值,则默认为数据类型的首字母小写的字符串 mv.addObject("msg","你好!"); mv.addObject(123);//这个就为integer return mv; } }
<!--配置控制器--> <bean name="/hello" class="com.test._01_hello.HelloController"/>
SpringMVC工作流程
流程图
流程分析
1、用户发出请求到前端控制器DispatcherServlet
2、前端控制器调用处理器映射器HandlerMapping
3、处理器映射器通过查找xml配置或注解配置,生成处理器对象的执行链,返回给前端控制器
4、前端控制器调用处理器适配器HandlerAdapter
5、处理器适配器适配调用具体的处理器Controller
6、Controller执行完成后返回ModelAndView对象
7、处理器适配器将Controller的执行结果返回给前端控制器
8、前端控制器将ModelAndView对象传给视图解析器View Resolver
9、视图解析器将解析后的视图View返回给前端控制器
10、前端控制器根据View进行视图渲染,即将模型数据填入页面中
11、前端控制器将渲染完成后的视图响应给用户
涉及到的组件分析
1、前端控制器DispatcherServlet
不需要程序员开发,由框架提供,只需要在web.xml中配置
作用:接收请求,响应结果,相当于转发器,中央处理器
2、处理器映射器HandlerMapping
不需要程序员开发,由框架提供
作用:根据请求的url查找Handler处理器(Controller),可以通过xml和注解的方式来映射。
3、处理器适配器HandlerAdapter
不需要程序员开发,由框架提供
作用:按照特定规则(HandlerAdapter要求的规则)去执行Controller
4、控制器Controller
需要程序员开发,按照HandlerAdapter的要求去做
作用:接收用户请求信息,调用业务方法处理请求,也称之为后端控制器
5、视图解析器ViewResolver
不需要程序员开发,由框架提供
作用:进行视图解析,把逻辑视图解析成真正的物理视图
6、视图View
需要程序员开发jsp等
作用:把数据展现给用户,View是一个接口,实现类支持不同的View技术(jsp、freemarker、pdf等)。
使用注解方式开发SpringMVC
1、第一步:在SpringMVC的配置文件中配置注解解析器
这里需要IoC的注解解析器和MVC的注解解析器
<!--IoC注解解析器,需要配置扫描的包的路径--> <context:component-scan base-package="com.xxx.xxx"/> <!--mvc注解解析器
会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter、ExceptionHandlerExceptionResolver三个bean。
除此之外,还支持使用 ConversionService实例对表单参数进行类型转换.
支持使用 @NumberFormat、@DateTimeFormat注解完成数据格式化操作.
支持使用 @Valid注解对JavaBean实例进行JSR303验证. 支持使用 @RequestBody和@ResponseBody注解读写JSON.-->
<mvc:annotation-driven/>
2、第二步:贴四大标签
控制层(Web) @Controller
业务逻辑层(Service) @Service
数据持久层(DAO) @Repository
其他组件使用通用注解 @Component
注意 :四个标签的功能一模一样,仅仅只是被贴的组件的类型不同,作用都是把被贴注解的类交给spring管理,相当于
<bean id=”类简单名字,首字母小写” class=”类的全限定名称”/>
3、@RequestMapping注解: 设置Controller方法的访问URL,不能重名。
作用:
一:URL路径映射(用于指定对应的url请求路径,value的值表示路径,路径通常以"/"开头,"/"可以省略。)
二:窄化请求映射(可以标注在类中,用于窄化请求映射,此时访问资源的路径为:"/类的路径/方法的路径")
三:请求方法限定(可以添加method属性,用于限定请求请求后台资源的方法)
代码示例:
@Controller @RequestMapping("/anno") public class AnnoController { @RequestMapping("/save,method=RequestMethod.POST") public ModelAndView save(){ System.out.println("这是注解的方式"); return null; } @RequestMapping("/update") public ModelAndView update(){ System.out.println("这是注解的方式"); return null; } }