• JavaEE开发之SpringMVC中的路由配置及参数传递详解


    在之前我们使用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/ 
    本文版权归作者和共博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

  • 相关阅读:
    CreateProcess逆向分析3环用户层逆向分析(一)
    CVE20112005(MS11080)漏洞分析
    vmware安装Windows 11虚拟机
    SAP SD 常用配置事物代码
    Java学习笔记02面向对象
    Java学习笔记01基本语法
    Java学习笔记03枚举和注解
    openssl3.0 加密算法库编程精要 06 详解 EVP API 公开密钥密码算法 非对称加密、签名
    零基础实现微信小程序云开发的无人机管理系统项目实例系列教程简述(一)
    chrome安装vuedevtools遇到的常见问题及解决方法
  • 原文地址:https://www.cnblogs.com/gopark/p/11456986.html
Copyright © 2020-2023  润新知