- muduo网络库剖析——noncopyable禁止拷贝构造类与copyable允许拷贝构造类
Apylee 后继
muduo网络库精解重构与拓展开源网络服务器linuxc++后端个人开发
muduo网络库剖析——noncopyable禁止拷贝构造类与copyable允许拷贝构造类前情从muduo到my_muduo概要禁止拷贝构造类允许拷贝构造类框架与细节代码实现禁止拷贝构造类允许拷贝构造类成员函数结尾未完待续,敬请期待……前情从muduo到my_muduo作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者,我们需要抽取其中的精华进行简要实现,
- 【C++11】default、delete与Noncopyable
十字星的约定_
c++c++开发语言c++20
C++11oop中的default、delete与Noncopyabledefault在C++11标准中,可以使用default关键字来显式地声明默认的构造函数和析构函数。使用default关键字可以用来显式声明默认的构造函数和析构函数。这样做可以让编译器自动生成默认实现–>->->关于构造函数<-<-<–classA{public://显式声明默认构造函数A()=default;//显式声明默认
- C++中noncopyable不可拷贝类的使用
小小码农Come on
C++c++java算法
背景:项目中需要某个类不能被拷贝构造和赋值构造,下面举例说明该场景:什么时候需要不可拷贝类考虑一种情况,我们要实现一个含有动态数组成员的类,其中动态数组成员在构造函数中new出来,在析构函数中delete掉。比如说这样一个矩阵类:templateclassMatrix{public:intw;inth;_T*data;//构造函数Matrix(int_w,int_h):w(_w),h(_h){da
- 不可拷贝类
ghost+
c++开发语言
目录拷贝什么时候需要不可拷贝类实现不可拷贝类使用boost::noncopyable声明拷贝函数为私有C++11下使用delete关键字其他拷贝拷贝是任何一门编程语言都必不可少的操作。在C++里,拷贝有等号拷贝和构造拷贝之分:Foofoo,foo2;Foofoo2=foo;//等号拷贝Foofoo3(foo);//构造拷贝等号拷贝是显式的,总得有个等号=在那才行。构造拷贝是隐式的,除了上面示例代码
- muduo库的Connector以及TcpClient的使用
FreeeLinux
Muduo源码剖析muduo源码剖析muduo库TcpClientmuduo库Connectormuduo源码剖析
一:ConnectorConnector可以说是muduo库的连接器,负责客户端向服务器发起连接。实际上说白了就是封装了socket的connect操作。Connector类的成员如下:classConnector:boost::noncopyable,publicboost::enable_shared_from_this{public:typedefboost::functionNewConn
- muduo源码剖析--EventLoop类
godaa
muduoc++多线程muduo网络库socket
EventLoop类Reactor模式的实现类,连通Channel类和Poller类的桥梁,也是上层注册和回调的实际调用类。//事件循环类主要包含了两个大模块ChannelPoller(epoll的抽象)classEventLoop:noncopyable{public:usingFunctor=std::function;EventLoop();~EventLoop();//开启事件循环void
- Linux多线程服务端编程 使用muduo C++网络库 学习笔记 日志log
weixin_30460489
代码来自陈硕开源代码库muduo中地址是https://github.com/chenshuo/muduo#pragmaonce#include#defineNAMESPACE(X)namespaceX{#defineNAMESPACE_END(X)}NAMESPACE(DEF)classnoncopyable{protected:noncopyable(){}private:noncopyabl
- 读书笔记:Effective C++ 2.0 版,条款11(拷贝构造函数和赋值操作符)、条款12(初始化列表)
御风@户外
cppc++
条款11:为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符只要类里有指针时,就要写自己版本的拷贝构造函数和赋值操作符函数。确定不会使用时,可以只声明这些函数(声明为private成员)而不去定义(实现)它们。这就防止了会有人去调用它们,也防止了编译器去生成它们。新版本cpp语法中,还可以设置函数实现为delete。classNonCopyable{public:NonCopyable()
- 单例的例子
qq_40178082
boostc++
#include#include#include//使用方式1:模板参数方式classCTest:publicboost::noncopyable//不能复制、赋值{public:voidSet(inti){m_val=i;}voidPrint()const{std::coutsingleton_ctest;//使用模板的方式只允许单个实例#definesCTestsingleton_ctest:
- 【网络编程】muduo库——noncopyable
菜鸟的Zoom之旅
网络编程c++
在研读muduo库源码时,可以发现其中的很多类都是私有继承自noncopyable的那么这是一个什么类呢?为什么要继承这个类?其实从名字也可以得知noncopyable——不可复制让我们看一下源码#ifndefMUDUO_BASE_NONCOPYABLE_H#defineMUDUO_BASE_NONCOPYABLE_Hnamespacemuduo{classnoncopyable{public:n
- server端统计latency和pv lost
INGNIGHT
Linux网络编程python前端数据库
//ThisisnotastandaloneheaderclassSudokuStat:muduo::noncopyable{public:SudokuStat(constThreadPool&pool):pool_(pool),lastSecond_(0),requests_(kSeconds),latencies_(kSeconds),totalRequests_(0),totalRespon
- muduo源码剖析--TcpConnection
godaa
muduoc++多线程socketmuduo网络库
TcpConnection类封装了一个个的tcp连接,实现了socket的四种回调,以及注册一些上层的回调classTcpConnection:noncopyable,publicstd::enable_shared_from_this{public:TcpConnection(EventLoop*loop,conststd::string&nameArg,intsockfd,constInetA
- Swift 5.9 有哪些新特性(二)
Swift社区
#Swift集swift蓝桥杯开发语言
文章目录前言Noncopyable结构体和枚举结束变量绑定的生命周期makeStream()方法添加sleep(for:)到ClockDiscardingtaskgroups总结前言虽然Swift6已经在地平线上浮现,但5.x版本仍然有很多新功能-更简单的if和switch用法、宏、非可复制类型、自定义actor执行器等等都将在Swift5.9中推出,再次带来了一个巨大的更新。在本文中,将介绍这个
- muduo源码 ---ThreadPool介绍
夏_a495
muduo源码分析系列线程池的实现分析线程池之前,先介绍线程毕竟线程池里保存着每个线程先分析Thread类classThread:noncopyable{public:typedefstd::functionThreadFunc;explicitThread(ThreadFunc,conststring&name=string());//FIXME:makeitmovableinC++11~Thr
- 【sylar】框架篇-Chapter11-Socket 模块
江湖人称菠萝包
【C++】服务器编程-实战c++linux服务器
站在巨人的肩膀上C++高性能分布式服务器框架从零开始重写sylarC++高性能分布式服务器框架概述套接字类,表示一个套接字对象。其实就是在操作系统的API上再封装了一层。Socket继承自std::enable_shared_from_this和sylar::Noncopyable。含有以下属性:文件描述符m_sock。地址类型(AF_INET,AF_INET6等)m_family。套接字类型(S
- 【sylar】框架篇-Chapter14-TcpServer 模块
江湖人称菠萝包
【C++】服务器编程-实战c++linux服务器
站在巨人的肩膀上C++高性能分布式服务器框架从零开始重写sylarC++高性能分布式服务器框架概述TCP服务器的封装。TcpServerConfTcpServer配置结构体。两个模板偏特化:templatetemplateTcpServer继承自std::enable_shared_from_this和sylar::Noncopyable。TcpServer类支持同时绑定多个地址进行监听,只需要在
- 学习muduo时对enable_shared_from_this的思考
晨哥是个好演员
muduo网络库c++网络库
在学习muduo时,看到C++11的特性,在TcpConnection类的声明中,继承了enable_shared_from_this这个模板类,部分代码片段如下:classTcpConnection:noncopyable,publicstd::enable_shared_from_this{...}于是我在想,enable_shared_from_this是干什么的呢?enable_share
- boost.asio mysql_boost.asio服务器使用io_service作为work pool
花枕
boost.asiomysql
#include#include#include#include#include#include#include#include#include#include#includeusingboost::asio::ip::tcp;classhandler_allocator:privateboost::noncopyable{public:handler_allocator():in_use_(fa
- muduo-Buffer
无敌的神龙战士
#muduo源码解析c++
tcpConnectionclassTcpConnection:NonCopyable,publicenable_shared_from_this{private:enumStateE{k_disconnected,k_connecting,//正在连接k_connected,//已连接k_disconnecting,};public:TcpConnection(EventLoop*loop,co
- boost::ref
MonkeyBoy
背景STL和Boost中的算法和函数大量使用了函数对象作为判断式或谓词参数,而这些参数都是传值语义,算法或函数在内部保留函数对象的拷贝并使用。值传递不可行的情况:作为参数的函数对象拷贝代价过高(具有复杂的内部状态)。不希望拷贝对象(内部状态不应该改变)。拷贝是禁止的(noncopyable、单件)。refreference_wrapperisprimarilyusedto"feed"referen
- muduo库源码分析(一)
weishenmax
muduo库源码分析
noncopyable类的作用默认情况下,如果类没有声明拷贝构造函数和复制构造函数,编译器会自动的为类创建隐含的public拷贝构造机复制构造函数。但是noncopyable类的实现是将构造函数与析构函数声明为protected,将拷贝构造函数和复制构造函数声明为delete。这就意味着,除了子类自己定义拷贝构造函数或者复制构造函数,外部的调用者不能够通过拷贝构造函数或者复制构造函数创建一个新的子
- C++使用pthread_once实现单例模式模板类
漂流瓶0429
C/C++设计模式
C++单例模式://singleton.htemplateclassSingleton:noncopyable{public:staticT&Instance(){pthread_once(&ponce_,&Singleton::init);return*value_;}private:Singleton();~Singleton();staticvoidinit(){value_=newT();
- C++ noncopyable类
chenBright
boostc++
在muduo中,有一个noncopyable类,继承了该类的派生类不能被拷贝,只能被移动。涉及拷贝的函数有两个:拷贝构造函数和拷贝复制操作符。将这两个方法声明为不可访问或者删除(=delete),即可达到不可拷贝的效果。将函数声明为private将拷贝构造函数和拷贝复制操作符声明为private,能阻止编译器创建这两个函数,同时阻止用户调用它们,从而达到阻止拷贝的效果。实现如下:classnonc
- 浅析muduo库中的线程设施01
uulogging
muduo
muduo是目前在学习过程中遇到的最具有学习意义的网络库,下文将分析muduo库中的基础设施–Thread和ThreadPool.文中观点如果部分不符合您的理解,请留言指教,谢谢~首先,介绍在多线程编程中不可缺少的同步措施–Mutex和Condition.MutexclassMutexLock:boost::noncopyable{public:MutexLock()//创建一个mutex:hol
- muduo库分析——base篇(2) Atomic
烟雨任大
c++
主要是封装了原子操作类,用于原子计数功能,使用的__sync_fetch_and_add等等系统函数都是特定cpu支持的命令namespacemuduo{namespacedetail{templateclassAtomicIntegerT:boost::noncopyable{public:AtomicIntegerT():value_(0){}//uncommentifyouneedcopyi
- muduo库分析——base篇(4) Mutex
烟雨任大
c++
为了方便开发,一般创建互斥量的管理类,同时创建上锁解锁类(RALL技术)classMutexLock:boost::noncopyable{public:MutexLock():holder_(0)//线程持有者{MCHECK(pthread_mutex_init(&mutex_,NULL));//mutex动态初始化}~MutexLock(){assert(holder_==0);//没有持有者
- boost::noncopyable以及空基类在编程中的应用
mdlyyh
C/C++
今天开始学习>,下载了书中在Github中的源代码,就好奇的开始阅读源代码,在/muduo/net/Socket.h中看到一个继承体系,classSocket:boost::noncopyable;看到boost::noncopyable后,首先想到EffectiveC++中曾经提到过,于是翻开书第6条款:若不想使用编译器自动生成的函数,就该明确拒绝。其中的一个实现方法就是通过私有继承一个copy
- boost::noncopyable的实现
我家云
C++
boost::noncopyable最近在看muduo网络库,muduo是基于boost库做开发的。里面很多类是继承自noncopyable,顺手查看了noncopyable类的实现。noncopyable类的作用默认情况下,如果类没有声明拷贝构造函数和复制构造函数,编译器会自动的为类创建隐含的public拷贝构造机复制构造函数。但是noncopyable类的实现是将构造函数与析构函数声明为pro
- muduo网络库——noncopyable.h
shenmingik
剖析moduo网络库
从这里开始就是剖析muduo网络库项目了。出发!!!!noncopy.h这个头文件时其他类的基类。//pragma是编译器级别和语言级别#ifndef一样#pragmaonceclassnoncopyable{public:noncopyable(constnoncopyable&)=delete;noncopyable&operator=(constnoncopyable&)=delete;pr
- TCP网络库:Acceptor、TcpServer、TcpConnection
weixin_30551947
Acceptor类:用于接收新的TCP连接,该类是内部class,供TcpServer使用,生命期由TcpServer控制类成员:classAcceptor:boost::noncopyable{public:typedefboost::functionNewConnectionCallback;Acceptor(EventLoop*loop,constInetAddress&listenAddr
- 枚举的构造函数中抛出异常会怎样
bylijinnan
javaenum单例
首先从使用enum实现单例说起。
为什么要用enum来实现单例?
这篇文章(
http://javarevisited.blogspot.sg/2012/07/why-enum-singleton-are-better-in-java.html)阐述了三个理由:
1.enum单例简单、容易,只需几行代码:
public enum Singleton {
INSTANCE;
- CMake 教程
aigo
C++
转自:http://xiang.lf.blog.163.com/blog/static/127733322201481114456136/
CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。
介绍:http://baike.baidu.com/view/1126160.htm
本文件不介绍CMake的基本语法,下面是篇不错的入门教程:
http:
- cvc-complex-type.2.3: Element 'beans' cannot have character
Cb123456
springWebgis
cvc-complex-type.2.3: Element 'beans' cannot have character
Line 33 in XML document from ServletContext resource [/WEB-INF/backend-servlet.xml] is i
- jquery实例:随页面滚动条滚动而自动加载内容
120153216
jquery
<script language="javascript">
$(function (){
var i = 4;$(window).bind("scroll", function (event){
//滚动条到网页头部的 高度,兼容ie,ff,chrome
var top = document.documentElement.s
- 将数据库中的数据转换成dbs文件
何必如此
sqldbs
旗正规则引擎通过数据库配置器(DataBuilder)来管理数据库,无论是Oracle,还是其他主流的数据都支持,操作方式是一样的。旗正规则引擎的数据库配置器是用于编辑数据库结构信息以及管理数据库表数据,并且可以执行SQL 语句,主要功能如下。
1)数据库生成表结构信息:
主要生成数据库配置文件(.conf文
- 在IBATIS中配置SQL语句的IN方式
357029540
ibatis
在使用IBATIS进行SQL语句配置查询时,我们一定会遇到通过IN查询的地方,在使用IN查询时我们可以有两种方式进行配置参数:String和List。具体使用方式如下:
1.String:定义一个String的参数userIds,把这个参数传入IBATIS的sql配置文件,sql语句就可以这样写:
<select id="getForms" param
- Spring3 MVC 笔记(一)
7454103
springmvcbeanRESTJSF
自从 MVC 这个概念提出来之后 struts1.X struts2.X jsf 。。。。。
这个view 层的技术一个接一个! 都用过!不敢说哪个绝对的强悍!
要看业务,和整体的设计!
最近公司要求开发个新系统!
- Timer与Spring Quartz 定时执行程序
darkranger
springbean工作quartz
有时候需要定时触发某一项任务。其实在jdk1.3,java sdk就通过java.util.Timer提供相应的功能。一个简单的例子说明如何使用,很简单: 1、第一步,我们需要建立一项任务,我们的任务需要继承java.util.TimerTask package com.test; import java.text.SimpleDateFormat; import java.util.Date;
- 大端小端转换,le32_to_cpu 和cpu_to_le32
aijuans
C语言相关
大端小端转换,le32_to_cpu 和cpu_to_le32 字节序
http://oss.org.cn/kernel-book/ldd3/ch11s04.html
小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)
- Nginx负载均衡配置实例详解
avords
[导读] 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。
负载均衡
先来简单了解一下什么是负载均衡
- 乱说的
houxinyou
框架敏捷开发软件测试
从很久以前,大家就研究框架,开发方法,软件工程,好多!反正我是搞不明白!
这两天看好多人研究敏捷模型,瀑布模型!也没太搞明白.
不过感觉和程序开发语言差不多,
瀑布就是顺序,敏捷就是循环.
瀑布就是需求、分析、设计、编码、测试一步一步走下来。而敏捷就是按摸块或者说迭代做个循环,第个循环中也一样是需求、分析、设计、编码、测试一步一步走下来。
也可以把软件开发理
- 欣赏的价值——一个小故事
bijian1013
有效辅导欣赏欣赏的价值
第一次参加家长会,幼儿园的老师说:"您的儿子有多动症,在板凳上连三分钟都坐不了,你最好带他去医院看一看。" 回家的路上,儿子问她老师都说了些什么,她鼻子一酸,差点流下泪来。因为全班30位小朋友,惟有他表现最差;惟有对他,老师表现出不屑,然而她还在告诉她的儿子:"老师表扬你了,说宝宝原来在板凳上坐不了一分钟,现在能坐三分钟。其他妈妈都非常羡慕妈妈,因为全班只有宝宝
- 包冲突问题的解决方法
bingyingao
eclipsemavenexclusions包冲突
包冲突是开发过程中很常见的问题:
其表现有:
1.明明在eclipse中能够索引到某个类,运行时却报出找不到类。
2.明明在eclipse中能够索引到某个类的方法,运行时却报出找不到方法。
3.类及方法都有,以正确编译成了.class文件,在本机跑的好好的,发到测试或者正式环境就
抛如下异常:
java.lang.NoClassDefFoundError: Could not in
- 【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j
bit1129
Stream
先来一段废话:
实际工作中,业务系统的日志基本上是使用Log4j写入到日志文件中的,问题的关键之处在于业务日志的格式混乱,这给对日志文件中的日志进行统计分析带来了极大的困难,或者说,基本上无法进行分析,每个人写日志的习惯不同,导致日志行的格式五花八门,最后只能通过grep来查找特定的关键词缩小范围,但是在集群环境下,每个机器去grep一遍,分析一遍,这个效率如何可想之二,大好光阴都浪费在这上面了
- sudoku solver in Haskell
bookjovi
sudokuhaskell
这几天没太多的事做,想着用函数式语言来写点实用的程序,像fib和prime之类的就不想提了(就一行代码的事),写什么程序呢?在网上闲逛时发现sudoku游戏,sudoku十几年前就知道了,学生生涯时也想过用C/Java来实现个智能求解,但到最后往往没写成,主要是用C/Java写的话会很麻烦。
现在写程序,本人总是有一种思维惯性,总是想把程序写的更紧凑,更精致,代码行数最少,所以现
- java apache ftpClient
bro_feng
java
最近使用apache的ftpclient插件实现ftp下载,遇见几个问题,做如下总结。
1. 上传阻塞,一连串的上传,其中一个就阻塞了,或是用storeFile上传时返回false。查了点资料,说是FTP有主动模式和被动模式。将传出模式修改为被动模式ftp.enterLocalPassiveMode();然后就好了。
看了网上相关介绍,对主动模式和被动模式区别还是比较的模糊,不太了解被动模
- 读《研磨设计模式》-代码笔记-工厂方法模式
bylijinnan
java设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern;
/*
* 工厂方法模式:使一个类的实例化延迟到子类
* 某次,我在工作不知不觉中就用到了工厂方法模式(称为模板方法模式更恰当。2012-10-29):
* 有很多不同的产品,它
- 面试记录语
chenyu19891124
招聘
或许真的在一个平台上成长成什么样,都必须靠自己去努力。有了好的平台让自己展示,就该好好努力。今天是自己单独一次去面试别人,感觉有点小紧张,说话有点打结。在面试完后写面试情况表,下笔真的好难,尤其是要对面试人的情况说明真的好难。
今天面试的是自己同事的同事,现在的这个同事要离职了,介绍了我现在这位同事以前的同事来面试。今天这位求职者面试的是配置管理,期初看了简历觉得应该很适合做配置管理,但是今天面
- Fire Workflow 1.0正式版终于发布了
comsci
工作workflowGoogle
Fire Workflow 是国内另外一款开源工作流,作者是著名的非也同志,哈哈....
官方网站是 http://www.fireflow.org
经过大家努力,Fire Workflow 1.0正式版终于发布了
正式版主要变化:
1、增加IWorkItem.jumpToEx(...)方法,取消了当前环节和目标环节必须在同一条执行线的限制,使得自由流更加自由
2、增加IT
- Python向脚本传参
daizj
python脚本传参
如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢?
需要模块:sys
参数个数:len(sys.argv)
脚本名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[
- 管理用户分组的命令gpasswd
dongwei_6688
passwd
NAME: gpasswd - administer the /etc/group file
SYNOPSIS:
gpasswd group
gpasswd -a user group
gpasswd -d user group
gpasswd -R group
gpasswd -r group
gpasswd [-A user,...] [-M user,...] g
- 郝斌老师数据结构课程笔记
dcj3sjt126com
数据结构与算法
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- yii2 cgridview加上选择框进行操作
dcj3sjt126com
GridView
页面代码
<?=Html::beginForm(['controller/bulk'],'post');?>
<?=Html::dropDownList('action','',[''=>'Mark selected as: ','c'=>'Confirmed','nc'=>'No Confirmed'],['class'=>'dropdown',])
- linux mysql
fypop
linux
enquiry mysql version in centos linux
yum list installed | grep mysql
yum -y remove mysql-libs.x86_64
enquiry mysql version in yum repositoryyum list | grep mysql oryum -y list mysql*
install mysq
- Scramble String
hcx2013
String
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = "great":
- 跟我学Shiro目录贴
jinnianshilongnian
跟我学shiro
历经三个月左右时间,《跟我学Shiro》系列教程已经完结,暂时没有需要补充的内容,因此生成PDF版供大家下载。最近项目比较紧,没有时间解答一些疑问,暂时无法回复一些问题,很抱歉,不过可以加群(334194438/348194195)一起讨论问题。
----广告-----------------------------------------------------
- nginx日志切割并使用flume-ng收集日志
liyonghui160com
nginx的日志文件没有rotate功能。如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件。第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。第二步向nginx主
- Oracle死锁解决方法
pda158
oracle
select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.
- java之List排序
shiguanghui
list排序
在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。 你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递
- servlet单例多线程
utopialxw
单例多线程servlet
转自http://www.cnblogs.com/yjhrem/articles/3160864.html
和 http://blog.chinaunix.net/uid-7374279-id-3687149.html
Servlet 单例多线程
Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的