SpringMVC的工作原理与核心开发步骤

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: SpringMVC核心开发步骤 3.1 DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC 3.2 HandlerMapping的配置,从而将请求映射到处理器 @RequestMapping() 3.3 HandlerAdapter的配置,从而支持多种类型的处理器 3.4 处理器(页面控制器)的配置,从而进行功能处理@Controller 3.5 ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术
  1. 什么是springMVC?
    Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、
    轻量级Web框架。

    S springmvc S struts2 视图层,控制层
    S spring S spring 中间层,业务层
    M mybatis H hibernate 持久层

自定义mvc
请求--->中央控制器---->找到对应的Action类---->
action实例化----->反射调用方法 ------>拿到结果,返回视图

ssm/userAction.action?methodName=login&username=zs&password=123

UserAction中的属性
User user = new User();
private String username;

springmvc
请求---->中央控制器---->找到对应的映射方法---->赋值 调用方法 ------>拿到结果,返回视图
ssm/user/login?uname=zs
@RequestMapping('/user/login')
public String login(String uname){ ...... return 'index' }

springmvc的工作原理

  1. SpringMVC处理请求的流程
    2.1 首先用户发送请求-->DispatherServlet
    2.2 DispatcherServlet-->HandlerMapping Controller
    2.3 DispatcherServlet-->HandlerAdapter
    2.4 HandlerAdapter-->处理器功能处理方法的调用 参数赋值
    2.5 ModelAndView的逻辑视图名-->ViewRecolver
    2.6 View-->渲染
    2.7 返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束
  2. SpringMVC核心开发步骤
    3.1 DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
    3.2 HandlerMapping的配置,从而将请求映射到处理器 @RequestMapping()
    3.3 HandlerAdapter的配置,从而支持多种类型的处理器
    3.4 处理器(页面控制器)的配置,从而进行功能处理

