SpringMVC简介
SpringMVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
1.springMVC执行原理
工作流程描述
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler(controller)对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
HandlerMapping接口实现类:
① BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象
② SimpleUrlHandlerMapping :也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多
③ DefaultAnnotationHandlerMapping : 主要是针对注解配置@RequestMapping的,已过时
④ RequestMappingHandlerMapping :取代了上面一个
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)HandlerAdapter接口实现类:
① HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口,该接口的方法为 void handleRequest(HttpServletRequest request, HttpServletResponse response)也就是 handler必须有一个handleRequest方法
② SimpleControllerHandlerAdapter:要求handler实现Controller接口,该接口的方法为ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response),也就是本工程采用的
③ AnnotationMethodHandlerAdapter :和上面的DefaultAnnotationHandlerMapping配对使用的,也已过时
④ RequestMappingHandlerAdapter : 和上面的RequestMappingHandlerMapping配对使用,针对 @RequestMapping
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,SpringMVC将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
结合以上流程,运行时序图如下:
2.springMVC环境搭建
第一步,拷贝jar包
此时因为需要处理web请求,所以需要web和webmvc的支持
第二步,配置DispatcherServlet
打开项目的web.xml,在文件中配置springMVC处理业务的核心servlet:DispatcherServlet,此时如果希望过滤所有请求,那么url-pattern需要配置/,而不能配置/*,代码如下:
<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定spring配置文件所在的位置 --> <init-param> <!-- 初始化参数:用来赋值springMVC配置文件 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring*.xml</param-value> </init-param> <!-- 在tomcat启动的时候创建该对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- 拦截以.do结尾的请求 --> <url-pattern>*.do</url-pattern> </servlet-mapping>
第三步,引入mvc的注解驱动
springMVC通过策略模式来选择处理的方式,可以根据url和名字等处理,也可以通过注解等方式来处理,现在一般直接采用注解的方式来处理,所以需要引入注解驱动,代码如下:
<mvc:annotation-driven></mvc:annotation-driven>
注意,此时需要先在springMVC配置文件的头部,引入mvc命名空间。
第四步,指定springMVC的视图处理器
<bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/admin/"></property> <property name="suffix" value=".jsp" ></property> </bean>
第五步,准备第一个测试页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <a href="hello/hello.do" >测试</a><br/> </body> </html>
第六步,准备一个控制器类,用来处理页面的请求
package com.zl.action; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("hello") public class Hello { @RequestMapping("hello.do") //http://localhost:8080/springMVC/hello/hello.do public ModelAndView hello() { ModelAndView mv=new ModelAndView(); mv.setViewName("main"); return mv; } }
此时,类名,方法名等都是自定义的;
最后,准备show.jsp页面,让请求处理完成后跳转到show.jsp页面上