学习Tomcat(二)
一、 Java简介
JDK: 面向开发人员使用的SDK,提供Java的开发环境和运行环境
SDK: 软件开发包,包括函数库、编译程序等
JRE: Java的运行环境,面向Java的使用者,不是开发者
二、 Tomcat安装
1、软件准备
JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Tomcat下载:http://tomcat.apache.org/ 2、部署java环境
# mkdir /application/tools/ -p
# cd /application/tools/
# tar xf jdk-8u60-linux-x64.tar.gz -C /application/
# ln -s /application/jdk1.8.0_60 /application/jdk
# sed -i.ori '$a export JAVA_HOME=/application/jdk\n
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\n
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar'
/etc/profile
# source /etc/profile
# java -version 3、安装Tomcat
# tar xf apache-tomcat-8.0.27.tar.gz -C /application/
# ln -s /application/apache-tomcat-8.0.27 /application/tomcat
# echo 'export TOMCAT_HOME=/application/tomcat' >> /etc/profile
# source /etc/profile
# useradd -u 601 tomcat
# chown -R tomcat.tomcat /application/jdk/ /application/tomcat/
# tail -4 /etc/profile
export JAVA_HOME=/application/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/application/tomcat 4、Tomcat目录介绍
# tree -L 1 /application/tomcat/
├── bin #管理Tomcat脚本文件(.bat和.sh)
├── conf #配置文件(XML和DTD)
├── lib #web应用访问的JAR包
├── LICENSE
├── logs #Catalina和应用的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时文件
├── webapps #Web应用程序根目录
└── work #JSP编译出的Servlet的.java和.class文件
# ll webapps/
drwxr-xr-x 14 root root 4096 docs #tomcat帮助文档
drwxr-xr-x 6 root root 4096 examples #web应用实例
drwxr-xr-x 5 root root 4096 host-manager #管理
drwxr-xr-x 5 root root 4096 manager #管理
drwxr-xr-x 3 root root 4096 ROOT #默认网站根目录 5、启动Tomcat
# /application/tomcat/bin/startup.sh #启动程序
# /application/tomcat/bin/shutdown.sh #关闭程序
# netstat -tunlp | grep java
# ps -ef | grep java 6、访问网站
网址: http://192.168.1.11:8080/ 7、Tomcat日志
# tailf /application/tomcat/logs/catalina.out 8、tomcat 启动和停止的方法
1) 启动Tomcat
方法1
# /opt/tomcat/bin/startup.sh
方法2
# /opt/tomcat/bin/catalina start 2) 停止Tomcat
方法1
# /opt/tomcat/bin/shutdown.sh
方法2
# /opt/tomcat/bin/catalina stop 3) 重启Tomcat
方法1
# /opt/tomcat/bin/shutdown.sh
# /opt/tomcat/bin/startup.sh
方法2
# /opt/tomcat/bin/catalina restart
方法3
# /opt/tomcat/bin/catalina stop
# /opt/tomcat/bin/catalina start
三、Tomcat配置文件
1、配置文件介绍
server.xml #主配置文件
tomcat-users.xml #管理用户配置文件
2、Tomcat管理(生产环境不要用)
# vim /application/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
# /application/tomcat/bin/shutdown.sh
# /application/tomcat/bin/startup.sh
3、主配置文件详解
1、配置文件结构
<server> #顶级组件,位于整个配置的顶层
<service> #容器类组件,可包含其它组件
<connector /> #连接器组件,用户请求连接tomcat
<engine> #容器类组件,可包含其它组件
<host> #容器类组件,可包含其它组件
<context></context> #容器类组件,可包含其它组件
</host>
<host>
<context></context>
<Valve /> #被嵌套类组件,位于一个容器中,不能包含其他组件
</host>
</engine>
</service>
</server> 2、配置文件注释
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server> #实例的顶层元素,代表整个容器
port: #关闭tomcat端口
shutdown: #关闭tomcat字符串
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!--
service服务组件
-->
<Service name="Catalina">
<!--
connector #接收用户请求
port: #服务监听端口号
address: #服务监听地址,默认0.0.0.0
protocol: #连接器使用的协议,支持HTTP和AJP(ajp:httpd反向代理tomcat时用)
minProcessors #最小处理请求的线程数
maxProcessors #最大处理请求的线程数
enableLookups #是否开启DNS查询,true:返回主机名,false:返回ip
redirectPort #https端口号
acceptCount #队列的请求数
connectionTimeout #连接超时时间,单位:毫秒
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--
engine #核心容器组件,catalina引擎,接收并处理用户请求
defaultHost #默认处理请求的主机名
-->
<Engine name="Catalina" defaultHost="localhost">
<!--
Realm #存放用户名,密码及role的数据库
-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--
host #一个虚拟主机
name: #主机名
appBase: #应用程序的目录,app的目录,可相对路径,也可绝对路径
unpackWARs: #是否自动解压war包,true:不解压,false:解压
autoDeploy: #是否自动部署war包
xmlValidation: #是否启动xml的校验功能,一般不效验
xmlNamespaceAware: #是否检测名称空间,一般不检测
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--
Context #一个web应用程序,通常为WAR文件
docBase #webapp的war包目录,相对路径或绝对路径
path #webapp的url的前缀,url:http://localhost:8080/path/webapp
reloadable #自动加载新的应用,目录:/WEB-INF/lib和/WEB-INF/classes
-->
<Context path="" docBase="" debug=""/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
4、组件详解
server | port | 关闭tomcat端口 |
shutdown | 关闭tomcat字符串 | |
service | name | 服务的名称,默认:Catalina |
Connector | port | 服务监听端口号 |
address | 服务监听地址,默认0.0.0.0 | |
protocol | 连接器协议类型,支持HTTP(BIO,NIO,NIO2,APR)和AJP(httpd反向代理tomcat时用) | |
minProcessors | 最小处理请求的线程数 | |
maxProcessors | 最大处理请求的线程数 | |
enableLookups | 是否开启DNS查询,true:返回主机名,false:返回ip | |
redirectPort | https端口号 | |
acceptCount | 队列的请求数 | |
connectionTimeout | 连接超时时间,单位:毫秒 | |
maxThreads | 最大并发连接数 | |
allowTrace | 是否跟踪请求转发过程,一般不跟踪 | |
asyncTimeout | 一部分访问超时时间,默认是30000(30秒) | |
maxHeaderCount |
最大的headers信息数量,默认100,0为不限制 |
|
maxParameterCount | 最大的参数数量,默认1000,0为不限制 | |
maxPostSize | 最大POST请求提交数据包,默认为2M | |
maxSavePostSize | SSL验证最大缓存大小,默认是4k | |
scheme | 协议名字,默认http | |
secure | 是否用安全模式通信,默认false | |
useIPVHosts | 是否用IP指向虚拟主机,默认false | |
xpoweredBy | 是否添加X-Powered-By头信息 | |
executor | 指定使用线程池,默认使用内置的线程池 | |
acceptorThreadCount | cpu数量 | |
compressableMimeType | 压缩类型 | |
compression | 是否开启压缩 | |
compressionMinSize | 压缩文件最小值 | |
connectionUploadTimeout | 上传文件的超时时间 | |
disableUploadTimeout | 是否禁用上传超时时间 | |
keepAliveTimeout | Keep-Alive连接超时时间,默认和connectionTimeout一致 | |
maxConnections | 最大连接数,NIO:10000,APR:8192(windows:1024) | |
maxKeepAliveRequests | 最大保持活跃的连接数,默认100 | |
minSpareThreads | 最小空闲线程数 | |
maxSpareThreads | 最大空闲线程数 | |
maxHttpHeaderSize | 请求和响应的HTTP头的最大大小,单位:字节 | |
tcpNoDelay | 可以提高性能,默认是true | |
noCompressionUserAgents | 对于以下的浏览器,不启用压缩 | |
URIEncoding | URL编码字符集 | |
allowTrace | 是否允许HTTP的TRACE方法,默认:false | |
emptySessionPath | 用户的所有路径是否设置为/(跟目录),默认为false | |
useBodyEncodingForURI | 是否用contentType中指定的编码来取代URIEncoding,默认:false | |
bufferSize | 连接器缓冲区的大小,单位:字节,默认缓存区大小:2048字节 | |
socketBuffer | Socket输出缓冲区的大小,单位:字节,默认:9000字节,-1:禁止缓冲 | |
threadPriority | JVM中请求处理线程优先级,默认:NORMAL-PRIORITY | |
useURIValidationHack | 是否检查不必要的URL,false:不检查,提升性能 | |
Engine | defaultHost | 默认接收的主机名称 |
name | Engine组件的名称,提供日志记录,名称不能和其他Engine冲突 | |
host | name | 主机名 |
appBase | 应用程序的目录,app的目录,可相对路径,也可绝对路径 | |
unpackWARs | 是否自动解压war包,true:不解压,false:解压 | |
autoDeploy | 是否自动部署war包 | |
xmlValidation | 是否启动xml的校验功能,一般不效验 | |
xmlNamespaceAware | 是否检测名称空间,一般不检测 | |
Values | directory | 日志保存的目录 |
prefix | 指定log文件的前缀 | |
suffix | 指定log文件的后缀 | |
pattern | 日志内容格式 | |
fileDateFormat | 自定义时间戳,作为日志suffix的前缀 | |
timestamp | 文件名是否加入系统时间戳,true:开启 | |
AccessLogValve | 访问日志Valve | |
ExtendedAccessValve | 扩展功能的访问日志Valve | |
JDBCAccessLogValve | 通过JDBC将访问日志,发送到数据库 | |
RequestDumperValve | 请求转储Valve | |
RemoteAddrValve | 基于远程地址的访问控制 | |
RemoteHostValve | 基于远程主机名的访问控制 | |
SemaphoreValve | 控制Tomcat主机任何容器的并发访问量 | |
JvmRouteBinderValve | 配置多个Tomcat,以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当停止某节点时,通过此Valve将请求定向至备用节点,使用此Valve,必须使用JvmRouteSessionIDBinderListener | |
ReplicationValve | 专用于Tomcat集群架构中,某个请求的session发生更改时,触发session数据在各节点间进行复制 | |
SingleSignOn | 将两个或多个需要对用户进行认证,webapp在认证用户时,即一次认证,可访问所有连接在一起的webapp | |
ClusterSingleSingOn | SingleSignOn的扩展,专用于Tomcat集群中,要结合ClusterSingleSignOnListener进行工作 | |
Context | docBase | webapp的war包目录,相对路径或绝对路径 |
path | webapp的url的前缀,url: http://localhost:8080/path/webapp | |
reloadable | 自动加载新的应用,目录:/WEB-INF/lib和/WEB-INF/classes | |
Realm | JAASRealm | 基于Java Authintication and Authorization Service实现用户认证 |
JDBCRealm | 通过JDBC访问某关系型数据库表实现用户认证 | |
JNDIRealm | 基于JNDI使用目录服务实现认证信息的获取 | |
MemoryRealm | 查找tomcat-user.xml文件实现用户信息的获取 | |
UserDatabaseRealm | 基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证 |
5、管理tomcat脚本
# vim tomcat.sh
#!/bin/sh
JAVA_HOME=/application/jdk
CATALINA_HOME=/application/tomcat usage(){
echo "$0 {start|stop|restart}"
exit 1
}
[ $# -ne 1 ]&& usage start_tomcat(){
$CATALINA_HOME/bin/startup.sh
}
stop_tomcat(){
TPID=$(ps -aux|grep java|grep tomcat|grep -v 'grep'|awk '{print $2}')
kill -9 $TPID
sleep 5;
TSTAT=$(ps -aux|grep java|grep tomcat|grep -v 'grep'|awk '{print $2}')
if [ -z $TSTAT ];then
echo "tomcat stop"
else
kill -9 $TSTAT fi cd $CATALINA_HOME
rm temp/* -rf
rm work/* -rf
} case $1 in
start)
start_tomcat
;;
stop)
stop_tomcat
;;
restart)
stop_tomcat
sleep 5
start_tomcat
;;
*)
usage
;;
esac
四、Tomcat性能优化
1、内存优化
-server #以server模式运行(默认client模式)
-Xms #初始堆内存大小
-Xmx #最大堆内存大小
–Xmn #年轻代大小(整个堆大小=年轻代大小+年老代大小+持久代大小)
-XX:NewSize #设置年轻代大小(for 1.3/1.4版本)
-XX:MaxNewSize #年轻代最大值(for 1.3/1.4)
-XX:PermSize #设置持久代初始值
-XX:MaxPermSize #设置持久代最大值
-Xss #每个线程的堆栈大小(JDK版本5.0后,每个线程堆栈大小:1M)
-XX:NewRatio #年轻代与年老代的比值
-XX:SurvivorRatio #Eden区与Survivor区的大小比值
-XX:LargePageSizeInBytes #内存页的大小,设置过大,会影响Perm的大小
-XX:+UseFastAccessorMethods #原始类型的快速优化(get,set方法转成本地代码)
-XX:+DisableExplicitGC #关闭System.gc()
-XX:MaxTenuringThreshold #垃圾最大年龄(该参数在串行GC时才有效)
-XX:+AggressiveOpts #加快编译
-XX:+UseBiasedLocking #锁机制的性能改善
-XX:MetaspaceSize #Metaspace的初始大小
-XX:MaxMetaspaceSize #Metaspace的最大值
-Xnoclassgc #禁用垃圾回收
-XX:PretenureSizeThreshold #对象超过多大,直接在旧生代分配
-XX:TLABWasteTargetPercent #TLAB占eden区的百分比
-XX:+CollectGen0First #FullGC时是否先YGC 并行收集器
-XX:+UseParNewGC #对年轻代采用多线程并行回收(gc)
-XX:ParallelGCThreads #并行收集器的线程数
-XX:+UseParallelOldGC #对年老代采用多线程并行回收(gc)
-XX:MaxGCPauseMillis #每次年轻代垃圾回收的最长时间(最大暂停时间)
-XX:+UseAdaptiveSizePolicy #自动选择年轻代区大小和相应的Survivor区比例
-XX:GCTimeRatio #垃圾回收占程序运行的时间百分比
-XXUseParallelGC #垃圾回收设置为并行收集器 CMS
-XX:+UseConcMarkSweepGC #用CMS收集器对年老代进行GC,CMS收集器优势停顿时间少,适用停顿时间短的前台应用
-XX:+AggressiveHeap #用大量的物理内存,忽略Xmx参数
-XX:CMSFullGCsBeforeCompaction #多少次后进行内存压缩
-XX:+CMSParallelRemarkEnabled #开启降低标记停顿
-XX:+UseCMSCompactAtFullCollection #CMS收集器完成垃圾回收后,是否对年老代的压缩整理
-XX:+UseCMSInitiatingOccupancyOnly #用手动定义初始化开始CMS收集(指定阈值回收,不指定jvm会自动调整)
-XX:CMSInitiatingOccupancyFraction=70 #年老代满70%开始CMS收集
-XX:CMSInitiatingPermOccupancyFraction #持久代满多少百分比,开始CMS回收
-XX:+CMSIncrementalMode #设置为增量模式(用于单CPU)
-XX:+CMSClassUnloadingEnabled #在用CMS收集进行垃圾回收时,同时清理持久代不使用的class(类)
-XX:ParallelCMSThreads #设定CMS的线程数 辅助信息
-XX:+PrintGC #输出JVM gc日志
-XX:+PrintGCDetails #输出JVM gc详情
-XX:+PrintGCTimeStamps #gc日志中输出GC的时间戳
-XX:+PrintGC:PrintGCTimeStamps #gc日志中输出GC的时间戳(混合模式)
-XX:+PrintGCApplicationStoppedTime #输出垃圾回收期间,程序暂停的时间(可与上面一起用)
-XX:+PrintGCApplicationConcurrentTime #输出每次垃圾回收前,程序未中断的执行时间(可与上面一起用)
-XX:+PrintHeapAtGC #输出GC前后的详细堆栈信息
-XX:+PrintClassHistogram #输出实例的数量以及空间大小
-XX:+PrintTLAB #输出TLAB空间的使用情况
-XX:+PrintTenuringDistribution #输出每次minor GC后,新的存活周期的阈值
-verbose:gc #输出JVM gc日志
-Xloggc:${CATALINA_BASE}/logs/gc.log #指定gc日志目录
-XX:+PrintGCDateStamps #gc日志中输出GC的时间戳(日期格式: 2013-05-04T21:53:59.234+0800)
-XX:+HeapDumpOnOutOfMemoryError #在发生OOM时dump堆内存便于排查问题
-XX:HeapDumpPath=${CATALINA_BASE}/logs #指定堆内存dump文件导出路径 -Djava.awt.headless=true #一般在最后,图表工具的展示
2、连接器优化
主要优化connector标签相关参数,用于处理用户的访问请求
1、通用配置
# vim server.xml
<Connector port="8080" protocol="HTTP/1.1"
#编码格式
URIEncoding="UTF-8"
#线程配置
maxThreads="1000" maxProcessors="1000" minProcessors="5" minSpareThreads="100" maxSpareThreads="1000
#连接数配置
maxConnections="1000" connectionTimeout="20000" acceptCount="1000"
enableLookups="false" disableUploadTimeout="true" useURIValidationHack="false"
#启用压缩的配置
compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
#其他配置
maxPostSize="10485760" maxHttpHeaderSize="8192" tcpNoDelay="true" acceptorThreadCount="8" redirectPort="8443" /> 2、https配置示例
# vim server.xml
<Connector port="8443" protocol="HTTP/1.1"
URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true"
connectionTimeout="20000"acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"
useURIValidationHack="false" compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/tomcat/ssl/test.jks" keystorePass="123456" />
3、线程池优化
1、配置
# vim server.xml
<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" acceptCount="100"
useBodyEncodingForURI="true" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false"
/>
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/> 2、参数详解
name #线程池名,在 Connector中指定
namePrefix #创建每个线程名的前缀,线程名: namePrefix + threadNumber
maxThreads #线程池最大线程数
minSpareThreads #活跃线程数
maxIdleTime #线程空闲时间,默认:6000(1分钟),单位:毫秒
maxQueueSize #被执行前最大队列数,默认:Int的最大值,一般不用改
prestartminSpareThreads #启动线程池时是否启动minSpareThreads部分线程,默认:false(不启动)
className #线程池实现类,默认实现类:org.apache.catalina.core.StandardThreadExecutor
4、优化IO模式
1、io模式介绍
BIO(阻塞型IO)、NIO、NIO2和APR 2、区别
BIO: BIO(Blocking I/O),阻塞式I/O,使用传统的Java I/O操作(java.io包及其子包),默认:bio模式,性能低,连接数少
NIO: NIO(New I/O),基于缓冲区,非阻塞I/O,提供java API(java.nio包及其子包),并发高,适合连接数多且短(聊天),后台耗时完成请求的操作
APR: APR(Apache Portable Runtime)JNI调用HTTP动态库处理文件,提高静态文件和SSL的处理,连接数多且长(相册),从系统层面解决IO堵塞 3、修改io模式
<Connector port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>
protocol="HTTP/1.1" #BIO
protocol="org.apache.coyote.http11.Http11NioProtocol" #NIO
protocol="org.apache.coyote.http11.Http11Nio2Protocol" #NIO2
protocol="org.apache.coyote.http11.Http11AprProtocol" #APR
5、监听器优化
1、Listener配置
预防JRE内存泄漏,默认无需配置
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
6、优化总结
1、如何分配JVM的内存空间
2、应该使用什么类型的垃圾回收器
JVM产生的垃圾需要回收、回收有不同的回收器,JVM的调优需要了解各个垃圾回收机制的原理
终极目标: 降低FULL GC出现的频率(FULL GC出现会导致应用的暂停服务)
五、监控Tomcat
1、使用jconsole来监控jvm
1、安装jconsole
在Windows平台安装jconsole图形化软件 2、配置tomcat的远程连接
# vim bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote #启用远程监控JMX
-Dcom.sun.management.jmxremote.port=12345 #jmx远程端口
-Dcom.sun.management.jmxremote.authenticate=false #不开启用户密码认证
-Dcom.sun.management.jmxremote.ssl=false #不开启ssl(https)
-Djava.rmi.server.hostname=192.168.230.130" #tomcat的IP地址
3、单击java目录bin下的JConsole.exe可执行文件
学习Tomcat(二)的更多相关文章
- 烂泥:学习tomcat之通过shell批量管理多个tomcat
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个 ...
- Shell 学习(二)
目录 Shell 学习(二) 1 设置环境变量 1.1 基本语法 1.2 实践 2 位置参数变量 2.1 介绍 2.2 基本语法 2.3 位置参数变量应用实例 3 预定义变量 3.1 基本介绍 3.2 ...
- crawler4j 学习(二)
crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...
- 从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
- AspectJ基础学习之二搭建环境(转载)
AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
随机推荐
- 一个快速制作表格的方法,和熬夜做表say拜拜
如今已是大数据时代了,统计工作是非常繁琐的一项工作,通常统计老师为了录单工作到下半夜或者是通宵,现在有了很多制作表单的软件,可以大大减轻基层统计老师的工作量,也增加了会员资料的保密性,给我们统计工作带 ...
- 『无为则无心』Python基础 — 62、Python中自定义迭代器
目录 1.迭代器对象的创建 2.实际应用案例 3.总结: 1.迭代器对象的创建 迭代器是一种可以被遍历的对象,并且能够作用于next()函数,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...
- 【C# 集合】HashTable .net core 中的Hashtable的实现原理
上一篇我介绍了Hash函数 这篇我来说一下Hash函数在 HashTable中的应用. HashTable的特性: 1.装载因子:.net core 0.72 ,java 0.75 2.冲突解决方案: ...
- 【C# 异常处理】 开端
异常概述 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是 ...
- c# $ @特殊字符
c# @ 停止字符串中的转义字符,让字符串内的转义字符当正常字符输入. 因此,如果你需要类似"所见所得"效果的赋值,逐字字符串赋值方式会是你的首选!此外,需要注意的是,当使用符号 ...
- Linux Shell 变量自加
转至:https://blog.csdn.net/dj0379/article/details/50946398/ declare -i iv=$svnvlet iv+=1shell中变量自增的实现方 ...
- while read line [linux] shell 学习
转至:https://blog.csdn.net/qq_22083251/article/details/80484176 循环中的重定向 或许你应该在其他脚本中见过下面的这种写法: while re ...
- linux中()、[]、{}、(())、[[]]等各种括号的使用
转至:https://www.jianshu.com/p/b88c7e07aaa9 linux中().[].{}.(()).[[]]等各种括号的使用 1.小括号.圆括号() 1.1 单小括号() 命令 ...
- Python:在命令行窗口中运行Python程序
首先通过cd进入程序所在目录下 再通过python或者python3加要运行的python文件即可
- 在用Scrapy进行爬虫时碰到的错误
1.module() takes at most 2 arguments (3 given) 解决方法:导入Spider类时,是from scrapy import Spider而不是from scr ...