最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù)

 更新時(shí)間:2017年03月15日 15:51:36   作者:Y橡樹(shù)Y  
本篇文章主要介紹了詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

在Spring MVC中想要對(duì)每一個(gè)URL進(jìn)行權(quán)限控制,不想手工整理這樣會(huì)有遺漏,所以就動(dòng)手寫(xiě)程序了。代碼如下:

  /**
   * @return 
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2017年3月8日 上午11:48:22
   * 功能:返回系統(tǒng)中的所有控制器映射路徑,以及對(duì)應(yīng)的方法
   */
  @RequestMapping(value = "/maps", produces = "application/json; charset=utf-8")
  @ResponseBody 
  public Object getMapPaths(){
    String result="";
     RequestMappingHandlerMapping rmhp = springHelper.getObject(RequestMappingHandlerMapping.class); 
      Map<RequestMappingInfo, HandlerMethod> map = rmhp.getHandlerMethods(); 
      for(RequestMappingInfo info : map.keySet()){ 
        result +=info.getPatternsCondition().toString().replace("[", "").replace("]", "")+ "\t"   ;
        HandlerMethod hm=map.get(info);
        result +=hm.getBeanType().getName()+ "\t"   ;
        result +=getMethodParams(hm.getBeanType().getName(),hm.getMethod().getName())+ "\t"; 
        result +=info.getProducesCondition().toString().replace("[", "").replace("]", "")+ "\t"   ;
        result += "\r\n"; 
      } 
    return result;
  }

getMethodParams是專門用于獲取方法中參數(shù)名稱的函數(shù),因?yàn)橛肑ava自身的反射功能是獲取不到的,浪費(fèi)我不少時(shí)間,后來(lái)網(wǎng)上看到JBOSS的JAVAssist類可以。其實(shí)這個(gè)JAVAssist類庫(kù)也被封裝在Mybatis中,如果系統(tǒng)使用了Mybatis,則直接引入可以使用了。

import org.apache.ibatis.javassist.*;
import org.apache.ibatis.javassist.bytecode.*;

getMethodParams 的實(shí)現(xiàn)如下:

/**
   * @param className 類名
   * @param methodName 方法名
   * @return 該方法的聲明部分
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2017年3月8日 上午11:47:16
   * 功能:返回一個(gè)方法的聲明部分,包括參數(shù)類型和參數(shù)名
   */
  private String getMethodParams(String className,String methodName){
    String result="";
    try{
      ClassPool pool=ClassPool.getDefault();
       ClassClassPath classPath = new ClassClassPath(this.getClass());
       pool.insertClassPath(classPath);
      CtMethod cm =pool.getMethod(className, methodName); 
     // 使用javaassist的反射方法獲取方法的參數(shù)名 
      MethodInfo methodInfo = cm.getMethodInfo(); 
      CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); 
      LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); 
      result=cm.getName() + "(";
      if (attr == null) { 
        return result + ")";
      } 
      CtClass[] pTypes=cm.getParameterTypes();
      String[] paramNames = new String[pTypes.length]; 
      int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1; 
      for (int i = 0; i < paramNames.length; i++) {
        if(!pTypes[i].getSimpleName().startsWith("HttpServletRe")){
          result += pTypes[i].getSimpleName();
          paramNames[i] = attr.variableName(i + pos); 
          result += " " + paramNames[i]+","; 
        }
      }
      if(result.endsWith(",")){
        result=result.substring(0, result.length()-1);
      }
      result+=")";
    }catch(Exception e){
      e.printStackTrace();
    }
    return result;
  }

這樣就可以獲得每個(gè)URL路徑與期對(duì)應(yīng)的方法聲明了。

另外SpringHelper是自己封裝的Spring工具類,可以用來(lái)直接獲取Spring管理的Bean,代碼如下:

import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;

/**
 * @author Elwin ZHANG 
 * 創(chuàng)建時(shí)間:2016年4月14日 上午9:12:13 
 * 功能:Spring 工具類,用于獲取Spring管理的Bean
 */
@Component
public class SpringHelper implements ApplicationContextAware {
  // 日志輸出類
  private static Logger logger = Logger.getLogger(SpringHelper.class);

  // 當(dāng)前的Spring上下文
  private static ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext arg0)
      throws BeansException {
    applicationContext = arg0;
  }

  /**
   * @param beanName bean Id
   * @return 如果獲取失敗,則返回Null
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2016年4月14日 上午9:52:55
   * 功能:通過(guò)BeanId獲取Spring管理的對(duì)象
   */
  public Object getObject(String beanName) {
    Object object = null;
    try {
      object = applicationContext.getBean(beanName);
    } catch (Exception e) {
      logger.error(e);
    }
    return object;
  }


  /**
   * @return 
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2017年3月7日 下午3:44:38
   * 功能:獲取Spring的ApplicationContext
   */
  public ApplicationContext getContext() {
    return applicationContext;
  }

  /**
   * @param clazz 要獲取的Bean類
   * @return 如果獲取失敗,則返回Null
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2016年4月14日 上午10:05:27
   * 功能:通過(guò)類獲取Spring管理的對(duì)象
   */
  public <T> T getObject(Class<T> clazz) {
    try {
      return applicationContext.getBean(clazz);
    } catch (Exception e) {
      logger.error(e);
    }
    return null;
  }

