在`Spring`中路由不叫路由,而叫做:`Request Mapping 请求映射`。路由(route)就是数据转发,而路由在按自己的规则进行数发的,而这个规则在英文中习惯的称为`map`,我们译过来叫做`映射`。所以`angular`中的`路由`与`spring`在此的`请求映射`只是说法不同而已,解决的都是数据依照什么规则进行转发的问题。 >[info] Thinking: 使用路径参数并获取参数中的路由;Coding: Angular及Spring中如写组织代码来实现该功能。 # 定义参数路由 在路由定义时,`spring`首先找到拉于控制器上的`@RequestMapping`注解,并获取注解中的值;然后以此值为基础,再找位于方法中的相关注解,比如:`@GetMapping`、`@PostMapping`等。 我们在前面的小节中,已经使用了如下代码来定义获取所有教师列表的路由地址: ```java @RequestMapping("Teacher") ① public class TeacherController { ... @GetMapping ② @CrossOrigin("*") public List<Teacher> getAll() { ``` 按照上述原则,最终得到的路由值为:`Teacher + ''` = `Teacher`。 # 获取路径变量的值 注解和有些语言的函数一样,是可以设置默认值的,比如如果我们使用`@GetMapping`注解。则表示:全部使用默认值设置该注解的值。当我们使用`@GetMapping("{id}")`表示:使用`"{id}"`来设置`@GetMapping`的默认属性`name`。`@GetMapping`除默认属性`name`外,还存在诸如`value`、`path`、`params`等属性。 在`spring`中通过设置`@GetMapping`注解的默认属性来设置路径变量,使用`@PathVariable`注解来获取绑定后的值。 TeacherController ```java @GetMapping("{id}") ➊ public Teacher getById(@PathVariable Long id) { ➋ logger.info(id.toString()); return null; } ``` * ➊ 声明映射路径变量值为`id`,当请求地址为`Teacher/1`时,符合本条规则。 * ➋ 获取绑定的`id`值。 ## 测试 启用系统并使用`REST Client`进行测试。 ![](https://img.kancloud.cn/92/a3/92a3015e0c3fc681051743cfae91b71b_994x279.png) 打开系统控制台,查看生成的日志: ![](https://img.kancloud.cn/d8/f9/d8f95d5a9ea6b9d40910908be5cfa08a_1635x436.png) 成功的打印了`id`的值。 ## 使用SQL语句获取 我们将前面学习过的获取多条教师数据的代码稍做修改: ```java /** * 根据ID获取数据表中的教师数据并返回,用于查询某个教师的数据 * 虽然在学习的过程中,我们将方法中的每条语句都加入注释会有利于我们的理解。 * 但在生产的环境中,我们并不推荐在方法体中加入注释。 * 我们认为: * 1 每个方法都应该是足够短小的。 * 2 每个方法的注释都是可以在方法头部说明的。 * 3 在代码输写时,我们更注重的是业务逻辑层面的交流而非coding方法的交流。 * 如果我们认为方法中的代码的确是需要注释的(比如一些新的方法、新的思想的引入,我们想其它的成员能够快速的学习到该技巧) * 那么应该该代码段抽离出来,变成一个新的方法,然后在该方法上加入注释。 * @param id 教师ID * @return */ @GetMapping("{id}") @CrossOrigin("*") ① public Teacher getById(@PathVariable Long id) { Teacher teacher = new Teacher(); ➊ RowCallbackHandler rowCallbackHandler = new RowCallbackHandler() { ② @Override public void processRow(ResultSet resultSet) throws SQLException { teacher.setId(resultSet.getLong("id")); teacher.setName(resultSet.getString("name")); teacher.setSex(resultSet.getBoolean("sex")); teacher.setUsername(resultSet.getString("username")); teacher.setEmail(resultSet.getString("email")); teacher.setCreateTime(resultSet.getLong("create_time")); teacher.setUpdateTime(resultSet.getLong("update_time")); } }; String query = String.format("select id, name, sex, username, email, create_time, update_time from teacher where id = %d", id); ➋ jdbcTemplate.query(query, rowCallbackHandler); ③ return teacher; ➌ } ``` * ➊ 初始化返回数据。 * ➋ 撰写查询语句。`String.format()`为字符串格式化函数,该代码中使用了`id`的值来替换了字符串中的`%d`。 * ➌ 返回数据。 > 由于获取到的数据要么有0条要么有1条,所以该赋值语句要么不执行,如果执行那么只会执行1次。 ## 测试 在程序的编写中我们需要尽量规避一些人为的不稳定地、无法快速重现或是难以共享的因素。而`REST Client`由于是人为地在客户端内进行输入点击,所以它是我们在开发中进行测试选择的下策。 在`IDEA`中除了`REST Client`以外我们还可以选择另外一个相对较抽象但却更符合我们习惯的工作,这就是`HTTP Request`。在`IDEA`中可以轻松的将`REST Client`转换为`HTTP Request`。 ![](https://img.kancloud.cn/9f/a8/9fa81cce0d97f03ecde76a631c050c19_1671x163.png) 点击红色的按钮便可以发起`http`请求协助我们的完成测试工作。更重要的是该请求是以文件形式存在的,我们可以很方便地重新运行测试或是将自己的测试文件与伙伴们进行分享,或是共同完成某个测试。 由于启用了`Http Request`,所以本次测试我直接把测试的代码给大家即可: ``` GET http://localhost:8080/Teacher/1 ➊ ``` * ➊ 请求方法为`GET`,请求地址为: `http://localhost:8080/Teacher/1` 重新启动应用并运行测试代码,得到的结果如下: ``` GET http://localhost:8080/Teacher/1 HTTP/1.1 200 Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Thu, 24 Oct 2019 06:18:39 GMT { "id": 1, "name": "张三", "sex": true, "username": "zhangsan", "email": "zhangsan@mail.com", "createTime": 1569721598000, "updateTime": 1569721598000 } Response code: 200; Time: 31ms; Content length: 135 bytes ``` 在返回的结果中,我们看到了想要的教师信息,测试成功。 # 本节作业 将在新增教师测试中使用`REST Client`转换为`HTTP Request`测试方法,查看转换后的代码并尝试找出使用`HTTP Request`测试的规律。 # 参考文档 | 名称 | 链接 | 预计学习时长(分) | | --- | --- | --- | | 使用JDBC访问数据库 | [https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/data-access.html#jdbc-core](https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/data-access.html#jdbc-core) | 15 | | 使用Spring创建REST服务 | [https://spring.io/guides/tutorials/bookmarks/](https://spring.io/guides/tutorials/bookmarks/) | 15 | | 请求映射 | [https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#mvc-ann-requestmapping](https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#mvc-ann-requestmapping) | 15 | | HTTP Request | [https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html) | 15 | | 源码地址 | [https://github.com/mengyunzhi/spring-boot-and-angular-guild/releases/tag/step2.4.2](https://github.com/mengyunzhi/spring-boot-and-angular-guild/releases/tag/step2.4.2) | - |