??xml version="1.0" encoding="utf-8" standalone="yes"?>
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.ClassUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
/**
* commons-lang-2.4.jar 包常用方法集?br />
*
*/
public class CommonsLang {
public static void main(String[] args) {
String[] test = {"33", "ddffd"};
String[] test1 = {"ddffd", "33"};
// 1.判断两个数据是否相等
System.out.println(ArrayUtils.isEquals(test, test1));
// 2.{33,ddffd} 数l内容以{,}形式输出Q?br />
System.out.println(ArrayUtils.toString(test));
Map map = ArrayUtils.toMap(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });
// 3.toMap 一个数l,但每个元?Each element of the array
// must be either a {@link java.util.Map.Entry} or an Array,
// 方式一 下面是遍历map的方式,取得其keySet.iterator();
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
// it.next()只包含key
System.out.println("key:" + key + "value:" + map.get(key));
}
// 方式?取得其entrySet()集合,
Iterator it1 = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it1.next();
// it1.next()中包含key和value
System.out.println("key :" + entry.getKey() + "value :" + entry.getValue());
}
// 4.取得cd
System.out.println(ClassUtils.getShortClassName(Test.class));
// 取得其包?br />
System.out.println(ClassUtils.getPackageName(Test.class));
// 5.NumberUtils
System.out.println(NumberUtils.stringToInt("6"));
System.out.println(NumberUtils.stringToInt("7", 10));
// 6.五位的随机字母和数字
System.out.println(RandomStringUtils.randomAlphanumeric(5));
// 7.StringEscapeUtils
System.out.println(StringEscapeUtils.escapeHtml("<html>"));
// 输出l果?amp;lt;html>
System.out.println(StringEscapeUtils.escapeJava("String"));
// 8.StringUtils,判断是否是空格字W?br />
System.out.println(StringUtils.isBlank(" "));
// 数l中的内容以,分隔
System.out.println(StringUtils.join(test, ","));
// 在右边加下字W?使之总长度ؓ(f)6
System.out.println(StringUtils.rightPad("abc", 6, 'T'));
// 首字母大?br />
System.out.println(StringUtils.capitalize("abc"));
// Deletes all whitespaces from a String 删除所有空?br />
System.out.println(StringUtils.deleteWhitespace(" ab c "));
// 判断是否包含q个字符
System.out.println(StringUtils.contains("abc", "ba"));
// 表示左边两个字符
System.out.println(StringUtils.left("abc", 2));
System.out.println(StringUtils.right("abcd", 3));
}
}
虽然用telnetq样的程序都可把面取回来,但是在与web服务器的交互中,如果涉及(qing)cookie或https或ssl{内容,一般功能相对完备的http客户端还是非常必要的。IE或NetScape{浏览器实不错Q可是如果ؓ(f)实现持箋(hu)互动而在E序调用览器,我个为其中的工作量还是不的Q这q没考虑版权问题。最好的办法Q就是能有一个开源的包,能实现http客户端的功能Q供我们开发的E序调用?a >httpclient是q么一个包Q我怿可能有比它的实现更好的,但目前我只关注这个。:(x)Q?br />
下面是nogoop做的功能比较表:(x)
Features | nogoop | Sun JRE < 1.4.2 | Sun JRE 1.4.2 | Innovation | Apache/Jakarta |
cookies | X | X | |||
plug compatible | X | X | X | X | [partial] |
true request output stream | X | X | |||
true response input stream | X | X | X | ||
connection keep alive | X | X | X | X | X |
connection pool throttling | X | X | |||
connection/request timeout | X | X [uns] | X | X | |
idle connection timeout | X | X | |||
pipelining of requests | X | ||||
alternate DNS resolution (dnsjava) | X | ||||
SSL | X | X | X | X | X |
basic authentication | X | X | X | X | X |
digest authentication | X | X | X | X | X |
NTLM authentication | X | [Windows only] | X | ||
proxy authentication | X | X | X | X | X |
minimum JRE version | 1.2 | 1 | 01q???/td> | 1.2 | 1.2 |
price | $499 | free | free | free | free |
source available | X | X | X | ||
diagnostic tracing | X | X | X | ||
actively supported | X | X | X | X | |
fix turnaround | fast | slow | slow | none | medium |
license | purchase | Sun JRE | Sun JRE | LGPL | Apache |
对jre1.3.*Q如果要HttpClient支持httpsQ则需要下载ƈ安装jsse?a >jce.安装的步骤如下:(x)
1)下蝲jsse和jce.
2)(g)查CLASSPATH中没有与jsse和jce相关的jar?br />
3)?US_export_policy.jar、local_policy.jar、jsse.jar、jnet.jar、jce1_2_x.jar、sunjce_provider.jar、jcert.jar复制到目录:(x)
UNIX:$JDK_HOME/jre/lib/ext
Windows:%JDK_HOME%\jre\lib\ext
4)修改下述目录下的java.security文g?br />
UNIX:$JDK_HOME/jre/lib/security/
Windows:%JDK_HOME%\jre\lib\security\
5)
HttpClientq要求安装commons-loggingQ下面跟httpclient一块安装?/p>
~译Q?/p>
在执行方法的q程中,有两U异常,一U是HttpRecoverableExceptionQ表C偶然性错误发生,一般再试可能成功,另一U是IOExceptionQ严重错误?br />
q儿有这个教E中的一个例E,可以下蝲?/p>
HttpClient三种不同的认证方? Basic, Digest and NTLM. q些Ҏ(gu)可用于服务器或代理对客户端的认证Q简U服务器认证或代理认证?br />
1)服务器认?Server Authentication)
HttpClient处理服务器认证几乎是透明的,仅需要开发h员提供登录信?login credentials)。登录信息保存在HttpStatecȝ实例中,可以通过 setCredentials(String realm, Credentials cred)和getCredentials(String realm)来获取或讄。注意,讑֮寚w特定站点讉K所需要的d信息Q将realm参数|ؓ(f)null. HttpClient内徏的自动认证,可以通过HttpMethodcȝsetDoAuthentication(boolean doAuthentication)Ҏ(gu)关闭Q而且q次关闭只媄(jing)响HttpMethod当前的实例?br />
抢先认证(Preemptive Authentication)可以通过下述Ҏ(gu)打开.
在这U模式时QHttpClient?x)主动将basic认证应答信息传给服务器,即在某U情况下服务器可能返回认证失败的应答Q这样做主要是ؓ(f)?jin)减连接的建立。ؓ(f)使每个新建的 HttpState实例都实行抢先认证,可以如下讄pȝ属性?/p>
Httpclient实现的抢先认证遵循rfc2617.
2)代理认证(proxy authentication)
除了(jin)d信息需单独存放以外Q代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)?getProxyCredentials(String realm)设、取d信息?br />
3)认证Ҏ(gu)(authentication schemes)
Basic
是HTTP中规定最早的也是最兼容(?)的方案,遗憾的是也是最不安全的一个方案,因ؓ(f)它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例Q可以指定服务器端的讉KI间或采用默认的d信息?br />
Digest
是在HTTP1.1中增加的一个方案,虽然不如Basic得到的Y件支持多Q但q是有广泛的使用。DigestҎ(gu)比BasicҎ(gu)安全得多Q因它根本就不通过|络传送实际的密码Q传送的是利用这个密码对从服务器传来的一个随机数(nonce)的加密串。它要求一个UsernamePasswordCredentials实例Q可以指定服务器端的讉KI间或采用默认的d信息?br />
NTLM
q是HttpClient支持的最复杂的认证协议。它M$设计的一个私有协议,没有公开的规范说明。一开始由于设计的~陷QNTLM的安全性比Digest差,后来l过一个ServicePack补丁后,安全性则比较Digest高。NTLM需要一个NTCredentials实例. 注意Q由于NTLM不用访问空?realms)的概念,HttpClient利用服务器的域名作访问空间的名字。还需要注意,提供lNTCredentials的用户名Q不要用域名的前~ - ? "adrian" 是正的Q?"DOMAIN\adrian" 则是错的.
NTLM认证的工作机制与basic和digest有很大的差别。这些差别一般由HttpClient处理Q但理解q些差别有助避免在用NTLM认证时出现错误?/p>
׃技术限Ӟ以及(qing)Z?.0发布版API的稳定,HttpClientq(sh)能自动处重定向,但对重定向到同一L、同一端口且采用同一协议的情况HttpClient可以支持。不能自动的处理的情况,包括需要h工交互的情况Q或出httpclient的能力?br />
当服务器重定向指令指C同的LӞHttpClient只是单地重定向状态码作ؓ(f)应答状态。所有的300?99Q包含两端)(j)的返回码Q都表示是重定向应答。常见的有:(x)
当收到简单的重定向时Q程序应从HttpMethod对象中抽取新的URLq将其下载。另?限制一下重定向ơ数是个好的LQ这可以避免递归循环。新的URL可以从头字段Location中抽取,如下Q?/p>
Ҏ(gu)重定向:(x)
一个HTTP协议的请求或应答的头?在http协议中,数据包分Z部分Q一部分是头部,׃些名值对构成Q一部分是主?body)Q是真正传办理的数据Q如HTML面{)(j)Q,必须以US-ASCII~码Q这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookieQ它是数据但是通过头部q行传输的,所以它也要用US-ASCII~码?br />
HTTP数据包的M部分Q可以用M一U方式进行编码,默认是ISO-8859-1Q具体可以用头部字段Content-Type指定。可以利?addRequestHeaderҎ(gu)Q设定编码方式;?getResponseCharSet取得~码方式。对HTML或XML{类型的文档Q它们的本n的Content-Type也可以指定编码方式,主要区分两者的作用范围以得到正实的解码?br />
URL的编码标准,由RFC1738指定为,只能是由可打??字节的us-ascii字符l成Q?0-ff不是us-ascii字符Q?0-1F是控制字W,q两个区域中用的字符都须加以~码(encoded)?br />
HttpClient能自动管理cookie,包括允许服务器设|cookieq在需要的时候自动将cookieq回服务器,它也支持手工讄cookie后发送到服务器端。不q的是,对如何处理cookieQ有几个规范互相冲突QNetscape Cookie 草案, RFC2109, RFC2965Q而且q有很大数量的Y件商的cookie实现不遵循Q何规? Z(jin)处理q种状况QHttpClient提供?jin)策略驱动的cookie理方式。HttpClient支持的cookie规范有:(x)
RFC2965规范暂时没有被HttpClient支持Q在以后的版本ؓ(f)?x)加上?j)Q它定义?jin)cookie版本2Qƈ说明?jin)版?cookie的不IRFC2965有意有久取代rfc2109.
在HttpClient中,有两U方法来指定cookie规范的用,
借助Java Secure Socket Extension (JSSE)QHttpClient全面支持Secure Sockets Layer (SSL)或IETF Transport Layer Security (TLS)协议上的HTTP。JSSE已经jre1.4?qing)以后的版本中,以前的版本则需要手工安装设|,具体q程参见Sun|站或本学习(fn)W记?br />
HttpClient中用SSL非常单,参考下面两个例?
Q如果通过需要授权的代理Q则如下Q?/p>
在HttpClient中定制SSL的步骤如下:(x)
已知的限制和问题
遇到问题的处?br />
很多问题Q特别是在jvm低于1.4Ӟ是由jsse的安装造成的?br />
下面的代码,可作为最l的(g)手Dc(din)?/p>
1、httpclient的多U程处理
使用多线E的主要目的Q是Z(jin)实现q行的下载。在httpclientq行的过E中Q每个http协议的方法,使用一个HttpConnection实例。由于连接是一U有限的资源Q每个连接在某一时刻只能供一个线E和Ҏ(gu)使用Q所以需要确保在需要时正确地分配连接。HttpClient采用?jin)一U类似jdbcq接池的Ҏ(gu)来管理连接,q个理工作?MultiThreadedHttpConnectionManager完成?/p>
此是Qclient可以在多个线E中被用来执行多个方法。每ơ调用HttpClient.executeMethod() Ҏ(gu)Q都?x)去链接理器申请一个连接实例,甌成功q个链接实例被签?checkout)Q随之在链接使用完后必须归还理器。管理器支持两个讄Q?
maxConnectionsPerHost | 每个L的最大ƈ行链接数Q默认ؓ(f)2 |
maxTotalConnections | 客户端dƈ行链接最大数Q默认ؓ(f)20 |
Ҏ(gu)一个HttpClient.executeMethodL一个method.releaseConnection()与之匚w.
HttpClient支持的HTTPҎ(gu)?U,下面分述之?br />
1、Options
HTTPҎ(gu)Options用来向服务器发送请求,希望获得针对p求URL(request url)标志的资源在h/应答的通信q程可以使用的功能选项。通过q个Ҏ(gu)Q客L(fng)可以在采取具体行动之前,可Ҏ(gu)一资源军_采取什么动作和/或以?qing)一些必要条Ӟ或者了(jin)解服务器提供的功能。这个方法最典型的应用,是用来获取服务器支持哪些HTTPҎ(gu)?br />
HttpClient中有一个类叫OptionsMethodQ来支持q个HTTPҎ(gu)Q利用这个类的getAllowedMethodsҎ(gu)Q就可以很简单地实现上述的典型应用?/p>
2、Get
HTTPҎ(gu)GET用来取回hURIQrequest-URIQ标志的M信息Q以实体(entity)的Ş式)(j)Q?get"q个单词本意是”获取“的意思。如果请求URI指向的一个数据处理过E,那这个过E生成的数据Q在应答中以实体的Ş式被q回Q而不是将q个q程的代码的q回?br />
如果HTTP包中含有If-ModifiedSince, If-Unmodified-Since, If-Match, If-None-Match, ?If-Range{头字段Q则GET也就变成?#8221;条gGET“Q即只有满上述字段描述的条件的实体才被取回Q这样可以减一些非必需的网l传输,或者减ؓ(f)获取某一资源的多ơ请求(如第一ơ检查,W二ơ下载)(j)。(一般的览器,都有一个(f)时目录,用来~存?sh)些网信息,当再ơ浏览某个页面的时候,只下载那些修改过的内容,以加快浏览速度Q就是这个道理。至于检查,则常用比GET更好的方法HEAD来实现。)(j)如果HTTP包中含有Range头字D,那么hURI指定的实体中Q只有决定范围条件的那部分才被取回来。(用过多线E下载工L(fng)朋友Q可能比较容易理解这一点)(j)
q个Ҏ(gu)的典型应用,用来从web服务器下载文档。HttpClient定义?jin)一个类叫GetMethod来支持这个方法,用GetMethodcMgetResponseBody, getResponseBodyAsStream ?getResponseBodyAsString函数可以取到应{包包体中的文档Q如HTML面Q信息。这q三个函CQgetResponseBodyAsStream通常是最好的Ҏ(gu)Q主要是因ؓ(f)它可以避免在处理下蝲的文档之前缓存所有的下蝲的数据?/p>
对GetMethod的最常见的不正确的用,是没有将全部的应{主体的数据d来。还有,必须注意要手工明地链接释放?br />
3、Head
HTTP的HeadҎ(gu)Q与GetҎ(gu)完全一_(d)唯一的差别是服务器不能在应答包中包含M(message-body)Q而且一定不能包含主体。用这个方法,可以使得客户无需资源下载回可׃得到一些关于它的基本信息。这个方法常用来(g)查超铄可访问性以?qing)资源最q有没有被修攏V?br />
HTTP的headҎ(gu)最典型的应用,是获取资源的基本信息。HttpClient定义?jin)HeadMethodcL持这个方法,HeadMethodcM其它*MethodcMP?getResponseHeaders()取回头部信息Q而没有自qҎ(gu)Ҏ(gu)?/p>
4、Post
Post在英文有“zN”的意思,HTTPҎ(gu)POST是要求服务器接受请求包中的实体Qƈ其作ؓ(f)hURI的下属资源。从本质上说Q这意味着服务器要保存q个实体信息Q而且通常由服务器端的E序q行处理。PostҎ(gu)的设计意图,是要以一U统一的方式实C列功能:(x)
q些都操作期待着在服务器端生一定的“副作?#8221;Q如修改?jin)数据库{?br />
HttpClient定义PostMethodcM支持该HTTPҎ(gu)Q在httpclient中,使用postҎ(gu)有两个基本的步骤Qؓ(f)h包准备数据,然后d服务器来的应{包的信息。通过调用 setRequestBody()函数Q来求包提供数据Q它可以接收三类参数Q输入流、名值对数组或字W串。至于读取应{包需要调?getResponseBody* 那一pd的方法,与GETҎ(gu)处理应答包的Ҏ(gu)相同?br />
常见问题是,没有全部应{读取(无论它对E序是否有用Q,或没有释N接资源?/p>
参考:(x)
http://msdn.microsoft.com/en-us/magazine/cc163917.aspx
http://www.unixwiz.net/techtips/sql-injection.html
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
http://xkcd.com/327/
http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/
http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=34&topic=18&show=0
http://www.cnblogs.com/iloveu/archive/2009/03/17/1414145.html
http://dang.javaeye.com/blog/338367
下面是一个全面的q表Q?/font>
lg |
说明 |
BeanUtils | Commons-BeanUtils 提供?Java 反射和自省API的包?/font> |
Betwixt | Betwixt提供?JavaBean 映射?XML 文档Q以?qing)相反映的服? |
Chain |
Chain 提供实现l织复杂的处理流E的“责Q链模?#8221;. |
CLI |
CLI 提供针对命o(h)行参敎ͼ选项Q选项l,强制选项{的单API. |
Codec |
Codec 包含一些通用的编码解码算法。包括一些语音编码器Q?Hex, Base64, 以及(qing)URL encoder. |
Collections |
Commons-Collections 提供一个类包来扩展和增加标准的 Java Collection框架 |
Configuration |
Commons-Configuration 工具对各U各式的配置和参考文件提供读取帮? |
Daemon |
一U?unix-daemon-like java 代码的替代机?/font> |
DBCP |
Commons-DBCP 提供数据库连接池服务 |
DbUtils |
DbUtils 是一?JDBC helper cdQ完成数据库d的简单的资源清除代码. |
Digester |
Commons-Digester 是一?XML-Java对象的映工P用于解析 XML配置文g. |
Discovery |
Commons-Discovery 提供工具来定位资?(包括c? Q通过使用各种模式来映服?引用名称和资源名U? |
EL |
Commons-EL 提供在JSP2.0规范中定义的EL表达式的解释? |
FileUpload |
FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能? |
HttpClient |
Commons-HttpClient 提供?jin)可以工作于HTTP协议客户端的一个框? |
IO |
IO 是一?I/O 工具? |
Jelly |
Jelly是一个基?XML 的脚本和处理引擎?Jelly 借鉴?JSP 定指标签QVelocity, Cocoon和Xdoclet中的脚本引擎的许多优炏VJelly 可以用在命o(h)行, Ant 或?Servlet之中. |
Jexl |
Jexl是一个表辑ּ语言Q通过借鉴来自于Velocity的经验扩展了(jin)JSTL定义的表辑ּ语言. |
JXPath |
Commons-JXPath 提供?jin)用Xpath语法操纵W合Javacd名规范的 JavaBeans的工兗也支持 maps, DOM 和其他对象模? |
Lang |
Commons-Lang 提供?jin)许多许多通用的工L(fng)集,提供?jin)一些java.lang中类的扩展功? |
Latka |
Commons-Latka 是一个HTTP 功能试包,用于自动化的QA,验收和衰减测? |
Launcher |
Launcher lg是一个交叉^台的Java 应用载入器?Commons-launcher 消除?jin)需要批处理或者Shell脚本来蝲入Java cR?原始?Java cL自于Jakarta Tomcat 4.0 目. |
Logging |
Commons-Logging 是一个各U?logging API实现的包裹类. |
Math |
Math 是一个轻量的Q自包含的数学和l计lgQ解决了(jin)许多非常通用但没有及(qing)时出现在Java标准语言中的实践问题. |
Modeler |
Commons-Modeler 提供?jin)徏模兼容JMX规范?Mbean的机? |
Net |
Net 是一个网l工具集Q基?NetComponents 代码Q包?FTP 客户端等{? |
Pool |
Commons-Pool 提供?jin)通用对象池接口,一个用于创建模块化对象池的工具包,以及(qing)通常的对象池实现. |
Primitives |
Commons-Primitives提供?jin)一个更,更快和更易用的对Java基本cd的支持。当前主要是针对基本cd?collection. |
Validator |
The commons-validator提供?jin)一个简单的Q可扩展的框架来在一个XML文g中定义校验器 (校验Ҏ(gu))和校验规则。支持校验规则的和错误消息的国际? |
详细信息位于Q?a >http://jakarta.apache.org/commons/index.html
以及(qing)Jakarta Commons:巧用cdlg
然后在一个JSP里或者Servlet中Q意调用即?
<%=new ThreadDumpBuilder().build() %>
===== END OF THREAD DUMP ===============
参考资?
1. Atlassian Confluence 3.0 理控制?/pre>2. JDK的DEMOjdk1.5.0\demo\management\FullThreadDump原文Q?a >http://ajava.org/course/java/13843.htmljava.lang
c?StackTraceElement Ҏ(gu)Q?/pre>boolean equals(Object obj)
如果指定的对象是另一?StackTraceElement 实例Qƈ且该对象表示的执行点与该实例的相同,则返?ture?br /> String getClassName()
q回cȝ完全限定名,该类包含p堆栈跟踪元素所表示的执行点?br /> String getFileName()
q回源文件名Q该文g包含p堆栈跟踪元素所表示的执行点?br /> int getLineNumber()
q回源行的行P该行包含p堆栈该跟t元素所表示的执行点?br /> String getMethodName()
q回Ҏ(gu)名,此方法包含由该堆栈跟t元素所表示的执行点?br /> int hashCode()
q回此堆栈跟t元素的哈希码倹{?br /> boolean isNativeMethod()
如果包含p堆栈跟踪元素所表示的执行点的方法是一个本机方法,则返?true?br /> String toString()
q回表示该堆栈跟t元素的字符丌Ӏ?/pre>
]]>
NumberFormat
的一个具体子c,用于格式化十q制数字。该c设计有各种功能Q其能够解析和格式化Q意语a环境中的敎ͼ包括对西方语a、阿拉伯语和印度语数字的支持。它q支持不同类型的敎ͼ包括整数 (123)、定Ҏ(gu) (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金?($123)。所有这些内定w可以本地化?/p>