Spring是一个很好很强大的开源框架,它就像是一个容器,为我们提供了各种Bean组件和服务。对于MVC这部分而言,它里面实现了从Url请求映射控制器方法的逻辑处理,在我们平时的开发工作中并不需要太多的理会这个Url是怎么和控制器中的方法建立映射的,一切都由Spring MVC帮我们搞定了。

但是我今天在做SDK工程的时候,突然产生一个想法:能否把我项目中的所有Url和Method的映射信息打印出来?以便我一眼就看出我已经完成了那些API接口开发,这些方法需要什么参数。就像下图所示:

有了想法就要用行动,第一步肯定是要去看看别人是否已经解决了这个问题啦。查了半天的资料,倒是发现有几个相似的问题,但都没有满意的答案,只好自己调试Spring,跟踪它的处理步骤,终于让我发现了一个可行的办法,不多说,直接贴代码:

1、首先建立一个类来保存我想要的东东

private class RequestToMethodItem
{
public String controllerName;
public String methodName;
public String requestType;
public String requestUrl;
public Class<?>[] methodParmaTypes; public RequestToMethodItem(String requestUrl, String requestType, String controllerName, String requestMethodName,
Class<?>[] methodParmaTypes)
{
this.requestUrl = requestUrl;
this.requestType = requestType;
this.controllerName = controllerName;
this.methodName = requestMethodName;
this.methodParmaTypes = methodParmaTypes; }
}

2、然后就是收集信息创建对象啦

@RequestMapping(value = "/index", method = RequestMethod.GET)
public ModelAndView index(HttpServletRequest request)
{
ServletContext servletContext = request.getSession().getServletContext();
if (servletContext == null)
{
return null;
}
WebApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); //请求url和处理方法的映射
List<RequestToMethodItem> requestToMethodItemList = new ArrayList<RequestToMethodItem>();
//获取所有的RequestMapping
Map<String, HandlerMapping> allRequestMappings = BeanFactoryUtils.beansOfTypeIncludingAncestors(appContext,
HandlerMapping.class, true, false);

        for (HandlerMapping handlerMapping : allRequestMappings.values())
{
//本项目只需要RequestMappingHandlerMapping中的URL映射
if (handlerMapping instanceof RequestMappingHandlerMapping)
{
RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;
Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet())
{
RequestMappingInfo requestMappingInfo = requestMappingInfoHandlerMethodEntry.getKey();
HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue(); RequestMethodsRequestCondition methodCondition = requestMappingInfo.getMethodsCondition();
String requestType = SetUtils.first(methodCondition.getMethods()).name(); PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
String requestUrl = SetUtils.first(patternsCondition.getPatterns()); String controllerName = mappingInfoValue.getBeanType().toString();
String requestMethodName = mappingInfoValue.getMethod().getName();
Class<?>[] methodParamTypes = mappingInfoValue.getMethod().getParameterTypes();
RequestToMethodItem item = new RequestToMethodItem(requestUrl, requestType, controllerName, requestMethodName,
methodParamTypes);

                    requestToMethodItemList.add(item);
}
break;
}
}
return new ModelAndView("index").addObject("MethodList", requestToMethodItemList);
}

这一步我需要说明一下,我这里只用了“RequestMappingHandlerMapping”中的映射信息,其实还有另外三个HandlerMapping,如果想要获取项目中所有的映射信息,肯定是一个都不能放过了。调试的 信息如下:

3、取到数据后就展示呗,借助Thymeleaf,很容易就实现了展示,效果就是第一张图。

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>
<title>Spring Thyme Seed Starter Manager</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" media="all" href="../../css/stsm.css" th:href="@{/css/stsm.css}"/>
<title>请求方法列表</title>
</head> <body>
<div style="margin: 0;padding: 0;text-align: center"><h1>请求方法列表</h1></div>
<div>
<ul>
<li th:each="method:${MethodList}">
<h3 th:text="${method.methodName}"></h3> <p th:text="'所属控制器:'+${method.controllerName}"></p> <p th:text="'请求URL:'+${method.requestUrl}"></p> <p th:text="'请求方式:'+${method.requestType}"></p> <div>
<p>方法参数列表:</p>
<ul>
<li th:each="param:${method.methodParmaTypes}">
<p th:text="${param}"></p>
</li>
</ul>
</div> </li>
</ul>
</div> </body>
</html>

