学习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参数 多参数的实 ...
随机推荐
- 【C#基础概念】字节顺序(大端、小端)
字节顺序,又称端序或尾序(英語:Endianness),在计算机科学领域中,指電腦記憶體中或在数字通信链路中,组成多字节的字的字节的排列顺序. 例如假设上述变量x类型为int,位于地址0x100处,它 ...
- 激活visio pro 2019
内容来源:http://www.yishimei.cn/catalog.asp?page=2 1.必须彻底关闭windows defender 防火墙 :光笔防火墙的教程:https://www.cn ...
- 【C# 表达式树 三】ExpressionType 节点类型种类
// // 摘要: // 描述表达式目录树的节点的节点类型. public enum ExpressionType { // // 摘要: // 加法运算,如 a + b,针对数值操作数,不进行溢出检 ...
- win7下安装docker toolbox
我的笔记本是win10系统,上面安装docker非常简单.只要在官网下载然后一路next就可以了.然而办公室的电脑装的是win7,我也懒得给它换win10.没想到,win7下安装docker这么费劲. ...
- JVM学习笔记(详细)
目录 01 JVM与Java体系结构 简介 JVM整体架构,HotSpot java代码执行流程 JVM架构模型 JVM生命周期 JVM发展历程 02 类加载子系统 JVM细节版架构 类加载器的作用 ...
- idea教程--快速插入依赖
1.打开pom.xml文件,按下快捷键Alt+insert,弹出Generate框,选择Dependency. 2.搜索所需jar的关键字. 3.点击add.添加jar包成功.如果第二步没有所要jar ...
- SQL Server--插入一天数据返回ID值
这里将该功能写成了一个存储过程, 本来只写Insert的话,返回1,即影响的行数,该数据没太大应用意义. 想在Insert的基础上,返回新添加的这条数据的ID,两种方法: 1 .添加第17行的Sele ...
- Lua中如何实现类似gdb的断点调试—06断点行号检查与自动修正
前面两篇我们对性能做了一个优化,接下来继续来丰富调试器的特性. 我们前面提到过,函数内并不是所有行都是有效行,空行和注释行就不是有效行.我们之前在添加断点的时候,并没有对行号进行检查,任何行号都能成功 ...
- php 23种设计模型 - 状态模式
状态模式 状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列 ...
- 解决 Vue 项目 invalid host header 问题(两种方案)
问题出现背景 做微信H5网页时,使用花生壳内网穿透进行调试时,打开网页显示:invalid host header 分析问题 这句话的意思是:无效的Host请求头: 因为在vue在调试时相当于启动了一 ...