﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-未知数据</title><link>http://www.blogjava.net/wangjc0801/</link><description>从头看Java</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 09:55:12 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 09:55:12 GMT</pubDate><ttl>60</ttl><item><title>wsdl文件生成客户端代码问题</title><link>http://www.blogjava.net/wangjc0801/archive/2009/08/17/291439.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Mon, 17 Aug 2009 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/08/17/291439.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/291439.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/08/17/291439.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/291439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/291439.html</trackback:ping><description><![CDATA[<p><font size="2">最近根据wsdl文件生成客户端代码,使用MyEclipse的xfire和axis插件都报错,报错如截图;</font></p> <p><img src="http://farm4.static.flickr.com/3446/3828052651_80f9a5f741.jpg"> </p> <p>&nbsp;</p> <p><img src="http://farm4.static.flickr.com/3494/3828852152_25bd8c806e.jpg"> </p><font size="2">后来在网上搜,原因应该是服务端发布的时候使用的是axis1.2版本的,使用的版本过低.于是从网上下载了axis1.2的版本,再试,还是一样报错.<br></font> <p><font size="2"><br>报错信息如下:<br>&lt;Recharge xmlns="ocs/server"&gt;<br>&nbsp; &lt;in0 xmlns=""&gt;<br>&nbsp;&nbsp;&nbsp; &lt;requestId&gt;20090728000022&lt;/requestId&gt;<br>&nbsp;&nbsp;&nbsp; &lt;requestTime&gt;20081102000000&lt;/requestTime&gt;<br>&nbsp;&nbsp;&nbsp; &lt;destinationId&gt;13340011829&lt;/destinationId&gt;<br>&nbsp;&nbsp;&nbsp; &lt;destinationAttr&gt;2&lt;/destinationAttr&gt;<br>&nbsp;&nbsp;&nbsp; &lt;balanceType&gt;2000&lt;/balanceType&gt;<br>&nbsp;&nbsp;&nbsp; &lt;rechargeUnit&gt;0&lt;/rechargeUnit&gt;<br>&nbsp;&nbsp;&nbsp; &lt;objType&gt;5BC&lt;/objType&gt;<br>&nbsp;&nbsp;&nbsp; &lt;rechargeAmount&gt;10&lt;/rechargeAmount&gt;<br>&nbsp;&nbsp;&nbsp; &lt;requestAmount&gt;1&lt;/requestAmount&gt;<br>&nbsp;&nbsp;&nbsp; &lt;cardNumber/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;channelID/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;operSystem/&gt;<br>&nbsp; &lt;/in0&gt;<br>&lt;/Recharge&gt;<br>java.lang.NullPointerException<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteDefaultNs(BaseNsStreamWriter.java:528)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.ctc.wstx.sw.SimpleNsStreamWriter.writeDefaultNamespace(SimpleNsStreamWriter.java:111)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.ctc.wstx.sw.SimpleNsStreamWriter.writeNamespace(SimpleNsStreamWriter.java:119)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.MTOMXMLStreamWriter.writeNamespace(MTOMXMLStreamWriter.java:146)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.serialize.StreamingOMSerializer.serializeElement(StreamingOMSerializer.java:243)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.serialize.StreamingOMSerializer.serializeNode(StreamingOMSerializer.java:76)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.serialize.StreamingOMSerializer.serialize(StreamingOMSerializer.java:59)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeByPullStream(OMSerializerUtil.java:473)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:823)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:848)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:819)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:180)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:848)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axiom.om.impl.llom.OMNodeImpl.serializeAndConsume(OMNodeImpl.java:419)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.transport.http.SOAPOverHTTPSender$AxisSOAPRequestEntity.handleOMOutput(SOAPOverHTTPSender.java:190)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.transport.http.SOAPOverHTTPSender$AxisSOAPRequestEntity.writeRequest(SOAPOverHTTPSender.java:232)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:495)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1973)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:541)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.transport.http.SOAPOverHTTPSender.send(SOAPOverHTTPSender.java:119)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:335)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:204)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:674)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:237)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.java:202)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.huawei.bus.ws.ct.skeleton.UvcSoapForOcsServiceStub.Recharge(UvcSoapForOcsServiceStub.java:266)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at test.Test.main(Test.java:56) </font></p> <p><font size="2">&nbsp; 把报错的测试工程发到同事那里测试,一切正常.<br>&nbsp; 最后只好从同事那里</font><font size="2">发过来axis的jar包导入,最后正常. </font> <p><font size="2">&nbsp; 怀疑是axis版本不一样,用比较工具比较两个lib文件夹,果然axis的版本不一样.</font> <p><font size="2">&nbsp;</font> <p><font size="2">&nbsp; 用org.apache.axis2.Version.getVersionText() 返回版本号,一个是1.1,一个是1.1.1(才发现axis2的2不是版本号...). </font> <p><font size="2">&nbsp; 之前一直都用xfire,好像没有遇到过服务端和客户端版本不一致还会有问题.看来还是要慎用axis.</font><img src ="http://www.blogjava.net/wangjc0801/aggbug/291439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-08-17 10:46 <a href="http://www.blogjava.net/wangjc0801/archive/2009/08/17/291439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐一款个人笔记软件</title><link>http://www.blogjava.net/wangjc0801/archive/2009/07/25/288321.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Sat, 25 Jul 2009 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/07/25/288321.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/288321.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/07/25/288321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/288321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/288321.html</trackback:ping><description><![CDATA[<p></p><font color="#0000ff" size="2">下载地址:<a href="http://www.box.net/shared/pf3gm0u8xj">treeDBnotes.rar</a></font>  <p>&nbsp;</p> <p><font color="#0000ff" size="2">下载试用了很多类型功能的软件,觉得这个还算合适,只是好像没有全文搜索.推荐一下.软件截图如下:</font></p> <div class="wlWriterEditableSmartContent" id="scid:51CF81A4-8F44-4a2c-8837-198C090B9994:4f1f4dc1-f269-4d5e-90b6-9f92cc9ec171" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><div class="wlWriterSmartContent" id="scid:51CF81A4-8F44-4a2c-8837-198C090B9994:4f1f4dc1-f269-4d5e-90b6-9f92cc9ec171" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>-------------------</p> <p>2009-07-25:</p> <p>试用了很多类似的软件,包括这款和其他的比如myData,everNote等等等等,还是用回了最开始使用的"电子日记本v2.53".该有的功能都有了,最主要的还是全文搜索功能....</p></div><img src ="http://www.blogjava.net/wangjc0801/aggbug/288321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-07-25 12:40 <a href="http://www.blogjava.net/wangjc0801/archive/2009/07/25/288321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ConceptDraw PRO 7 专业流程绘制软件免费注册</title><link>http://www.blogjava.net/wangjc0801/archive/2009/04/02/263502.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Thu, 02 Apr 2009 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/04/02/263502.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/263502.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/04/02/263502.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/263502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/263502.html</trackback:ping><description><![CDATA[<p><font color="#0000ff">首先到 </font><a title="这个页面" href="http://www.conceptdraw.com/registration/cd7special.php"><font color="#0000ff">这个页面</font></a><font color="#0000ff"> 注册，可得到序列号。之后到</font><a title="这里" href="http://download.cnet.com/ConceptDraw/3000-2191_4-10367699.html"><font color="#0000ff">这里</font></a><font color="#0000ff">下载软件，大概160M</font></p> <p><font color="#0000ff"><img src="http://pic.yupoo.com/jdvip/9735673673e9/medium.jpg"> </font></p> <p><font color="#0000ff"></font>&nbsp;</p> <p><font color="#0000ff">ConceptDraw Pro 一款简单易用的软件流程图、组织图表、时间线、市场图表等图表的工具软件。有67种工作导向、可升级的对象数据库，可提供你超过1600种制作流程图、办公室配置图或其它图表所需的对象。ConceptDraw跨平台，可嵌入超级链接，并包含一个内建的电子表格，还有计算功能。它还包含聪明连接模式（Smart Connection Mode）和直接连结模式（Direct Connection Mode）。这些模式可让你轻松地画出大型流程图或图表。当输出成HTML时，它还支持可点选影像图的最佳化输出。1.8版本中增加了XML支持，新的菜单属性(帮助/得到新版)，可以让用户方便的通过互联网下载升级程序，寻找/替换功能提供给你在编辑过程中更大的便利。</font></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/263502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-04-02 10:37 <a href="http://www.blogjava.net/wangjc0801/archive/2009/04/02/263502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EL 表达式之一</title><link>http://www.blogjava.net/wangjc0801/archive/2009/03/22/261287.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Sun, 22 Mar 2009 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/03/22/261287.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/261287.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/03/22/261287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/261287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/261287.html</trackback:ping><description><![CDATA[<p><font color="#0000ff">1. EL简介 </font> <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; EL,Expression Lanauage，原本是JSTL1.0中方便存取数据所定义的语言。当时只能在JSTL标签中使用。如</font>  <p><font color="#0000ff">&lt;c:out value="${3+7}"&gt;。</font>  <p><font color="#0000ff">&nbsp;&nbsp; 到了JSP2.0以后，EL被正式纳入标准规范之一。因此，要在jsp页面中直接使用EL，容器必须是至少支持Servlet2.4/JSP2.0的，而如Tomcat4.1.29，只支持servlet2.3/JSP1.2，所以不能在jsp页面中直接使用EL。</font>  <p><font color="#0000ff">2. EL语法</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 2.1 运算符--.和[]</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; ${sessionScope.user.sex}</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; ${sessionScope.user["sex"]}</font>  <p><font color="#0000ff">相当于：</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; User user = (User)session.getAttribute("user");</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; String sex = user.getSex();</font>  <p><font color="#0000ff">需要注意的两点：</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 1. 当属性名称中有特殊字符，如“_”时，必须使用[].</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${sessionScope.user.my_name}不正确，应改为$(sessionScope.user["my_name"]);</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 2. 使用变量时，必须使用[].</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${sessionScope.user[data]}. data="name"时，相当于${sessionScope.user["name"]}.但不能使用${sessionScope.user.data}.</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 3. 关系运算符，使用${param.password1 == param.password2}，不能写成${param.password1} == ${param.password2}</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 4. ${empty param.username} = ${param.username == null}判断是否为空或为null。</font> <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 2.2 变量</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; $(username)</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 没有指定范围的时候，会依次在Request,session,Application中查找username，找到就返回不再继续；否则返回null</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 2.3 自动类型转换</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; ${param.count+10}</font>  <p><font color="#0000ff">相当于：</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; String str = request.getParamter("count");</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; int count = Integer.ParseInt(str);</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; count = count + 10;&nbsp;&nbsp; </font> <p><font color="#0000ff">&nbsp;&nbsp;&nbsp; 2.4 隐含对象</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. 范围相关：pageScore,requestScore,sessionScore,applicationScore</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这4个隐含对象只能用来取得范围属性值，也就是getAttribute(String name)，不能取得其他信息比如请求参数或表头信息等。</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. 输入相关：param,paramValues</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${param.name} = request.getParameter(String name)</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${paramValues} = request.getParameterValues(String name),获取复选框值的时候使用。eg：${paramValues.habit[0]},${paramValues.habit[1]}</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:questEncoding value="GB2312" /&gt; = request.setCharacterEncoding("GB2312")</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. 其他：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie,header,headerValues,initParam,pageContext</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c1.&nbsp; cookie以key、value的方式将sessionTracking中的内容记录在一个文本文件中。从cookie中获取值，${cookie.username}</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c2.&nbsp; header存储用户浏览器和服务端用来沟通的数据，当用户要求服务端的网页时，会送出一个记载要求信息的标头文件。包括用户浏览器的版本，用户计算机的区域等相关数据。eg:${header["User-Agent"]}获取用户浏览器版本.同一标头有不同值的话，使用headerValues来获取</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c3.&nbsp; ${initParam.<strong>userid</strong>} 从web.xml中设定的值，相当于String userid=(String)application.getInitParameter("userid");</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l<strong>&lt;context-param&gt;</strong></font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l<strong>&lt;param-name&gt;userid&lt;/param-name&gt;</strong></font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l<strong>&lt;param-value&gt;mike&lt;/param-value&gt;</strong></font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l<strong>&lt;/context-param&gt;</strong></font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l</font>  <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c4. 使用${pageContext}获取其他有关用户要求或页面的信息</font>  <p><font color="#0000ff"></font></p> <p><font color="#0000ff"></font></p> <p><font color="#0000ff"></font></p> <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${pageContext.request.queryString}:获取请求的参数字符串</font></p> <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${pageContext.request.requestURL}:获取请求的URL，但不包含请求的参数字符串</font></p> <p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${pageContext.request.contextPath}:服务的web application名称</font></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/261287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-03-22 09:59 <a href="http://www.blogjava.net/wangjc0801/archive/2009/03/22/261287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探查 ClassCastException(转载)</title><link>http://www.blogjava.net/wangjc0801/archive/2009/03/19/260716.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Thu, 19 Mar 2009 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/03/19/260716.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/260716.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/03/19/260716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/260716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/260716.html</trackback:ping><description><![CDATA[<p><font size="2">转载自:<a title="http://www.javaeedev.com/blog/article.jspx?articleId=ff80808114e23046011535799b5e0ecd" href="http://www.javaeedev.com/blog/article.jspx?articleId=ff80808114e23046011535799b5e0ecd">http://www.javaeedev.com/blog/article.jspx?articleId=ff80808114e23046011535799b5e0ecd</a></font></p> <p><font size="2"><strong>问题描述</strong></font></p> <p><br><font size="2">ClassCastException 是 JVM 在检测到两个类型间的转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。本模式试图为您提供了解和排除 ClassCastException 错误最常见成因的一些基本要素。</font></p> <p><font size="2"><strong>故障排除</strong></font></p> <p><br><font size="2">请注意，并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。</font></p> <p><font size="2">&nbsp;</font></p> <p><a name="Why_does_the_problem_occur"><font color="#000000" size="2"><strong>为什么发生此问题？</strong></font></a><font size="2"> </font> <p><font size="2">&nbsp; </font> <p><a name="Why_does_the_problem_occur"><font color="#000000" size="2">在执行几乎任何子系统（Web 容器、EJB、JCA、群集等）的应用程序代码或 WebLogic Server 代码内均可能发生 ClassCastException。通过转换，可以指示 Java 编译器将给定类型的变量作为另一种变量来处理。对基础类型和用户定义类型都可以进行转换。Java 语言规范定义了允许的转换，其中的大多数可在编译时进行验证。不过，某些转换还需要运行时验证。如果在此运行时验证过程中检测到不兼容，JVM 就会引发 ClassCastException。</font></a><font size="2"> </font> <p><a name="Why_does_the_problem_occur"><font color="#000000" size="2">假设有一个 S 类型的对象，我们想把它转换为 T 类型。</font></a><pre class="csharpcode">S s;
...
T t = (T) s;</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p><a name="Why_does_the_problem_occur"><br><font color="#000000" size="2">如果存在以下情况，上述转换就可能引发 ClassCastException</font></a><font size="2"> </font>
<ul>
<li><a name="Why_does_the_problem_occur"><font color="#000000" size="2">S 与 T 不兼容。规范规定：“当应用程序代码尝试将某一对象转换为某一子类时，如果该对象并非该子类的实例，JVM 就会抛出 ClassCastException。”以下是一个示例代码，执行该代码时将会引发此类错误：</font></a></li></ul>
<div class="csharpcode"><pre class="alt"><font color="#000000"><span class="kwrd">public</span> <span class="kwrd">class</span> TestCCE {</font></pre><pre>  <font color="#000000"><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String args[]) {</font></pre><pre class="alt">    Object obj = <font color="#000000"><span class="kwrd">new</span> Object();</font></pre><pre>    String s = (String) obj;</pre><pre class="alt">  }</pre><pre>}</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<ul>
<li><a name="Why_does_the_problem_occur"><font color="#000000" size="2">S 类型和 T 类型兼容，但加载时使用了不同的 ClassLoader。</font></a></li></ul>
<p><a name="Why_does_the_problem_occur"><font color="#000000" size="2">第二个原因实际上是这种错误最常见的原因。这种情况在诊断上有相当的难度，而且需要对 Java 类加载以及 WebLogic 类加载体系结构方面的基础知识有一定程度的了解。</font></a><font size="2"> </font>
<p><a name="What_is_a_classloader"><font color="#000000" size="2"><strong>什么是 ClassLoader？</strong></font></a><font size="2"> </font>
<p><a name="What_is_a_classloader"><font color="#000000" size="2">ClassLoader 是允许 JVM 查找和加载类的一种 Java 类。JVM 有内置的 ClassLoader。不过，应用程序可以定义自定义 ClassLoader。应用程序定义新的 ClassLoader 通常有两个主要目的：</font></a><font size="2"> </font>
<ul>
<li><a name="What_is_a_classloader"><font color="#000000" size="2">自定义和扩展 JVM 加载类的方式。例如：增加对新的类库（网络、加密文件等）的支持</font></a><font size="2"> </font>
<li><a name="What_is_a_classloader"><font color="#000000" size="2">划分 JVM 名称空间，避免名称冲突。举例来说，利用划分技术可同时运行同一应用程序的多个版本（基于空间的划分）。此项技术在应用程序服务器（如 WebLogic Server）内的另一个重要用途是启用应用程序热重新部署，即在不重新启动 JVM 的情况下启动应用程序的新版本（基于时间的划分）。</font></a></li></ul>
<p><a name="What_is_a_classloader"><font color="#000000" size="2">ClassLoader 按层级方式进行组织。除系统 Boot ClassLoader 外，其它 ClassLoader 都必须有父 ClassLoader。</font></a><a href="http://e-docs.bea.com/wls/docs81/programming/classloading.html"><font color="#000000" size="2">http://e-docs.bea.com/wls/docs81/programming/classloading.html</font></a><font size="2"> (English) 中提供了对 WebLogic 类加载体系结构的说明。 </font>
<p><a name="Keys_to_understanding_classloading"><font color="#000000" size="2"><strong>理解类加载的关键</strong></font></a></p>
<p><br><font size="2">记住以下内容会有帮助： </font></p>
<ul>
<li><a name="Keys_to_understanding_classloading"><font color="#000000" size="2">永远无法在同一 ClassLoader 中重新加载类：“热重新部署”需要使用新的 ClassLoader。每个类对其 ClassLoader 的引用都是不可变的：this.getClass().getClassLoader()</font></a><font size="2"> </font>
<li><a name="Keys_to_understanding_classloading"><font color="#000000" size="2">在加载类之前，ClassLoader 始终会先询问其父 ClassLoader（委托模型）。这意味着将永远无法重写“核心”类</font></a><font size="2"> </font>
<li><a name="Keys_to_understanding_classloading"><font color="#000000" size="2">同级 ClassLoader 间互不了解</font></a><font size="2"> </font>
<li><a name="Keys_to_understanding_classloading"><font color="#000000" size="2">由不同 ClassLoader 加载的同一类文件也会被视为不同的类，即便每个字节都完全相同。这是 ClassCastException 的一个典型成因。</font></a><font size="2"> </font>
<li><a name="Keys_to_understanding_classloading"><font color="#000000" size="2">可以使用 Thread.setContextClassloader(cl) 将 ClassLoader 连接到线程的上下文</font></a></li></ul>
<p><a name="Diagnosis"><font color="#000000" size="2"><strong>诊断</strong></font></a><font size="2"> </font>
<p><a name="Diagnosis"><font color="#000000" size="2">通常可以在服务器的日志和/或客户端获得完整的 ClassCastException 堆栈跟踪。该堆栈应能使您对涉及的 WebLogic Server 子系统的情况有相当深入的了解。请根据这些信息确认该问题是否与某个</font></a><a href="http://www.bea.com.cn/support_pattern/Class_Cast_Exceptions_Pattern.html#Known_WebLogic_Server_Issues"><font color="#000000" size="2">已知 WebLogic Server 问题</font></a><font size="2">的情况相符。如果相符，请使用相应的解决办法。 </font>
<p><font size="2">如果错误与所有已知问题的情况均不相符，则需要做进一步探查。如果错误出现在您可以编辑和编译源代码的类中，以下方法可能有助于您理解该问题。 </font>
<p><font size="2">假设出现错误的代码行类似于： </font>
<p><font size="2">oo f = (Foo) bar.method(); </font>
<p><font size="2">如果按照转换规则该转换应该有效，但仍然引发了 ClassCastException，则可能的情况是：类“bar”和“Foo”是由不同的 ClassLoader 加载的。要验证这一点，请像下面这样拆分该代码行： </font>
<p><font size="2">&nbsp;</font>
<div class="csharpcode"><pre class="alt">Object o = bar.method();</pre><pre>System.err.println(<font color="#000000"><span class="str">"The object "</span> + o + <span class="str">" classloader is "</span> +</font></pre><pre class="alt">o.getClass().getClassLoader());</pre><pre>System.err.println(<font color="#000000"><span class="str">"Class Foo class loader is "</span> +</font></pre><pre class="alt">Foo.<font color="#000000"><span class="kwrd">class</span>.getClassLoader());</font></pre><pre>Foo f = (Foo) o;</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<pre><font size="2">&nbsp;</font></pre>
<p><font size="2">典型的输出可能与此类似： </font>
<p><font size="2"></font>&nbsp; <p><font color="#0000ff" size="2">The object Foo@@3e86d0 classloader is<br>sun.misc.Launcher$AppClassLoader@b9d04<br>Class Foo classloader is<br>weblogic.utils.classloaders.ChangeAwareClassLoader@5998cb finder:<br></font><a href="mailto:weblogic.utils.classloaders.MultiClassFinder@7c2528"><font color="#0000ff" size="2">weblogic.utils.classloaders.MultiClassFinder@7c2528</font></a><font size="2"> </font>
<p><font size="2"></font>&nbsp; <p><font size="2">下一步是探查为什么涉及了不同的 ClassLoader。请执行下列检查清单中的各项检查： </font>
<ul>
<li><font size="2">检查应用程序打包情况，并检查“Foo”是否是使用由不同 ClassLoader 加载的不同模块打包而成。在这方面众所周知的一个成因是 Web 应用程序的“prefer-web-inf-classes”功能（请参阅</font><a href="http://www.bea.com.cn/support_pattern/Class_Cast_Exceptions_Pattern.html#Known_WebLogic_Server_Issues"><font color="#000000" size="2">已知的 WebLogic 问题</font></a><font size="2">） </font>
<li><font size="2">检查它正在使用的应用程序代码或某个框架代码是否更改了 WebLogic 线程的上下文 ClassLoader，且在请求流程期间未将其还原。如果应用程序代码内有对 Thread.setContextClassloader(cl) 的调用，就可能存在这种情况。 </font>
<li><font size="2">如果上述所有措施均无济于事，请尝试将问题隔离在一个简单的、可重现的测试案例中，然后联系 BEA 技术支持部门，以做进一步探查。</font></li></ul>
<p><a name="Known_WebLogic_Server_Issues"><font color="#000000" size="2"><strong>已知的 WebLogic Server 问题</strong></font></a></p>
<p><br><font size="2">以下汇集了可导致 ClassCastException 错误的各种情况，您在使用各种 WebLogic 子系统时可能会遇到这些情况。 </font></p>
<p><a name="Applets_"><font color="#000000" size="2">小程序</font></a><font size="2"> </font>
<p><a name="Applets_"><font color="#000000" size="2">有关该情况的完整说明，请参考 </font></a><a href="http://e-docs.bea.com/wls/docs81/applets/usingapplets.html"><font color="#000000" size="2">http://e-docs.bea.com/wls/docs81/applets/usingapplets.html</font></a><font size="2"> (English) </font>
<p><font size="2">摘要：如果小程序中的 WebLogic Server 客户端尝试从 ClassLoader 获取某些资源信息，且一并使用了缓存标志和 codebase=/bea_wls_internal/classes 标志，就可能会抛出 ClassCastException。 </font>
<p><font size="2"><strong>解决方法：</strong> </font>
<ul>
<li><font size="2">在将类路径 servlet 用作代码基时，请不要使用“cache_option”和“cache_archive”一类的缓存选项。 </font>
<li><font size="2">使用缓存选项时，请不要使用 /classes (ClasspathServlet) 做为代码基。如果要这样做，请先使用归档实用程序打包客户端 JAR。</font></li></ul>
<p><font size="2">有关此限制的详细信息，请参阅 </font><a href="http://developer.java.sun.com/developer/bugParade/bugs/4648591.html"><font color="#000000" size="2">http://developer.java.sun.com/developer/bugParade/bugs/4648591.html</font></a><font size="2"> (English)。 </font>
<p><a name="JCA_connectors_"><font color="#000000" size="2">JCA Connector</font></a><font size="2"> </font>
<p><a name="JCA_connectors_"><font color="#000000" size="2">有关该情况的完整说明，请参考 </font></a><a href="http://e-docs.bea.com/wls/docs81/notes/issues.html"><font color="#000000" size="2">http://e-docs.bea.com/wls/docs81/notes/issues.html</font></a><font size="2"> (English)。 </font>
<p><font size="2">摘要：发出连接请求时，WebLogic Server 会返回一个代理对象，该对象通过资源适配器将连接对象封装后返回到客户端。WebLogic Server 使用该代理来提供一些功能，帮助应用程序使用 WebLogic Server 的“J2EE 连接器体系结构”实现。这些功能包括 (1) 连接泄漏检测功能和 (2) 连接请求在启动使用该连接的全局事务之前发出时，推迟 XAResource 登记。 </font>
<p><font size="2">如果将连接请求返回的连接对象向原始的 Connection 类进行了转换，就可能发生 ClassCastException。导致该异常的对象不外乎在连接请求过程中：(1) 资源适配器进行转换时或 (2) 客户端进行转换时。 </font>
<p><font size="2">在 WebLogic Server 8.1 SP2 中，尝试检测由上述资源适配器情况 (1) 导致的 ClassCastException。如果服务器检测到该转换失败，将关闭代理包装器功能，并在连接请求期间返回连接对象（不进行包装）。服务器会记录一条警告消息，说明代理包装器已被关闭。出现此类转换故障时，连接泄漏检测和 XAResource 推迟登记功能也将被关闭（但当前在控制台监视中并不会就此给出任何指示）。 </font>
<p><font size="2">WebLogic Server 尝试以使用容器管理的安全性的客户端身份检测 ClassCastException。如果要这样做，则部署的资源适配器须定义安全性 Credential。 </font>
<p><font size="2">如果客户端在执行转换时发生 ClassCastException，可按如下方式修改客户（客户端）代码： </font>
<p><font size="2">解决方法：如果客户端将连接对象转换为 MyConnection，而不是将 MyConnection 作为实现资源适配器的 Connection 接口的一个类，请将该对象修改为一个扩展 Connection 的接口。实现一个用于实现 MyConnection 接口的 MyConnectionImpl 类。 </font>
<p><a name="Servlet_dynamic_reloading"><font color="#000000" size="2"><strong>Servlet 动态重新加载</strong></font></a><font size="2"> </font>
<p><a name="Servlet_dynamic_reloading"><font color="#000000" size="2">有关该情况的完整说明，请参考 </font></a><a href="http://e-docs.bea.com/wls/docs81/jsp/reference.html"><font color="#000000" size="2">http://e-docs.bea.com/wls/docs81/jsp/reference.html</font></a><font size="2"> (English) </font>
<p><font size="2">摘要：要在会话过程中动态重新加载 servlet 或 JSP，servlet 会话中存储的对象必须是可序列化的。需要进行序列化是因为，servlet 是使用新的 ClassLoader 重新加载的，而这会导致此前加载的所有类（旧版本 servlet 中的类）与使用新的 ClassLoader 加载的所有类（新版本 servlet 类）发生不兼容的情况。这种不兼容会导致 servlet 返回 ClassCastException 错误。 </font>
<p><a name="Using_Prefer-web-inf-classes_feature"><font color="#000000" size="2">使用 Prefer-web-inf-classes 功能</font></a><font size="2"> </font>
<p><a name="Using_Prefer-web-inf-classes_feature"><font color="#000000" size="2">有关该情况的完整说明，请参考 </font></a><a href="http://e-docs.bea.com/wls/docs81/programming/classloading.html"><font color="#000000" size="2">http://e-docs.bea.com/wls/docs81/programming/classloading.html</font></a><font size="2"> (English) </font>
<p><font size="2">摘要：weblogic.xml Web 应用程序部署描述符包含一个 prefer-web-inf-classes 元素（container-descriptor 元素的子元素）。缺省情况下，此元素设置为 False。如果将此元素设置为 True，则不遵循 ClassLoader 委托模型，从而使 Web 应用程序中的类定义的加载顺序优先于更高级别的 ClassLoader 中的类定义。这样 Web 应用程序就可使用其自己版本的第三方类，该类也可能是 WebLogic Server 的一部分。请参阅 </font><a href="http://e-docs.bea.com/wls/docs81/webapp/weblogic_xml.html"><font color="#000000" size="2">weblogic.xml Deployment Descriptor Elements</font></a><font size="2"> (English)。 </font>
<p><font size="2">使用该功能时，必须注意不要混淆使用 Web 应用程序的类定义创建的实例与使用服务器的定义创建的实例。如果混淆了此类实例，就会发生 ClassCastException。 </font>
<p><a name="Cluster:_storing_object_containing_EJBOb"><font color="#000000" size="2">群集：在 http 会话中存储包含 EJBObject 的自定义对象 - CR102119</font></a><font size="2"> </font>
<p><a name="Cluster:_storing_object_containing_EJBOb"><font color="#000000" size="2">摘要：可序列化的自定义对象会包装 EJBObject（对 EJB 的引用）。该自定义对象存储在 http 会话中。会话复制时，这种设计就会导致 ClassCastException。</font></a><font size="2"> </font>
<p><a name="Cluster:_storing_object_containing_EJBOb"><font color="#000000" size="2">解决方法：在以后版本的 WebLogic Server 中将彻底解决该问题。目前的解决办法是在包装器内存储 EJB 句柄（而不是 EJBObject）。</font></a><font size="2"> </font>
<p><a name="Cluster:"><font color="#000000" size="2">群集：Failover 后使用 http 会话中的 EJB 句柄 - CR187062</font></a><font size="2"> </font>
<p><a name="Cluster:"><font color="#000000" size="2">摘要：在群集中分别部署 webApp 和 EJB。EJB 句柄包装在可序列化的自定义对象中，而该对象存储在 http 会话中。Failover 后，通过句柄访问 EJB 就会发生 ClassCastException。</font></a><font size="2"> </font>
<p><a name="Cluster:"><font color="#000000" size="2">解决方法：在同一个 ear 文件中包装 webApp 和 EJB。该问题存在于 WLS 8.1sp2 中，目前正在等待更正。<br></font></a><a href="http://www.bea.com.cn/support_pattern/Class_Cast_Exceptions_Pattern.html#TOP"><font color="#000000" size="2">返回页首</font></a><font size="2"> </font>
<p><font size="2">需要更多帮助？<br>如果您已经理解这个模式，但仍需要更多帮助，您可以： </font>
<ol>
<li><font size="2">在 </font><a href="http://support.bea.com"><font color="#000000" size="2">http://support.bea.com/</font></a><font size="2"> 上查询 AskBEA（例如，使用“ClassCastException”），以查找其它已发布的解决办法。 </font>
<li><font size="2">在 </font><a href="http://forums.bea.com"><font color="#000000" size="2">http://forums.bea.com/</font></a><font size="2"> 上，向 BEA 的某个新闻组提出更详细具体的问题。</font></li></ol>
<p><font size="2"></font></p>
<p><font size="2"></font></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/260716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-03-19 11:42 <a href="http://www.blogjava.net/wangjc0801/archive/2009/03/19/260716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP协议（转载）</title><link>http://www.blogjava.net/wangjc0801/archive/2009/02/18/255356.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Wed, 18 Feb 2009 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/02/18/255356.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/255356.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/02/18/255356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/255356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/255356.html</trackback:ping><description><![CDATA[<p><strong><font color="#0000ff" size="2"></font></strong> <p><font color="#0000ff" size="2">HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。它于1990年提出，经过几年的<br>使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，HTTP/1.1的规范化工作正在进行之中，而且HTTP-<br>NG(Next Generation of HTTP)的建议已经提出。<br>HTTP协议的主要特点可概括如下：<br>1.支持客户/服务器模式。<br>2.简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服<br>务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。<br>3.灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。<br>4.无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方<br>式可以节省传输时间。<br>5.无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则<br>它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。</font> <p><strong><font color="#0000ff" size="2">一、HTTP协议详解之URL篇<br></font></strong> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; http（超文本传输协议）是一个基于请求与响应模式的、无状态的、应用层的协议，常基于TCP的连接方<br>式，HTTP1.1版本中给出一种持续连接的机制，绝大多数的Web开发，都是构建在HTTP协议之上的Web应用。</font> <p><font color="#0000ff" size="2">HTTP URL (URL是一种特殊类型的URI，包含了用于查找某个资源的足够的信息)的格式如下：<br></font><a href="http://host%5b%22:%22port%5D%5Babs_path/"><font color="#0000ff" size="2">http://host[":"port][abs_path</font></a><font color="#0000ff" size="2">]<br>http表示要通过HTTP协议来定位网络资源；host表示合法的Internet主机域名或者IP地址；port指定一个端口号，<br>为空则使用缺省端口80；abs_path指定请求资源的URI；如果URL中没有给出abs_path，那么当它作为请求URI<br>时，必须以“/”的形式给出，通常这个工作浏览器自动帮我们完成。<br>eg:<br>1、输入：</font><a href="http://www.guet.edu.cn/"><font color="#0000ff" size="2">www.guet.edu.cn</font></a><br><font color="#0000ff" size="2">浏览器自动转换成：</font><a href="http://www.guet.edu.cn/"><font color="#0000ff" size="2">http://www.guet.edu.cn/</font></a><br><font color="#0000ff" size="2">2、http:192.168.0.116:8080/index.jsp </font> <p><strong><font color="#0000ff" size="2">二、HTTP协议详解之请求篇</font></strong> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; http请求由三部分组成，分别是：请求行、消息报头、请求正文</font> <p><font color="#0000ff" size="2">1、请求行以一个方法符号开头，以空格分开，后面跟着请求的URI和协议的版本，格式如下：Method Request-<br>URI HTTP-Version CRLF&nbsp; <br>其中 Method表示请求方法；Request-URI是一个统一资源标识符；HTTP-Version表示请求的HTTP协议版本；<br>CRLF表示回车和换行（除了作为结尾的CRLF外，不允许出现单独的CR或LF字符）。</font> <p><font color="#0000ff" size="2">请求方法（所有方法全为大写）有多种，各个方法的解释如下：<br>GET&nbsp;&nbsp;&nbsp;&nbsp; 请求获取Request-URI所标识的资源<br>POST&nbsp;&nbsp;&nbsp; 在Request-URI所标识的资源后附加新的数据<br>HEAD&nbsp;&nbsp;&nbsp; 请求获取由Request-URI所标识的资源的响应消息报头<br>PUT&nbsp;&nbsp;&nbsp;&nbsp; 请求服务器存储一个资源，并用Request-URI作为其标识<br>DELETE&nbsp; 请求服务器删除Request-URI所标识的资源<br>TRACE&nbsp;&nbsp; 请求服务器回送收到的请求信息，主要用于测试或诊断<br>CONNECT 保留将来使用<br>OPTIONS 请求查询服务器的性能，或者查询与资源相关的选项和需求<br>应用举例：<br>GET方法：在浏览器的地址栏中输入网址的方式访问网页时，浏览器采用GET方法向服务器获取资源，<br>eg:GET /form.html HTTP/1.1 (CRLF)</font> <p><font color="#0000ff" size="2">POST方法要求被请求服务器接受附在请求后面的数据，常用于提交表单。<br>eg：POST /reg.jsp HTTP/ (CRLF)<br>Accept:image/gif,image/x-xbit,... (CRLF)<br>...<br>HOST:www.guet.edu.cn (CRLF)<br>Content-Length:22 (CRLF)<br>Connection:Keep-Alive (CRLF)<br>Cache-Control:no-cache (CRLF)<br>(CRLF)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //该CRLF表示消息报头已经结束，在此之前为消息报头<br>user=jeffrey&amp;pwd=1234&nbsp; //此行以下为提交的数据</font> <p><font color="#0000ff" size="2">HEAD方法与GET方法几乎是一样的，对于HEAD请求的回应部分来说，它的HTTP头部中包含的信息与通过<br>GET请求所得到的信息是相同的。利用这个方法，不必传输整个资源内容，就可以得到Request-URI所标识的资<br>源的信息。该方法常用于测试超链接的有效性，是否可以访问，以及最近是否更新。<br>2、请求报头后述<br>3、请求正文(略) </font> <p><strong><font color="#0000ff" size="2">三、HTTP协议详解之响应篇</font></strong> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; 在接收和解释请求消息后，服务器返回一个HTTP响应消息。</font> <p><font color="#0000ff" size="2">HTTP响应也是由三个部分组成，分别是：状态行、消息报头、响应正文<br>1、状态行格式如下：<br>HTTP-Version Status-Code Reason-Phrase CRLF<br>其中，HTTP-Version表示服务器HTTP协议的版本；Status-Code表示服务器发回的响应状态代码；Reason-Phrase<br>表示状态代码的文本描述。<br>状态代码有三位数字组成，第一个数字定义了响应的类别，且有五种可能取值：<br>1xx：指示信息--表示请求已接收，继续处理<br>2xx：成功--表示请求已被成功接收、理解、接受<br>3xx：重定向--要完成请求必须进行更进一步的操作<br>4xx：客户端错误--请求有语法错误或请求无法实现<br>5xx：服务器端错误--服务器未能实现合法的请求<br>常见状态代码、状态描述、说明：<br>200 OK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //客户端请求成功<br>400 Bad Request&nbsp; //客户端请求有语法错误，不能被服务器所理解<br>401 Unauthorized //请求未经授权，这个状态代码必须和WWW-Authenticate报&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //头域一起使用 <br>403 Forbidden&nbsp; //服务器收到请求，但是拒绝提供服务<br>404 Not Found&nbsp; //请求资源不存在，eg：输入了错误的URL<br>500 Internal Server Error //服务器发生不可预期的错误<br>503 Server Unavailable&nbsp; //服务器当前不能处理客户端的请求，一段时间后，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //可能恢复正常<br>eg：HTTP/1.1 200 OK （CRLF）</font> <p><font color="#0000ff" size="2">2、响应报头后述</font> <p><font color="#0000ff" size="2">3、响应正文就是服务器返回的资源的内容 </font> <p><strong><font color="#0000ff" size="2">四、HTTP协议详解之消息报头篇</font></strong> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行（对<br>于请求消息，开始行就是请求行，对于响应消息，开始行就是状态行），消息报头（可选），空行（只有<br>CRLF的行），消息正文（可选）组成。</font> <p><font color="#0000ff" size="2">HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。<br>每一个报头域都是由名字+“：”+空格+值 组成，消息报头域的名字是大小写无关的。</font> <p><font color="#0000ff" size="2">1、普通报头<br>在普通报头中，有少数报头域用于所有的请求和响应消息，但并不用于被传输的实体，只用于传输的消息。<br>eg：<br>Cache-Control&nbsp;&nbsp; 用于指定缓存指令，缓存指令是单向的（响应中出现的缓存指令在请求中未必会出现），且是<br>独立的（一个消息的缓存指令不会影响另一个消息处理的缓存机制），HTTP1.0使用的类似的报头域为Pragma。<br>请求时的缓存指令包括：no-cache（用于指示请求或响应消息不能缓存）、no-store、max-age、max-stale、min-<br>fresh、only-if-cached;<br>响应时的缓存指令包括：public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、<br>max-age、s-maxage.<br>eg：为了指示IE浏览器（客户端）不要缓存页面，服务器端的JSP程序可以编写如下：response.sehHeader<br>("Cache-Control","no-cache");<br>//response.setHeader("Pragma","no-cache");作用相当于上述代码，通常两者//合用<br>这句代码将在发送的响应消息中设置普通报头域：Cache-Control:no-cache</font> <p><font color="#0000ff" size="2">Date普通报头域表示消息产生的日期和时间</font> <p><font color="#0000ff" size="2">Connection普通报头域允许发送指定连接的选项。例如指定连接是连续，或者指定“close”选项，通知服务<br>器，在响应完成后，关闭连接</font> <p><font color="#0000ff" size="2">2、请求报头<br>请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。<br>常用的请求报头<br>Accept<br>Accept请求报头域用于指定客户端接受哪些类型的信息。eg：Accept：image/gif，表明客户端希望接受GIF图象<br>格式的资源；Accept：text/html，表明客户端希望接受html文本。<br>Accept-Charset<br>Accept-Charset请求报头域用于指定客户端接受的字符集。eg：Accept-Charset:iso-8859-1,gb2312.如果在请求消<br>息中没有设置这个域，缺省是任何字符集都可以接受。<br>Accept-Encoding<br>Accept-Encoding请求报头域类似于Accept，但是它是用于指定可接受的内容编码。eg：Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。<br>Accept-Language<br>Accept-Language请求报头域类似于Accept，但是它是用于指定一种自然语言。eg：Accept-Language:zh-cn.如果请<br>求消息中没有设置这个报头域，服务器假定客户端对各种语言都可以接受。<br>Authorization<br>Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时，如果收到服务器<br>的响应代码为401（未授权），可以发送一个包含Authorization请求报头域的请求，要求服务器对其进行验证。<br>Host（发送请求时，该报头域是必需的）<br>Host请求报头域主要用于指定被请求资源的Internet主机和端口号，它通常从HTTP URL中提取出来的，eg：<br>我们在浏览器中输入：</font><a href="http://www.guet.edu.cn/index.html"><font color="#0000ff" size="2">http://www.guet.edu.cn/index.html</font></a><br><font color="#0000ff" size="2">浏览器发送的请求消息中，就会包含Host请求报头域，如下：<br>Host：</font><a href="http://www.guet.edu.cn/"><font color="#0000ff" size="2">www.guet.edu.cn</font></a><br><font color="#0000ff" size="2">此处使用缺省端口号80，若指定了端口号，则变成：Host：</font><a href="http://www.guet.edu.cn/"><font color="#0000ff" size="2">www.guet.edu.cn</font></a><font color="#0000ff" size="2">:指定端口号<br>User-Agent<br>我们上网登陆论坛的时候，往往会看到一些欢迎信息，其中列出了你的操作系统的名称和版本，你所使用的<br>浏览器的名称和版本，这往往让很多人感到很神奇，实际上，服务器应用程序就是从User-Agent这个请求报头<br>域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不<br>过，这个报头域不是必需的，如果我们自己编写一个浏览器，不使用User-Agent请求报头域，那么服务器端就<br>无法得知我们的信息了。<br>请求报头举例：<br>GET /form.html HTTP/1.1 (CRLF)<br>Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-<br>powerpoint,application/msword,*/* (CRLF)<br>Accept-Language:zh-cn (CRLF)<br>Accept-Encoding:gzip,deflate (CRLF)<br>If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)<br>If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)<br>User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)<br>Host:www.guet.edu.cn (CRLF)<br>Connection:Keep-Alive (CRLF)<br>(CRLF)</font> <p><font color="#0000ff" size="2">3、响应报头<br>响应报头允许服务器传递不能放在状态行中的附加响应信息，以及关于服务器的信息和对Request-URI所标识<br>的资源进行下一步访问的信息。<br>常用的响应报头<br>Location<br>Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。<br>Server<br>Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是<br>Server响应报头域的一个例子：<br>Server：Apache-Coyote/1.1<br>WWW-Authenticate<br>WWW-Authenticate响应报头域必须被包含在401（未授权的）响应消息中，客户端收到401响应消息时候，并发<br>送Authorization报头域请求服务器对其进行验证时，服务端响应报头就包含该报头域。<br>eg：WWW-Authenticate:Basic realm="Basic Auth Test!"&nbsp; //可以看出服务器对请求资源采用的是基本验证机制。</font> <p><font color="#0000ff" size="2">4、实体报头<br>请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成，但并不是说实体报头域和实体正文要在一起发送，可以只发送实体报头域。实体报头定义了关于实体正文（eg：有无实体正文）和请求所标识的资源的元信息。<br>常用的实体报头<br>Content-Encoding<br>Content-Encoding实体报头域被用作媒体类型的修饰符，它的值指示了已经被应用到实体正文的附加内容的编<br>码，因而要获得Content-Type报头域中所引用的媒体类型，必须采用相应的解码机制。Content-Encoding这样用<br>于记录文档的压缩方法，eg：Content-Encoding：gzip<br>Content-Language<br>Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言<br>阅读<br>者。eg：Content-Language:da<br>Content-Length<br>Content-Length实体报头域用于指明实体正文的长度，以字节方式存储的十进制数字来表示。<br>Content-Type<br>Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg：<br>Content-Type:text/html;charset=ISO-8859-1<br>Content-Type:text/html;charset=GB2312<br>Last-Modified<br>Last-Modified实体报头域用于指示资源的最后修改日期和时间。<br>Expires<br>Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次<br>访问曾访问过的页面时，直接从缓存中加载，缩短响应时间和降低服务器负载)的页面，我们可以使用Expires<br>实体报头域指定页面过期的时间。eg：Expires：Thu，15 Sep 2006 16:23:12 GMT<br>HTTP1.1的客户端和缓存必须将其他非法的日期格式（包括0）看作已经过期。eg：为了让浏览器不要缓存页<br>面，我们也可以利用Expires实体报头域，设置为0，jsp中程序如下：response.setDateHeader("Expires","0");</font> <p><strong><font color="#0000ff" size="2">五、利用telnet观察http协议的通讯过程</font></strong> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; 实验目的及原理：<br>&nbsp;&nbsp;&nbsp; 利用MS的telnet工具，通过手动输入http请求信息的方式，向服务器发出请求，服务器接收、解释和接受请求<br>后，会返回一个响应，该响应会在telnet窗口上显示出来，从而从感性上加深对http协议的通讯过程的认识。</font> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; 实验步骤：</font> <p><font color="#0000ff" size="2">1、打开telnet<br>1.1 打开telnet<br>运行--&gt;cmd--&gt;telnet</font> <p><font color="#0000ff" size="2">1.2 打开telnet回显功能<br>set localecho</font> <p><font color="#0000ff" size="2">2、连接服务器并发送请求<br>2.1 open </font><a href="http://www.guet.edu.cn/"><font color="#0000ff" size="2">www.guet.edu.cn</font></a><font color="#0000ff" size="2"> 80&nbsp; //注意端口号不能省略</font> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; HEAD /index.asp HTTP/1.0<br>&nbsp;&nbsp;&nbsp; Host:www.guet.edu.cn<br>&nbsp;&nbsp; /*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/<br>&nbsp;&nbsp;&nbsp; open </font><a href="http://www.guet.edu.cn/"><font color="#0000ff" size="2">www.guet.edu.cn</font></a><font color="#0000ff" size="2"> 80 <br>&nbsp;&nbsp;&nbsp; GET /index.asp HTTP/1.0&nbsp; //请求资源的内容<br>&nbsp;&nbsp;&nbsp; Host:www.guet.edu.cn&nbsp;&nbsp; </font> <p><font color="#0000ff" size="2">2.2 open </font><a href="http://www.sina.com.cn/"><font color="#0000ff" size="2">www.sina.com.cn</font></a><font color="#0000ff" size="2"> 80&nbsp; //在命令提示符号下直接输入telnet </font><a href="http://www.sina.com.cn/"><font color="#0000ff" size="2">www.sina.com.cn</font></a><font color="#0000ff" size="2"> 80<br>&nbsp;&nbsp;&nbsp; HEAD /index.asp HTTP/1.0<br>&nbsp;&nbsp;&nbsp; Host:www.sina.com.cn</font> <p><font color="#0000ff" size="2">3 实验结果：</font> <p><font color="#0000ff" size="2">3.1 请求信息2.1得到的响应是:</font> <p><font color="#0000ff" size="2">HTTP/1.1 200 OK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //请求成功<br>Server: Microsoft-IIS/5.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //web服务器<br>Date: Thu,08 Mar 200707:17:51 GMT<br>Connection: Keep-Alive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Content-Length: 23330<br>Content-Type: text/html<br>Expries: Thu,08 Mar 2007 07:16:51 GMT<br>Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/<br>Cache-control: private</font> <p><font color="#0000ff" size="2">//资源内容省略</font> <p><font color="#0000ff" size="2">3.2 请求信息2.2得到的响应是:</font> <p><font color="#0000ff" size="2">HTTP/1.0 404 Not Found&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //请求失败<br>Date: Thu, 08 Mar 2007 07:50:50 GMT<br>Server: Apache/2.0.54 &lt;Unix&gt;<br>Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT<br>ETag: "6277a-415-e7c76980"<br>Accept-Ranges: bytes<br>X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix<br>Vary: Accept-Encoding<br>Content-Type: text/html<br>X-Cache: MISS from zjm152-78.sina.com.cn<br>Via: 1.0 zjm152-78.sina.com.cn:80&lt;squid/2.6.STABLES-20061207&gt;<br>X-Cache: MISS from th-143.sina.com.cn<br>Connection: close</font> <p><font color="#0000ff" size="2">失去了跟主机的连接</font> <p><font color="#0000ff" size="2">按任意键继续...</font> <p><font color="#0000ff" size="2">4 .注意事项：1、出现输入错误，则请求不会成功。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、报头域不分大小写。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、更深一步了解HTTP协议，可以查看RFC2616，在</font><a href="http://www.letf.org/rfc"><font color="#0000ff" size="2">http://www.letf.org/rfc</font></a><font color="#0000ff" size="2">上找到该文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、开发后台程序必须掌握http协议</font> <p><strong><font color="#0000ff" size="2">六、</font></strong><a href="http://blog.csdn.net/gueter/archive/2007/04/23/1575543.aspx"><strong><font color="#0000ff" size="2">HTTP协议相关技术补充</font></strong></a> <p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; 1、基础：<br>&nbsp;&nbsp;&nbsp; 高层协议有：文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和<br>HTTP协议等<br>中介由三种：代理(Proxy)、网关(Gateway)和通道(Tunnel)，一个代理根据URI的绝对格式来接受请求，重写全部<br>或部分消息，通过 URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理，作为一些其它服务<br>器的上层，并且如果必须的话，可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接<br>之间的中继点。当通讯需要通过一个中介(例如：防火墙等)或者是中介不能识别消息的内容时，通道经常被使<br>用。<br>&nbsp;&nbsp;&nbsp;&nbsp; 代理(Proxy)：一个中间程序，它可以充当一个服务器，也可以充当一个客户机，为其它客户机建立请求。<br>请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前，必须解释并且<br>如果可能重写它。代理经常作为通过防火墙的客户机端的门户，代理还可以作为一个帮助应用来通过协议处 <br>理没有被用户代理完成的请求。<br>网关(Gateway)：一个作为其它服务器中间媒介的服务器。与代理不同的是，网关接受请求就好象对被请求的<br>资源来说它就是源服务器；发出请求的客户机并没有意识到它在同网关打交道。<br>　　网关经常作为通过防火墙的服务器端的门户，网关还可以作为一个协议翻译器以便存取那些存储在非<br>HTTP系统中的资源。<br>&nbsp;&nbsp;&nbsp; 通道(Tunnel)：是作为两个连接中继的中介程序。一旦激活，通道便被认为不属于HTTP通讯，尽管通道可能<br>是被一个HTTP请求初始化的。当被中继 的连接两端关闭时，通道便消失。当一个门户(Portal)必须存在或中介<br>(Intermediary)不能解释中继的通讯时通道被经常使用。<br>2、协议分析的优势—HTTP分析器检测网络攻击<br>以模块化的方式对高层协议进行分析处理，将是未来入侵检测的方向。<br>HTTP及其代理的常用端口80、3128和8080在network部分用port标签进行了规定<br>3、HTTP协议Content Lenth限制漏洞导致拒绝服务攻击<br>使用POST方法时，可以设置ContentLenth来定义需要传送的数据长度，例如ContentLenth:999999999，在传送完<br>成前，内 存不会释放，攻击者可以利用这个缺陷，连续向WEB服务器发送垃圾数据直至WEB服务器内存耗<br>尽。这种攻击方法基本不会留下痕迹。<br>http://www.cnpaf.net/Class/HTTP/0532918532667330.html<br>4、利用HTTP协议的特性进行拒绝服务攻击的一些构思<br>服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求（毕竟客户端的正常请求比率非常之<br>小），此时从正常客户的角度看来，服务器失去响应，这种情况我们称作：服务器端受到了SYNFlood攻击（SYN洪水攻击）。<br>而Smurf、TearDrop等是利用ICMP报文来Flood和IP碎片攻击的。本文用“正常连接”的方法来产生拒绝服务攻击。<br>19端口在早期已经有人用来做Chargen攻击了，即Chargen_Denial_of_Service，但是！他们用的方法是在两台<br>Chargen 服务器之间产生UDP连接，让服务器处理过多信息而DOWN掉，那么，干掉一台WEB服务器的条件就<br>必须有2个：1.有Chargen服务2.有HTTP 服务<br>方法：攻击者伪造源IP给N台Chargen发送连接请求（Connect），Chargen接收到连接后就会返回每秒72字节的<br>字符流（实际上根据网络实际情况，这个速度更快）给服务器。<br>5、Http指纹识别技术<br>&nbsp;&nbsp; Http指纹识别的原理大致上也是相同的：记录不同服务器对Http协议执行中的微小差别进行识别.Http指纹识<br>别比TCP/IP堆栈指纹识别复杂许 多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应<br>信息变的很容易,这样使得识别变的困难；然而定制TCP/IP堆栈的行为 需要对核心层进行修改,所以就容易识<br>别.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要让服务器返回不同的Banner信息的设置是很简单的,象Apache这样的开放源代码的Http服务器,用户可以在<br>源代码里修改Banner信息,然 后重起Http服务就生效了；对于没有公开源代码的Http服务器比如微软的IIS或者<br>是Netscape,可以在存放Banner信息的Dll文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果<br>还是不错的.另外一种模糊Banner信息的方法是使用插件。<br>常用测试请求：<br>1：HEAD/Http/1.0发送基本的Http请求<br>2：DELETE/Http/1.0发送那些不被允许的请求,比如Delete请求<br>3：GET/Http/3.0发送一个非法版本的Http协议请求<br>4：GET/JUNK/1.0发送一个不正确规格的Http协议请求<br>Http指纹识别工具Httprint,它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定Http服务器的类型.它<br>可以被用来收集和分析不同Http服务器产生的签名。<br>6、其他：为了提高用户使用浏览器时的性能，现代浏览器还支持并发的访问方式，浏览一个网页时同时建立<br>多个连接，以迅速获得一个网页上的多个图标，这样能更快速完成整个网页的传输。<br>HTTP1.1中提供了这种持续连接的方式，而下一代HTTP协议：HTTP-NG更增加了有关会话控制、丰富的内容<br>协商等方式的支持，来提供<br>更高效率的连接。</font></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/255356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-02-18 22:35 <a href="http://www.blogjava.net/wangjc0801/archive/2009/02/18/255356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谷歌移动---免费订阅全国主要城市天气预报</title><link>http://www.blogjava.net/wangjc0801/archive/2009/02/13/254608.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Fri, 13 Feb 2009 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/02/13/254608.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/254608.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/02/13/254608.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/254608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/254608.html</trackback:ping><description><![CDATA[<p>google中国最近推出全国主要城市天气预报短信提醒服务.每天发送一次,还是免费滴.比某些包月的提醒好多了,闲话不说,下面是截图:</p> <div class="wlWriterEditableSmartContent" id="scid:51CF81A4-8F44-4a2c-8837-198C090B9994:16377928-b0ac-4df5-920e-52ce45c9eb9b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><p><a href="http://picasaweb.google.com/tianya0801/DropBox?authkey=VrjKOFR_lhs" atomicselection="true"><img style="border-right: 2px; border-top: 2px; border-left: 2px; border-bottom: 2px" height="178" src="http://lh4.ggpht.com/_L3nkUmUbBp0/SZVx6FQq_5I/AAAAAAAAAr4/k1izbWeCFnM/s400/google.sms.jpg" width="400"></a></p></div> <p>网址：<a href="http://www.google.com/sms/alerts">http://www.google.com/sms/alerts</a></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/254608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-02-13 21:14 <a href="http://www.blogjava.net/wangjc0801/archive/2009/02/13/254608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一款很不错的音乐播放器</title><link>http://www.blogjava.net/wangjc0801/archive/2009/02/09/253848.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Mon, 09 Feb 2009 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/02/09/253848.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/253848.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/02/09/253848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/253848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/253848.html</trackback:ping><description><![CDATA[<p><font color="#0000ff" size="2">&nbsp;&nbsp;&nbsp; 亦歌(<a title="http://www.1g1g.com" href="http://www.1g1g.com">http://www.1g1g.com</a>)是一个在线的音乐播放器,界面很干净,个人很喜欢.另外还支持收藏,歌词,黑名单等功能.</font></p> <p><font color="#0000ff" size="2">还有桌面版本的,很不错.和大家共享一下...</font></p> <p><font color="#0000ff" size="2">下面是截图:</font></p> <p> <div class="wlWriterEditableSmartContent" id="scid:51CF81A4-8F44-4a2c-8837-198C090B9994:49ce8287-cf57-44de-91e1-eb342cff57e6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><p><a href="http://picasaweb.google.com/tianya0801/DropBox?authkey=VrjKOFR_lhs" atomicselection="true"><img style="border-right: 2px; border-top: 2px; border-left: 2px; border-bottom: 2px" height="289" src="http://lh5.ggpht.com/_L3nkUmUbBp0/SY-AZeb4HaI/AAAAAAAAArc/om0epRVWU24/s400/full.jpg" width="400"></a></p></div></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/253848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-02-09 09:04 <a href="http://www.blogjava.net/wangjc0801/archive/2009/02/09/253848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java之网络编程</title><link>http://www.blogjava.net/wangjc0801/archive/2009/02/08/253799.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Sun, 08 Feb 2009 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/02/08/253799.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/253799.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/02/08/253799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/253799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/253799.html</trackback:ping><description><![CDATA[<p><font color="#0000ff" size="2">&nbsp;&nbsp; java 为网络支持提供了java.net包.</font></p> <p><font color="#0000ff" size="2">1. 该包下的URL和URLConnection类提供了以编程方式访问Web服务的功能</font></p> <p><font color="#0000ff" size="2">2. URLDecoder和URLEncoder提供普通字符串和application/x-www-form-urlencoded MIME</font></p> <p><font color="#0000ff" size="2">3. InetAddress类代表IP地址</font></p> <p><font color="#0000ff" size="2">程序清单:InetAddressTest.java</font></p> <p></p> <div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"> <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">import java.net.InetAddress;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> InetAddressTest {</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) throws Exception {</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        InetAddress ia = InetAddress.getByName(<span style="color: #006080">"www.163.com"</span>);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"是否可到达:"</span> + ia.isReachable(5000));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">//获取ia对象的Ip和主机名</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(ia.getHostAddress() + <span style="color: #006080">"~"</span> +ia.getHostName());</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">//getCanonicalHostName返回结果是Ip地址</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(ia.getCanonicalHostName());</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        InetAddress ia1 = InetAddress.getByAddress(<span style="color: #0000ff">new</span> <span style="color: #0000ff">byte</span>[] {10,17,8,61});</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"是否可到达:"</span> + ia1.isReachable(5000));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(ia1.getCanonicalHostName());</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">    }</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">}</pre></div></div>
<p><font color="#0000ff" size="2">程序清单:URLDecoderTest.java</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">import java.net.URLDecoder;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import java.net.URLEncoder;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> URLDecoderTest {</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) throws Exception</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">    {</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">//将application/x-www-form-urlencoded字符串转换成普通字符串</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">//编码方式不同,结果不同</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"utf-8:"</span> + URLEncoder.encode(<span style="color: #006080">"未知数据"</span> , <span style="color: #006080">"utf-8"</span>));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"GBK:"</span> + URLEncoder.encode(<span style="color: #006080">"未知数据"</span> , <span style="color: #006080">"GBK"</span>));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">//将普通字符串转换成application/x-www-form-urlencoded字符串</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"utf-8:"</span> + URLDecoder.decode(<span style="color: #006080">"%E6%9C%AA%E7%9F%A5%E6%95%B0%E6%8D%AE"</span>, <span style="color: #006080">"utf-8"</span>));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"GBK:"</span> + URLDecoder.decode(<span style="color: #006080">"%CE%B4%D6%AA%CA%FD%BE%DD"</span>, <span style="color: #006080">"GBK"</span>));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    }</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">}</pre></div></div></font>
<p></p>
<p>&nbsp;</p>
<p><font color="#ff0000"><strong>Q:上面的getCanonicalHostName()不知道有什么作用,不知道各位大虾有没有了解的?</strong></font></p>
<p><font color="#ff0000"><strong>上网google了一下,在C:\WINDOWS\system32\drivers\etc\hosts中设置了servername,就可以通过该方法获取到,否则返回IP地址.</strong></font></p><img src ="http://www.blogjava.net/wangjc0801/aggbug/253799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-02-08 18:50 <a href="http://www.blogjava.net/wangjc0801/archive/2009/02/08/253799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java常用类:Calendar</title><link>http://www.blogjava.net/wangjc0801/archive/2009/02/06/253485.html</link><dc:creator>wangjc</dc:creator><author>wangjc</author><pubDate>Fri, 06 Feb 2009 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/wangjc0801/archive/2009/02/06/253485.html</guid><wfw:comment>http://www.blogjava.net/wangjc0801/comments/253485.html</wfw:comment><comments>http://www.blogjava.net/wangjc0801/archive/2009/02/06/253485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangjc0801/comments/commentRss/253485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangjc0801/services/trackbacks/253485.html</trackback:ping><description><![CDATA[<p><font color="#0000ff" size="2">1. 处理日期时间的类有java.util.Date和java.util.Calendar</font></p> <p><font color="#0000ff" size="2">2. Date类从java1.0就开始存在了,到现在大部分方法都已经过时了,所以不推荐使用.比如Date有6个构造器,但其中有4个已经不推荐使用了.</font></p> <p><font color="#0000ff" size="2">3. Calendar是一个抽象类.本身不能被实例化,只能通过getInstance()的方法来获取实例对象.Calendar.getInstance()根据TimeZone,Locale类获取特定的Calendar</font></p> <p><font color="#0000ff" size="2">4. Calendar是所有日历类的模板,例如GregorianCalendar(公历)</font></p> <p><font color="#0000ff" size="2">5. Date和Calendar都是表示日期的工具类,二者之间可以任意转换.Calendar的getTime()方法返回Date</font></p> <p><font color="#0000ff" size="2">程序清单:</font></p> <div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 200px"> <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import java.util.Calendar;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">import java.util.Date;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import java.util.Locale;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> DateTest {</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #008000">/**</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #008000">     * @param args</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #008000">     */</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">// TODO Auto-generated method stub</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        Calendar c = Calendar.getInstance(Locale.CHINESE);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">// 有Calendar获取Date</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        Date d = c.getTime();</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(d);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">// 获取年月日</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"年:"</span>+c.get(Calendar.YEAR));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"月:"</span>+c.get(Calendar.MONTH));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"日:"</span>+c.get(Calendar.DATE));</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">// 时间计算</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        c.add(Calendar.YEAR, -1);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"前1年:"</span>+c.getTime());</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">// 设定时间,Calendar有两种模式lenient(宽松模式)和non-lenient.当Calendar处于宽松模式下,每个</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">// 时间字段都可以超出它允许的范围;在处于非宽松模式下,当时间字段超出范围时,会抛出异常</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">//c.setLenient(false);//容错开发,false可关闭容错,进行日期合法性检查</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        c.set(2009, 0, 32);<span style="color: #008000">// 容错性,当字段值超过了正常范围时,上级字段会自动增加</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #008000">// set方法延迟性,使用set方法后,日历时间不会立即更新,要等到下次调用get(),getTime(),getTimeinMillis(),add()或roll()</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">// 时,才会重新计算日历的时间.这样也避免了多次调用set方法带来的多次计算.</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"设定时间:"</span>+c.getTime());</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #008000">// add和roll区别,add的上级字段会自动增加</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        c.set(2008,11,31);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        c.add(Calendar.MONTH, 1);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"add():"</span>+c.getTime());<span style="color: #008000">//2009-01-31  年份增加了</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        c.set(2008,11,31);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        c.roll(Calendar.MONTH, 1);</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"roll():"</span>+c.getTime());<span style="color: #008000">//2008-01-31  年份没有改变</span></pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        </pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    }</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">&nbsp;</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">}</pre></div></div><font color="#0000ff" size="2"></font><img src ="http://www.blogjava.net/wangjc0801/aggbug/253485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangjc0801/" target="_blank">wangjc</a> 2009-02-06 09:08 <a href="http://www.blogjava.net/wangjc0801/archive/2009/02/06/253485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>