SpringMVC_入门案例[web3.0开发]

SpringMVC_入门案例[web3.0开发]

web3.0开发是通过配置类而不通过xml配置文件

1. 创建一个Maven工程

创建的是一个web工程
在这里插入图片描述

2. 修改项目结构

我们可以看到项目创建好的时候项目中是没有源码目录的, 所以我们要添加源码目录:
在这里插入图片描述

3. 删除WEB-INFO下的配置文件

因为我们此时是web3.0开发, 是使用配置类来完成配置, 不需要使用xml配置文件了

4. 在pom.xml文件中添加依赖和插件

我们添加了:

  1. servlet依赖
  2. springmvc依赖
  3. tomcat插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <packaging>war</packaging>

  <name>springmvc_01_quickstart</name>
  <groupId>com.ffyc</groupId>
  <artifactId>springmvc_01_quickstart</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <!--      这里一定要注意:依赖范围一定要设置为provided
      provided表示的是编译和测试时作用, 在运行环境中就会失效(运行时tomcat中已经是由Servlet.jar包了)-->
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>

<!--  导入一个tomcat插件-->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

5.创建一个SpringMvcConfig配置类, 在该类上开启组件扫描

package com.ffyc.springmvc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.ffyc.springmvc")
public class SpringMvcConfig {
}

6.创建一个ServletContainersInitConfig配置类

该类就是配置在Servlet容器启动的时候要做的事情

package com.ffyc.springmvc.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

/**
 * 让web容器启动的时候加载springmvc容器和spring容器, 还有就是做映射, 配置哪些请求要通过springmvc处理, 也就是配置DispatcherServlet请求映射
 * spring容器和springmvc容器之间是父子容器关系, spring容器是父容器
 */
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    /**
     * 加载springmvc容器
     * @return
     */
    protected WebApplicationContext createServletApplicationContext() {
        //创建springmvc容器
        AnnotationConfigWebApplicationContext annotationConfigApplicationContext = new AnnotationConfigWebApplicationContext();
        annotationConfigApplicationContext.register(SpringMvcConfig.class); //注册的方式加载配置类
        //将springmvc容器返回
        return annotationConfigApplicationContext;
    }

    /**
     * 哪些请求需要springmvc处理
     * @return
     */
    protected String[] getServletMappings() {
        //表示所有的请求都要到disPatcherServlet(前端控制器中), 进行一个请求分发
        return new String[]{"/"};
    }

    /**
     * 加载spring容器
     * @return
     */
    protected WebApplicationContext createRootApplicationContext() {
        //这里我们暂时是可以不使用spring容器的, 所以我们这里直接返回一个null
        return null;
    }
}

可以看到我们加载了springmvc容器, 然后配置了DispatcherServlet的请求映射

7.创建一个控制器来测试:

web3.0下我们一般都是前端异步请求 + 后端直接响应Json数据, 不会直接返回页面

package com.ffyc.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

//注册组件到容器中
@Controller
//使用@ResponseBody注解, 告诉Servlet直接以响应体的形式响应数据, 而不是以model and View的形式响应
@ResponseBody
public class UserController {

    @RequestMapping("/save")
    public String save() {
        System.out.println("save..");
        return "{'name'='zs'}";
    }

}

注意: 如果没有加@ResponseBody注解, 那么就是响应页面, 就会有以下两种问题:

  1. 如果Controller返回值为void : 前端会报一个500, 因为要响应一个页面, 但是响应没有返回值

  2. 如果Controller返回的不是页面, 前端就会报404, 因此此时返回的并不是一个页面

    加上@ResponseBody注解之后就没有了这些问题, 加上了@ResponseBody注解之后就会将返回值转换为Json格式之后写到response对象的body位置, 然后最终由Web容器(tomcat返回)

@ResponseBody注解工作原理(简述):

作用范围 : 使用在控制层(Controller层)

作用 : 将方法的返回值, 以特定的格式写入到response的body区域, 进而将数据返回给客户端

  • 如果方法上面没有写@ResponseBody,底层会将方法的返回值封装为ModelAndView对象。
  • 如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。

原理 : 控制层方法的返回值是如何转化为json格式的字符串的?其实是通过HttpMessageConverter中的方法实现的,它本是一个接口,在其实现类完成转换。如果是bean对象,会调用对象的getXXX()方法获取属性值并且以键值对的形式进行封装,进而转化为json串。如果是map集合,采用get(key)方式获取value值,然后进行封装。

8.添加tomcat

在这里插入图片描述

9.在前端进行测试

因为我们配置的tomcat端口是80, 所以我们在前端直接可以通过localhost/sava请求访问, 原本访问应该是localhost:80/save, 但是http协议之下默认访问的端口号就是80, 所以可以不用添加端口号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值