handler

springMVC请求流程详解

不问归期 提交于 2019-12-16 11:20:25
SpringMVC框架是一个基于请求驱动的Web框架,并且使用了‘前端控制器’模型来进行设计,再根据‘请求映射规则’分发给相应的页面控制器进行处理。 (一)整体流程 具体步骤: 1、 首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的 1、2 步骤; 2、 页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);图中的 3、4、5 步骤; 3、 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤 6、7; 4、 前端控制器再次收回控制权,将响应返回给用户,图中的步骤 8;至此整个结束。 (二)核心流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 第三步:处理器映射器HandlerMapping向前端控制器返回Handler

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 ({

手把手带你了解内存抖动和泄漏的优化

主宰稳场 提交于 2019-12-16 02:05:45
前言 这个系列的文章: 1、用通俗易懂的讲解方式,讲解一门技术的实用价值 2、详细书写源码的追踪,源码截图,绘制类的结构图,尽量详细地解释原理的探索过程 3、提供Github 的 可运行的Demo工程,但是我所提供代码,更多是提供思路,抛砖引玉,请酌情cv 4、集合整理原理探索过程中的一些坑,或者demo的运行过程中的注意事项 5、用gif图,最直观地展示demo运行效果 如果觉得细节太细,直接跳过看结论即可。本人能力有限,如若发现描述不当之处,欢迎留言批评指正。 学到老活到老,路漫漫其修远兮。与众君共勉 !,和我一起当个CV工程师吧,手动滑稽 正文大纲 jvm内存管理常识 检测以及处理内存抖动 检测以及处理内存泄漏 正文 jvm内存管理常识 LMK (LowMemoryKill)机制 android底层会在系统内存告急的时候,按照一定规则杀死一些进程来满足其他进程的内存需要。其中 消耗内存的高低就是其中一项指标,所以,优化app的内存占用,能够有效降低app被系统杀死的概率。 GC STW机制 GC,垃圾回收进程,在 GC 线程执行任务的时候,会存在一个 STW (stop the world) 机制,他就会把其他所有线程都挂起。如果 GC 非常频繁地调用,那就会导致主线程不流畅,给用户的感觉就是 卡顿。 内存抖动频繁引起OOM 内存抖动太频繁,导致大量对象频繁创建和销毁

Google Protobuf在Netty中的使用

元气小坏坏 提交于 2019-12-16 00:23:54
[toc] Google Protobuf在Netty中的使用 程序代码来自于《Netty权威指南》第8章,已经加了注释,不过需要注意的是,使用的proto源代码是在 Google Protobuf入门与使用 中生成的,关于protobuf代码自动生成工具的使用可以参考这篇文章。 例子中,通过××× ProtobufVarint32FrameDecoder 和编码器 ProtobufVarint32LengthFieldPrepender 的使用已经解决了半包问题,测试时可以把其注释掉,这样就可以演示Netty中使用Protobuf出现的TCP粘包问题。 同时,通过protobuf的使用,也可以深刻感受到,其在Netty中的使用确实非常简单,编解码、半包问题,只需要添加相关的处理器即可,而且它可以方便地实现跨语言的远程服务调用。(protobuf本身提供了对不同语言的支持) 但其实在使用时会发现有一个问题,就是编解码的对象是需要使用其生成的特定的proto对象来进行操作的,也就是说,需要编写.proto文件,再通过protoc来生成相应语言的代码文件,显然这样做还是会有些麻烦(虽然其实也还好,不算麻烦),有没有方便点的方法呢?后面通过protostuff的使用即可解决这个问题。 服务端 SubReqServer.java package cn.xpleaf.subscribe;

C++实现轻量级极简httpserver和httpclient(转)

大城市里の小女人 提交于 2019-12-15 18:51:37
转自:https://blog.csdn.net/u012234115/article/details/79596826 一般来说,C++的项目多是偏底层,不怎么需要跟http打交道,但有时候又需要在C++后端项目中加入一些简单 http接口,比如游戏运营服务器,金融交易监控服务等。 但是传统的实现方法比如采用libcurl,asio等较为重型的框架来做有没有必要,因此,这里采用 mongoose 这个库来实现基本的httpserver和httpclient功能,非常简单,包含一个h文件,一个cpp文件到工程中就行了,无需编译,无需链接库。 本文实现了一个project,将mongoose中提供的http相关api封装成了httpserver类和httpclient类,方便调用,目录结构如下: ├─common ├─mongoose.h └─mongoose.cpp ├─httpclient ├─http_client.h ├─http_client.cpp └─main.cpp └─httpserver └─web └─index.html ├─http_server.h ├─http_server.cpp └─main.cpp 编译环境:win10,vs2015, C++11 (其实是跨平台的) http_server.h #pragma once #include

Netty服务端Channel的创建与初始化

ε祈祈猫儿з 提交于 2019-12-15 18:47:55
Netty创建服务端Channel时,从服务端 ServerBootstrap 类的 bind 方法进入,下图是创建服务端Channel的函数调用链。在后续代码中通过反射的方式创建服务端Channel,反射操作在创建服务端 Channel 对象的工厂的 newChannel 方法,创建服务端 Channel 对象的工厂在ServerBootstrap 类的 channel 方法中确定。 final ChannelFuture initAndRegister() { Channel channel = null; try { // 反射创建服务端Channel channel = channelFactory.newChannel(); init(channel); } ChannelFuture regFuture = config().group().register(channel); return regFuture; } 反射创建服务端Channel的工厂: public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> { private final Class<? extends T> clazz; public ReflectiveChannelFactory

android异常:android.os.NetworkOnMainThreadException

人盡茶涼 提交于 2019-12-15 17:50:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 报android.os.NetworkOnMainThreadException异常,经过查文档,原来是4.0系统不允许主线程(UI线程)访问网络,因此导致了其异常。在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧。 一:在发起Http请求的Activity里面的onCreate函数里面添加如下代码: // 详见StrictMode文档 StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy( new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); 如果正在做的项目不是Android 4.0的是看不到StrictMode类的。 二:使用Thread、Runnable

Android异步处理:Handler+Looper+MessageQueue深入详解

我只是一个虾纸丫 提交于 2019-12-15 17:45:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 转载自: http://blog.csdn.net/mylzc/article/details/6771331 ,在原文基础上修改整理再发布。 概述 :Android使用消息机制实现线程间的通信,线程通过Looper建立自己的消息循环,MessageQueue是FIFO的消息队列,Looper负责从MessageQueue中取出消息,并且分发到消息指定目标Handler对象。Handler对象绑定到线程的局部变量Looper,封装了发送消息和处理消息的接口。 例子 :在介绍原理之前,我们先介绍Android线程通讯的一个例子,这个例子实现点击按钮之后从主线程发送消息"hello"到另外一个名为” CustomThread”的线程。 Log打印结果: 原理: 我们看到,为一个线程建立消息循环有四个步骤: 1、 初始化Looper 2、 绑定handler到CustomThread实例的Looper对象 3、 定义处理消息的方法 4、 启动消息循环 下面我们以这个例子为线索,深入Android源代码,说明Android Framework是如何建立消息循环,并对消息进行分发的。 1、 初始化Looper : Looper.prepare() Looper.java private static final

Android 主线程和线程之间相互发送消息

为君一笑 提交于 2019-12-15 17:39:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带Looper的,当线程要接收来自主线程的消息是就需要调用Looper.prepare()和Looper.loop()。以下我们将通过一个示例,讲述主线程和线程之间如何发送Message。 import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.Toast; /** * 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。 * org.fneg.HandlerTestActivity.java * Create at: 2012-6-4 下午9:39:19 * @author:feng * Email:fengcunhan@gmail.com * */ public class

springmvc源码学习

萝らか妹 提交于 2019-12-15 17:39:23
1.springmvc运行流程 流程图是直接在百度图片中找的一张 >.前台发送请求,请求会首先通过DispatcherServlet进行url的匹配;如果匹配不到,看是否配置<mvc:default-servlet-hanler> 如果配置了,就找对应的目标资源 >.如果匹配到url,就调用HandlerMapping,获取到handlerExecutionChain >.dispatcherServlet会调用handlerAdapter >.handlerAdapter调用对应的handler,也就是controller方法。 >.调用完成之后,返回modelAndView >.视图解析器会解析出对应的view,并进行视图的渲染 2.springMVC的核心类和接口 前端控制器 DispatcherServlet 处理器映射器 HandlerMapping 处理器适配器 HandlerAdapter 视图解析器 viewResolver ModelAndView 3.springmvc的controller有三种配置方式 1.@Controller注解 2.实现Controller接口,这种方式,需要在类名增加@Component("/映射地址") 3.实现HttpRequestHandler接口,在类上加@Component("/映射地址") 后面两种原理是一样的,下面会说到