精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

完全自定義實現SpringMVC核心組件

開發 前端
實際Spring Web底層是做了很多的工作,其核心組件有HandlerMapping, HandlerAdapter, ViewResolver等組件。

概述

通過Spring定義請求接口非常容器,通過幾個注解就可以完成,如下:

@RestController
@RequestMapping("/demos")
public class DemoController {
@GetMapping("/index")
public Object index() {
return "index" ;
}
}

通過上面的@RestController, @RequestMapping就完成了一個簡單的接口定義。

實際Spring Web底層是做了很多的工作,其核心組件有HandlerMapping, HandlerAdapter, ViewResolver等組件。

  1. HandlerMapping
    根據當前請求的URI,查找對應的Handler,如:HandlerExecutionChain,包裝的HandlerMethod
  2. HandlerAdapter
    根據上面的確定的HandlerMethod, 找到能夠處理該Handler的Adapter,進行調用
  3. ViewResolver
    如果返回的ModelAndView對象那么會通過相應的ViewResolver進行渲染輸出

了解了上面的幾個核心組件之后,接下來就是自定義實現上面的核心類,來完成接口的請求處理。

自定義Endpoint

自定義注解,標記Controller類及請求參數:

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PackEndpoint {
}

參數標記,用來對接口參數進行注解。

 @Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PackParam {
}

Endpoint接口參數封裝對象

該對象用來保存記錄,方法參數由@PackParam注解的參數。

public class PackMethodParameter {
// 用來解析接口參數的名稱
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer() ;
private String name ;
private Executable executable ;
private int parameterIndex ;
private Class<?> type ;
public PackMethodParameter(String name, int parameterIndex, Executable executable) {
this.name = name;
this.parameterIndex = parameterIndex ;
this.executable = executable ;
}
public PackMethodParameter(int parameterIndex, Executable executable, Class<?> type) {
this.parameterIndex = parameterIndex ;
this.executable = executable ;
this.type = type ;
}
public boolean hasParameterAnnotation(Class<? extends Annotation> clazz) {
Method method = (Method) this.executable ;
Parameter[] parameters = method.getParameters() ;
return parameters[this.parameterIndex].isAnnotationPresent(clazz) ;
}
public String getParameterName() {
String[] parameterNames = parameterNameDiscoverer.getParameterNames((Method) this.executable) ;
return parameterNames[this.parameterIndex] ;
}
}

自定義HandlerMapping

自定義實現了SpringMVC標準的HandlerMapping,這樣在DispatcherServlet中才能夠識別。

public class PackHandlerMapping implements HandlerMapping, InitializingBean, ApplicationContextAware {
private ApplicationContext context;
private Map<String, PackMethodHandler> mapping = new HashMap<>();
@Override
public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
String requestPath = request.getRequestURI();
Optional<PackMethodHandler> opt = mapping.entrySet().stream().filter(entry -> entry.getKey().equals(requestPath)).findFirst()
.map(Map.Entry::getValue);
if (opt.isPresent()) {
HandlerExecutionChain executionChain = new HandlerExecutionChain(opt.get()) ;
return executionChain ;
}
return null;
}
// Bean初始化時,從容器中查找所有符合條件的Bean對象,即Bean對象上有@PackEndpoint注解
@Override
public void afterPropertiesSet() throws Exception {
String[] beanNames = context.getBeanNamesForType(Object.class) ;
for (String beanName : beanNames) {
Object bean = this.context.getBean(beanName) ;
Class<?> clazz = bean.getClass() ;
// 判斷當前的Bean上是否有PackEndpoint注解,只對有該注解的類進行處理
if (clazz.getAnnotation(PackEndpoint.class) != null) {
RequestMapping clazzMapping = clazz.getAnnotation(RequestMapping.class) ;
String rootPath = clazzMapping.value()[0] ;
if (clazzMapping != null) {
ReflectionUtils.doWithMethods(clazz, method -> {
RequestMapping nestMapping = AnnotatedElementUtils.findMergedAnnotation(method, RequestMapping.class) ;
if (nestMapping != null) {
String nestPath = nestMapping.value()[0] ;
String path = rootPath + nestPath ;
PackMethodHandler handler = new PackMethodHandler(method, bean) ;
mapping.put(path, handler) ;
}
}) ;
}
}
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
// 該類的作用:用來記錄接口對應的信息,方法,對應的實例,參數信息
public static class PackMethodHandler {
private Method method;
private Object instance;
private PackMethodParameter[] parameters ;
public Method getMethod(){
return method;
}
public void setMethod(Method method){
this.method = method;
}
public Object getInstance(){
return instance;
}
public void setInstance(Object instance){
this.instance = instance;
}
public PackMethodHandler(Method method, Object instance){
super();
this.method = method;
this.instance = instance;
Parameter[] params = method.getParameters() ;
this.parameters = new PackMethodParameter[params.length] ;
for (int i = 0; i < params.length; i++) {
this.parameters[i] = new PackMethodParameter(i, method, params[i].getType()) ;
}
}
public PackMethodParameter[] getParameter() {
return this.parameters ;
}
}
}

自定義參數解析器

專門用來解析處理接口方法中的參數信息然后從請求中讀取。

public interface PackHandlerMethodArgumentResolver {
boolean supportsParameter(PackMethodParameter methodParameter);
Object resolveArgument(PackMethodParameter methodParameter, HttpServletRequest request);
}
public class PackParamHandlerMethodArgumentResolver implements PackHandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(PackMethodParameter methodParameter){
return methodParameter.hasParameterAnnotation(PackParam.class) ;
}
@Override
public Object resolveArgument(PackMethodParameter methodParameter, HttpServletRequest request){
String name = methodParameter.getParameterName() ;
Object arg = null;
String[] parameterValues = request.getParameterValues(name) ;
if (parameterValues != null) {
arg = parameterValues.length == 1 ? parameterValues[0] : parameterValues ;
}
return arg ;
}
}

