??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?使之总长度ؓ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服务器的交互中,如果涉及cookie或https或ssl{内容,一般功能相对完备的http客户端还是非常必要的。IE或NetScape{浏览器实不错Q可是如果ؓ实现持箋互动而在E序调用览器,我个为其中的工作量还是不的Q这q没考虑版权问题。最好的办法Q就是能有一个开源的包,能实现http客户端的功能Q供我们开发的E序调用?a >httpclient是q么一个包Q我怿可能有比它的实现更好的,但目前我只关注这个。:Q?br />
下面是nogoop做的功能比较表:
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.安装的步骤如下:
1)下蝲jsse和jce.
2)查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复制到目录:
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些Ҏ可用于服务器或代理对客户端的认证Q简U服务器认证或代理认证?br />
1)服务器认?Server Authentication)
HttpClient处理服务器认证几乎是透明的,仅需要开发h员提供登录信?login credentials)。登录信息保存在HttpStatecȝ实例中,可以通过 setCredentials(String realm, Credentials cred)和getCredentials(String realm)来获取或讄。注意,讑֮寚w特定站点讉K所需要的d信息Q将realm参数|ؓnull. HttpClient内徏的自动认证,可以通过HttpMethodcȝsetDoAuthentication(boolean doAuthentication)Ҏ关闭Q而且q次关闭只媄响HttpMethod当前的实例?br />
抢先认证(Preemptive Authentication)可以通过下述Ҏ打开.
在这U模式时QHttpClient会主动将basic认证应答信息传给服务器,即在某U情况下服务器可能返回认证失败的应答Q这样做主要是ؓ了减连接的建立。ؓ使每个新建的 HttpState实例都实行抢先认证,可以如下讄pȝ属性?/p>
Httpclient实现的抢先认证遵循rfc2617.
2)代理认证(proxy authentication)
除了d信息需单独存放以外Q代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)?getProxyCredentials(String realm)设、取d信息?br />
3)认证Ҏ(authentication schemes)
Basic
是HTTP中规定最早的也是最兼容(?)的方案,遗憾的是也是最不安全的一个方案,因ؓ它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例Q可以指定服务器端的讉KI间或采用默认的d信息?br />
Digest
是在HTTP1.1中增加的一个方案,虽然不如Basic得到的Y件支持多Q但q是有广泛的使用。DigestҎ比BasicҎ安全得多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>
׃技术限Ӟ以及Z?.0发布版API的稳定,HttpClientq不能自动处重定向,但对重定向到同一L、同一端口且采用同一协议的情况HttpClient可以支持。不能自动的处理的情况,包括需要h工交互的情况Q或出httpclient的能力?br />
当服务器重定向指令指C同的LӞHttpClient只是单地重定向状态码作ؓ应答状态。所有的300?99Q包含两端)的返回码Q都表示是重定向应答。常见的有:
当收到简单的重定向时Q程序应从HttpMethod对象中抽取新的URLq将其下载。另?限制一下重定向ơ数是个好的LQ这可以避免递归循环。新的URL可以从头字段Location中抽取,如下Q?/p>
Ҏ重定向:
一个HTTP协议的请求或应答的头?在http协议中,数据包分Z部分Q一部分是头部,׃些名值对构成Q一部分是主?body)Q是真正传办理的数据Q如HTML面{)Q,必须以US-ASCII~码Q这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookieQ它是数据但是通过头部q行传输的,所以它也要用US-ASCII~码?br />
HTTP数据包的M部分Q可以用M一U方式进行编码,默认是ISO-8859-1Q具体可以用头部字段Content-Type指定。可以利?addRequestHeaderҎ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处理q种状况QHttpClient提供了策略驱动的cookie理方式。HttpClient支持的cookie规范有:
RFC2965规范暂时没有被HttpClient支持Q在以后的版本ؓ会加上)Q它定义了cookie版本2Qƈ说明了版?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及以后的版本中,以前的版本则需要手工安装设|,具体q程参见Sun|站或本学习W记?br />
HttpClient中用SSL非常单,参考下面两个例?
Q如果通过需要授权的代理Q则如下Q?/p>
在HttpClient中定制SSL的步骤如下:
已知的限制和问题
遇到问题的处?br />
很多问题Q特别是在jvm低于1.4Ӟ是由jsse的安装造成的?br />
下面的代码,可作为最l的手Dc?/p>
1、httpclient的多U程处理
使用多线E的主要目的Q是Z实现q行的下载。在httpclientq行的过E中Q每个http协议的方法,使用一个HttpConnection实例。由于连接是一U有限的资源Q每个连接在某一时刻只能供一个线E和Ҏ使用Q所以需要确保在需要时正确地分配连接。HttpClient采用了一U类似jdbcq接池的Ҏ来管理连接,q个理工作?MultiThreadedHttpConnectionManager完成?/p>
此是Qclient可以在多个线E中被用来执行多个方法。每ơ调用HttpClient.executeMethod() ҎQ都会去链接理器申请一个连接实例,甌成功q个链接实例被签?checkout)Q随之在链接使用完后必须归还理器。管理器支持两个讄Q?
maxConnectionsPerHost | 每个L的最大ƈ行链接数Q默认ؓ2 |
maxTotalConnections | 客户端dƈ行链接最大数Q默认ؓ20 |
Ҏ一个HttpClient.executeMethodL一个method.releaseConnection()与之匚w.
HttpClient支持的HTTPҎ?U,下面分述之?br />
1、Options
HTTPҎOptions用来向服务器发送请求,希望获得针对p求URL(request url)标志的资源在h/应答的通信q程可以使用的功能选项。通过q个ҎQ客L可以在采取具体行动之前,可Ҏ一资源军_采取什么动作和/或以及一些必要条Ӟ或者了解服务器提供的功能。这个方法最典型的应用,是用来获取服务器支持哪些HTTPҎ?br />
HttpClient中有一个类叫OptionsMethodQ来支持q个HTTPҎQ利用这个类的getAllowedMethodsҎQ就可以很简单地实现上述的典型应用?/p>
2、Get
HTTPҎGET用来取回hURIQrequest-URIQ标志的M信息Q以实体(entity)的Ş式)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传输,或者减ؓ获取某一资源的多ơ请求(如第一ơ检查,W二ơ下载)。(一般的览器,都有一个时目录,用来~存一些网信息,当再ơ浏览某个页面的时候,只下载那些修改过的内容,以加快浏览速度Q就是这个道理。至于检查,则常用比GET更好的方法HEAD来实现。)如果HTTP包中含有Range头字D,那么hURI指定的实体中Q只有决定范围条件的那部分才被取回来。(用过多线E下载工L朋友Q可能比较容易理解这一点)
q个Ҏ的典型应用,用来从web服务器下载文档。HttpClient定义了一个类叫GetMethod来支持这个方法,用GetMethodcMgetResponseBody, getResponseBodyAsStream ?getResponseBodyAsString函数可以取到应{包包体中的文档Q如HTML面Q信息。这q三个函CQgetResponseBodyAsStream通常是最好的ҎQ主要是因ؓ它可以避免在处理下蝲的文档之前缓存所有的下蝲的数据?/p>
对GetMethod的最常见的不正确的用,是没有将全部的应{主体的数据d来。还有,必须注意要手工明地链接释放?br />
3、Head
HTTP的HeadҎQ与GetҎ完全一_唯一的差别是服务器不能在应答包中包含M(message-body)Q而且一定不能包含主体。用这个方法,可以使得客户无需资源下载回可׃得到一些关于它的基本信息。这个方法常用来查超铄可访问性以及资源最q有没有被修攏V?br />
HTTP的headҎ最典型的应用,是获取资源的基本信息。HttpClient定义了HeadMethodcL持这个方法,HeadMethodcM其它*MethodcMP?getResponseHeaders()取回头部信息Q而没有自qҎҎ?/p>
4、Post
Post在英文有“zN”的意思,HTTPҎPOST是要求服务器接受请求包中的实体Qƈ其作ؓhURI的下属资源。从本质上说Q这意味着服务器要保存q个实体信息Q而且通常由服务器端的E序q行处理。PostҎ的设计意图,是要以一U统一的方式实C列功能:
q些都操作期待着在服务器端生一定的“副作?#8221;Q如修改了数据库{?br />
HttpClient定义PostMethodcM支持该HTTPҎQ在httpclient中,使用postҎ有两个基本的步骤Qؓh包准备数据,然后d服务器来的应{包的信息。通过调用 setRequestBody()函数Q来求包提供数据Q它可以接收三类参数Q输入流、名值对数组或字W串。至于读取应{包需要调?getResponseBody* 那一pd的方法,与GETҎ处理应答包的Ҏ相同?br />
常见问题是,没有全部应{读取(无论它对E序是否有用Q,或没有释N接资源?/p>
参考:
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以及相反映的服务. |
Chain |
Chain 提供实现l织复杂的处理流E的“责Q链模?#8221;. |
CLI |
CLI 提供针对命o行参敎ͼ选项Q选项l,强制选项{的单API. |
Codec |
Codec 包含一些通用的编码解码算法。包括一些语音编码器Q?Hex, Base64, 以及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 提供了可以工作于HTTP协议客户端的一个框? |
IO |
IO 是一?I/O 工具? |
Jelly |
Jelly是一个基?XML 的脚本和处理引擎?Jelly 借鉴?JSP 定指标签QVelocity, Cocoon和Xdoclet中的脚本引擎的许多优炏VJelly 可以用在命o行, Ant 或?Servlet之中. |
Jexl |
Jexl是一个表辑ּ语言Q通过借鉴来自于Velocity的经验扩展了JSTL定义的表辑ּ语言. |
JXPath |
Commons-JXPath 提供了用Xpath语法操纵W合Javacd名规范的 JavaBeans的工兗也支持 maps, DOM 和其他对象模? |
Lang |
Commons-Lang 提供了许多许多通用的工L集,提供了一些java.lang中类的扩展功? |
Latka |
Commons-Latka 是一个HTTP 功能试包,用于自动化的QA,验收和衰减测? |
Launcher |
Launcher lg是一个交叉^台的Java 应用载入器?Commons-launcher 消除了需要批处理或者Shell脚本来蝲入Java cR?原始?Java cL自于Jakarta Tomcat 4.0 目. |
Logging |
Commons-Logging 是一个各U?logging API实现的包裹类. |
Math |
Math 是一个轻量的Q自包含的数学和l计lgQ解决了许多非常通用但没有及时出现在Java标准语言中的实践问题. |
Modeler |
Commons-Modeler 提供了徏模兼容JMX规范?Mbean的机? |
Net |
Net 是一个网l工具集Q基?NetComponents 代码Q包?FTP 客户端等{? |
Pool |
Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现. |
Primitives |
Commons-Primitives提供了一个更,更快和更易用的对Java基本cd的支持。当前主要是针对基本cd?collection. |
Validator |
The commons-validator提供了一个简单的Q可扩展的框架来在一个XML文g中定义校验器 (校验Ҏ)和校验规则。支持校验规则的和错误消息的国际? |
详细信息位于Q?a >http://jakarta.apache.org/commons/index.html
然后在一个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 Ҏ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回Ҏ名,此方法包含由该堆栈跟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)、定Ҏ (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金?($123)。所有这些内定w可以本地化?/p>