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

springmvc的工作原理(springmvc和springboot的区别)

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

springmvc的工作原理(springmvc和springboot的区别)

1、什么是MVC ①概念

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。

最典型的MVC就是JSP + servlet + javabean的模式。

②职责分析:

Controller:控制器

    取得表单数据调用业务逻辑转向指定的页面

Model:模型

    业务逻辑保存数据的状态

View:视图

    显示页面
2、回顾servlet ①导入依赖

创建空Maven 项目后,配置父工程pom文件依赖:


    
        junit
        junit
        4.12
    
    
        org.springframework
        spring-webmvc
        5.1.9.RELEASE
    
    
        javax.servlet
        servlet-api
        2.5
    
    
        javax.servlet.jsp
        jsp-api
        2.2
    
    
        javax.servlet
        jstl
        1.2
    

②引入web

空的Maven没有sevlet所需web配置文件,这样引入:

 ③其他文件代码

1、HelloServlet.java

//实现Servlet接口
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //取得参数
        String method = req.getParameter("method");
        if (method.equals("add")){
            req.getSession().setAttribute("msg","执行了add方法");
        }
        if (method.equals("delete")){
            req.getSession().setAttribute("msg","执行了delete方法");
        }
        //业务逻辑
        //视图跳转
        req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

 2、hello.jsp和web.xml注册servlet

hello.jsp

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


    ${msg}




web.xml注册servlet



    
        HelloServlet
        com.cola.servlet.HelloServlet
    
    
        HelloServlet
        /hello
    

④ 测试:

 

 

3、HelloSpringMVC手动配置版 ① 项目开始
    新建一个Moudle , 添加web的支持!确定导入了SpringMVC 的依赖!配置web.xml , 注册DispatcherServlet【springmvc的打包类,在底层的servlet上层增加一个打包类,来集中处理servlet请求!】有了这个,我们servlet就不用每次都手动在web.xml中注册了

web.xml




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

    
    
    
        springmvc
        /
    

② resource目录下,编写SpringMVC 的配置文件!

名称:springmvc-servlet.xml

他是springmvc的核心配置!!!





    

    
    
    
        
        
        
        
    


    
    


③com.cola.controller下建servlet:HelloServlet.java

package com.cola.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//注意:这里我们实现了Controller接口,代表他是Controller,重写方法!
//执行controller→返回给适配器→传给DispatcherServlet→调用视图解析器→解析好给DispatcherServlet→调用具体视图
public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();

        //把我们自己写的业务,放在ModelAndView中。
        mv.addObject("msg","我是叶上萧");

        //后面会进行业务跳转了,你在这里直接告诉springmvc跳转的是哪个视图
        //放在ModelAndView中
        mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp

        //后面会把你写的名字丢进springmvc核心配置里拼接上,→传给DispatcherServlet
        //再传给调用视图解析器【也在核心配置文件那里】

        return mv;
    }
}

④JSP跳转页面

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


    Kuangshen


    ${msg}


⑤idea环境的bug,自动手动添加lib文件夹

⑥运行测试!! 

4、执行原理:【面试问】 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根据视图解析器解析的视图结果,调用具体的视图。最终视图呈现给用户。

一句话:注册DispatcherServlet→映射器 →适配器→执行controller→返回给适配器→传给DispatcherServlet→调用视图解析器→解析好给DispatcherServlet→调用具体视图→返回给用户!

5、HelloSpringMVC【注解版】

创建模块、导入web、添加lib

①web.xml

代码跟上文的手动版的一样!

②springmvc-servlet.xml

变化:用了注解,不需要每个controller都在这里注册了,配置了注解的支持!!!!




    
    
    
    
    

    

    
    
        
        
        
        
    


helloSpringMVC.java

@Controller
public class helloSpringMVC {

    @RequestMapping("/cola")//请求的映射路径来的
    public String sayHello(Model model){
        //向模型中添加属性msg与值,可以在JSP页面中取出并渲染
        model.addAttribute("msg","我是SpringMVC注解版!!");
//        方法返回的结果是视图的名称hello,jsp下的hello.jsp
        return "hello";//会被视图解析
    }
}

测试:http://localhost:8080/cola

6、Controller干嘛用的?

Controller 可以决定要显示哪一个View。Controller 负责定义和调用Model。

控制器Controller接受用户的输入并调用模型和视图去完成用户的需求。当web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只接受请求并决定调用哪个模型构件去处理请求,然后决定用哪个视图来显示模型处理返回的数据。

public class ControllerTest1 implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一个模型model视图view对象
        ModelAndView mv = new ModelAndView();
        //调用模型完成用户请求,也可以直接装任何数据!
        mv.addObject("msg","ControllerTest1");
        //决定要显示哪一个View,即设置视图
        mv.setViewName("test");
        return mv;
    }
}

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

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

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