源码

“HTTP method POST is not supported by this URL ”

流过昼夜 提交于 2019-12-16 14:06:20
之前练习的时候,写了个LoginServlet继承的HttpServlet的小例子,运行的时候一直报HTTP method POST is not supported by this URL,代码与报错如下,控制台没有报错: 提示不支持post方法,但是代码里已经设置了post方法,于是有点懵逼,之后查了一下HttpServlet源码里的doPost方法 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString(“http.method_post_not_supported”); if (protocol.endsWith(“1.1”)) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } } 也就是说不管你的http是不是1.1的,都是用resp.sendError方法返回一个“http.method_post_not_supported”的错误信息给前台界面。也就是说问题出在super.doPost这里

[Tomcat源码分析] Eclipse中搭建Apache Tomcat源码调试环境

不问归期 提交于 2019-12-16 13:27:44
网上很多文章都推荐使用Ant下载编译,但本地实践中屡屡失败,无法下载。 后来参考 https://blog.csdn.net/xiongyouqiang/article/details/78941077 总算把调试环境搭建完成。 以下文章几乎完全copy上述网址,但稍作延展。 下载源码 官网直接下载源码 http://tomcat.apache.org/download-70.cgi 源码导入到Eclipse中 第1步:Eclipse中新建一个Java Project,例如名称可以是Tomcat-Src 第2步:在工程上点击右键=>Import=>General=>File System,点击Next按钮。 第3步:点击Browser按钮,找到tomcat源码解压路径,勾选java、test、conf和webapps目录(注意不需要勾选examples目录),点击Finish按钮。 第4步:在java和test目录上点击右键=>Build Path=>Use As Source Folder將这两个目录设为源码目录。同时可以删除工程中原有的src目录了。 第5步:解决导入后工程中出现的编译错误,一般都是由于缺少某些jar导致 主要导入以下几个jar饱 ant.jar ecj-4.4.2.jar jaxrpc.jar wsdl4j-1.5.2.jar easymock-3.5.1

Spring MVC源码阅读笔记