@Controller
3.5 ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术

  1. SpringMVC的组件
    4.1 前端控制器(DispatcherServlet)
    4.2 请求到处理器映射(HandlerMapping)
    4.3 处理器适配器(HandlerAdapter)
    4.4 视图解析器(ViewResolver)
    4.5 处理器或页面控制器(Controller)
    4.6 验证器(Validator)
    4.6 命令对象(Command 请求参数绑定到的对象就叫命令对象)
    4.7 表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)
  2. 如何在项目中添加springmvc
    5.1 添加相关依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    
    <!-- ********************** JSTL依赖 ********************** -->
    <!-- 缺少下面的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
    <!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包-->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    

    5.2 在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)

    5.3 修改web.xml

  3. 第一个springMVC程序:HelloWorld
  1. 页面跳转
    7.1 转发:"forward:path"
    7.2 重定向:"redirect:path"
    注1:这两种跳转方式将会绕开视图解析器的前缀和后缀
    注2:还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。
  2. 访问其它的静态资源(被springmvc拦截了)
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

    <mvc:resources location="/static/" mapping="/static/**" cache-period="86400" />
    SpringMVC会自动给静态资源Response添加缓存头Cache-Control和Expires值

  3. 常用注解
    9.1 @Controller:用于标识处理器类

     @RestController注解相当于@ResponseBody + @Controller合在一起的作用
    

    9.2 @RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法

     常用参数:value、method
     可将@RequestMapping标签定义到类名处窄化路径
    

    9.3 @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定

     常用参数:value、required、defaultValue
     注:required设置成false的参数类型必须是引用类型,因为基本数据类型是不能为null的
    

    9.4 @ModelAttribute:请求参数到命令对象的绑定

     常用参数:value

    9.4.1 可用@ModelAttribute标注方法参数,方法参数会被添加到Model对象中(作用:向视图层传数据)
    9.4.2 可用@ModelAttribute标注一个非请求处理方法,此方法会在每次调用请求处理方法前被调用(作用:数据初始化)
    9.4.3 可用@ModelAttribute标注方法,方法返回值会被添加到Model对象中(作用:向视图层传数据)

         但此方法视图的逻辑图就会根据请求路径解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
         太麻烦几乎不用,不用直接保存到Model或ModelAndView中
    

    9.5 @SessionAttributes:指定ModelMap中的哪些属性需要转存到session

     常用参数:value、types
     注1:必须放到class类名处
    

    9.6 @InitBinder(自学):用于将请求参数转换到命令对象属性的对应类型

     例如:日期格式到后台的数据转换
           birthday=2000年10月10日   --> java.util.Date birthday;
    

    9.7 @RequestBody(重要~):用于目前比较流行的ajax开发的数据绑定(即提交数据的类型为json格式)

     注1:使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json,
          如果没有更改,前台会报错415(Unsupported Media Type)。
          后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。
          这些错误Eclipse下Tomcat是不会显示错误信息的,只有使用了日志才会显示
     $.ajax({
               url : "jsontest",
               type : "POST",
               async : true,
               contentType : "application/json",
               data : JSON.stringify(json),
               dataType : 'json',
               success : function(data) {
                   if (data.userstatus === "success") {
                       $("#errorMsg").remove();
                   } else {
                       if ($("#errorMsg").length <= 0) {
                           $("form[name=loginForm]").append(errorMsg);
                       }
                   }
               }
           });
     

    9.8 @ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);

     
     注1:@RestController
     @RestController=@Controller+@ResponseBody
    

    9.9 其它

     @CookieValue cookie数据到处理器功能处理方法的方法参数上的绑定
     @RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定
     @RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
     @ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
     @ExceptionHandler:注解式声明异常处理器;
     @PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,
     @PostConstruct或@PreDestroy:初始化方法/销毁方法
    
    
    
    
    
  4. 请求处理方法的参数及返回值
    10.1请求处理方法的参数

     HttpServletRequest/ServletRequest
     HttpServletResponse/HttpServletResponse
     HttpSession
     Model/ModelAndView/ModelMap/Map
    
     WebRequest/NativeWebRequest
     Locale
     InputStream/Reader
     OutputStream/Writer
     Principal
     HttpEntiry<?>
     RedirectAttributes
     Errors
     BindingResult
     SessionStatus
     UriComponentsBuilder
     带@PathVariable,@MatrixVariable注释的对象
     @RequestParam,@RequestHeader,@RequestBody,@RequestPart
    
     特别重要的是:org.springframework.ui.Model类型,每次调用请求处理方法时,SpringMVC都创建Model对象并将
     其注入到各种对象
    

    10.2返回值的类型

     ModelAndView
     String(代表一个逻辑视图名)
    
     void
     Map
     View
     Callable
     DeferredResult
     其它任意类型,spring将其视作输出给View的对象模型
    
    
  5. springmvc配置一个首页

附录一:spring常用注解

@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Aspect//切面
@Pointcut//定义需要切面的地方,表达式参数(https://blog.csdn.net/elim168/article/details/78150438
@annotation//当执行的方法上拥有指定的注解时生效。

@After
@Before
@Around

附录二:Ant 风格路径表达式

ANT通配符有三种:
? 匹配任何单字符

  • 匹配0或者任意数量的字符

** 匹配0或者更多的目录

“add” /WEB-INF/jsp/add.jsp

struts2和springMVC的区别:

1、springmvc入口是一个servlet前端控制器( DispatcherServlet ),struts2入口是一个filter过滤器(StrutsPrepareAndExecuteFilter).

2、struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action.

springmvc通过在controller方法中定义形参接收参数,springmvc可以使用单例模式管理controller.

3、springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行 映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method).

struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法.

开发中建议使用springmvc,springmvc方法更类似service业务方法.

4、struts2采用值栈存储请求和相应的数据,通过OGNL存取数据;springmvc通过参数绑定期将request请求内容解析,并给方法形参赋值.

5、struts2和springmvc的速度是相当的,由于struts2的漏洞较多,更多企业使用springmvc

6、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

7、设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

8、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

相关文章
|
11月前
|
XML 前端开发 JavaScript
Spring MVC应用的开发步骤
Spring MVC应用的开发步骤
108 0
|
4月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
3月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
36 1
|
3月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
3月前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
3月前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16
|
4月前
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
|
4月前
|
移动开发 Java 测试技术
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
123 1
|
11月前
|
前端开发 Java Go
Spring MVC 和 Spring Boot 的区别
Spring MVC 和 Spring Boot 的区别
192 0
|
4月前
|
Java Apache vr&ar
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException:
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException: