??xml version="1.0" encoding="utf-8" standalone="yes"?>
接压安装?
ant的配法:
1。解压ant的包到本地目录?
2。在环境变量中设|ANT_HOMEQgؓ你的安装目录?
3。在环境变量中设|JAVA_HOMEQgؓ你的jdk安装目录?
4。把ANT_HOME/bin加到你系l的path目录中去?
SET ANT_HOME=D:\jakarta-ant-1.5.1 //注意是Ant的安装目录,不是bin子目?
SET PATH=%PATH%;%ANT_HOME%\bin;
在cmd模式下输?ant -version回RQ看到输明配|成功?
User@Site.Domain.com
您也可以hq行 SMTP 服务的服务器计算机的完全限定域名 (FQDN) ?nbsp;IP 地址Q例如,10.120.159.1Q。如果服务器在您的组l中Q您可能已经拥有q些信息。如果服务器是外部服务器Q查找这些信息最单的Ҏ是?nbsp;Nslookup.exe 以找到包含这些信息的 DNS 记录?nbsp;有关 NSlookup 的其他信息,请单M面的文章~号Q以查看 Microsoft 知识库中相应的文章:200525 使用 NSlookup.exe
有关如何获取 Internet 邮g交换器记录的其他信息Q请单击下面的文章编P以查?nbsp;Microsoft 知识库中相应的文章:203204 XFORQ如何获?nbsp;Internet 邮g交换器记?/p>
服务器名端口?/var> mail.contoso.com 25 ?/P> test.com ?/P> Admin@test.com ?/P> User@Domain.Com ?/P>
您会收到以下消息Q?nbsp;
test message
?/P>
您会收到以下消息Q?nbsp;
?/P>
保q行 SMTP 服务的服务器上已启动 SMTP。要试 SMTP 是否已启动,您可以运行本文中列出的基本测试,q证您是否会收到来自远E服务器?nbsp;220 消息。这q将验证 SMTP 是否正在q行?br>
注意Q?/strong>
基本试
按照下列步骤操作Q以保L和远E?nbsp;SMTP 服务器能够通信。如果在您键入以下Q一命o之后Q收C下错误信息,则说?nbsp;SMTP 服务器因法错误或命o错误而无法识别您所键入的内容:
注意QMicrosoft Telnet 不允许您使用 Backspace 键。如果在键入时出错,必须?nbsp;Enter 键,然后开始键入新的命令?br>
在以下步骤中Q您要从命o行中q行 Telnet。要打开命o行,请单?#8220;开?#8221;Q单?#8220;q行”Q在“打开”框中键入 Q然后单?#8220;定”?nbsp;
注意Q在键入每行内容之后?nbsp;Enter 键?nbsp;
如果该命令v作用Q您会收到来自 SMTP 服务器的cM以下内容的消息:
220 site.contoso.com Microsoft Exchange Internet Mail Connector <IMC 的版本号>
注意Q由于有许多不同版本?nbsp;Microsoft SMTP 或第三方 SMTP 服务器,因此您可能会收到来自接收服务器的不同的消息。不q,您肯定会收到包含服务器的 FQDN ?nbsp;SMTP 的版本的 220 消息。此外,所有版本的 Microsoft SMTP ?nbsp;220 消息中都包含“Microsoft”一词?nbsp;
如果该命令成功,您会收到以下消息Q?nbsp;
250 OK
250 OK - MAIL FROM Admin@test.com
注意Q最好始l用要发送到的域中的有效收g?nbsp;SMTP 地址。例如,如果您要发送到 john@domain.comQ必ȝ保域中存?nbsp;john@domain.com。否则,您会收到 NDR?br>
使用您要发送到的h员的 SMTP 地址键入以下命oQ?nbsp;
250 OK - Recipient User@ Domain.Com
354 Send data. End with CRLF.CRLF
注意Q按两次 Enter 键ؓ了与 Request for Comments (RFC) 822 ?nbsp;2822 保持一致。它规定 822 命o后面必须跟一个空行?nbsp;
250 OK
221 closing connection
高试
除本文前面列出的基本试步骤外,您还可以使用送达回执寚w件进行双向测试。您可以使用此方法验?nbsp;SMTP 服务器是否可以接受入站连接,q且为发件h生成一个送达回执以测?nbsp;SMTP 服务器的出站q接?br>
要ؓ试邮gh送达回执Q请参见本文“基本试”一节的W?nbsp;4 步,以确保提供的信息是可以接攉达回执的有效电子邮件地址。然后在本文“基本试”一节的W?nbsp;5 步中Q在 Telnet 会话中键入以下命?/div>
]]>
明显HTMLQ暗渡“公用脚本?/strong>
减少web面下蝲旉的关键就是设法减文件大。当多个面q一些成分内ҎQ就可以考虑这些公用部分单独分d来。比如:我们可以多个HTML面都用到的脚本E序~写成独立存在的.js文gQ然后再在页面中按如下方式调用它Q?br />
<script src="myfile.js"></script>
q样Q公用文件只需要下载一ơ,然后p入缓冲区。等下次再次调用包含公用文g的html面Ӟ下蝲旉明显减少?br />
让样式表内容q入C工作
CSS是HTML装扮器,一个漂亮的Web面不可能没有它。HTML面中有多种引用CSS的方法,不同的方法导致的效率也不一栗通常Q我们可以将定义?lt;style></style>间的样式控制代码提取出来Q保存到单独?css文g中,然后在HTML面中以<LINK>标记或者@import标记的方式进行引用:
<style>
@import url("mysheet1.css");
</style>
h?点:1?css文g中无需包括<style>标记Q?、@import和LINK标记要定义在HTML面的HEAD部分?br />
宝贵内存节省两法
量减少HTML面占用的内存空间是加快面下蝲速度的一个有效方法。在q方面,?个需要注意的问题Q?br />
1、用同一U脚本语a
HTML面M开脚本E序的支持,我们l常会在面中嵌入多U脚本语aQ比如JavaScript与VBScript。但是,不知你发觉没有:q样的合用减慢了面的访问速度。原因在于:要解释ƈq行多种脚本代码Q就必须在内存中装蝲多种脚本引擎。所以,请尽量在面中用同一U脚本语a~写代码?br />
2、y用IFrame
你用过<IFRAME>标记吗?它可是一个非常美妙的功能。如果要在一个HTML文档中包含第2个页面的内容Q通常的方法是使用<FRAMESET>标记。但是有?lt;IFRAME>Q一切变得简单了。比如,开发一个文档预览页面,可以在左Ҏ|一pd主题Q在双攄一个IFRAMEQ其中包含要预览的文档;当鼠标掠q左边的每一个主题链接时Q就在右边徏立一个新的IFRAME以预览文档。这样做Q代码效率无疑是高效的,但同时导致了J重的处理过E,最l是~慢的速度?br />
没关p,我们有办法:只用单一的IFRAME。当鼠标指向一个新主题Ӟ只需要修改IFRAME元素的SRC属性即可。这PM旉内只会有一个预览文档保留在内存?br />
择优选用动画定位属?/strong>
每天上网览面Q你一定会看到许多动画效果。比如,一个可q兔子在面上来回地走动 ... 实现q个效果的核心技术就是CCS定位。通常Q我们是使用element.style.left和element.style.top2个属性来辑ֈ囑Ş定位的目的。但是,q样做会产生一些问题:left属性返回一个字W串Qƈ且其中包含了度量单位Q比?00px)。因此,要设定新的位|坐标,必首先对q个字符串返回D行处理,然后才能赋|象下面一P
dim stringLeft, intLeft
stringLeft = element.style.left
intLeft = parseInt(stringLeft)
intLeft = intLeft + 10
element.style.left = intLeft;
你一定会感觉做这么点事情竟要~写q么复杂的代码,是否有更z的ҎQ当然有Q请看这4个属性:posLeft、posTop、posWidth 和 posHeightQ它们对应于相应字符串返回值的Ҏ数倹{好了,使用q些属性重新编写代码实C面代码实现的功能Q?br />
element.style.posLeft += 10
代码短小、速度却更快!
循环控制多个动画
说到制作动画效果Q当然离不开定时器的q用。通常的方法就是用window.setTimeout来不断地定位面上的元素。但是,如果面上有多个动画要显C,是不是就要设定多个定时器呢?{案是NoQ原因很单:定时器功能将消耗掉大量宝贵的系l资源。可是我们仍能在面上控制多个动画,技巧就是用一个@环。在循环中根据不同的变量值控制相应动ȝ位置Q整个@环中只用一个window.setTimeout()函数调用?br />
Visibility快于Display
让图L隐时C创造很有趣的效果,?U方法可以实现这个目的:使用CSS的visibility属性或者display属性。对于绝对位|元素,diaplay和visibilityh同样的效果。两者的区别在于Q设|ؓdisplay:none的元素将不再占用文档的I间Q而设|ؓvisibility:hidden的元素仍然保留原位置?br />
但是如果要处理绝对位|的元素Q用visibility会更快?br />
从小处着?/strong>
~写DHTML|页的一个重要提C是Q从处着手。初ơ编写DHTML面Ӟ一定不要试囑֜面中用你了解到的全部DHTML功能。每ơ可以只使用一个单一的新特征Qƈ且仔l地观察由此产生的变化。如果发现性能有所下降Q就可以快速地扑ֈZ么?br />
脚本的DEFER?br />
DEFER是脚本程序强大功能中的一个“无名英雄”。你可能从没有用过它,但是看完q里的介l后Q相信你q不开它。它告诉览器ScriptD包含了无需立即执行的代码,q且Q与SRC属性联合用,它还可以使这些脚本在后台被下载,前台的内容则正常昄l用戗?br />
最后请注意两点Q?br />
1、不要在defer型的脚本E序D中调用document.write命oQ因为document.write生直接输出效果?br />
2、而且Q不要在defer型脚本程序段中包括Q何立x行脚本要使用的全局变量或者函数?br />
保持同一URL的大写一致?/strong>
我们都知道UNIX服务器是大小写敏感的Q但是你知道吗:Internet Explorer的缓冲区也是区别对待大小写字W串的。因此,作ؓweb开发者,一定要C保持相同链接的URL字符串在不同位置的大写的一致性。否则,׃在浏览器的缓冲区中存攑一位置的不同文件备份,也增加了下蝲同一位置内容的请求次数。这些都无疑降低了web讉K效率。所以请谨记Q同一位置的URLQ在不同面中请保持URL字符串的大小写一致性?br />
让标记有始有l?/strong>
自己~写或者查看他人的HTML代码Ӟ我们一定都遇到q标记有头无情况。比如:
<P>有头无尾标记举例
<UL>
<LI>W一?br /> <LI>W二?br /> <LI>W三?br /> </UL>
很明显,上面的代码中~少三个</LI>l束标记。但是这q不妨碍它的正确执行。在HTML中,q样的标记还有一些,例如FRAME、IMG和P。?br />
可是请不要偷懒,请将l束标记写完_q样做不仅HTML代码格式规范Q更可以加速页面的昄速度。因为Internet Explorer不会花Ҏ间判断和计算D落或者列表项目在哪里l束?br />
<P>有头有尾标记举例</P>
<UL>
<LI>W一?lt;/LI>
<LI>W二?lt;/LI>
<LI>W三?lt;/LI>
</UL>
OKQ以上列举了有关加速HTML面?0个处理技巧,描述q些很简单,但是只有真正领会q掌握其中的本质Qƈ且D一反三Q才会编写出更快、更好的E序?/div>
]]>
winchat--------XP 自带局域网聊天
mem.exe-------- 昄内存使用情况
Msconfig.exe--- pȝ配置实用E序
mmc------------ 打开控制?/span>
mobsync-------- 同步命o
dxdiag--------- ?/span> DirectX 信息
drwtsn32------ pȝȝ
devmgmt.msc--- 讑֤理?/span>
dfrg.msc------- 盘片整理E序
diskmgmt.msc--- 盘理实用E序
dcomcnfg------- 打开pȝlg服务
net stop messenger----- 停止信服务
net start messenger---- 开始信使服?/span>
nslookup------- |络理的工具向?/span>
ntbackup------- pȝ备䆾和还?/span>
netstat -an----(TC) 命o查接?/span>
sysedit-------- pȝ配置~辑?/span>
secpol.msc----- 本地安全{略
syskey--------- pȝ加密Q一旦加密就不能解开Q保?/span> windows xp pȝ的双重密?/span>
services.msc--- 本地服务讄
Sndvol32------- 音量控制E序
sfc.exe-------- pȝ文g查器
sfc /scannow---windows 文g保护
tsshutdn-------60 U倒计时关机命?/span>
taskmgr-------- d理?/span>
explorer------- 打开资源理?/span>
progman-------- E序理?/span>
regedit.exe---- 注册?/span>
regedt32------- 注册表编辑器
rononce -p ----15 U关?/span>
cmd.exe--------CMD 命o提示W?/span>
chkdsk.exe-----Chkdsk 盘?/span>
compmgmt.msc--- 计算机管?/span>
lusrmgr.msc---- 本机用户和组
Nslookup-------IP 地址侦测?/span>
fsmgmt.msc----- ׃n文g夹管理器
utilman-------- 辅助工具理?/span>
gpedit.msc----- l策?/span>
我们不可能列举所有可能的固Q我们会针对几种最常见的问题进行处理。当然了Q正如前面说到的Q如果我们自׃用 java.net.HttpURLConnection来搞定这些问题是很恐怖的事情Q因此在开始之前我们先要介l一下一个开放源码的目Q这个项目就是 Apache开源组l中的httpclientQ它隶属于Jakarta的commons目Q目前的版本?.0RC2。commons下本来已l有一个net的子目Q但是又把httpclient单独提出来,可见http服务器的讉Kl非易事?/p>
Commons-httpclient目是专门设计来简化HTTP客户端与服务器进行各U通讯~程。通过它可以让原来很头疼的事情现在L的解冻I例如你不再管是HTTP或者HTTPS的通讯方式Q告诉它你想使用HTTPS方式Q剩下的事情交给httpclient替你完成。本文会针对我们在编写HTTP客户端程序时l常到的几个问题进行分别介l如何用httpclient来解军_们,Z让读者更快的熟悉q个目我们最开始先l出一个简单的例子来读取一个网늚内容Q然后@序渐q解x前进中的所有问题?/p>
1Q 读取网?HTTP/HTTPS)内容
下面是我们给出的一个简单的例子用来讉K某个面
/*
* Created on 2003-12-14 by Liudong
*/
package http.demo;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
/**
* 最单的HTTP客户?/span>,用来演示通过GET或?/span>POST方式讉K某个面
* @author Liudong
*/
public class SimpleClient {
public static void main(String[] args) throws IOException
{
HttpClient client = new HttpClient();
//讄代理服务器地址和端?/span>
//client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
//使用GETҎQ如果服务器需要通过HTTPSq接Q那只需要将下面URL中的http换成https
HttpMethod method = new GetMethod("http://java.sun.com");
//使用POSTҎ
//HttpMethod method = new PostMethod("http://java.sun.com");
client.executeMethod(method);
//打印服务器返回的状?/span>
System.out.println(method.getStatusLine());
//打印q回的信?/span>
System.out.println(method.getResponseBodyAsString());
//释放q接
method.releaseConnection();
}
}
在这个例子中首先创徏一个HTTP客户?HttpClient)的实例,然后选择提交的方法是GET或者POSTQ最后在HttpClient实例上执行提交的ҎQ最后从所选择的提交方法中d服务器反馈回来的l果。这是使用HttpClient的基本流E。其实用一行代码也可以搞定整个请求的q程Q非常的单!
2Q 以GET或者POST方式向网|交参?br />
其实前面一个最单的CZ中我们已l介l了如何使用GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时讑֮面所需的参敎ͼ我们知道如果是GET的请求方式,那么所有参数都直接攑ֈ面的URL后面用问号与面地址隔开Q每个参数用&隔开Q例如:http://java.sun.com/?name=liudong&mobile=123456Q但是当使用POSTҎ时就会稍微有一点点ȝ。本节的例子演C向如何查询手机L所在的城市Q代码如下:
/*
* Created on 2003-12-7 by Liudong
*/
package http.demo;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
/**
* 提交参数演示
* 该程序连接到一个用于查询手机号码所属地的页?/span>
* 以便查询LD?/span>1330227所在的省䆾以及城市
* @author Liudong
*/
public class SimpleHttpClient {
public static void main(String[] args) throws IOException
{
HttpClient client = new HttpClient();
client.getHostConfiguration().setHost("www.imobile.com.cn", 80, "http");
HttpMethod method = getPostMethod();//使用POST方式提交数据
client.executeMethod(method);
//打印服务器返回的状?/span>
System.out.println(method.getStatusLine());
//打印l果面
String response =
new String(method.getResponseBodyAsString().getBytes("8859_1"));
//打印q回的信?/span>
System.out.println(response);
method.releaseConnection();
}
/**
* 使用GET方式提交数据
* @return
*/
private static HttpMethod getGetMethod(){
return new GetMethod("/simcard.php?simcard=1330227");
}
/**
* 使用POST方式提交数据
* @return
*/
private static HttpMethod getPostMethod(){
PostMethod post = new PostMethod("/simcard.php");
NameValuePair simcard = new NameValuePair("simcard","1330227");
post.setRequestBody(new NameValuePair[] { simcard});
return post;
}
}
在上面的例子中页?a >http://www.imobile.com.cn/simcard.php需要一个参数是simcardQ这个参数gؓ手机LD,x机号码的前七位,服务器会q回提交的手机号码对应的省䆾、城市以及其他详l信息。GET的提交方法只需要在URL后加入参C息,而POST则需要通过NameValuePaircL讄参数名称和它所对应的?/span>
3Q 处理页面重定向
在JSP/Servlet ~程中response.sendRedirectҎ是使用HTTP协议中的重定向机制。它与JSP中的<jsp:forward ?gt;的区别在于后者是在服务器中实现页面的跌{Q也是说应用容器加载了所要蟩转的面的内容ƈq回l客LQ而前者是q回一个状态码Q这些状态码的可能D下表Q然后客Ld需要蟩转到的页面的URLq新加载新的页面。就是这样一个过E,所以我们编E的时候就要通过 HttpMethod.getStatusCode()Ҏ判断q回值是否ؓ下表中的某个值来判断是否需要蟩转。如果已l确认需要进行页面蟩转了Q那么可以通过dHTTP头中的location属性来获取新的地址?/span>
状态码 | 对应HttpServletResponse的常?/span> | 详细描述 |
301 | SC_MOVED_PERMANENTLY | 面已经怹Ud另外一个新地址 |
302 | SC_MOVED_TEMPORARILY | 面暂时Ud到另外一个新的地址 |
303 | SC_SEE_OTHER | 客户端请求的地址必须通过另外?/span>URL来访?/span> |
307 | SC_TEMPORARY_REDIRECT | ?/span>SC_MOVED_TEMPORARILY |
下面的代码片D|C如何处理页面的重定?/p>
client.executeMethod(post);
System.out.println(post.getStatusLine().toString());
post.releaseConnection();
//查是否重定向
int statuscode = post.getStatusCode();
if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||
(statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||
(statuscode == HttpStatus.SC_SEE_OTHER) ||
(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
//d新的URL地址
Header header = post.getResponseHeader("location");
if (header != null) {
String newuri = header.getValue();
if ((newuri == null) || (newuri.equals("")))
newuri = "/";
GetMethod redirect = new GetMethod(newuri);
client.executeMethod(redirect);
System.out.println("Redirect:"+ redirect.getStatusLine().toString());
redirect.releaseConnection();
} else
System.out.println("Invalid redirect");
}
我们可以自行~写两个JSP面Q其中一个页面用response.sendRedirectҎ重定向到另外一个页面用来测试上面的例子?br />
4Q 模拟输入用户名和口令进行登?/p>
本小节应该说是HTTP客户端编E中最常碰见的问题Q很多网站的内容都只是对注册用户可见的,q种情况下就必须要求使用正确的用户名和口令登录成功后Q方可浏览到惌的页面。因为HTTP协议是无状态的Q也是q接的有效期只限于当前请求,h内容l束后连接就关闭了。在q种情况下ؓ了保存用Ld信息必须使用到Cookie机制。以JSP/ServletZQ当览器请求一个JSP或者是Servlet的页面时Q应用服务器会返回一个参敎ͼ名ؓjsessionidQ因不同应用服务器而异Q,值是一个较长的唯一字符串的CookieQ这个字W串g是当前讉K该站点的会话标识。浏览器在每讉K该站点的其他面时候都要带上jsessionidq样的Cookie信息Q应用服务器Ҏdq个会话标识来获取对应的会话信息?/p>
对于需要用L录的|站Q一般在用户d成功后会用戯料保存在服务器的会话中,q样当访问到其他的页面时候,应用服务器根据浏览器送上的 Cookie中读取当前请求对应的会话标识以获得对应的会话信息Q然后就可以判断用户资料是否存在于会话信息中Q如果存在则允许讉K面Q否则蟩转到d面中要求用戯入帐号和口oq行d。这是一般用JSP开发网站在处理用户d的比较通用的方法?/p>
q样一来,对于HTTP的客L来讲Q如果要讉K一个受保护的页面时必L拟浏览器所做的工作Q首先就是请求登录页面,然后dCookie|再次hd面q加入登录页所需的每个参敎ͼ最后就是请求最l所需的页面。当然在除第一ơ请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前h是否已经通过验证。说了这么多Q可是如果你使用httpclient的话Q你甚至q一行代码都无需增加Q你只需要先传递登录信息执行登录过E,然后直接讉K惌的页面,跟访问一个普通的面没有M区别Q因为类HttpClient已经帮你做了所有该做的事情了,太棒了!下面的例子实Cq样一个访问的q程?br />
/*
* Created on 2003-12-7 by Liudong
*/
package http.demo;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.cookie.*;
import org.apache.commons.httpclient.methods.*;
/**
* 用来演示d表单的示?/span>
* @author Liudong
*/
public class FormLoginDemo {
static final String LOGON_SITE = "localhost";
static final int LOGON_PORT = 8080;
public static void main(String[] args) throws Exception{
HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);
//模拟d面login.jsp->main.jsp
PostMethod post = new PostMethod("/main.jsp");
NameValuePair name = new NameValuePair("name", "ld");
NameValuePair pass = new NameValuePair("password", "ld");
post.setRequestBody(new NameValuePair[]{name,pass});
int status = client.executeMethod(post);
System.out.println(post.getResponseBodyAsString());
post.releaseConnection();
//查看cookie信息
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());
if (cookies.length == 0) {
System.out.println("None");
} else {
for (int i = 0; i < cookies.length; i++) {
System.out.println(cookies[i].toString());
}
}
//讉K所需的页?/span>main2.jsp
GetMethod get = new GetMethod("/main2.jsp");
client.executeMethod(get);
System.out.println(get.getResponseBodyAsString());
get.releaseConnection();
}
}
5Q 提交XML格式参数
提交XML格式的参数很单,仅仅是一个提交时候的ContentType问题Q下面的例子演示从文件文件中dXML信息q提交给服务器的q程Q该q程可以用来试Web服务?/span>
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.PostMethod;
/**
* 用来演示提交XML格式数据的例?/span>
*/
public class PostXMLClient {
public static void main(String[] args) throws Exception {
File input = new File(“test.xml?;
PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp?;
// 讄h的内容直接从文g中读?/span>
post.setRequestBody(new FileInputStream(input));
if (input.length() < Integer.MAX_VALUE)
post.setRequestContentLength(input.length());
else post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);
// 指定h内容的类?/span>
post.setRequestHeader("Content-type", "text/xml; charset=GBK");
HttpClient httpclient = new HttpClient();
int result = httpclient.executeMethod(post);
System.out.println("Response status code: " + result);
System.out.println("Response body: ");
System.out.println(post.getResponseBodyAsString());
post.releaseConnection();
}
}
6Q 通过HTTP上传文g
httpclient使用了单独的一个HttpMethod子类来处理文件的上传Q这个类是MultipartPostMethodQ该cdl封装了文g上传的细节,我们要做的仅仅是告诉它我们要上传文g的全路径卛_Q下面的代码片段演示如何使用q个cR?/span>
MultipartPostMethod filePost = new MultipartPostMethod(targetURL);
filePost.addParameter("fileName", targetFilePath);
HttpClient client = new HttpClient();
//׃要上传的文g可能比较?/span>,因此在此讄最大的q接时旉
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
上面代码中,targetFilePath即ؓ要上传的文g所在的路径?/p>
7Q 访问启用认证的面
我们l常会碰到这L面Q当讉K它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可,q种用户认证的方式不同于我们在前面介l的Z表单的用戯n份验证。这是HTTP的认证策略,httpclient支持三种认证方式包括Q基本、摘要以及NTLM认证。其中基本认证最单、通用但也最不安全;摘要认证是在HTTP 1.1中加入的认证方式Q而NTLM则是微Y公司定义的而不是通用的规范,最新版本的NTLM是比摘要认证q要安全的一U方式?/p>
下面例子是从httpclient的CVS服务器中下蝲的,它简单演C如何访问一个认证保护的面Q?br />
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.methods.GetMethod;
public class BasicAuthenticationExample {
public BasicAuthenticationExample() {
}
public static void main(String[] args) throws Exception {
HttpClient client = new HttpClient();
client.getState().setCredentials(
"www.verisign.com",
"realm",
new UsernamePasswordCredentials("username", "password")
);
GetMethod get = new GetMethod("https://www.verisign.com/products/index.html");
get.setDoAuthentication( true );
int status = client.executeMethod( get );
System.out.println(status+"\n"+ get.getResponseBodyAsString());
get.releaseConnection();
}
}
8Q 多U程模式下用httpclient
多线E同时访问httpclientQ例如同时从一个站点上下蝲多个文g。对于同一个HttpConnection同一个时间只能有一个线E访问,Z保证多线E工作环境下不生冲H,httpclient使用了一个多U程q接理器的c: MultiThreadedHttpConnectionManagerQ要使用q个cd单,只需要在构造HttpClient实例的时候传入即可,代码如下Q?/span>
MultiThreadedHttpConnectionManager connectionManager =
new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
以后管讉Kclient实例卛_?/span>
参考资料:
httpclient首页Q ?a >http://jakarta.apache.org/commons/httpclient/
关于NTLM是如何工作: http://davenport.sourceforge.net/ntlm.html