自定義HandlerAdapter

自定義實現了SpringMVC標準的HandlerAdatper,這樣在DispatcherServlet中才能夠識別。

public class PackHandlerAdapter implements HandlerAdapter{
@Resource
private ConversionService conversionService ;
private PackParamHandlerMethodArgumentResolver argumentResolver = new PackParamHandlerMethodArgumentResolver() ;
@Override
public boolean supports(Object handler){
return handler instanceof PackMethodHandler;
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
PackMethodHandler methodHandler = (PackMethodHandler) handler ;
PackMethodParameter[] parameters = methodHandler.getParameter() ;
Object[] args = new Object[parameters.length] ;
for (int i = 0; i < args.length; i++) {
if (this.argumentResolver.supportsParameter(parameters[i])) {
// 解析對應的方法參數
args[i] = this.argumentResolver.resolveArgument(parameters[i], request) ;
// 類型轉換
args[i] = this.conversionService.convert(args[i], parameters[i].getType()) ;
}
}
// 調用目標方法
Object result = methodHandler.getMethod().invoke(methodHandler.getInstance(), args) ;
// 設置響應header,輸出內容
response.setHeader("Content-Type", "text/plain;charset=utf8") ;
PrintWriter out = response.getWriter() ;
out.write((String) result) ;
out.flush() ;
out.close() ;
return null ;
}
@Override
public long getLastModified(HttpServletRequest request, Object handler){
return -1 ;
}

}

通過以上的步驟就完成了一個完全自定義SpringMVC核心組件的實現。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-01-03 07:40:27

自定義滑塊組件

2022-03-01 16:09:06

OpenHarmon鴻蒙單選組件

2022-04-24 15:17:56

鴻蒙操作系統

2020-11-11 08:04:34

低代碼

2023-02-20 15:20:43

啟動頁組件鴻蒙

2009-06-24 15:13:36

自定義JSF組件

2021-11-01 10:21:36

鴻蒙HarmonyOS應用

2022-01-17 10:20:24

Ubuntu桌面Linux

2022-07-06 20:24:08

ArkUI計時組件

2022-10-26 15:54:46

canvas組件鴻蒙

2022-10-25 15:12:24

自定義組件鴻蒙

2022-07-15 16:45:35

slider滑塊組件鴻蒙

2022-06-30 14:02:07

鴻蒙開發消息彈窗組件

2009-06-25 14:53:35

自定義UI組件JSF框架

2021-09-15 10:19:15

鴻蒙HarmonyOS應用

2022-06-20 15:43:45

switch開關鴻蒙

2022-02-21 15:16:30

