Bootstrap

SpringMVC

七、SpringMVC

(1)SpringMVC简介

  • SpringMVC概述
    • SpringMVC技术与Servlet技术功能等同,均属于web层开发技术,web程序大都基于三层架构实现

  • 如果所有的处理都交给Servlet来处理的话,所有的东西都耦合在一起,对后期的维护和扩展极为不利

  • 将后端服务器Servlet拆分成三层,分别是webservicedao
    • web层主要由servlet来处理,负责页面请求和数据的收集以及响应结果给前端

    • service层主要负责业务逻辑的处理

    • dao层主要负责数据的增删改查操作

  • servlet处理请求和数据的时候,存在的问题是一个servlet只能处理一个请求

  • 针对web层进行了优化,采用了MVC设计模式,将其设计为controllerviewModel
    • controller负责请求和数据的接收,接收后将其转发给service进行业务处理

    • service根据需要会调用dao对数据进行增删改查

    • dao把数据处理完后将结果交给service,service再交给controller

    • controller根据需求组装成Model和View,Model和View组合起来生成页面转发给前端浏览器

    • 这样做的好处就是controller可以处理多个请求,并对请求进行分发,执行不同的业务操作。

  • SpringMVC==主要==负责的就是
    • controller如何接收请求和数据

    • 如何将请求和数据转发给业务层

    • 如何将响应数据转换成json发回到前端

  • 定义
    • SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

  • 优点
    • 使用简单、开发便捷(相比于Servlet)

    • 灵活性强

(2)Spring入门案例

  • Servlet是如何进行开发的?
    • 1.创建web工程(Maven结构)

    • 2.设置tomcat服务器,加载web工程(tomcat插件)

    • 3.导入坐标(Servlet)

    • 4.定义处理请求的功能类(UserServlet)

    @WebServlet("/user/save")
    public class UserSave extends HttpServlet {
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException{
            //1.接受请求参数
            String name = req.getParameter("name");
            System.out.println("servlet save name ==>"+name);
            //2.产生相应
            res.setContentType("text/json;charset=utf-8");
            PrintWriter writer = res.getWriter();
            writer.write("{'module':'servlet save'}");
        }
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            this.doGet(req,res);
        }
    }
    • 5.设置请求映射(配置映射关系) ==》xml

  • SpringMVC的实现流程?
    • 1.创建web工程(Maven结构)

    • 2.设置tomcat服务器,加载web工程(tomcat插件)

    • 3.导入坐标(SpringMVC+Servlet) ,同时添加tomcat插件

    <dependencies>
        <!--1.导入springmvc和servlet依赖-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.3.19</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.3</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.apache.tomcat.embed</groupId>
          <artifactId>tomcat-embed-core</artifactId>
          <version>9.0.83</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>SpringMVC_01_quickstart</finalName>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-api</artifactId>
            <version>7.0.37</version>
          </plugin>
        </plugins>
    </build>
    • 4.定义处理请求的功能类(UserController)

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("/save")
        public String save(String name){
            System.out.println("springmvc user save name==>"+name);
            return "{'info':'springmvc save'}";
        }
        @RequestMapping("/delete")
        public String delete(String name){
            System.out.println("springmvc user delete name==>"+name);
            return "{'info':'springmvc delete'}";
        }
        @RequestMapping("/update")
        public String update(String name){
            System.out.println("springmvc user update name==>"+name);
            return "{'info':'springmvc update'}";
        }
        @RequestMapping("/find")
        public String find(String name){
            System.out.println("user find name==>"+name);
            return "{'info':'springmvc find'}";
        }
    }
    • 5.设置请求映射(配置映射关系)==》配置类替代xml配置文件

    //springmvc配置类
    @Configuration
    @ComponentScan({"com.presentationLayer.controller"})
    public class SpringMVCConfig{...}
    //web容器配置类
    public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
        //产生springMVC对象,本质上还是spring容器
        protected WebApplicationContext createServletApplicationContext() {
            //初始化web容器
            AnnotationConfigWebApplicationContext ctx =
                                            new AnnotationConfigWebApplicationContext();
            //加载springMVC配置类
            ctx.register(SpringMVCConfig.class);
            return ctx;
        }
    ​
        //设置由springmvc控制器处理的请求映射路径
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    ​
        //加载spring配置类
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }
    • 6.将SpringMVC设定加载到Tomcat容器中

    protected WebApplicationContext createServletApplicationContext() {
        //初始化web容器
        AnnotationConfigWebApplicationContext ctx = 
                                            new AnnotationConfigWebApplicationContext();
        //加载springMVC配置类
        ctx.register(SpringMVCConfig.class);
        return ctx;
    }
    • 7.启动tomcat服务器

    • 原因:由于业务有json数据类型的返回值,需要在方法体上使用@ResponseBody进行指定该方法返回一个json数据格式的返回值

    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(String name){
        System.out.println("springmvc user save name==>"+name);
        return "{'info':'springmvc save'}";
    }
    ...
    • 8.总结

      • 一次性工作

        • 创建工程,设置服务器,加载工程

        • 导入坐标 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径 SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)

      • 多次工作

        • 定义处理请求的控制器类

        • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据 (@ResponseBody )

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;