??xml version="1.0" encoding="utf-8" standalone="yes"?> 1 ~写目的 本文详细介绍了DBCPq接池的各个配置参数的含义,q过实际例子演示不同的参数设|可能参数的l果?/p>
2 适用对象 目实施人员 3 参考资?nbsp; 4 知识文g主要内容4.1q接池知识简?nbsp; L周知建立数据库连接是一个非常耗时耗资源的行ؓQ因此现代的Web中间Ӟ无论是开源的Tomcat、Jbossq是商业的websphere、weblogic都提供了数据库连接池功能Q可以毫不夸张的_数据库连接池性能的好坏,不同厂商对连接池有着不同的实玎ͼ本文只介l拜特公怋用较多的开源web中间件Tomcat中默认的q接池DBCPQDataBase connection poolQ的使用?/p>
4.2Tomcat下配|连接池 下面以tomcat5.5.26Z来介l如何配|连接池 1Q需要的jar 在tomcat的安装目录common\lib下有一个naming-factory-dbcp.jarQ这个是tomcat修改后的dbcpq接池实玎ͼ同时Z能够正常q行Q还需要commons-pool.jar?/p>
2Q徏立context文g q入到conf\Catalina\localhost新徏一个上下文文gQ文件的名称既ؓ来要访问是输入url上下文名Uͼ例如我们建立一个名为btweb的文件内容如下: <Context debug="0" docBase="D:\v10_workspace\build\WebRoot" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:cahs" removeAbandonedTimeout="60" testOnBorrow="true" 4.3参数分步介绍 u username="v10" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:cahs" u name="jdbc/btdb1" factory默认是org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactoryQtomcat也允讔R用其他连接实玎ͼ不过默认使用dbcp?/p>
u maxIdle="3" minIdle=”2” u testOnBorrow="true" u removeAbandonedTimeout="60" 如下图所C:q接池处于应用程序与数据库之_一斚w应用E序通过它来获取q接Q归q连接,另一斚wq接又需要从数据里获取连接,归还q接?/p>
步骤1Q系l启?/p>
pȝ启动Ӟ初始化连接池Q由于没有Q何请求连接池中连接数??/p>
maxActive="5" 表示q发情况下最大可从连接池中获取的q接数。如果数据库不是单独Q供一个应用用,通过讄maxActive参数可以避免某个应用无限制的获取q接对其他应用造成影响Q如果一个数据库只是用来支持一个应用那么maxActive理论上可以设|成该数据库可以支撑的最大连接数。maxActive只是表示通过q接池可以ƈ发的获取的最大连接数?/p>
从图上我们可以看到连接的获取与释放是双向Q当应用E序q发hq接池时Q连接池需要从数据库获取连接,那么但应用程序用完q接q将q接归还l连接池Ӟq接池是否也同时连接归q给数据库呢Q很昄{案是否定的Q如果那L话连接池变得多此一举,不但不能提高性能Q反而会降低性能Q那么但应用成归q连接后Q连接池如何处理呢? maxIdle="3" 如果在ƈ发时辑ֈ了maxActive=5Q那么连接池必M数据库中获取5个连接来供应用程序用,当应用程序关闭连接后Q由于maxIdle=3,因此q不是所有的q接都会归还l数据库Q将会有3个连接保持在q接池种中,状态ؓI闲?/p>
minIdle=”2” 最默认情况下q不生效Q它的含义是当连接池中的q接有minIdleQ系l监控线E将启动补充功能Q一般情况下我们q不启动补充U程?/p>
问题Q如何设|maxActive和maxIdleQ?/strong> 理论上讲maxActive应该讄成应用的最大ƈ发数Q这样一来即便是在最大ƈ发的情况下,应用依然能够从连接池中获取连接,但是困难时的是我们很隑և估计到最大ƈ发数Q设|成最大ƈ发数是一U最优的服务质量保证Q事实上Q如果某个用L录提C系l繁忙,那么在他再次dӞ可能pȝ资源已经充Q对于拜特资金管理系l我们徏议将maxActive讄为系l注册h数的十分之一C十分之一之间。例如系l的注册人数?000Q那么设|成50-100靠近100的数字,例如85?0?/p>
50-100中靠q?0的数字,例如55。这样就能在兼顾最大ƈ发同Ӟ保持较少的数据库q接Q而且在绝大多情况Q能够ؓ应用E序提供最快的相应速度?/p>
testOnBorrow="true" validationQuery="select count(*) from bt_user" 我们知道数据库连接从本质上架构在tcp/ipq接之上Q一般情况下web服务器与数据库服务器都不在同一台物理机器上Q而是通过|络q行q接Q那么当建立数据库连接池的机器与数据库服务器自己出现|络异常Ӟ保持在连接池中的q接失效,不能够在ơ用,传统的情况下只能通过重新启动Q再ơ徏立连接,通过讄以上两个参数Q但应用E序从连接池中获取连接时Q会首先q行zd性检,当获取的q接是活动的时候才会给应用E序使用Q如果连接失效,q接释放该q接?strong>validationQuery是一条测试语句,没有实际意义Q现实中Q一般用一条最为简单的查询语句充当?/p>
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" 有时_心的程序编写者在从连接池中获取连接用后忘记了连接的关闭Q这栯池的q接׃逐渐辑ֈmaxActive直至q接池无法提供服务。现代连接池一般提供一U?#8220;”的检查,但设|了removeAbandoned="true"Ӟ当连接池q接数到?getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时便会启动连接回Ӟ那种zd旉过removeAbandonedTimeout="60"的连接将会被回收Q同时如?strong>logAbandoned="true"讄为true,E序在回收连接的同时会打印日志?strong>removeAbandoned是连接池的高U功能,理论上这中配|不应该出现在实际的生环境Q因为有时应用程序执行长事务Q可能这U情况下Q会被连接池误回Ӟ该种配置一般在E序试阶段Qؓ了定位连接泄漏的具体代码位置Q被开启,生环境中连接的关闭应该靠程序自׃证?/p> 所以我们需要做的就是: 2、系l部|到TOMCATQ访问时IE栏出?span xml:lang="EN-US" style="word-wrap: normal; word-break: normal; line-height: 21px; ">TOMCAT的小猫图?span xml:lang="EN-US" style="word-wrap: normal; word-break: normal; line-height: 21px; "> 同样如果部v?span xml:lang="EN-US" style="word-wrap: normal; word-break: normal; line-height: 21px; ">webapps下面的也一样处理?br />3、或者直接在tomcat安装跟目录下放一个命名ؓtomcat.ico文g的图标,所有项目将引用q个图标。(我暂旉用的q种方式Q?/span> linux安装配置jdk1.5、tomcat5.5、eclipse3.2、Myeclipse calendar.setTime(new Date()); 在JSP/Servlet中主要有以下几个地方可以讄~码QpageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding("UTF-8")Q其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet中?/p>
1、pageEncoding="UTF-8"的作用是讄JSP~译成Servlet时用的~码?/p>
众所周知QJSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP~译器在JSP文g~译成Servlet时用的~码。通常Q在JSP内部定义的字W串Q直接在JSP中定义,而不是从览器提交的数据Q出Cؕ码时Q很多都是由于该参数讄错误引v的。例如,你的JSP文g是以GBK为编码保存的Q而在JSP中却指定pageEncoding="UTF-8"Q就会引起JSP内部定义的字W串Zؕ码?/p>
另外Q该参数q有一个功能,是在JSP中不指定contentType参数Q也不用response.setCharacterEncodingҎӞ指定Ҏ务器响应q行重新~码的编码?/p>
2、contentType="text/html;charset=UTF-8"的作用是指定Ҏ务器响应q行重新~码的编码?/p>
在不使用response.setCharacterEncodingҎӞ用该参数指定Ҏ务器响应q行重新~码的编码。服务器在将数据发送到览器前Q对数据q行重新~码Ӟ使用的就是该~码?/p>
3、request.setCharacterEncoding("UTF-8")的作用是讄对客Lhq行重新~码的编码?/p>
该方法用来指定对览器发送来的数据进行重新编码(或者称码)Ӟ使用的编码?/p>
4、response.setCharacterEncoding("UTF-8")的作用是指定Ҏ务器响应q行重新~码的编码?/p>
服务器在数据发送到览器前Q对数据q行重新~码Ӟ使用的就是该~码?/p>
其次Q要说一说浏览器是怎么样对接收和发送的数据q行~码?/p>
response.setCharacterEncoding("UTF-8")的作用是指定Ҏ务器响应q行重新~码的编码。同Ӟ览器也是根据这个参数来对其接收到的数据q行重新~码Q或者称码)。所以在无论你在JSP中设|response.setCharacterEncoding("UTF-8")或者response.setCharacterEncoding("GBK")Q浏览器均能正确昄中文Q前提是你发送到览器的数据~码是正的Q比如正设|了pageEncoding参数{)。读者可以做个实验,在JSP中设|response.setCharacterEncoding("UTF-8")Q在IE中显C面Ӟ在IE的菜单中选择"查看(V)"à"~码(D)"中可以查看到? UnicodeQUTF-8Q?Q而在在JSP中设|response.setCharacterEncoding("GBK")Q在IE中显C面Ӟ在IE的菜单中选择"查看(V)"à"~码(D)"中可以查看到?体中文(GB2312Q??/p>
览器在发送数据时Q对URL和参Cq行URL~码Q对参数中的中文Q浏览器也是使用response.setCharacterEncoding参数来进行URL~码的。以癑ֺ和GOOGLEZQ如果你在百度中搜烦"汉字"Q百度会其~码?%BA%BA%D7%D6"。而在GOOGLE中搜?汉字"QGOOGLE会将其编码ؓ"%E6%B1%89%E5%AD%97"Q这是因为百度的response.setCharacterEncoding参数为GBKQ而GOOGLE的的response.setCharacterEncoding参数为UTF-8?/p>
览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP面的response.setCharacterEncoding参数Q或者contentType和pageEncoding参数Q,我们U其为浏览器~码。当Ӟ在IE中可以修Ҏ览器~码Q在IE的菜单中选择"查看(V)"à"~码(D)"中修改)Q但通常情况下,修改该参C使原本正的面中出Cؕ码。一个有的例子是,在IE中浏览GOOGLE的主|Q将览器编码修改ؓ"体中文(GB2312Q?Q此Ӟ面上的中文会变成ؕ码,不理它,在文本框中输?汉字"Q提交,GOOGLE会将其编码ؓ"%BA%BA%D7%D6"Q可见,览器在对中文进行URL~码Ӟ使用的就是浏览器~码?/p>
弄清了浏览器是在接收和发送数据时Q是如何Ҏ据进行编码的了,我们再来看看服务器是在接收和发送数据时Q是如何Ҏ据进行编码的?/p>
对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据q行~码?/p>
对于接收数据Q要分三U情c一U是览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据?/p>
因ؓ各种WEB服务器对q三U方式的处理也不相同Q所以我们以Tomcat5.0Z?/p>
无论使用那种方式提交Q如果参C包含中文Q浏览器都会使用当前览器编码对其进行URL~码?/p>
对于表单中POST方式提交的数据,只要在接收数据的JSP中正request.setCharacterEncoding参数Q即对客户端请求进行重新编码的~码讄成浏览器~码Q就可以保证得到的参数编码正。有写读者可能会问,那如何得到浏览器~码呢?上面我们提过了,在默认请情况下,览器编码就是你在响应该h的JSP面中response.setCharacterEncoding讄的倹{所以对于POST表单提交的数据,在获得数据的JSP面中request.setCharacterEncoding要和生成提交该表单的JSP面的response.setCharacterEncoding讄成相同的倹{?/p>
对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设|request.setCharacterEncoding参数是不行的Q因为在Tomcat5.0中,默认情况下用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码Q,而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码Q。要解决该问题,应该在Tomcat的配|文件的Connector标签中设|useBodyEncodingForURI或者URIEncoding属性,其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下Q该参数为falseQTomcat4.0中该参数默认为trueQ;URIEncoding参数指定Ҏ有GET方式hQ包括URL提交的数据和表单中GET方式提交的数据)q行l一的重新编码(解码Q的~码。URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据q行l一的重新编码(解码Q,而useBodyEncodingForURI则是Ҏ响应该请求的面的request.setCharacterEncoding参数Ҏ据进行的重新~码Q解码)Q不同的面可以有不同的重新~码Q解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改URIEncoding参数为浏览器~码或者修改useBodyEncodingForURI为trueQƈ且在获得数据的JSP面中request.setCharacterEncoding参数讄成浏览器~码?/p>
下面ȝ下,以Tomcat5.0为WEB服务器时Q如何防止中文ؕ码?/p>
1?对于同一个应用,最好统一~码Q推荐ؓUTF-8Q当然GBK也可以?/p>
2?正确讄JSP的pageEncoding参数 3?在所有的JSP/Servlet中设|contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8")Q从而间接实现对览器编码的讄?/p>
4?对于hQ可以用过滤器或者在每个JSP/Servlet中设|request.setCharacterEncoding("UTF-8")。同Ӟ要修改Tomcat的默认配|,推荐useBodyEncodingForURI参数讄为trueQ也可以URIEncoding参数讄为UTF-8Q有可能影响其他应用Q所以不推荐Q?/p>
<!------------------------ 有时候,我们必须把用户密码存攑ֈ数据库,Z安全赯Q我们需要对q些密码q行单向的加密处理, 应用报文摘要ҎQ得到单向的加密字符? //MD5?6?SHA?0位(q是两种报文摘要的算法) 注意Q?br />
byte[] digest = messageDigest.digest(); 也可以把digest的每个byte转化成hexQ?6q制Q保存?br />
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1"); 或者: 或? q里指定了get时候的数据~码。但是,当用IIS作ؓwebserver转发servlet/jsphlTomcat时候,q个讄却失效了。其实原因很单:IIS是通过AJP协议Q把h转发到Tomcat监听?009端口上的Q所以这里针?080的设|自然就无效了。正的Ҏ是进行下面的讄Q? 虽然是小问题Q却׃我几个小时才惛_?nbsp;
reloadable="false">
<Resource
name="jdbc/btdb1"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
username="v10"
password="v10"
maxActive="5"
maxIdle="3"
maxWait="5000"
removeAbandoned="true"
validationQuery="select count(*) from bt_user"
logAbandoned="true"
/>
</Context>
数据库连接相?/strong>
password="v10"
jndi相关
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
q接数控制与q接归还{略
maxActive="5"
maxWait="5000"
应对|络不稳定的{略
validationQuery="select count(*) from bt_user"
应对q接泄漏的策?/strong>
removeAbandoned="true"
logAbandoned="true"
maxIdle对应的连接,实际上是q接池保持的长连接,q也是连接池发挥优势的部分,理论上讲保持较多的长q接Q在应用h时可以更快的响应Q但是过多的q接保持Q反而会消耗数据库大量的资源,因此maxIdle也ƈ不是大好Q同上例我们?strong>maxIdle讄?/p>
js中:encodeURI(str).replace(/\+/g,'%2B')
java中:str.replaceAll("\\+","%2B")
]]>
public class Test {
public static String compare(BigDecimal val1, BigDecimal val2) {
String result = "";
if (val1.compareTo(val2) < 0) {
result = "W二位数大!";
}
if (val1.compareTo(val2) == 0) {
result = "两位C样大Q?;
}
if (val1.compareTo(val2) > 0) {
result = "W一位数大!";
}
return result;
}
public static void main(String[] args) {
String a = "200.5"; String b = "1000";
BigDecimal data1 = new BigDecimal(a);
BigDecimal data2 = new BigDecimal(b);
System.out.print(compare(data1, data2));
}
}
]]>
javascritpt的应用:
var patrn=/^(-)?(([1-9]{1}\d*)|([0]{1}))(\.(\d){1,2})?$/;
if (!patrn.exec('-012312123.23')) {
alert('false');
}else{
alert('true');
}
解读/^(-)?(([1-9]{1}\d*)|([0]{1}))(\.(\d){1,2})?$/
^表示以什么开?我们q里?- Q后面的Q是表示“-”出现一ơ或者零?/span>
(([1-9]{1}\d*)|([0]{1})) 表示不以0开头的数字l合或者仅出现一?
(\.(\d){1,2})?表示数点后两位Q出?ơ或者一?/span>
必须是大?的金额正则表辑ּQ?/span>
var patrn=/^(([1-9]{1}\d*)|([0]{1}))(\.(\d){1,2})?$/;
Java里的应用Q?/span>
Pattern pattern = Pattern.compile("^(-)?(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){1,2})?$");
Matcher matcher = pattern.matcher("-0.11");
System.out.println(matcher.matches());
]]>
后来把项目改成GB2312~码Qget方式提交可以得到正常的中文。后来通过癑ֺ和googl的编码得C启发。百度中输入中文搜烦Qurl中显C的是中文。google输入中文q行搜烦Qurl中显C的是带%的编码。说明百度用的是GB2312~码Q中文可以正常解析。google用的是UTF-8~码Q所以需要对中文q行转码?br />
下面是我目中的解决ҎQ?br />1、在h面中把中文参数q行转码
如:String content="试短信";
2、在接收参数的响应页面进行中文参数的解码
如:String message= URLDecoder.decode(request.getParameter,"UTF-8");
l过q次的问题,个h认ؓq是用GB2312~码比较省事?/div>
]]>
]]>
包括安装jdk1.5Qtomcat5.5Qeclipse3.2QMyeclipse5.1到配|搭建成功?
W一步:下蝲所要的Y?
下蝲jdk1.5?
下蝲tomcat5.5?
下蝲eclipse3.2?
下蝲Myeclipse5.1
W二步:安装已下载Y?
假设你将上诉所要下载的软g全部从光盘拷贝或者通过pc机ftp到linux服务器上传到/home/user/Downloads目录下?
首先要安装jdk1.5
1. 打开l端Q运行命令su root 切换到超U用戗?
2.cd切换?home/user/Downloads目录下。运行命?cp jdk-1_5_0_12-linux-i586.bin /usr/localjdk复制?usr/local目录下?
3.cd切换?usr/local目录下。运行命?chmod a+x jdk-1_5_0_12-linux-i586.binl於相应权限?
4.q行命o ./jdk-1_5_0_12-linux-i586.bin {待Q按提示安装jdkQ假讑֮装在/usr/local目录下。jdk安装完成?
然后安装tomcat5.5
1.cd切换?home/user/Downloads目录下。运行命令cp apache-tomcat-5.tar.gz /usr/local其拯?usr/local目录下?
2.cd切换?usr/local目录下。运行命令tar xvfz apache-tomcat-5.tar.gz其?usr/local目录中解压。tomcat5.5安装完成?
安装eclipse3.2
1.cd切换?home/user/Downloads目录下。运行命令cp eclipse-SDK-3.2.2-linux-gtk.tar.gz /usr/local其拯?usr/local目录下?
2.cd切换?usr/local目录下。运行命令tar xvfz eclipse-SDK-3.2.2-linux-gtk.tar.gz 其解压。eclipse3.2安装完成?
安装Myeclipse5.1
1.cd切换?home/user/Downloads目录下。运行命令cp MyEclipseEnterprise(Linux)WorkbenchInstaller_5_1_0GA_E3_2_1.bin /usr/local其拯?usr/local目录下?
2.cd切换?usr/local目录下。运行命令chmod +x MyEclipseEnterprise(Linux)WorkbenchInstaller_5_1_0GA_E3_2_1.bin ,然后q行$./M*.bin 安装q程中会提示选择Eclipse安装目录Q按照你实际的Eclipse安装目录q行选择卛_。Myeclipse安装完成?
到此步骤Q安装Y件已l完成了Q但是还不能q行Q还要进行配|?
W三步:配置环境变量
首先q行命o vi /etc/profile 出现profile文g源代码?
按键盘子?#8220;i”q入插入模式?
在profile文g中插入以下代码:
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:/usr/local/java/lib:/usr/local/java/jre/lib:$CLASSPATH
export TOMCAT_HOME=/usr/local/tomcat
我得源文件代码是q样Q?
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
}
# Path manipulation
#if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
#fi
pathmunge /usr/X11R6/bin after
unset pathmunge
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
HOSTNAME=`/bin/hostname`
HISTSIZE=1000
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
INPUTRC=/etc/inputrc
fi
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:/usr/local/java/lib:/usr/local/java/jre/lib:$CLASSPATH
export TOMCAT_HOME=/usr/local/tomcat
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
unset i
export G_BROKEN_FILENAMES=true
黑体字部分是插入代码?
插入完成后按“ESC”健。在按大写的子母“ZZ”。保存退出?
环境变量配置完成后,可以做以下策试?
q行命ojava -versionQ出现jdk版本和相关信息,证明jdk已经OK了?
cd切换?opt/tomcat/bin目录下,q行命o ./startup.shQ出现如下信息:
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr/java/jre1.5.0_05
证明安装成功。如果以上策试没成功的话Q请仔细查环境变量的配置?
到此步骤为止Q已l成功的配置完成了jdk和tomcat。该是配|我们eclipse的时候了?/div>
]]>
1.java.util.Calendar
Calendar cL一个抽象类Q它为特定瞬间与一l诸?YEAR、MONTH、DAY_OF_MONTH、HOUR {?日历字段之间的{换提供了一些方法,qؓ操作日历字段Q例如获得下星期的日期)提供了一些方法。瞬间可用毫U值来表示Q它是距历元Q即格林威治标准旉 1970 q?1 ?1 日的 00:00:00.000Q格里高利历Q的偏移量?
?
Java代码
1. Calendar cal = Calendar.getInstance();//使用默认时区和语a环境获得一个日历?nbsp;
2. cal.add(Calendar.DAY_OF_MONTH, -1);//取当前日期的前一?
3.
4. cal.add(Calendar.DAY_OF_MONTH, +1);//取当前日期的后一?
5.
6. //通过格式化输出日?nbsp;
7. java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
8.
9. System.out.println("Today is:"+format.format(Calendar.getInstance().getTime()));
10.
11. System.out.println("yesterday is:"+format.format(cal.getTime()));
得到2007-12-25日期:
Java代码
1. Calendar calendar = new GregorianCalendar(2007, 11, 25,0,0,0);
2. Date date = calendar.getTime();
3. System.out.println("2007 Christmas is:"+format.format(date));
java月䆾是从0-11,月䆾讄时要?.
GregorianCalendar构造方法参CơؓQ年Q月-1Q日Q时Q分Q秒.
取日期的部分:
Java代码
1. int year =calendar.get(Calendar.YEAR);
2.
3. int month=calendar.get(Calendar.MONTH)+1;
4.
5. int day =calendar.get(Calendar.DAY_OF_MONTH);
6.
7. int hour =calendar.get(Calendar.HOUR_OF_DAY);
8.
9. int minute =calendar.get(Calendar.MINUTE);
10.
11. int seconds =calendar.get(Calendar.SECOND);
取月份要?.
判断当前月䆾的最大天?
Java代码
1. Calendar cal = Calendar.getInstance();
2. int day=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
3. System.out.println(day);
2.java.util.Date
Java代码
1. java.util.Date today=new java.util.Date();
2. System.out.println("Today is "+formats.format(today));
取当月的W一?
Java代码
1. java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-01");
2. java.util.Date firstDay=new java.util.Date();
3. System.out.println("the month first day is "+formats.format(firstDay));
取当月的最后一?
Java代码
1.
2. Calendar cal = Calendar.getInstance();
3. int maxDay=cals.getActualMaximum(Calendar.DAY_OF_MONTH);
4. java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM-"+maxDay);
5. System.out.println(formatter3.format(cal.getTime()));
求两个日期之间相隔的天数:
Java代码
1. java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
2. java.util.Date beginDate= format.parse("2007-12-24");
3. java.util.Date endDate= format.parse("2007-12-25");
4. long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);
5. System.out.println("盔R的天?"+day);
一q前的日?
Java代码
1. java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");
2. java.util.Date todayDate=new java.util.Date();
3. long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;
4. todayDate.setTime(beforeTime*1000);
5. String beforeDate=formatter.format(todayDate);
6. System.out.println(beforeDate);
一q后的日?
Java代码
1. java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");
2. java.util.Date todayDate=new java.util.Date();
3. long afterTime=(todayDate.getTime()/1000)+60*60*24*365;
4. todayDate.setTime(afterTime*1000);
5. String afterDate=formatter.format(todayDate);
6. System.out.println(afterDate);
?0时后的旉
Java代码
1. java.util.Calendar Cal=java.util.Calendar.getInstance();
2. Cal.setTime(dateOper);
3. Cal.add(java.util.Calendar.HOUR_OF_DAY,10);
4. System.out.println("date:"+forma.format(Cal.getTime()));
?0时前的旉
Java代码
1. java.util.Calendar Cal=java.util.Calendar.getInstance();
2. Cal.setTime(dateOper);
3. Cal.add(java.util.Calendar.HOUR_OF_DAY,-10);
4. System.out.println("date:"+forma.format(Cal.getTime()));
3.java.sql.Date
l承自java.util.Date,是操作数据库用的日期cd
Java代码
1. java.sql.Date sqlDate = new java.sql.Date(java.sql.Date.valueOf("2007-12-25").getTime());
日期比较:单的比较可以以字W串的Ş式直接比?也可使用
java.sql.Date.valueOf("2007-03-08").compareTo(java.sql.Date.valueOf("2007-03-18"))方式来比较日期的大小.也可使用java.util.Date.after(java.util.Date)来比?
相差旉Q?
long difference=c2.getTimeInMillis()-c1.getTimeInMillis();
相差天数Qlong day=difference/(3600*24*1000)
相差时Qlong hour=difference/(3600*1000)
相差分钟Qlong minute=difference/(60*1000)
相差U: long second=difference/1000
补充Q?
Java代码
1. DateFormat df=new SimpleDateFormat("yyyy-MM-dd EE hh:mm:ss");
2. System.out.println(df.format(new Date()));
3. Date date = new Date();
4. DateFormat shortDate=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
5. DateFormat mediumDate =DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
6. DateFormat longDate =DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
7. DateFormat fullDate =DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
8.
9. system.out.println(shortDate.format(date));
10. System.out.println(mediumDate.format(date));
11. System.out.println(longDate.format(date));
12. System.out.println(fullDate.format(date));
13.
14. 08-4-15 下午3:24
15. 2008-4-15 15:24:31
16. 2008q??5?下午03?4?1U?nbsp;
17. 2008q??5?星期?下午03?4?1UCST
18.
19.
20. Calendar c = Calendar.getInstance();
21.
22. c.add(Calendar.MONTH, 1); // 目前時間?個月
23. System.out.println(df.format(c.getTime()));
24.
25. c.add(Calendar.HOUR, 3); // 目前時間?時
26. System.out.println(df.format(c.getTime()));
27.
28. c.add(Calendar.YEAR, -2); // 目前時間?q?nbsp;
29. System.out.println(df.format(c.getTime()));
30.
31. c.add(Calendar.DAY_OF_WEEK, 7); // 目前的時間加7?nbsp;
32. System.out.println(df.format(c.getTime()));
]]>
]]>
String year = String.valueOf(calendar.get(Calendar.YEAR));
String month = String.valueOf(calendar.get(Calendar.MONTH)+1);
String day = String.valueOf(calendar.get(Calendar.DATE));
String hour = String.valueOf(calendar.get(Calendar.HOUR));
String minute = String.valueOf(calendar.get(Calendar.MINUTE));
String second = String.valueOf(calendar.get(Calendar.SECOND));
System.out.println(year+month+day+hour+minute+second);
]]>
]]>
比如Q有明文密码如下Q?br />
String originalPwd = "mypassword";
//MessageDigest md= MessageDigest.getInstance("MD5");
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
messageDigest.update(originalPwd.getBytes());
//String digestedPwdString = new String(messageDigest.digest());
String digestedPwdString = new String(Base64.encode(messageDigest.digest()));
System.out.println("pwd:" + digestedPwdString);
q样Q就得到密码的报文摘要,把此摘要保存到数据库Q?br />
以后用户登陆Ӟ用相同的法出摘要Q和数据库中的比较,如果一_则密码正?
得到的是个二q制byte数组Q有可能某些byte是不可打印的字符?br />
所以用Base64.encode把它转化成可打印字符?
messageDigest.update(originalPwd.getBytes());
byte[] bin = messageDigest.digest()Q?br />
再调用下面的Ҏ生hexQ?6q制Q保存?
二行制{hex字符串的Ҏ如下Q?br />
private static String byte2hex(byte[] b){
String hs="";
String stmp="";
for (int n=0; n<b.length; n++){
stmp=(java.lang.Integer.toHexString(b[n] & 0xFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
}
return hs;
}
private static String byto2hex2(byte[] bin){
StringBuffer buf = new StringBuffer();
for (int i = 0; i < bin.length; ++i) {
int x = bin[i] & 0xFF, h = x >>> 4, l = x & 0x0F;
buf.append((char) (h + ((h < 10) ? '0' : 'a' - 10)));
buf.append((char) (l + ((l < 10) ? '0' : 'a' - 10)));
}
return buf.toString();
}
q脆直接用下面的Ҏ生成Q用到第三方包:
public static String encryptPwd(String pwd, String algorithm){
//String a = org.apache.catalina.realm.RealmBase.Digest(pwd,"SHA-1");
return org.apache.catalina.realm.RealmBase.Digest(pwd, algorithm);
}
]]>
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>
]]>
解决办法Q在昄中文字符串前加上 request.setCharacterEncoding("gbk");
或?在获取字W串str后用str = new String(str.getBytes("ISO-8859-1"),"GB2312");转换
ISO-8859-1是默认的字符~码
解决办法Q?/p>
1、项目已打包到web服务器:
扑ֈ %TOMCAT_HOME%\conf\server.xml文gQ将此文件的代码D|֊ ?nbsp;URIEncoding="gbk"Q结果如下所C:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk"/>
2、开发过E中Q?/p>
扑ֈ %project_name%\Tomcat\conf\server.xml文gQ删除文件中的备注,增加URIEncoding="gbk"Q结果如下所C:
<Connector acceptCount="10" connectionTimeout="60000" maxThreads="75" minSpareThreads="5" port="8080" URIEncoding="gbk"/>
二、处理响应结果的q..
1.在servlet?response.setContentType("text/html;charset=GB2312");
2.在jsp?<%@page contentType="text/html;charset=GB2312"%>
3.在html?<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=GB2312"></head>
一、提交中文是使用javascript的函敎ͼencodeURIComponent()q行~码Q?br />例如Q?br />String
param=encodeURIComponet("param"); public test_father() {
System.out.println("father");//构造器
}
public void test_father() {
System.out.println("father");//重蝲
}
public int test_father(int i) {
System.out.println("fatherii"+i);
return i;//重蝲
}
}
test_subc:
public class test_sub extends test_father{//l承
public test_sub() {
System.out.println("test_sub");//构造器
}
public void test_father() {
System.out.println("sub");//重写父类Ҏ
}
public int test_father(int i) {
System.out.println("subii"+i);
return i;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
test_father fa=new test_sub();//多?br /> fa.test_father();
fa.test_father(3);
}
}
输出l果Q?br />father
test_sub
sub
subii3
q段代码是jsp中调用的写法。在servlet面中可以用request.getparameter()的方法直接得Cq去的参敎ͼ然后调用servletE序中的doget()Ҏ。在doget()Ҏ中进行业务处理,然后把处理结果以字符串的形式q回。在servletE序中的输出方式是:
year=(myyear > 200) ? myyear : 1900 + myyear;
if(myweekday == 0)
weekday=" 星期?";
else if(myweekday == 1)
weekday=" 星期一 ";
else if(myweekday == 2)
weekday=" 星期?";
else if(myweekday == 3)
weekday=" 星期?";
else if(myweekday == 4)
weekday=" 星期?";
else if(myweekday == 5)
weekday=" 星期?";
else if(myweekday == 6)
weekday=" 星期?";
document.write("<font color=#ff0000>北京旉 "+year+"q?+mymonth+"?+myday+"?"+weekday+"</font>");
</SCRIPT>
输出l果Q?br />北京旉 2006q?2?8?星期一
三、用ASP代码写日?br />
<%
Response.write FormatDateTime(Date, 1)
MyWeekDay= Weekday(date)
If MyWeekDay=1 Then
MyWeekDay_result=" 星期?"
ElseIf MyWeekDay=2 Then
MyWeekDay_result=" 星期一 "
ElseIf MyWeekDay=3 Then
MyWeekDay_result=" 星期?"
ElseIf MyWeekDay=4 Then
MyWeekDay_result=" 星期?"
ElseIf MyWeekDay=5 Then
MyWeekDay_result=" 星期?"
ElseIf MyWeekDay=6 Then
MyWeekDay_result=" 星期?"
ElseIf MyWeekDay=7 Then
MyWeekDay_result=" 星期?"
End If
Response.write MyWeekDay_result
%>
输出l果Q?font color="#000000">2006q?2?8?星期一
public class DisplayDate {
public static void main(String[] args){
Date today;
Calendar now;
DateFormat f1,f2;
String s1,s2;
System.out.println("\n昄Datecȝ相关用法");
today = new Date();
System.out.println("new Date()= \t"+ today);
System.out.println("\n用DateFormatcLC各U日期格?);
//昄各种日期格式
f1 = DateFormat.getDateInstance();
s1 = f1.format(today);
System.out.println("DateFormat.getDateInstance()= \t"+s1);
f1 = DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);
s1 = f1.format(today);
System.out.println("DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)= \t"+ s1);
f1 = DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);
s1 = f1.format(today);
System.out.println("DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= \t"+ s1);
f1 = DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA);
s1 = f1.format(today);
System.out.println("DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)= \t" + s1);
System.out.println("\n用DateFormatcLC各U时间格?);
//昄各种旉格式
f1 = DateFormat.getTimeInstance();
s1 = f1.format(today);
System.out.println("DateFormat.getTimeInstance()= \t"+s1);
f1 = DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA);
s1 = f1.format(today);
System.out.println("DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)= \t"+s1);
f1 = DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);
s1 = f1.format(today);
System.out.println("DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= \t"+s1);
f1 = DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA);
s1 = f1.format(today);
System.out.println("DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= \t"+s1);
System.out.println("\n昄Calendar的相x间用?);
now = Calendar.getInstance();
today = now.getTime();
System.out.println("Calendar.getInstance().getTime()= \t"+ today.toString());
}
}
E序q行l果昄如下Q?/p>
昄Datecȝ相关用法
new Date()= Fri May 02 13:29:32 CST 2003
用DateFormatcLC各U日期格?br />DateFormat.getDateInstance()= 2003-5-2
DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)= 2003q???br />DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= 2003-5-2
DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)= 03-5-2
用DateFormatcLC各U时间格?br />DateFormat.getTimeInstance()= 13:29:32
DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)= 下午01?9?2U?br />DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= 13:29:32
DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= 下午1:29
昄Calendar的相x间用?br />Calendar.getInstance().getTime()= Fri May 02 13:29:33 CST 2003
<object classid=CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95
codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701
height=180 id=NSPlay type=application/x-oleobject width=240
VIEWASTEXT standby="加蝲 Microsoft Windows Media Player lg...">
<param name="FileName" value=" <param name="AutoStart" value="true"><!--是否自动播放-->
<param name="AutoRewind" value="-1">
<param name="AnimationAtStart" value="false">
<param name="ShowControls" value="false"><!--是否昄控制,比如播放,停止,暂停-->
<param name="ClickToPlay" value="false">
<param name="EnableContextMenu" value="true"> <!--是否用右键弹单控?->
<param name="EnablePositionControls" value="false">
<param name="Balance" value="0">
<param name="ShowStatusBar" value="false"><!--当前播放信息,昄是否正在播放,及L放时间和当前播放到的旉-->
<param name="AutoSize" value="0"> <!--是否自动调整播放大小-->
<param name="PlayCount" value="0"><!--播放ơ数Q?为@环播?->
<embed
type="application/x-mplayer2"
pluginspage=" filename src autostart="false"
enablecontextmenu="false"
clicktoplay="false"
enablepositioncontrols="false"
showcontrols="0" showstatusbar="1"
showdisplay="0" width="240" height="180">
</embed>
</object>
<input type="button" onMouseDown="DoFull()" value="全屏昄" style="border-style: ridge; border-width: 1">
</body>
</html>
<script language=javascript>
setTimeout("DoFull()",1000)
</script>
下面q句话可以不要?/p>
<a href="javascript:window.close(self)">q回正常效果昄</a>
- setContextDirectoryQ设|?/span>web应用的根
- setRequestPathInfoQ设|?/span>request的请?/span>
- addRequestParameterQ将参数和对应的值加?/span>request?/span>
- actionPerformQ执行这个请?/span>
- verifyForwardQ验?/span>forward的名字是否正?/span>
- verifyForwardPathQ验?/span>forward?/span>path是否正确
- verifyNoActionErrorsQ验证在action执行q程中没?/span>ActionError产生
- verifyActionErrorsQ验证在action执行q程中生的ActionError集合的内?/span>
具体详细的内容请参见对应?/span>javaDoc?/span>