HarmonyOS鴻蒙操作系統

2021-12-21 15:22:22

鴻蒙HarmonyOS應用

2021-11-22 10:00:33

鴻蒙HarmonyOS應用

2022-05-18 07:44:13

自定義菜單前端
點贊
收藏

51CTO技術棧公眾號

欧美一区二三区| 日韩一区二区三区视频在线 | 久久不卡日韩美女| 一区二区中文视频| 国产欧美韩日| 中文字幕激情视频| 欧美日韩国产探花| 亚洲欧美国内爽妇网| 九九九九九伊人| www.综合网.com| 国产午夜一区二区三区| 91免费视频网站| 国产尤物在线视频| 97视频热人人精品免费| 亚洲第一中文字幕在线观看| 亚洲精品一二三四五区| 亚洲91av| 国产精品天天摸av网| 国产女人水真多18毛片18精品| 精品一区二区无码| 欧美日韩三级电影在线| 亚洲最新av在线| 理论片大全免费理伦片| 日本一区二区中文字幕| 岛国精品视频在线播放| 亚欧精品在线| 色资源在线观看| 国产盗摄视频一区二区三区| 国产精品美女www| 日本在线视频免费观看| 99久久激情| 亚洲色图15p| 漂亮人妻被黑人久久精品| 日韩一区二区三免费高清在线观看| 亚洲福利视频一区| 好色先生视频污| 成人在线免费看| 99久久免费国产| 亚洲一区二区少妇| 国产成人自拍偷拍| 国产精品夜夜夜| 欧美黑人一区二区三区| 久久久国产一级片| 精品视频日韩| 亚洲男人天堂2024| 亚洲av成人片无码| 中文字幕视频精品一区二区三区| 8x福利精品第一导航| 在线观看的毛片| 大胆人体一区| 欧美性猛xxx| 免费无遮挡无码永久视频| 国产色婷婷在线| 亚洲综合在线五月| 草草草视频在线观看| 成人日批视频| 亚洲男人天堂一区| 国产免费xxx| 国产在线1区| 综合久久久久久| 日本女人高潮视频| 91精选在线| 伊人夜夜躁av伊人久久| 毛片在线视频观看| 啦啦啦中文在线观看日本| 亚洲精品国久久99热| wwwjizzjizzcom| 污污的网站在线看| 亚洲一区二区成人在线观看| 日韩成人三级视频| 俺来也官网欧美久久精品| 亚洲va在线va天堂| 白嫩少妇丰满一区二区| 国产精品蜜月aⅴ在线| 欧美卡1卡2卡| 中文字幕无人区二| 欧美三级午夜理伦三级在线观看 | 无需播放器的av| 欧美xxxx网站| 日韩视频永久免费| 欧美熟妇精品一区二区蜜桃视频 | 亚洲成人黄色在线| 一级特黄a大片免费| 亚州精品视频| 色狠狠久久aa北条麻妃 | 久久婷婷蜜乳一本欲蜜臀| 久久久成人精品视频| 亚洲熟女www一区二区三区| 欧美日韩三级电影在线| 欧美孕妇孕交黑巨大网站| 国产一级精品毛片| 国产精品香蕉一区二区三区| 国产欧美一区二区视频| 国产黄色片在线观看| 亚洲精品视频免费看| 欧美不卡在线播放| 成人精品动漫| 337p日本欧洲亚洲大胆色噜噜| 欧美图片第一页| 亚洲激情中文| 日本精品视频在线| 99久久免费国产精精品| 99国产精品国产精品久久| 亚洲午夜精品久久久中文影院av| 青青草原av在线| 在线免费观看日韩欧美| 成人三级做爰av| 国产探花在线精品| 欧美成人精品一区| 日本欧美www| 不卡一区二区中文字幕| 亚洲蜜桃av| 麻豆免费版在线观看| 欧美精品一二三区| 亚洲激情视频小说| 国产一区亚洲| 国产精品亚洲网站| 五月婷婷在线观看视频| 亚洲天堂av一区| 国产xxxxx视频| 极品一区美女高清| 久热爱精品视频线路一| 国产剧情在线视频| 处破女av一区二区| 国产高清精品软男同| 人人鲁人人莫人人爱精品| 精品久久人人做人人爰| 日韩精品一区二区三区在线视频| 国产精品亚洲综合色区韩国| 国产精品jizz视频| 国产网站在线免费观看| 欧美三级资源在线| 天天躁日日躁aaaa视频| 99成人免费视频| 97久久天天综合色天天综合色hd| av在线电影院| 一本大道久久a久久综合| 国产精品一区二区无码对白| 亚洲老妇激情| 国产一区香蕉久久| 日本不卡不卡| 欧美视频一区二区三区| 欧美人与性囗牲恔配| 先锋影音国产一区| 久久香蕉综合色| 精精国产xxxx视频在线播放| 精品电影一区二区| 精品午夜福利视频| 成人激情小说网站| 日韩精品一区在线视频| 福利片一区二区| 久久久久久成人精品| 亚洲国产欧美另类| 亚洲自拍欧美精品| 人妻 丝袜美腿 中文字幕| 午夜日韩在线| 97人人香蕉| 丁香影院在线| 亚洲精品国产欧美| 国产一区二区三区影院| 91丨九色porny丨蝌蚪| 成人中文字幕在线播放| 美女福利一区| 日本精品一区二区三区在线播放视频| 外国精品视频在线观看 | 亚洲一二区在线| 韩国精品视频在线观看| 久久精品电影网| 国产高清视频免费观看| 亚洲国产综合91精品麻豆| 成人午夜精品无码区| 美女精品网站| 亚洲v日韩v欧美v综合| 久久亚洲精品中文字幕| 久久夜色撩人精品| 欧美一级免费片| 一本到不卡免费一区二区| 长河落日免费高清观看| 国产在线不卡一区| 欧美成人精品免费| 午夜a一级毛片亚洲欧洲| 国产精品久久久久久久久男| 日本免费中文字幕在线| 欧美大片一区二区| 欧美精品一二三四区| 国产精品伦理在线| 无码人妻一区二区三区免费n鬼沢| 精品电影一区| 日韩精品国内| 日韩三级精品| 欧美自拍视频在线| 含羞草www国产在线视频| 精品国产乱码91久久久久久网站| 日日摸天天添天天添破| **欧美大码日韩| 一边摸一边做爽的视频17国产| 天堂一区二区在线免费观看| 最新黄色av网站| 欧美人与物videos另类xxxxx| 成人免费视频网| 国产欧洲在线| 久久天堂电影网| 日本护士...精品国| 日韩欧美一级二级三级久久久| 国产成人免费看| 亚洲精品综合在线| 久久精品无码一区| 成人免费视频视频在线观看免费 | 婷婷久久综合网| 91在线视频免费91| 污视频在线观看免费网站| 午夜在线一区| 亚洲精品蜜桃久久久久久| 久久亚洲国产| 免费h精品视频在线播放| 麻豆国产一区| 国产精品中文字幕久久久| 国产高清中文字幕在线| 欧美成人精品一区| 天天综合视频在线观看| 亚洲欧美日韩在线高清直播| 亚洲AV无码精品自拍| 欧美日韩高清影院| 国产91精品看黄网站在线观看| 一区二区不卡在线视频 午夜欧美不卡在| 日韩在线免费观看av| 成人aa视频在线观看| 亚洲少妇一区二区| 国模少妇一区二区三区| 五月婷婷丁香综合网| 媚黑女一区二区| 日韩中字在线观看| 欧美特黄一区| 九九久久九九久久| 小说区亚洲自拍另类图片专区| 日韩av一级大片| 人人香蕉久久| 狠狠色狠狠色综合人人| youjizz欧美| 亚洲最大福利视频网| 白嫩亚洲一区二区三区| 国产精品网站大全| www.成人在线视频| 国产精品视频免费在线观看| 黄瓜视频成人app免费| 欧美一二三视频| 男女羞羞在线观看| 91国在线精品国内播放| 韩日毛片在线观看| 69精品小视频| 亚洲美女尤物影院| 欧美一级黄色网| 五月天国产在线| 欧美中文字幕在线| 三级成人黄色影院| 国产成人精品日本亚洲| 在线成人视屏| 国产精品激情自拍| 国产成人精选| 国产精品久久国产精品99gif| 日本成人福利| 91精品国产综合久久久久久蜜臀| 4438五月综合| 亚洲自拍偷拍一区| 成人动态视频| 久久精品国产第一区二区三区最新章节| 日韩精品导航| 日日夜夜精品网站| 国产精品久久久久久久免费观看 | 日韩理伦片在线| 久久这里有精品| 黄色成人在线网| 欧美亚洲一区在线| 农村妇女一区二区| 不卡视频一区二区三区| 伦理一区二区三区| 色一情一乱一伦一区二区三欧美 | 日韩中文字幕国产| 欧美精品videosex| 欧美制服第一页| 欧美特黄色片| 国产精品免费在线播放| 国产精品欧美三级在线观看| 中文字幕精品一区日韩| 亚洲视屏一区| 人人爽人人av| 国产成人久久精品77777最新版本| 中文字幕在线视频播放| 国产色产综合产在线视频| 国产一二三四区| 懂色av一区二区三区| 91精品视频免费在线观看| 亚洲精品一线二线三线无人区| 黄色在线视频观看网站| 美女福利精品视频| 亚洲午夜天堂| 亚洲综合精品伊人久久| 九热爱视频精品视频| 裸体裸乳免费看| 亚洲在线电影| 在线观看中文av| 久久精品视频免费观看| 在线免费观看亚洲视频| 色婷婷av一区二区三区之一色屋| 国产免费黄色片| 亚洲人成网7777777国产| av在线免费网站| 国产高清在线不卡| 大桥未久女教师av一区二区| 亚洲一区二区三区午夜| 国产精品毛片在线| 国产人妻精品久久久久野外| 国产午夜精品美女毛片视频| 免费麻豆国产一区二区三区四区| 在线观看免费成人| 日本人妻熟妇久久久久久| 色爱精品视频一区| 桃色一区二区| 国产亚洲福利社区| 一本一本久久a久久综合精品| 免费日韩视频在线观看| 成人午夜视频免费看| 69夜色精品国产69乱| 在线观看av一区| 黄网在线观看| 97精品欧美一区二区三区| 免费一区二区三区在线视频| 亚洲乱码一区二区三区 | 亚洲女与黑人做爰| 中文字幕在线观看国产| 亚洲色图第一页| 夜鲁夜鲁夜鲁视频在线播放| 国产精品日韩二区| 午夜欧美视频| 超碰91在线播放| 亚洲欧美日韩系列| 国产精品久久久久久久久久久久久久久久久久 | 欧美日韩国产观看视频| 亚洲一区二区三区毛片| 99精品国产一区二区三区| 日本中文字幕高清| 国产欧美日韩另类视频免费观看| 在线观看精品国产| 日韩激情片免费| 日韩欧美精品一区二区三区| 国产乱码精品一区二区三区日韩精品| 牛牛国产精品| 成人高清在线观看视频| 亚洲色图在线视频| 97人妻精品一区二区三区视频| 综合网中文字幕| 青青久久精品| 青青草影院在线观看| 国产精品自拍网站| 免费一级全黄少妇性色生活片| 日韩写真欧美这视频| 青春草在线视频| 精品中文字幕一区| 国产农村妇女毛片精品久久莱园子| 91黄色免费视频| 欧美色播在线播放| 国产在线观看黄| 国产精品亚洲片夜色在线| 亚洲成人精品| 成人免费看片载| 婷婷一区二区三区| 男人av在线| 国产狼人综合免费视频| 国产精品久久观看| 老熟女高潮一区二区三区| 欧美体内谢she精2性欧美| 国产黄在线观看免费观看不卡| 国产精品视频大全| 午夜日韩在线| 欧美 日本 国产| 在线观看日韩国产| av中文字幕在线观看| 精品一区2区三区| 青娱乐精品视频| 国内偷拍精品视频| 日韩不卡在线观看| 国产香蕉久久| 妞干网在线播放| 久久久久久一级片| 97视频免费在线| 午夜精品久久久久久99热软件| 国产欧美亚洲精品a| 亚洲熟女乱综合一区二区| 都市激情亚洲色图| 免费看a在线观看| 国内精品视频在线播放| 麻豆精品在线视频| 国产精品theporn动漫| 国产亚洲成精品久久| 午夜视频一区二区在线观看| 午夜肉伦伦影院| 亚洲天堂av一区| 九色在线免费| 国产精品三区在线| 免费不卡在线观看|