您的位置:首页 > 编程语言 > Java开发

【736c677c4】在SpringMVC中获取URL和Controller映射关系的两种办法 (亲测可用)

2017-12-21 09:55 387 查看
package com.jeeplus.modules.dynamictrace.web;

import com.jeeplus.core.web.BaseController;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
* 市长信箱Controller
* @author Slg
* @version 2017-10-02
*/
@Controller
@RequestMapping(value = "${adminPath}/dynamictrace")
public class URLMappingController extends BaseController {

/**************************************第一种方法(比较复杂)********************************************/
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;

}
}

@RequestMapping(value = "/temp", method = RequestMethod.GET)
public String 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();
PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
String requestType="";
String requestUrl ="";
for (RequestMethod m:methodCondition.getMethods()) {
requestType=m.name();
}

for (String s:patternsCondition.getPatterns()) {
requestUrl=s;
}
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 "";
}

/*************************************第二种方法(比较简单)************************************************/
public WebApplicationContext getWebApplicationContext(ServletContext sc) {
return WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
}

@RequestMapping(value = "/getUrlMapping", method = RequestMethod.GET)
public String getUrlMapping(HttpServletRequest request) {
WebApplicationContext wc = getWebApplicationContext(request.getSession().getServletContext());
RequestMappingHandlerMapping rmhp = wc.getBean(RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> map = rmhp.getHandlerMethods();
for (Iterator<RequestMappingInfo> iterator = map.keySet().iterator(); iterator
.hasNext();) {
RequestMappingInfo info = iterator.next();
HandlerMethod method = map.get(info);

System.out.println(method.getMethod().getDeclaringClass().toString()+ "--");
System.out.println("ConsumesCondition"+info.getConsumesCondition());
System.out.println("HeadersCondition"+info.getHeadersCondition());
System.out.println("MethodsCondition"+info.getMethodsCondition());
System.out.println("ParamsCondition"+info.getParamsCondition());
System.out.println("PatternsCondition"+info.getPatternsCondition());
System.out.println("ProducesCondition"+info.getProducesCondition());
System.out.println("============================");

//System.out.print(method.getMethodAnnotation(RequestMapping.class).params()[0]);
}
return "";
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc