您是否有这样的困扰:浏览器F12看到请求,去代码里面找具体处理请求的类和方法,找了半天找不到,一般处理请求的类会放在controller包里面,或者是action包里面,这是开发规范,开发人员基本都会遵守。但在协同开发环境中,往往十几个人开发一个项目,而且公司一般都有自己的框架,好多请求可能会被封装到jar包里面,jar包多,很难找,找到了还要看半天,不确定是不是这个,当然,你可以debug看。那么,有没有简单的办法,迅速定位到某个请求的具体类和方法呢?
既然所有的请求都交给spring管理了,那么spring肯定知道你的所有请求,并且准确地知道处理请求具体的类和方法,所以去找spring准没错,spring这么优秀的框架,有没有提供这样的查找方法呢?答案是肯定的。spring把您所有的请求都封装在了org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping这个对象中,获取到了RequestMappingHandlerMapping,就知道了所有的请求信息
关键代码
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
<%@ page import="org.springframework.web.context.WebApplicationContext" %>
<%@ page import="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" %>
<%@ page import="org.springframework.web.servlet.mvc.method.RequestMappingInfo" %>
<%@ page import="org.springframework.web.method.HandlerMethod" %>
<%@ page import="java.util.Map" %>
<%@ page import="org.springframework.web.servlet.mvc.condition.PatternsRequestCondition" %>
<%@ page import="java.util.Set" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>【requests】获取请求路径对应的JAVA类和具体的方法</title>
</head>
<body>
<%
//获取WebApplicationContext,用于获取Bean
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(application);
//获取spring容器中的RequestMappingHandlerMapping
RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) webApplicationContext.getBean("requestMappingHandlerMapping");
//获取应用中所有的请求
Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
int requestCount = 0;
int handlerCount = handlerMethods.size();
//遍历所有的请求信息
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : handlerMethods.entrySet()) {
//key为http请求信息,即URL
RequestMappingInfo requestMappingInfo = entry.getKey();
//value为处理请求信息的方法,即code
HandlerMethod handlerMethod = entry.getValue();
//URL
PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
Set<String> patterns = patternsCondition.getPatterns();
requestCount += patterns.size();
//类和方法
String type = handlerMethod.getBeanType().getName();
String method = handlerMethod.getMethod().getName();
out.println("<span>URL:</span>" + patterns);
out.println("<br/>");
out.println("<span>类:</span>" + type);
out.println("<br/>");
out.println("<span>方法:</span>" + method);
out.println("<hr/>");
}
out.println("<h5>请求总数:" + requestCount + " 处理器总数:" + handlerCount + "</h5>");
%>
</body>
</html>
测试环境或生产环境,在运维中,可以直接把该JSP传到项目的根目录,一访问,一目了然,但用完后一定要将其删除,不然会暴露项目关键信息,有安全隐患