zoukankan      html  css  js  c++  java
  • 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的方法上。当我们给@RequestMappingvalue属性赋值一个数组时,数组中的路径都会映射到该注解所修饰的方法中。如下所示。下方的/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的东西,会继续更新的。

  • 相关阅读:
    【svn】一个设置,少写几个字
    转眼一年
    linux虚拟机与windows主机传输文件方法
    meta常用命令
    Metasploit 读书笔记-持久控制
    Metasploit 读书笔记-神器Meterpreter
    [工作]采购失误
    解决:kali linux 在vmware 虚拟机中使用bridge模式上网的问题
    metasploit 读书笔记-EXPLOITATION
    [共鸣]温州600住户合买高音炮 还击广场舞大妈
  • 原文地址:https://www.cnblogs.com/ludashi/p/6513478.html
Copyright © 2011-2022 走看看