精品欧美一区二区三区在线观看 _久久久久国色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高清大胆| 91禁在线观看| 国产精品大片| 亚洲日韩第一页| www.亚洲自拍| 日韩精品美女| 亚洲欧美日韩在线| 蜜桃网站成人| 中文字幕日韩第一页| 欧美激情 亚洲a∨综合| 亚洲欧美在线一区| 色偷偷中文字幕| 中文字幕 在线观看| 亚洲欧洲成人自拍| 久久riav二区三区| 国产激情无套内精对白视频| 美女黄网久久| 国内精品在线一区| 日韩精品一区二区三区在线视频| 欧美亚洲tv| 欧美一区午夜视频在线观看| 综合网五月天| 国产午夜视频在线观看| 国产精品资源在线看| 国产成人精品久久二区二区| 久久久久久久久久91| 欧美日韩国产高清电影| 亚洲www.| 亚洲欧美日韩综合aⅴ视频| 欧美另类高清视频在线| 精品国产999久久久免费| 毛片网站在线免费观看| 国内精品久久久久影院色| 国产一区久久久| 国产亚洲精品久久久久动| av漫画在线观看| 日韩国产91| 欧美伊人精品成人久久综合97| 免费观看国产精品视频| 日本高清在线观看| 自拍偷拍亚洲欧美日韩| 天堂资源在线亚洲视频| 九色视频在线观看免费播放| 91亚洲精品久久久蜜桃网站| 国产精品一区在线播放| 亚洲成人一二三区| 国产在线不卡一区| 成人xxxxx| 国产精品久久久久久免费播放| 天使萌一区二区三区免费观看| 97av视频在线| 永久免费看片在线播放| 欧美日韩激情在线一区二区三区| 亚洲国产成人精品一区二区 | 日韩欧美国产成人一区二区| 男人搞女人网站| 怡红院成人在线| 日韩人体视频一二区| 黄色a级片免费| 日本免费一区二区三区四区| 91国产丝袜在线播放| 国产一区视频免费观看| 亚洲精品555| 欧美人牲a欧美精品| 九九精品久久久| 国模大尺度视频一区二区| 欧美一区二区精品久久911| 在线观看av免费观看| 日韩一区网站| 亚洲国产一区二区三区在线观看 | 91麻豆成人精品国产免费网站| 看片的网站亚洲| 91视频88av| 亚洲欧美强伦一区二区| 91视视频在线观看入口直接观看www | 超碰精品在线观看| 日韩精品免费综合视频在线播放| 国产一级二级在线观看| 精品国产乱码久久久久久果冻传媒 | 亚洲一区在线观看免费 | 成人午夜免费电影| 色94色欧美sute亚洲线路一久| 无码aⅴ精品一区二区三区浪潮| 亚洲mmav| 精品国产亚洲在线| 色欲av无码一区二区三区| 天天av综合| 97av视频在线| 国产人妻精品一区二区三| 不卡av在线网| 影音先锋欧美在线| 成人三级高清视频在线看| 日本二三区不卡| 国产精品91av| 精品美女久久| 久久久久久久久久久久av| 黄色一级视频免费看| 久久69国产一区二区蜜臀| 国产久一道中文一区| 在线观看黄av| 午夜电影一区二区三区| 中文字幕第17页| 成人性生交大片免费看中文视频| 这里只有精品在线观看| 国产精品二区一区二区aⅴ| 视频一区国产视频| 国产精品yjizz| 毛片在线视频| 色94色欧美sute亚洲线路一久| 国产精品一级无码| 日韩久久精品网| 欧洲成人在线观看| 亚洲av无码乱码国产精品| 国产精品女上位| 欧美色图色综合| 99热这里只有精品首页 | 久久久久久国产精品免费免费| 欧美三级黄网| 日本道色综合久久| 青青草视频播放| 国产一区清纯| 亚洲综合中文字幕在线| 日本中文字幕电影在线免费观看| 日韩欧美亚洲成人| 超碰caoprom| 精品国产影院| 日韩一区视频在线| 欧美三级韩国三级日本三斤在线观看| 久久99精品一区二区三区三区| 久久国产精品亚洲va麻豆| 曰本三级在线| 欧美一区二区黄| 神马久久精品综合| 久久99精品国产麻豆婷婷洗澡| 欧美日韩国产免费一区二区三区| caoporn-草棚在线视频最| 狠狠爱在线视频一区| 中文字幕人妻一区| 国内精品嫩模av私拍在线观看| 成人免费午夜电影| 免费av不卡| 欧美男生操女生| 欧美日韩黄色网| 国产在线观看一区二区| 成人高清dvd| 亚洲超碰在线观看| 久久久久久久久国产精品| www夜片内射视频日韩精品成人| 亚洲色图欧洲色图婷婷| 人妻换人妻仑乱| 欧美在线不卡| 国产传媒一区二区三区| 超碰高清在线| 亚洲免费视频网站| 亚洲大尺度在线观看| 国产精品视频你懂的| 亚洲精品视频三区| 欧美91精品| 国产在线一区二区三区四区| 蜜桃视频动漫在线播放| 亚洲欧美国产va在线影院| 无码人妻aⅴ一区二区三区有奶水| 久久精品男人的天堂| 欧美 日韩 国产 激情| 色婷婷色综合| 亚洲淫片在线视频| 91福利区在线观看| 亚洲区在线播放| 欧美另类高清videos的特点| 欧美国产乱子伦| 亚洲精品在线网址| 亚洲日韩视频| 日韩一区二区电影在线观看| 日韩欧美专区| 久久久爽爽爽美女图片| 你懂的在线看| 欧美一区二区在线免费播放| 国产精品第二十页| 中文字幕精品—区二区四季| 91亚洲一区二区| 国产一区二区三区的电影| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 中文字幕一区2区3区| 亚洲精品伦理在线| 自拍偷拍中文字幕| 国产在线不卡视频| 免费黄色日本网站| 久久精品青草| 久久天天狠狠| 国产美女亚洲精品7777| 欧美亚洲激情视频| 岛国中文字幕在线| 亚洲欧洲日韩国产| 亚洲第一视频在线| 欧美亚洲一区二区三区四区| 国产在线视频99| 中文乱码免费一区二区 | 中文一区二区在线观看| 国产xxxx视频| 狠狠色丁香婷婷综合久久片| 激情综合在线观看| 欧美1区2区3区| 亚洲电影网站| 天堂av一区二区三区在线播放 | 国模精品系列视频| 日韩精品一二| 日韩一区二区在线播放| 五月婷婷激情五月| 精品欧美aⅴ在线网站| 欧美日韩在线视频免费播放| 国产目拍亚洲精品99久久精品| 中国黄色片视频| 国产伦精一区二区三区| www.亚洲高清| 久久婷婷影院| 亚洲 高清 成人 动漫| 欧美视频导航| 喜爱夜蒲2在线| 欧美电影《轻佻寡妇》| 欧美日韩一区二区三区在线视频| av毛片精品| 18成人在线| 成人网av.com/| 国产日韩精品电影| 欧美日韩尤物久久| 日产精品久久久一区二区福利| 超免费在线视频| 久久99亚洲热视| 2024最新电影免费在线观看| 精品国内产的精品视频在线观看| 番号集在线观看| 亚洲欧洲激情在线| 每日更新av在线播放| 亚洲精品小视频在线观看| 香蕉视频黄在线观看| 亚洲国产精品久久| 五月婷婷丁香网| 日韩成人网免费视频| 天堂av电影在线观看| 日韩高清中文字幕| 日韩专区一区二区| 亚洲片在线资源| 国产日本在线视频| 中文字幕在线成人| 日本中文字幕伦在线观看| 精品国产一区二区三区久久狼黑人| 性开放的欧美大片| 久久久精品中文字幕| av网站大全在线| 欧美人在线观看| 国产白丝在线观看| 欧美亚洲日本黄色| 全亚洲第一av番号网站| 国产精品男人的天堂| 99久久久成人国产精品| 亚洲自拍小视频免费观看| 6080成人| 久久综合久久久| 精品精品99| 一区二区免费在线视频| 亚欧美无遮挡hd高清在线视频| 好吊色视频988gao在线观看| 亚洲精品看片| 精品久久久久久久免费人妻| 在线国产情侣| 在线播放日韩av| 亚洲搞黄视频| 九九九久久国产免费| 欧美hdxxx| 97国产精品视频人人做人人爱| 亚洲精品动漫| 国产精品欧美久久久| 日韩欧美一级| 久久精品二区| 99re66热这里只有精品8| 欧美一级特黄aaaaaa在线看片| 亚洲国产日本| 男女视频在线看| 成人一道本在线| 欧美波霸videosex极品| 亚洲伦在线观看| 中文字幕69页| 中文字幕不卡在线播放| 欧美色图17p| 亚洲一区影音先锋| 亚洲天堂五月天| 日韩欧美国产一区二区三区| 欧美性孕妇孕交| 免费91在线视频| 欧美美女日韩| 成人国产一区二区| 欧美熟乱15p| 亚洲色欲久久久综合网东京热| 日韩精品91亚洲二区在线观看| 中文字幕人妻无码系列第三区| 久久人人超碰精品| 免费日韩在线视频| 欧美私人免费视频| 日本护士...精品国| 欧美噜噜久久久xxx| 3d欧美精品动漫xxxx无尽| 国产成人一区二区三区免费看| 日韩中文在线电影| 国产a级一级片| 国产成人午夜精品5599| 黄色免费一级视频| 日韩欧美在线字幕| 高清毛片aaaaaaaaa片| 日韩少妇与小伙激情| 裤袜国产欧美精品一区| 国产综合av一区二区三区| 亚洲乱码精品| 深夜黄色小视频| 国产午夜精品一区二区| 97人人澡人人爽人人模亚洲 | 亚洲精品国产片| 日韩在线一区二区三区免费视频| 忘忧草在线影院两性视频| 国产欧美日韩综合精品二区| 亚洲久久久久| 天天干天天玩天天操| 国产视频一区不卡| 丁香六月婷婷综合| 亚洲精品久久久久久下一站 | 免费网站看v片在线a| 国产福利精品在线| 美日韩中文字幕| 国产成人a亚洲精v品无码| 成人妖精视频yjsp地址| 久久久久亚洲天堂| 欧美大片在线观看| 亚洲综合伊人久久大杳蕉| 91最新国产视频| 91精品国产91久久久久久密臀| 久久久久国产一区| 国产欧美一区二区精品性色超碰| 中文字幕第四页| 日韩精品免费观看| 亚洲一区二区三区四区| 青青草成人网| 热久久免费视频| 亚洲最大成人综合网| 欧美色图片你懂的| 蜜芽在线免费观看| 99久久自偷自偷国产精品不卡| 综合久久综合| 国产精品欧美性爱| 亚洲一二三四久久| 色婷婷激情五月| 欧亚精品中文字幕| 日本a口亚洲| 深爱五月综合网| 亚洲综合一区在线| 午夜视频在线免费播放| 日本欧美一二三区| 久久高清免费| 日韩欧美中文在线视频| 亚洲国产精品影院| 日韩欧美在线观看一区二区| 国产精品普通话| 亚洲国产日韩欧美在线| 怡红院一区二区| 日本丰满少妇一区二区三区| 日本在线免费| 99国产超薄肉色丝袜交足的后果| 亚洲精品色图| 亚洲欧洲久久久| 制服视频三区第一页精品| 91破解版在线观看| 日本一区二区三区免费观看| 久久99精品久久久| 日本一级黄色大片| 中文日韩在线视频| 日韩高清在线观看一区二区| 国产a级一级片| 国产精品久久久久aaaa樱花| 亚洲AV午夜精品| 日韩美女视频免费在线观看| 五月天久久777| 国产 中文 字幕 日韩 在线| 欧美日韩你懂的| 91九色在线播放| 影音先锋欧美在线| 菠萝蜜视频在线观看一区| 中文字幕在线观看高清| 久久久免费在线观看| 日本a级不卡| 加勒比精品视频| 91精品久久久久久久99蜜桃| 男人久久天堂| 蜜桃视频成人在线观看| 久久男人中文字幕资源站| 国产男女猛烈无遮挡| 日本精品视频在线| 欧美深夜福利| 黑人狂躁日本娇小| 亚洲女同精品视频| 亚洲精品v亚洲精品v日韩精品|