/**
 * @param code 配置文件中消息提示的代碼
 * @param locale 當(dāng)前的語(yǔ)言環(huán)境
 * @return 當(dāng)前語(yǔ)言對(duì)應(yīng)的消息內(nèi)容
 * @author Elwin ZHANG
 * 創(chuàng)建時(shí)間:2016年4月14日 上午10:34:25
 * 功能:獲取當(dāng)前語(yǔ)言對(duì)應(yīng)的消息內(nèi)容
 */
  public String getMessage(String code,Locale locale){
    String message;
    try{
      message=applicationContext.getMessage(code, null, locale);
    }catch(Exception e){
      logger.error(e);
      message="";
    }
    return message;
  }

  /**
   * 
   * @param code 配置文件中消息提示的代碼
   * @param request 當(dāng)前的HTTP請(qǐng)求
   * @return 當(dāng)前語(yǔ)言對(duì)應(yīng)的消息內(nèi)容
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2016年4月14日 下午3:03:37
   * 功能:獲取當(dāng)前語(yǔ)言對(duì)應(yīng)的消息內(nèi)容
   */
  public String getMessage(String code,HttpServletRequest request){
    String message;
    try{
      message=applicationContext.getMessage(code, null, getCurrentLocale(request));
    }catch(Exception e){
      logger.error(e);
      message="zh_CN";
    }
    return message;
  }

  /**
   * @param request 當(dāng)前的HTTP請(qǐng)求
   * @return 當(dāng)前用戶Cookie中的語(yǔ)言
   * @author Elwin ZHANG
   * 創(chuàng)建時(shí)間:2016年4月14日 下午2:59:21
   * 功能:當(dāng)前用戶保存Cookie中的默認(rèn)語(yǔ)言
   */
  public Locale getCurrentLocale(HttpServletRequest request){
    return resolver.resolveLocale(request);
  }

  //Cookie本地語(yǔ)言解析器,Spring提供
  @Autowired
  CookieLocaleResolver resolver;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java編程接口回調(diào)一般用法代碼解析

    Java編程接口回調(diào)一般用法代碼解析

    本文的主要內(nèi)容是同過(guò)實(shí)際代碼向大家展示Java編程中接口回調(diào)的一般用法,具有一定參考價(jià)值,需要的朋友可以了解下
    2017-09-09
  • zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作

    zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作

    這篇文章主要介紹了zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)

    java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 淺談Java的LinkedHashSet源碼

    淺談Java的LinkedHashSet源碼

    這篇文章主要介紹了淺談Java的LinkedHashSet源碼,底層是鏈表實(shí)現(xiàn)的,是set集合中唯一一個(gè)能保證怎么存就怎么取的集合對(duì)象
    因?yàn)槭荋ashSet的子類,所以也是保證元素唯一的,與HashSet的原理一樣,需要的朋友可以參考下
    2023-09-09
  • java使用ArrayList實(shí)現(xiàn)斗地主(無(wú)序版)

    java使用ArrayList實(shí)現(xiàn)斗地主(無(wú)序版)

    這篇文章主要為大家詳細(xì)介紹了java使用ArrayList實(shí)現(xiàn)斗地主,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java多線程start()方法原理解析

    Java多線程start()方法原理解析

    這篇文章主要介紹了Java多線程start()方法原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringAnimation 實(shí)現(xiàn)菜單從頂部彈出從底部消失動(dòng)畫(huà)效果

    SpringAnimation 實(shí)現(xiàn)菜單從頂部彈出從底部消失動(dòng)畫(huà)效果

    最近做項(xiàng)目遇到這樣一個(gè)需求,要求實(shí)現(xiàn)一種菜單,菜單從頂部彈入,然后從底部消失,頂部彈入時(shí),有一個(gè)上下抖動(dòng)的過(guò)程,底部消失時(shí),先向上滑動(dòng),然后再向下滑動(dòng)消失。下面給大家?guī)?lái)了實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2018-05-05
  • Java多線程Condition接口原理介紹

    Java多線程Condition接口原理介紹

    這篇文章主要介紹了Java多線程Condition接口原理介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • java報(bào)錯(cuò):找不到或無(wú)法加載主類的解決方法簡(jiǎn)單粗暴

    java報(bào)錯(cuò):找不到或無(wú)法加載主類的解決方法簡(jiǎn)單粗暴

    本文主要介紹了java報(bào)錯(cuò):找不到或無(wú)法加載主類的解決方法簡(jiǎn)單粗暴,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java實(shí)現(xiàn)Yaml轉(zhuǎn)Json示例詳解

    java實(shí)現(xiàn)Yaml轉(zhuǎn)Json示例詳解

    這篇文章主要為大家介紹了java實(shí)現(xiàn)Yaml轉(zhuǎn)Json示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

霍林郭勒市| 正宁县| 古交市| 庆城县| 大洼县| 博爱县| 焉耆| 偏关县| 于都县| 湘潭市| 昭平县| 南华县| 宜宾县| 望城县| 鸡东县| 海淀区| 聂荣县| 开江县| 公安县| 临海市| 北票市| 从江县| 济宁市| 乐陵市| 普陀区| 温泉县| 合川市| 全南县| 岚皋县| 枣庄市| 深泽县| 宜昌市| 买车| 镇平县| 历史| 丹寨县| 万全县| 卢氏县| 汉阴县| 霸州市| 邵武市|