主宰稳场 提交于 2019-12-16 12:38:07
刷了一遍spring mvc源码,记录一下,写的可能有点乱。 DispatcherServlet的核心方法为doDispatch,上图中的流程基本都在doDispatch中完成,下面贴上源码 /** * Process the actual dispatching to the handler. * <p>The handler will be obtained by applying the servlet's HandlerMappings in order. * The HandlerAdapter will be obtained by querying the servlet's installed HandlerAdapters * to find the first that supports the handler class. * <p>All HTTP methods are handled by this method. It's up to HandlerAdapters or handlers * themselves to decide which methods are acceptable. * @param request current HTTP request * @param response current HTTP response *

Dubbo源码分析之 SPI(一)

ぐ巨炮叔叔 提交于 2019-12-16 11:53:29
一、概述 dubbo SPI 在dubbo的作用是基础性的,要想分析研究dubbo的实现原理、dubbo源码,都绕不过 dubbo SPI,掌握dubbo SPI 是征服dubbo的必经之路。 本篇文章会详细介绍dubbo SPI相关的内容,通过源码分析,目标是让读者能通过本篇文章,彻底征服dubbo SPI。 文章的组织方式是先介绍SPI 的概念,通过Java SPI 让大家了解SPI 是什么,怎么用,有一个初步的概念,dubbo的SPI是扩展了Java SPI的内容,自己实现了一个SPI。 二、SPI概念介绍 SPI全称 Service Provider Interface,是一种服务发现机制。我们编程实现一个功能时,经常先抽象一个interface,内部再定一些方法。具体的实现交给 implments了此接口的类,实现了功能和实现类的分离。 我们设想一下,如果一个描述汽车功能的interface Car,存在多个实现类BMW、Benz、Volvo,某个场景调用Car的行驶方法,程序就需要确认到底是需要BMW、Benz、Volvo中的那个类对象。如果硬编码到程序中,固然可以,但是出现了接口和实现类的耦合,缺点也显而易见。 有办法做到在调用代码中不涉及BMW、Benz、Volvo字符,也随意的指定实现类么?当然,SPI就是解决这个问题。 SPI的实现方式是

IPC之shm.c源码解读

廉价感情. 提交于 2019-12-16 10:56:59
// SPDX-License-Identifier: GPL-2.0 /* * linux/ipc/shm.c * Copyright (C) 1992, 1993 Krishna Balasubramanian * Many improvements/fixes by Bruno Haible. * Replaced `struct shm_desc' by `struct vm_area_struct', July 1994. * Fixed the shm swap deallocation (shm_unuse()), August 1998 Andrea Arcangeli. * * /proc/sysvipc/shm support (c) 1999 Dragos Acostachioaie <dragos@iname.com> * BIGMEM support, Andrea Arcangeli <andrea@suse.de> * SMP thread shm, Jean-Luc Boyard <jean-luc.boyard@siemens.fr> * HIGHMEM support, Ingo Molnar <mingo@redhat.com> * Make shmmax, shmall, shmmni sysctl'able, Christoph

学习String源码的部分方法

对着背影说爱祢 提交于 2019-12-16 10:19:35
先看构造器: private final char value[]; //char类型的数组 以下均会用到 private int hash; //缓存字符串的哈希值 //以下均会用到 public String() { this.value = "".value; //声明时没有参数 则直接用空.value获取该value值,这个.value不太懂,个人认为应该是类似是将一个整体字符串,分割成char类型数组的方法。 } public String(String original) { this.value = original.value; //当存在值的时候 就将该值放到value中,也就是char类型的数组 this.hash = original.hash; //以及对应的哈希值 } public String(char value[]) { //这个构造器说明了 String其实就是一个char类型的数组 this.value = Arrays.copyOf(value, value.length); } public String(char value[], int offset, int count) { //给定起始下标和指定位数的构造器 if (offset < 0) { //先判断给定下标值是否符合逻辑,小于0则报字符串下标越界异常 throw new

vuex源码阅读分析

廉价感情. 提交于 2019-12-16 10:16:18
这几天忙啊,有绝地求生要上分,英雄联盟新赛季需要上分,就懒着什么也没写,很惭愧。这个vuex,vue-router,vue的源码我半个月前就看的差不多了,但是懒,哈哈。 下面是vuex的源码分析 在分析源码的时候我们可以写几个例子来进行了解,一定不要闭门造车,多写几个例子,也就明白了 在vuex源码中选择了example/counter这个文件作为例子来进行理解 counter/store.js是vuex的核心文件,这个例子比较简单,如果比较复杂我们可以采取分模块来让代码结构更加清楚,如何分模块请在vuex的官网中看如何使用。 我们来看看store.js的代码: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { count: 0 } const mutations = { increment (state) { state.count++ }, decrement (state) { state.count-- } } const actions = { increment: ({ commit }) => commit('increment'), decrement: ({ commit }) => commit('decrement'), incrementIfOdd ({

ASP.NET Core 选项模式源码学习Options IOptionsMonitor(三)

孤街浪徒 提交于 2019-12-16 09:39:02
前言 IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用。IOptionsMonitor用于检索选项并管理TOption实例的选项通知, IOptionsMonitor 支持以下方案: 更改通知 命名选项 可重载配置 选择性选项失效 (IOptionsMonitorCache ) IOptionsMonitor public interface IOptionsMonitor<out TOptions> { /// <summary> /// 返回具有 DefaultName 的当前 TOptions 实例。 /// </summary> TOptions CurrentValue { get; } /// <summary> /// 返回具有给定名称的已配置的 TOptions 实例。 /// </summary> TOptions Get(string name); /// <summary> /// 注册一个要在命名 TOptions 更改时调用的侦听器。 /// </summary> IDisposable OnChange(Action<TOptions, string> listener); } OptionsMonitor OptionsMonitor通过IOptionsChangeTokenSource实现监听事件

踩坑了!使用 @Autowired 注入成功,GetBean 方法却获取不到?!

强颜欢笑 提交于 2019-12-16 09:38:13
本文首发于个人微信公众号:Coder小黑 踩坑了?! 之前推文已经讲过 当@Transactional遇到@CacheEvict,你的代码是不是有bug! 现在要在事务提交之后清除缓存。在Spring4.2 之后,可以使用 @TransactionalEventListener 选择在事务提交之后再消费对应的事件。 为了方便发送事件,偷懒使用了静态方法: 其中, SpringUtil.getBean() 方法的内部实现为: 满心欢喜写完代码,一运行,直接报错,报错信息为 IoC 容器中不存在 ApplicationEventPublisher 。 怎么解决?解决的方案也很简单:使用 @Autowired 注入 ApplicationEventPublisher ,调用其 publishEvent 方法。 深入思考 可是, 为什么 ApplicationEventPublisher 可以通过 @Autowired 进行注入,却不能使用 BeanFactory#getBean 方法来获取呢? 画外音:千万不要只限于解决问题,多思考,知其然并知其所以然。 看过 Spring 源码的小伙伴不知道还记不记得,在 refresh() 方法中,会调用 prepareBeanFactory ,在该方法中,注册了可解析依赖项。 从源码中可以知道,一些特殊实例对象是存放在

darknet源码分析-draw_detections

本秂侑毒 提交于 2019-12-16 09:29:32
darknet/src/image.c 对检测结果画标记框 draw_detections函数 //画检测框 void draw_detections ( image im , detection * dets , int num , float thresh , char * * names , image * * alphabet , int classes ) { /* im:输入图像 dets:检测出目标 num:目标个数 thresh:阈值(决定是否画标记框?) names:目标名字,如6类:bicycle、bus、car、motorcycle、person、truck alphabet: classes:目标类别,如6类则,class:0,1,2,3,4,5 names与classes顺序对应 */ int i , j ; for ( i = 0 ; i < num ; ++ i ) { char labelstr [ 4096 ] = { 0 } ; int class = - 1 ; for ( j = 0 ; j < classes ; ++ j ) { if ( dets [ i ] . prob [ j ] > thresh ) { if ( class < 0 ) { strcat ( labelstr , names [ j ] ) ; class = j