在之前我们使用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的东西,会继续更新的。