SpringBoot Web开发

Spring Boot Web开发

1. 静态资源访问

​ 由于SpringBoot的项目是打成jar包的所以没有之前web项目的那些web资源目录(webapps)。

​ 那么我们的静态资源要放到哪里呢?

​ 从SpringBoot官方文档中我们可以知道,我们可以把静态资源放到 resources/static (或者 resources/public 或者resources/resources 或者 resources/META-INF/resources) 中即可。

​ 静态资源放完后,

​ 例如我们想访问文件:resources/static/index.html 只需要在访问时资源路径写成/index.html即可。

​ 例如我们想访问文件:resources/static/pages/login.html 访问的资源路径写成: /pages/login.html

1.1 修改静态资源访问路径

SpringBoot默认的静态资源路径匹配为/** 。如果想要修改可以通过 spring.mvc.static-path-pattern 这个配置进行修改。

​ 例如想让访问静态资源的url必须前缀有/res。例如/res/index.html 才能访问到static目录中的。我们可以修改如下:

在application.yml中

spring:
  mvc:
    static-path-pattern: /res/** #修改静态资源访问路径

1.2 修改静态资源存放目录

​ 我们可以修改 spring.web.resources.static-locations 这个配置来修改静态资源的存放目录。

​ 例如:

spring:
  web:
    resources:
      static-locations:
        - classpath:/sgstatic/ 
        - classpath:/static/

2 设置请求映射规则@RequestMapping

该注解可以加到方法上或者是类上。(查看其源码可知)

我们可以用其来设定所能匹配请求的要求。只有符合了设置的要求,请求才能被加了该注解的方法或类处理。

2.1 指定请求路径

path或者value属性都可以用来指定请求路径。

例如:

​ 我们期望让请求的资源路径为 /test/testPath的请求能够被testPath方法处理则可以写如下代码

@RestController
public class HelloController {

    @RequestMapping("/test/testPath")
    public String testPath(){
        return "testPath";
    }
}

2.2 指定请求方式

​method属性可以用来指定可处理的请求方式。

例如:

​我们期望让请求的资源路径为 /test/testMethodPOST请求能够被testMethod方法处理。则可以写如下代码

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

    @RequestMapping(value = "/testMethod",method = RequestMethod.POST)
    public String testMethod(){
        System.out.println("testMethod处理了请求");
        return "testMethod";
    }
}

注意:我们可以也可以运用如下注解来进行替换

  • ​ @PostMapping 等价于 @RequestMapping(method = RequestMethod.POST)

  • ​ @GetMapping 等价于 @RequestMapping(method = RequestMethod.GET)

  • ​ @PutMapping 等价于 @RequestMapping(method = RequestMethod.PUT)

  • ​ @DeleteMapping 等价于 @RequestMapping(method = RequestMethod.DELETE)

例如:

​ 上面的需求我们可以使用下面的写法实现

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

    @PostMapping(value = "/testMethod")
    public String testMethod(){
        System.out.println("testMethod处理了请求");
        return "testMethod";
    }
}

2.3 指定请求参数

​我们可以使用params属性来对请求参数进行一些限制。可以要求必须具有某些参数,或者是某些参数必须是某个值,或者是某些参数必须不是某个值。

例如:

​我们期望让请求的资源路径为 /test/testParamsGET请求,并且请求参数中具有code参数的请求能够被testParams方法处理。则可以写如下代码

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "code")
    public String testParams(){
        System.out.println("testParams处理了请求");
        return "testParams";
    }
}

如果是要求不能有code这个参数可以把改成如下形式

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "!code")
    public String testParams(){
        System.out.println("testParams处理了请求");
        return "testParams";
    }
}

如果要求有code这参数,并且这参数值必须是某个值可以改成如下形式

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "code=sgct")
    public String testParams(){
        System.out.println("testParams处理了请求");
        return "testParams";
    }
}

如果要求有code这参数,并且这参数值必须不是某个值可以改成如下形式

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "code!=sgct")
    public String testParams(){
        System.out.println("testParams处理了请求");
        return "testParams";
    }
}

2.4 指定请求头

​我们可以使用headers属性来对请求头进行一些限制。

例如:

​我们期望让请求的资源路径为 /test/testHeaders的GET请求,并且请求头中具有deviceType的请求能够被testHeaders方法处理。则可以写如下代码

@RestController
@RequestMapping("/test")
public class TestController {
    
    @RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType")
    public String testHeaders(){
        System.out.println("testHeaders处理了请求");
        return "testHeaders";
    }
}

如果是要求不能有deviceType这个请求头可以把改成如下形式

@RestController
@RequestMapping("/test")
public class TestController {
    
    @RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "!deviceType")
    public String testHeaders(){
        System.out.println("testHeaders处理了请求");
        return "testHeaders";
    }
}

如果要求有deviceType这个请求头,并且其值必须是某个值可以改成如下形式

@RestController
@RequestMapping("/test")
public class TestController {
    
    @RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType=ios")
    public String testHeaders(){
        System.out.println("testHeaders处理了请求");
        return "testHeaders";
    }
}

如果要求有deviceType这个请求头,并且其值必须不是某个值可以改成如下形式

@RestController
@RequestMapping("/test")
public class TestController {
    
    @RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType!=ios")
    public String testHeaders(){
        System.out.println("testHeaders处理了请求");
        return "testHeaders";
    }
}

2.5 指定请求头Content-Type

我们可以使用consumes属性来对Content-Type这个请求头进行一些限制。

范例一

​我们期望让请求的资源路径为 /test/testConsumes的POST请求,并且请求头中的Content-Type头必须为 multipart/from-data 的请求能够被testConsumes方法处理。则可以写如下代码

    @RequestMapping(value = "/testConsumes",method = RequestMethod.POST,consumes = "multipart/from-data")
    public String testConsumes(){
        System.out.println("testConsumes处理了请求");
        return "testConsumes";
    }
范例二

​如果我们要求请求头Content-Type的值必须不能为某个multipart/from-data则可以改成如下形式:

    @RequestMapping(value = "/testConsumes",method = RequestMethod.POST,consumes = "!multipart/from-data")
    public String testConsumes(){
        System.out.println("testConsumes处理了请求");
        return "testConsumes";
    }

3. 获取请求参数

3.1 获取路径参数

RestFul风格的接口一些参数是在请求路径上的。类似: /user/1 这里的1就是id。

​如果我们想获取这种格式的数据可以使用 @PathVariable来实现。

范例一

​要求定义个RestFul风格的接口,该接口可以用来根据id查询用户。请求路径要求为 /user ,请求方式要求为GET。

​而请求参数id要写在请求路径上,例如 /user/1 这里的1就是id。

​我们可以定义如下方法,通过如下方式来获取路径参数:

@RestController
public class UserController {

    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    public String findUserById( @PathVariable("id")Integer id){
        System.out.println("findUserById");
        System.out.println(id);
        return "findUserById";
    }
}
范例二

如果这个接口,想根据id和username查询用户。请求路径要求为 /user ,请求方式要求为GET。

​而请求参数id和name要写在请求路径上,例如 /user/1/zs 这里的1就是id,zs是name

我们可以定义如下方法,通过如下方式来获取路径参数:

@RestController
public class UserController {
    @RequestMapping(value = "/user/{id}/{name}",method = RequestMethod.GET)
    public String findUser(@PathVariable("id") Integer id,@PathVariable("name") String name){
        System.out.println("findUser");
        System.out.println(id);
        System.out.println(name);
        return "findUser";
    }
}

3.2 获取请求体中的Json格式参数

RestFul风格的接口一些比较复杂的参数会转换成Json通过请求体传递过来。这种时候我们可以使用 @RequestBody注解获取请求体中的数据。

配置:SpringBoot的web启动器已经默认导入了jackson的依赖,不需要再额外导入依赖了。

范例一

​要求定义个RestFul风格的接口,该接口可以用来新建用户。请求路径要求为 /user ,请求方式要求为POST。

用户数据会转换成json通过请求体传递。
​ 请求体数据

{"name":"三更","age":15}

1.获取参数封装成实体对象

​如果我们想把Json数据获取出来封装User对象,我们可以这样定义方法:

@RestController
public class UserController {
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String insertUser(@RequestBody User user){
        System.out.println("insertUser");
        System.out.println(user);
        return "insertUser";
    }
}

User实体类如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

2.获取参数封装成Map集合

​ 也可以把该数据获取出来封装成Map集合:

    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String insertUser(@RequestBody Map map){
        System.out.println("insertUser");
        System.out.println(map);
        return "insertUser";
    }
范例二

​如果请求体传递过来的数据是一个User集合转换成的json,Json数据可以这样定义:

[{"name":"三更1","age":14},{"name":"三更2","age":15},{"name":"三更3","age":16}]

方法定义:

    @RequestMapping(value = "/users",method = RequestMethod.POST)
    public String insertUsers(@RequestBody List<User> users){
        System.out.println("insertUsers");
        System.out.println(users);
        return "insertUser";
    }

注意事项

如果需要使用 @RequestBody来获取请求体中Json并且进行转换,要求请求头 Content-Type 的值要为: application/json 。

3.3 获取QueryString格式参数

​如果接口的参数是使用QueryString的格式的话,我们也可以使用SpringMVC快速获取参数。

我们可以使用**@RequestParam**来获取QueryString格式的参数。

范例一

要求定义个接口,该接口请求路径要求为 /testRequestParam,请求方式无要求。参数为id和name和likes。使用QueryString的格式传递。

1.参数单独的获取

​如果我们想把id,name,likes单独获取出来可以使用如下写法:

在方法中定义方法参数,方法参数名要和请求参数名一致,这种情况下我们可以省略 @RequestParam注解。

    @RequestMapping("/testRquestParam")
    public String testRquestParam(Integer id, String name, String[] likes){
        System.out.println("testRquestParam");
        System.out.println(id);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "testRquestParam";
    }

如果方法参数名和请求参数名不一致,我们可以加上 @RequestParam注解例如:

    @RequestMapping("/testRquestParam")
    public String testRquestParam(@RequestParam("id") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
        System.out.println("testRquestParam");
        System.out.println(uid);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "testRquestParam";
    }

2.获取参数封装成实体对象

​ 如果我们想把这些参数封装到一个User对象中可以使用如下写法:

    @RequestMapping("/testRquestParam")
    public String testRquestParam(User user){
        System.out.println("testRquestParam");
        System.out.println(user);
        return "testRquestParam";
    }

User类定义如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String[] likes;
}

测试时请求url如下:

http://localhost:8080/testRquestParam?id=1&name=三更草堂&likes=编程&likes=录课&likes=烫头

注意:实体类中的成员变量要和请求参数名对应上。并且要提供对应的set/get方法。

3.4 相关注解其他属性

required

代表是否必须,默认值为true也就是必须要有对应的参数。如果没有就会报错。

​如果对应的参数可传可不传则可以把其设置为fasle

例如:

    @RequestMapping("/testRquestParam")
    public String testRquestParam(@RequestParam(value = "id",required = false) Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
        System.out.println("testRquestParam");
        System.out.println(uid);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "testRquestParam";
    }
defaultValue

如果对应的参数没有,我们可以用defaultValue属性设置默认值。

例如:

    @RequestMapping("/testRquestParam")
    public String testRquestParam(@RequestParam(value = "id",required = false,defaultValue = "777") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
        System.out.println("testRquestParam");
        System.out.println(uid);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "testRquestParam";
    }

4. 响应体响应数据

无论是RestFul风格还是我们之前web阶段接触过的异步请求,都需要把数据转换成Json放入响应体中。

4.1 数据放到响应体

​我们的SpringMVC为我们提供了 @ResponseBody来非常方便的把Json放到响应体中。

@ResponseBody可以加在类上和方法上

4.2 数据转换成Json

配置

SpringBoot项目中使用了web的start后,不需要进行额外的依赖和配置

使用

​只要把要转换的数据直接作为方法的返回值返回即可。SpringMVC会帮我们把返回值转换成json。具体代码请参考范例。

4.3 范例

范例一

​要求定义个RestFul风格的接口,该接口可以用来根据id查询用户。请求路径要求为 /response/user ,请求方式要求为GET。

​而请求参数id要写在请求路径上,例如 /response/user/1 这里的1就是id。

​要求获取参数id,去查询对应id的用户信息(模拟查询即可,可以选择直接new一个User对象),并且转换成json响应到响应体中。

@Controller
@RequestMapping("/response")
public class ResponseController {

    @RequestMapping("/user/{id}")
    @ResponseBody
    public User findById(@PathVariable("id") Integer id){
        User user = new User(id, "三更草堂", 15, null);
        return user;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值