栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅谈SpringMVC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈SpringMVC

目录

1.什么是SpringMVC

1.1简介

1.2原理简述

2.第一个SpringMVC程序

2.1.程序代码

2.2结合代码分析原理

2.2.1探究原理

2.2.2分析代码

3.注解实现SpringMVC

3.1 web.xml文件不变

3.2 springmvc-servlet.xml文件做如下变动

3.3HelloController类如下


1.什么是SpringMVC

【这篇文章是我在B站看狂神视频的笔记,文章中也会用到一些狂神的资料比如流程图等,因为懒不想自己画画的估计也没他的好】

未完,持续更新。。。

1.1简介

SpringMVC是Springframework的一部分,是基于Java实现MVC的轻量级Web框架。Spring的web框架围绕DispatcherServlet【调度Servlet】设计,它可以将请求分发到不同的处理器。

1.2原理简述

当用户发起一个请求时,会被前端控制器【DIspatcherServlet】拦截,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,获得返回的数据得到需要的数据模型,将数据模型响应给前端控制器,前端控制器使用模型与视图渲染视图结果并得到返回的结果,再将结果返回给前端用户。

                                                                        SpringMVC工作原理示意图

2.第一个SpringMVC程序

2.1.程序代码

首先为DispatcherServlet注册一个servlet标签【Spring内置类】




    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:springmvc-servlet.xml
        
        
        1
    

    
    
    
        springmvc
        /
    

在servlet标签内有一个init-param的子标签,它需要一个contextConfigLoation的位置配置文件,就相当于Spring的beans.xml,现在就在resources新建一个,文件名为springmvc-servlet.xml 




    

    

    
        
        
    


    

在springmvc-servlet.xml文件中,最后一个bean标签里我们为HelloController映射了一个对象,现在来实现这个HelloController ,这就是1.2原理简述中提到的实际控制器

public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//        创建一个 视图和模型
        ModelAndView mv = new ModelAndView();
//        将一个数据对象封装放在mv中
        mv.addObject("msg", "HelloSpringMVC");
//        封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello");//视图解析器将会把 hello 与前缀、后缀拼接,得到路径

        return mv;
    }
}

运行后的结果

2.2结合代码分析原理

2.2.1探究原理

上图是SpringMVC的一个比较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

执行流程讲解:

    DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello

    如上url拆分成三部分:

    http://localhost:8080服务器域名

    SpringMVC部署在服务器上的web站点

    hello表示控制器

    通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

    HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。

    HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

    HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

    HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

    Handler让具体的Controller执行。

    Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

    HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

    DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

    视图解析器将解析的逻辑视图名传给DispatcherServlet。

    DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

    最终视图呈现给用户。

2.2.2分析代码

在springmvc-servlet.xml文件中,我们为处理映射器、处理适配器注册了bean的映射,还注册了一个视图解析器的映射以及一个HelloController的映射。

在web.xml文件中,我们在为DIspatcherServlet类【前端控制器】注册servlet的时候,使用到了springmvc-servlet.xml文件,那么前端控制器就可以调用处理映射器和处理适配器。处理映射器通过url获得的控制器,查找与这个控制器id一样的在springmvc-servlet.xml中注册的Handler bean,处理适配器通过Handler bean的class找到实际控制器com.plane.controller.HelloController,将请求交给这个实际控制器来处理。

HelloController处理完请求,将mv返回给前端解析器的时候,前端解析器调用视图解析器,为HelloController返回的路径拼接上前后缀,得到真实的页面路径,将mv的数据渲染到这个真实路径的页面上。

这就是SpringMVC的执行的流程。虽然看起来似乎很绕,但在实际开发中几乎不会和这些流程打交道,真正需要做的也就是让实际控制器去访问模型得到数据,把mv返回就好了。原理有兴趣的话了解就好。

3.注解实现SpringMVC

这一章节讲解注解实现SpringMVC,相比于前一章节讲的实现SpringMVC方法,其实差别不是很大,之不过通过注解来实现,将SpringMVC框架做的工作更加地隐藏了,我们之需要关注更少的一部分就好了。

3.1 web.xml文件不变

依然需要注册一个前端控制器

3.2 springmvc-servlet.xml文件做如下变动

1)头部增加context命名空间和mvc命名空间的依赖

xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd

2)增加对注解使用的支持

    

    


    

3)视图解析器依旧,不用改动 

3.3HelloController类如下
//将这个类注册成一个controller
@Controller
//@RequestMapping("h1") 如果是在类上的@RequestMapping,那么在访问的时候,就是 类上的请求/方法上的请求
public class HelloController {
//  localhost:8080/hello 由前端控制器拦截请求并解析,得到hello控制器,
    @RequestMapping("hello")  
    public String hello(Model model){
//        为model添加携带信息
        model.addAttribute("msg", "HelloSpringAnnotation");

//        将model信息返回,返回的字符串会被视图解析器得到,进行拼接,得到完整的页面地址,
//        将model信息返回到这个地址的页面 WEB-INFjsphello.jsp
        return "hello";
    }
}
4. restFul风格 4.1简介

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制 。

这一章节讲解的是restFul风格和普通url的对比

4.2restFul风格和普通url对比

以localhost举例,restFul风格的格式为 localhost:8080/请求路径/参数值1/参数值2/...,普通url格式为 localhost:8080/请求路径?参数名1=参数值1&参数名2=参数值2...

其次,restFul风格还能做到在发起地址栏路径完全相同的请求的时候,这个请求会被处理器以不同的方法处理。这里是通过请求方法来判断,如post方法或者get方法。

看下面的一个测试例子

4.3测试

在这个测试中,先定义了一个post.jsp和一个get.jsp,里面都定义了一个表单,表单的action完全一样,不过method分别是post和get。有一个submit按钮将表单提交。

HelloController的两个方法上面使用了@PostMapping和@GetMapping,用来接收以不同method提交过来的请求,并分别返回到1.jsp和2.jsp页面。

代码如下

post.jsp



    Title


get.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


HelloController

//将这个类注册成一个controller
@Controller
//@RequestMapping("h1") 如果是在类上的@RequestMapping,那么在访问的时候,就是 类上的请求/方法上的请求
public class HelloController {
//  localhost:8080/hello 由前端控制器拦截请求并解析,得到hello控制器,


//    restFul风格的请求路径,路径变量用{}括起来,且命名和方法参数一样
    @PostMapping("hellorest/{a}/{b}")
    public String hell1(@PathVariable int a, @PathVariable int b, Model model){
        model.addAttribute("msg", "这里处理通过post方式提交的请求" + (a+b));
        return "1";
    }

    @GetMapping("hellorest/{a}/{b}")
    public String hell2(@PathVariable int a, @PathVariable int b, Model model){
        model.addAttribute("msg", "这里处理通过get方式提交的请求" + (a+b));
        return "2";
    }
}

restFul风格,仅仅只是一种风格,不一定要使用,有人觉得它好,也有人觉得它不好。 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/754676.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号