第 2-1 课:Spring Boot 对基础 Web 开发的支持(上)

自从 B/S 架构(Browser/Server,浏览器/服务器模式)被发明以来,因为其具有跨平台、易移植、方便使用等特点,迅速地成为了技术架构的首选,前端 Web 技术迅速发展起来。人们利用前端 Web 技术构建各种应用场景,如电子商务平台、在线聊天室、后台管理系统等。页面技术也从最初的 JSP 演化为现在的模板引擎;信息交互由以前的 XML 发展到现在更流行的 JSON;Spring Filter、IoC、Aop 等概念的发展更加方便人们构建 Web 系统。

Spring Boot 对 Web 开发的支持很全面,包括开发、测试和部署阶段都做了支持。spring-boot-starter-web 是 Spring Boot 对 Web 开发提供支持的组件,主要包括 RESTful,参数校验、使用 Tomcat 作为内嵌容器等功能,接下来给大家一一介绍。

JSON 的支持

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python 等),这些特性使 JSON 成为理想的数据交换语言。

早期人们习惯使用 XML 进行信息交互,后来 JSON 的使用更加简单,到了现在信息交互大部分都以 JSON 为主。早期在 Spring 体系中使用 JSON 还比较复杂,需要配置多项 XML 和注解,现在在 Spring Boot 体系中,对 JSON 支持简单而又完善,在 Web 层使用仅仅只需要一个注解即可完成。接下来使用案例说明。

新建一个 spring-boot-web 项目,在 pom.xml 中添加 Web 依赖。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

启动类:

@SpringBootApplication
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

在项目根路径下新建 model 包,在包下新建一个实体类 User,User 信息如下:

public class User {
    private String name;
    private int age;
    private String pass;
    //setter、getter省略
}

在项目中新建 Web 包,并在 Web 包下新建一个类 WebController,在类中创建一个方法返回 User,如下:

@RestController
public class WebController {
    @RequestMapping(name="/getUser", method= RequestMethod.POST)
    public User getUser() {
        User user=new User();
        user.setName("小明");
        user.setAge(12);
        user.setPass("123456");
        return user;
    }
}
  • @RestController 注解相当于 @ResponseBody + @Controller 合在一起的作用,如果 Web 层的类上使用了 @RestController 注解,就代表这个类中所有的方法都会以 JSON 的形式返回结果,也相当于 JSON 的一种快捷使用方式;
  • @RequestMapping(name="/getUser", method= RequestMethod.POST),以 /getUser 的方式去请求,method= RequestMethod.POST 是指只可以使用 Post 的方式去请求,如果使用 Get 的方式去请求的话,则会报 405 不允许访问的错误。

在 test 包下新建 WebControllerTest 测试类,对 getUser() 方法进行测试。

@SpringBootTest
public class WebControllerTest {
    //省略部分代码
    @Test
    public void getUser() throws Exception {
        String responseString = mockMvc.perform(MockMvcRequestBuilders.post("/getUser"))
                .andReturn().getResponse().getContentAsString();
        System.out.println("result : "+responseString);
    }
}

这里的测试代码和上面的稍有区别,“.andReturn().getResponse().getContentAsString(); ”的意思是获取请求的返回信息,并将返回信息转换为字符串,最后将请求的响应结果打印出来。

执行完 Test,返回结果如下:

result : {"name":"小明","age":12,"pass":"123456"}

说明 Spring Boot 自动将 User 对象转成了 JSON 进行返回。那么如果返回的是一个 list 呢,在 WebController 添加方法 getUsers(),代码如下:

@RequestMapping("/getUsers")
public List<User> getUsers() {
    List<User> users=new ArrayList<User>();
    User user1=new User();
    user1.setName("neo");
    user1.setAge(30);
    user1.setPass("neo123");
    users.add(user1);
    User user2=new User();
    user2.setName("小明");
    user2.setAge(12);
    user2.setPass("123456");
    users.add(user2);
   return users;
}

添加测试方法:

@Test
public void getUsers() throws Exception {
    String responseString = mockMvc.perform(MockMvcRequestBuilders.get("/getUsers"))
            .andReturn().getResponse().getContentAsString();
    System.out.println("result : "+responseString);
}

执行测试方法,返回内容如下:

result : [{"name":"neo","age":30,"pass":"neo123"},{"name":"小明","age":12,"pass":"123456"}]

说明不管是对象还是集合或者对象嵌套,Spring Boot 均可以将其转换为 JSON 字符串,这种方式特别适合系统提供接口时使用。

请求传参

请求传参是 Web 开发最基础的内容,前端浏览器和后端服务器正是依赖交互过程中的参数,来判断用户是否登录、用户正在执行时哪些动作,因此参数的传递和接收是一个 Web 系统最基础的功能。Spring Boot 内置了很多种参数接收方式,提供一些注解来帮助限制请求的类型、接收不同格式的参数等,接下来我们举例介绍。

使用 Spring Boot 可以轻松的对请求做一些限制,比如为了安全我们只允许 POST 请求的访问,只需要在方法上添加一个配置既可:

@RequestMapping(name="/getUser", method= RequestMethod.POST)
public User getUser() {
    ...
}

这时候再以 GET 请求去访问,就会返回如下结果:

Request method 'GET' not supported

如果要求其请求只支持 GET 请求,method 设置为:method= RequestMethod.GET;如果不进行设置默认两种方式的请求都支持。

Spring Web 层支持多种方法传参,在上一课中我们传入一个属性 name,直接使用对象接收也可以支持。

@RequestMapping(name="/getUser", method= RequestMethod.POST)
public String getUser(User user) {
    ...
}

这样的写法,只要是 User 的属性都会被自动填充到 User 对象中;还有另外一种传参的方式,使用 URL 进行传参,这种形式的传参地址栏会更加美观一些。

@RequestMapping(value="get/{name}", method=RequestMethod.GET)
public String get(@PathVariable String name) {
    return name;
}

在浏览器中输入网址:http://localhost:8080/get/neo,返回:neo,说明 name 值已经成功传入

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值