springMVC与前端交互

第一步 加依赖

pom.xml

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
  </dependency>

其中jackson是反序列列化的,用于实体类的属性映射装配
lombok简化实体类get,set等等的代码

第二步 编写配置类

SpringConfig.java

package config;

import org.springframework.context.annotation.ComponentScan;

//spring容器
@ComponentScan({"service"})//扫业务层的包
public class SpringConfig {
}

SpringWebConfig.java

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//springWeb容器
@ComponentScan({"testcontroller"})//扫web控制层的包
@EnableWebMvc//开启JSON数据自动转换
public class SpringWebConfig  implements WebMvcConfigurer{
    //跨域设置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 允许跨域访问的路径
                .allowedOrigins("*")// 允许跨域访问的域名
                .allowedMethods("*")   // 允许跨域访问的方法
                .allowedHeaders("*")   // 允许跨域访问的请求头
                .allowCredentials(true)   // 是否允许证书 不需要配置
                .maxAge(24 * 60 * 60);          // 暴露在请求头的有效时间
    }
}

ServletContainersInitConfig.java

package config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override//拦截路径配置
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    @Override//加载spring容器
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
    @Override//加载springWeb容器
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringWebConfig.class};
    }

    //处理请求体的中文乱码问题
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }
}

第三步 加web启动插件

pom.xml

<build>
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
        	<port>2000</port> <!--  端口号  -->
            <path>/</path> <!--  项目根路径  -->
          </configuration>
        </plugin>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                  <source>8</source>
                  <target>8</target>
              </configuration>
          </plugin>
      </plugins>
  </build>

第四步 编写controller

为了能够用实体类接前端的数据,先写两个实体类


TestUser.java

package testcontroller;

import lombok.Data;

@Data
public class TestUser {
    int id;
    String user;
}

Teacher.java

package testcontroller;

import lombok.Data;

@Data
public class Teacher {
    int no;
    TestUser user;
}


编写controller测试
TestController.java

package testcontroller;


import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/test")
public class TestController {

//    测试路径 http://localhost:20000/test/hello
    @RequestMapping("/hello")
    public String sayHello(){
        return "hello";
    }


//    测试路径 http://localhost:20000/test/commonParam?id=1&user=123
    //普通传参,名字对应
    @RequestMapping("/commonParam")
    public  String commonParam(int id,String user){
        viewData("/commonParam",id+user);
        return id+user;
    }
//    测试路径 http://localhost:20000/test/commonParamDif?id=1&user=123
    //普通传参,名字不对应对应
    @RequestMapping("/commonParamDif")
    public  String commonParamDif(int id,@RequestParam("user") String userName){
        viewData("/commonParamDif",id+userName);
        return id+userName;
    }
//    测试路径 http://localhost:20000/test/commonParamDif?id=1&user=123
    //无引用 pojo传参,名称得一样可以自动装配
    @RequestMapping("/pojo")
    public  String pojo(TestUser user){
        viewData("/pojo","");
        System.out.println(user);
        return "pojo";
    }
//    测试路径 http://localhost:20000/test/pojo2?user.id=1&user.user=123&no=100
    //含引用 pojo传参,名称得一样可以自动装配
    @RequestMapping("/pojo2")
    public  String pojo2(Teacher teacher){
        viewData("/pojo2",teacher);
        return "pojo2";
    }
//    测试路径 http://localhost:20000/test/array?strings=strings1&strings=strings2&strings=strings3
    //数组传参
    @RequestMapping("/array")
    public  String array(String[] strings){
        viewData("/array", Arrays.toString(strings));
        return "array";
    }
//    测试路径 http://localhost:20000/test/list?strings=strings1&strings=strings2&strings=strings3
    //集合传参
    @RequestMapping("/list")
    public  String list(@RequestParam List<String> strings){
        viewData("/list", strings);
        return "list";
    }

//--------------------------下方为JSON传参-----------------------------------

    //数组传参
    @RequestMapping("/jsonarray")
    public  List<String>  jsonarray(@RequestBody List<String> strings){
        viewData("/jsonarray", strings);
        return strings;
    }

    //pojo传参
    @RequestMapping("/jsonpojo")
    public TestUser jsonpojo(@RequestBody TestUser user){
        viewData("/jsonpojo", user);
        return user;
    }

    //集合传参
    @RequestMapping("/jsonlist")
    public  List<TestUser> jsonlist(@RequestBody List<TestUser> users){
        viewData("/jsonlist", users);
        return users;
    }

    public void viewData(String path,Object s){
        System.out.println("Current path:"+path+"\ndata from web:"+s);
    }
}


注意:json传参参考postman,其中{{url2000}}是我在postman中设置的变量,值为http://localhost:2000,可以自行设置替换,也可直接填写http://localhost:2000。

json 数组传参


在这里插入图片描述

// 路径 http://localhost:2000/test/jsonarray
["strings1","strings12","strings13"]

json pojo传参


以下两张图参考第一张图
在这里插入图片描述

// 路径 http://localhost:2000/test/jsonpojo
{
    "id":1,
    "user":"needto"
}

json 集合传参


在这里插入图片描述

// 路径 http://localhost:2000/test/jsonlist
[
    {
    "id":1,
    "user":"needto"
    },
    {
    "id":2,
    "user":"needto2"
    }
]

最后,我们还有一个问题,那就是pojo的实体类属性名必须和前端json对应位置的名称一致,不然接不到数据,有什么办法能灵活控制吗?即使不一致也能接到数据呢?
答案当然是有的
jackson为我们提供了一个注解@JsonProperty(“name”),只要将该注解放在实体类属性上面,将name改成对应前端位置的名称,就可不改变实体类属性名的情况下,将name替换原来的属性名来和前端映射啦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值