在之前我们使用 Swift 的 Perfect 框架来开发服务端程序时,聊到了 Perfect 中的路由配置。而在 SpringMVC 中的路由配置与其也是大同小异的。说到路由,其实就是将 URL 映射到 Java 的具体类中的具体方法,或者映射到具体的 JSP 文件上。本篇博客主要就阐述了如何在 SpringMVC 中配置路由以及 REST 配置。下方将会聊到路由到 JSP 文件、路由到 Java 中具体的方法、获取路由参数、获取路由的 get 属性、已经返回 json 和 xml 数据等。
本篇博客的案例是在上篇博客创建的工程的基础上来实现的,关于 Maven 管理下的 SpringMVC 工程的内容,请移步于《JavaEE 开发使用 Maven 管理的 SpringMVC 工程》。本篇博客对如何使用 Maven 来管理 SpringMVC 就不做过多赘述了。
一、基本路由配置
接下来我们将聊一下常用的几种路由配置方式,然后给出每种路由的具体实例。当然本部分还是比较简单的,虽然简单,但是还是比较重要的。一些后端常用的框架中,都会有各式各样的路由配置方法,但是这些路由的作用都是大同小异的。像 ThinkPHP 框架中的路由配置也是 ThinkPHP 运作的基础之一。本部分我们就好好的聊一下 SpringMVC 的路由配置。
1、配置路由前的准备
在配置路由前,我们得先创建一个 Java 类,我们所配置的路由都会映射到该 Java 类中的特定方法。创建一个 Java 的普通类,命名为 RouteController。下方截图中,上方圆框中就是我们 SpringMVC 的配置文件了。因为在 SpringMVCConfig 中我们指定了该配置文件的作用域是 com.zeluli.springmvc 这个包,所以我们创建的路由控制器 RouteController 类也必须在此包下方。如下所示。下方会对 RouteController 类中的内容进行详细的介绍。
2、路由到 JSP 文件
接下来我们就来看一下在 SpringMVC 中是如何路由到 JSP 文件的。首先我们使用 spring 中的 @Controller 注解将 RouteController 类声明为控制器类,然后在通过 @RequestMapping 配置路由映射。将路由 "/route" 映射到 RouteController 类上。也就是说在浏览器中访问该工程下的 / route 路径,就会访问到 RouteController 类。稍后会介绍到访问方式。
声明并映射完相应的 Controller 类后,我们在 RouteController 中创建了一个 index() 方法。该 index() 方法比较简单就返回个 "index" 字符串。然后也是使用 @RequestMapping 来配置路由。我们可以看出 index() 方法所对应的路由值为"/",也就是说,访问 / route 这个路由,就会映射到 index() 这个方法上。
而 index() 方法返回的这个字符串其实就是该路由所对应的 JSP 文件的名称,因为我们在 SpringMVCConfig 配置文件中为其添加了前缀和后缀,所以当返回"index"时,我们访问的就是"/web-INF/classes/views/index.jsp" 这个资源文件。下方就是 SpringMVCConfig 中的配置项。
上面实现完方法配置路由后,我们就可以部署到 Tomcat 上然后用浏览器访问了,下方截图就是我们访问 / route 路由的具体效果。
3、追加路由并设置 ResponseBody
接着,我们继续往 / route 这个路由上追加字路径。下方我们创建了一个 sub1() 方法,该方法有一个参数并返回了一个字符串的值。该参数就是用来接收 HttpServletRquest 对象的,通过这个对象我们可以获取到用户发起请求时的一些参数。
我们将此方法的路由配置为 "/sub1",因为 RounteController 类的路由是 "/route",所以我们 sub1() 方法的整体路由就是"/route/sub1"。而在 sub1() 方法的前方,我们使用了 @ResponseBody 注解将该方法的返回值放在响应体(Response Body)返回给用户。那么用户在访问该路由时,就会获取到该方法返回的值。如下所示。
上面,我们配置好路由已经响应体后,我们就可以进行该路由的访问了,下方是该路径访问的效果。从下方效果我们可以看出路由可以正常访问,并且有返回参数。不过我们返回的一些中文却产生了码,所以我们要指定 ResponseBody 的编码方式。
我们可以查看一下上述请求的编码方式,从下方内容中我们可以看出,charset 的值是 ISO-8859-1。我们可以将其设置成我们想要的编码方式。
我们在配置路由时不仅可以指定路由的值(value),而且可以指定路由所响应内容的文本格式已经编码方式。因为 sub1() 方法是在 RouteController 类中的,所以我们可以指定整个类的编码方式。下方就是通过 produces 属性来指定文本格式已经编码方式的,如下所示。
添加完文本类型以及编码格式后,我们重新看一下运行结果。从下方的运行结果,我们不难看出,Response Body 中的内容不再是乱码了,而且 Response Header 中的 Content-Type 也变成了我们设置的值,如下所示。
4、多个路由映射到同一方法上
我们可以将多个路由映射到同一个 Controller 的方法上。当我们给 @RequestMapping 的 value 属性赋值一个数组时,数组中的路径都会映射到该注解所修饰的方法中。如下所示。下方的 / name1 和 / name2 都会映射到该方法中。如下所示。
二、获取路由及请求参数
我们在聊 Swift 的 Perfect 框架时,其中配置的路由中是可以加一些变量的,然后我们可以在路由映射中获取路由的参数。在 SpringMVC 中也是如此,本部分,我们就来看一下如何获取路由中的参数。以及如何获取用户通过 Get 方式提交的参数的。
1、配置路由参数
在路由配置中,我们可以为路由添加参数,然后使用 @PathVariable 注解来获取该路径变量的值。下方创建的 sub2()方法的路由配置中就带有路径变量的,使用 {路径变量} 来声明路径变量,使用 @PathVariable 来获取路径变量。
在下方方法中,我们声明了两个路由变量,一个名为 value1,另一个为 value2,在 sub2() 方法的参数中使用 @PathVariable 来取出相应变量的值。当然在取值是变量名要和路由中的变量名一致。如下所示。
配置完路由以及路径变量后,我们就可以进行访问了。下方就是我们访问的具体结果,已经返回的 Response Body 的内容。从该实例中我们不难看出,路径变量在开发中是非常实用的一项功能。
2. 获取 Get 请求的单个参数
获取用户在 Get 请求中所添加的参数,可以说是在开发中经常使用的。接下来我们就来看一下我们的方法是如何来获取 Get 请求中的相应参数的值的。本小结的内容比较简单。直接在所映射的方法中添加相应的参数即可。下方 sub3() 方法的 param 参数,就是用来接收 Get 请求参数中名为"param" 参数的值的,如下所示。
下方是我们访问上述路由并传入相应的参数的请求,结果如下所示:
3、获取 Get 请求的多个参数
上面是获取的 Get 请求的单个参数,如果一个 Get 请求有多个参数怎么办呢?肯定不能再用上述方法类获取参数的值了。在 Spring 框架中,支持将获取的参数直接映射成 Model。前提是参数的名称必须和特定 Model 中的属性名称相同,接下来我们就来做这件事情。将用户传入的参数直接映射成 Model。
首先我们得创建一个 Model,下方这段代码就是我们创建的 Model,该 Model 比较简单,只有两个属性,一个是 studentNumber,另一个则是 name。Model 类中还对应着各个属性的 getter 和 setter 方法。具体代码如下所示。
- package com.zeluli.model;
- public class StudentModel {
- private String studentNumber;
- private String name;
- public StudentModel() {
- super();
- }
- public String getStudentNumber() {
- return studentNumber;
- }
- public void setStudentNumber(String studentNumber) {
- this.studentNumber = studentNumber;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
创建好 Model 后,我们就可以在 Controller 里边直接使用了。在路由对应的方法中直接使用相应的 Model 对象进行接收即可,在接收的过程中会将参数中相应的值赋给该 Model 对象中相应的属性。在之前的博客中,我们讲过 iOS 中将 Json 数据直接映射为 Model 类的方式,是使用 Objective-C 的 Runtime 的方式来实现的。当然在 Java 中也是使用该机制来实现的,不过 Java 中的 Runtime 我们称之为 "反射机制"。
我们对上述路由进行访问,访问结果如下所示。可见,Model 的对象中存储的就是我们 URL 中传入的参数。
三、JSON 及 XML 数据的返回
在 Spring 框架中支持 JSON 和 XML 的数据绑定,也就是说 JOSN 或者 XML 可以与数据对象进行互转。不过我们要添加相应的依赖库。本部分我们就来看一下 Spring 框架中的 JSON 和 XML 的数据绑定。
1、依赖库的引入
因为我们的项目是使用 Maven 进行管理的,所以依赖库的引入是相当简单的,下方就是 pom.xml 文件中添加的 JSON 以及 XML 数据绑定所依赖的库。当然,下方的依赖库的版本不一定是最新的,不过你可以从 Maven 的 Repository 中查找你想要的依赖库的版本。
- <!-- 添加对象向json或xml转换的支持 -->
- <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml
- -->
- <dependency>
- <groupId>
- com.fasterxml.jackson.dataformat
- </groupId>
- <artifactId>
- jackson-dataformat-xml
- </artifactId>
- <version>
- 2.8.6
- </version>
- </dependency>
- <!-- 添加json数据绑定支持 -->
- <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
- -->
- <dependency>
- <groupId>
- com.fasterxml.jackson.core
- </groupId>
- <artifactId>
- jackson-databind
- </artifactId>
- <version>
- 2.8.6
- </version>
- </dependency>
2.JSON 的数据绑定
引入完上述依赖库后,我们就可以进行 JSON 的数据绑定了。本部分做的就是将 Model 的数据转成 JSON 直接返回给客户端。依然是在 RouteController 中进行实现。在下方代码片段中,客户端收到的就是 JSON 格式的数据。在使用 @RequestMapping 来配置路由时,我们使用 produces 属性来配置 Response Body 的文本类型,下方我们将文本类型设置成 "application/json",编码格式依然选择 UTF-8。将接受到的数据对象之间返回给用户,这时候用户收到的就是 json 格式的数据信息。
我们对上述配置的路径进行访问、从下方的访问结果不难看出,用户收到的是 JSON 格式的数据、如下所示:
3、XML 的数据格式的绑定
当然 XML 的数据绑定与 JOSN 类似,只不过是讲 produces 属性的文本类型转换成 "application/xml"。返回的还是 StudentModel 的对象,如下所示。
下方就是访问该路由所对应的结果:
四、REST-Controller 的创建
当我们创建的 Controller 了是专门为作为 App 接口或者其他 API 的话,可以将我们的 Controller 声明为 RestController。因为从上述实例中我们不难看出,普通的 Controller 中,如果要将返回的数据放到 Response Body 中,需要在相应的方法前面使用 @ResponseBody 来进行注解。
但是当我们使用 @RestController 注解将我们的 Controller 声明为 RestController 时,就不用在每个方法前面添加上 @ResponseBody 注解了,因为在 RestController 中路由所映射的方法的返回值就会直接放入到 Response Body 中。
下方就是我们创建的 RestController, 其中路由所映射的方法是不需要 @ResponseBody 来进行注解的,如下所示:
下方就是我们访问 "/rest" 路由所返回的内容:
五、路由的快捷设置
我们也可以在 SpringMVC 的配置文件中来快速的设置路由与 JSP 页面的映射关系,当然实现起来也是比较简单的。只需要我们的 Spring 的配置类继承于 WebMvcConfigurerAdapter 然后重写 addViewControllers() 方法即可。在 addViewController() 的方法中来进行路由到 JSP 页面的映射关系。如下所示:
我们直接访问 "/indextest" 路由,访问的就是 index.jsp 页面了。该功能会在后几篇博客中经常用到。
好今天博客的内容也够多的了,就先到这儿吧。关于 JavaEE 的东西,会继续更新的。
来源: http://www.cnblogs.com/ludashi/p/6513478.html