SpringMVC项目中获取所有URL到Controller Method的映射的更多相关文章

  1. 在ASP.NET MVC 中获取当前URL、controller、action

    一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...

  2. 在ASP.NET MVC 中获取当前URL、controller、action(转)

    URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录 ...

  3. 如何在ASP.NET MVC 中获取当前URL、controller、action

    一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...

  4. 在ASP.NET MVC 中获取当前URL、controller、action 、参数

    URL的获取很简单,ASP.NET通用:[1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名 ...

  5. nginx的rewrite ,如何在flask项目中获取重写前的url

    1. 在flask配一个重写到哪的路由,假设是/rewite/,然后到nginx的配置文件写重写规则,我这里重写全部的请求,接着测试能否重写成功 1. 添加一个路由 配置重写规则 测试成功 2.接下来 ...

  6. Django自动获取项目中的全部URL

    import re from collections import OrderedDict from django.conf import settings from django.utils.mod ...

  7. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

  8. 无法从项目中获取SSIS包的列表

    一直做的SSIS项目,突然在生成项目的时候没有反应,crtl + alt +o 提示:无法从项目中获取SSIS包的列表,发现是最近的包没有设计数据源, 解决思路:检查最近的包,挨个运行一遍,看看有没有 ...

  9. SpringMVC项目中web.xml中的节点载入顺序问题

    SpringMVC项目中web.xml中的节点载入顺序问题,之前以为web.xml中就是一些配置信息,和节点的顺序没有关系.后来才发现初始化时的载入顺序是和节点的顺序相关的. 完整的web.xml文件 ...

随机推荐

  1. 大数据学习--day14(String--StringBuffer--StringBuilder 源码分析、性能比较)

    String--StringBuffer--StringBuilder 源码分析.性能比较 站在优秀博客的肩上看问题:https://www.cnblogs.com/dolphin0520/p/377 ...

  2. linux-2.6.22.6内核启动分析之编译体验

    1 解压缩.打补丁操作 1.1 打开ubuntu,通过FTP将windows相应文件夹下的linux-2.6.22.6.tar.bz2和补丁文件linux-2.6.22.6-jz2440.patch上 ...

  3. C语言 编程练习22

    一.题目 1.编一个程序,输入x的值,按下列公式计算并输出y值: 2.已知数A与B,由键盘输入AB的值,交换它们的值,并输出. 3.给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位 ...

  4. POJ_1679_The Unique MST(次小生成树)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  5. 20145209 实验四 《android开发基础》 实验报告

    20145209 实验四 <android开发基础> 实验报告 实验内容 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBI ...

  6. sql语句-3-聚合数据查询

  7. day3 前奏

    1.第1个c语言 编辑---编译----运行 python@ubuntu:~/Desktop/pythons06$ vim -第1个c语言.c #include<stdio.h> int ...

  8. 1126: [POI2008]Uci

    1126: [POI2008]Uci https://lydsy.com/JudgeOnline/problem.php?id=1126 分析: dp.状态很妙,就是有点难写. 能走的是一个矩形.首先 ...

  9. MSP430的CAN通信发送

    1. 电路图如下,RE是接收使能,DE是发送使能,看图的话,这个CAN只支持半双工 2. 使用MSP430F149,以下代码只有发送,其实用的是串口 #include <msp430x14x.h ...

  10. symfony注册Twig模板中使用自定义PHP方法

    // 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档// 官方文档,https://symfony.com/doc/2.8/templating/twig_extension.html// ...