??xml version="1.0" encoding="utf-8" standalone="yes"?>91麻豆精品国产自产在线观看亚洲 ,国产精品亚洲va在线观看,亚洲AV成人一区二区三区在线看http://www.tkk7.com/baizhihui19870626/记录?/description>zh-cnMon, 12 May 2025 11:06:42 GMTMon, 12 May 2025 11:06:42 GMT60excel单元格拆分(原创Q?/title><link>http://www.tkk7.com/baizhihui19870626/articles/390800.html</link><dc:creator>白19870626</dc:creator><author>白19870626</author><pubDate>Mon, 05 Nov 2012 04:02:00 GMT</pubDate><guid>http://www.tkk7.com/baizhihui19870626/articles/390800.html</guid><wfw:comment>http://www.tkk7.com/baizhihui19870626/comments/390800.html</wfw:comment><comments>http://www.tkk7.com/baizhihui19870626/articles/390800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/baizhihui19870626/comments/commentRss/390800.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baizhihui19870626/services/trackbacks/390800.html</trackback:ping><description><![CDATA[<img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/baizhihui19870626/1.jpg" width="316" longdesc="" height="180" /><br />如图Q将单元?双的单元格拆分成两个或更多Q请按照如下步骤操作?br />1、插入一?br /><img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/baizhihui19870626/2.jpg" width="392" longdesc="" height="221" /><br /><img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/baizhihui19870626/3.jpg" width="329" longdesc="" height="144" /><br />2、将单元?和下面的单元D行合q?br /><img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/baizhihui19870626/4.jpg" width="635" longdesc="" height="193" /><br /><br /><br />效果Q?br /><img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/baizhihui19870626/5.jpg" width="338" longdesc="" height="167" /><br /><img src ="http://www.tkk7.com/baizhihui19870626/aggbug/390800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baizhihui19870626/" target="_blank">白19870626</a> 2012-11-05 12:02 <a href="http://www.tkk7.com/baizhihui19870626/articles/390800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA SOAP技?转http://www.cnblogs.com/mingzi/archive/2009/03/23/1419385.html)http://www.tkk7.com/baizhihui19870626/articles/389671.html白19870626白19870626Tue, 16 Oct 2012 08:41:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/389671.htmlhttp://www.tkk7.com/baizhihui19870626/comments/389671.htmlhttp://www.tkk7.com/baizhihui19870626/articles/389671.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/389671.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/389671.html开始之前,我想本文即讨论的主题和读者需要具备的L(fng)知识做一些必需的描叙。本文的主题是讨论SOAP技术,我们尽可能的讲得通俗易懂一些,所以,我们引入?jin)一个普通的“Hello World”范例来给读者说明它们是怎么q作的,让读者知道它们的q作方式。我认ؓ(f)Q如果光看官Ҏ(gu)是很难开始学?fn)这门新技术的Q官Ҏ(gu)中包含大量的范例,q解释了(jin)所有的Ҏ(gu)和优点Q但是没解释它们的运作方式。在q篇文章中,我不打算只肤的解释SOAP技术的定义Q我们假设读者熟(zhn)JAVA语言Q?/font>Web 技术,hXML 语言QXML NamespacesQXML Schema的基。在q种情况下,理解本文不存在M困难。然而,即没有q些知识Q你也不必担?j),我们尽可能的解释得单,但是当你开始做自己?SOAP应用E序时会(x)遇到一些问题和ȝ(ch)。因此,p一定时间来学习(fn)上面的知识是很有必要的?/font>

从技术的角度来说Q有必要提一下我们的调试环境。我们用的?a target="_blank">Windows XP操作pȝ Q安装有JAVA 2 SDK 1.4.1QApache SOAP 2.3.1QJAF 1.0.2Q?a target="_blank">JavaMail 1.3.1和Xerces 2.6.0。上面所提及(qing)的都能在Tcomcat 4.1.29 JSP /Servlet 容器中正常运行。所有的软g都是免费自由软gQ因此你能够很容易的下蝲 它们q自己在M你喜Ƣ的q_如Windows或UNIX上安装它们。Java SDKQJAF和JAVAMAIL位于SUN的官方网站( http://java.sun.com Q,其他的Y件在Jakarta目l的官方|站Q?/span> http://jakarta.apache.org Q上有down的。可能你在看到我们需要这么多不同的包QpackageQ时已经有点担心(j)和不安了(jin)Q但是实际上你不应该担心(j)q些的。一旦你懂了(jin)基础Q那么对你将相当Ҏ(gu)。安装不是一件很隄事情Q你只需要在讄环境变量的时候仔l些Q比?em>CATALINA_HOME , CLASSPATH , JAVA_HOME {等Q所有这些步骤都是手工的。由于我仅仅是想你的注意力再次集中到它们n上,所以你能很快的完成以上配|过E。我只是d下面的一些字W串到Tomcat?em>bin/setclasspath.bat 文g中:(x)

...
set CATALINA_HOME=C:\Tomcat4.1.29
set CLASSPATH=%JAVA_HOME%\lib\tools.jar
set CLASSPATH=%JAVA_HOME%\soap-2.3.1\lib\soap.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\tools.jar
...

如果你的安装路径Qinstallation pathsQ和上面使用的不同,你需要更正它们,然后关闭和重启Tomcat以它们生效。这P你就有ؓ(f)q行SOAP作好?jin)准备。但是现在,我要忘记有关的技术部分,来学一点理论知识?/span>

SOAP意思是单对象访问协议(S imple O bject A ccess P rotocolQ。的如它的名字一PSOAP是很单的。它是一个基于XML的协议,允许E序lg和应用程序彼此用一U标准的Internet协议 --HTTP来通讯。SOAP是一U独立的q_Q它不依赖程序语aQ它是简单的Q弹性的Q很Ҏ(gu)扩展的。目前,应用E序能够彼此使用一U基于DCOM?CORBA技术的q程q程调用QRPCQ来q行怺通讯Q但HTTP不被设计个目的。RPC在Internet上应用是非常困难的,它们?x)出现许多兼?gu)和安全性的问题Q因?a target="_blank">防火?/span> 和代?a target="_blank">服务?/span> 通常都会(x)LQblockQ这些类型的量。应用程序之间最好的通讯方式是通过HTTP协议Q因为HTTP是支持所有Internet览器和服务器的。基于这个目的,SOAP协议被创建出来?/span>

那么Q它们是如何q作的呢Q比如,一个应用程序(AQ需要和另一个应用程序(BQ在SOAP的帮助下q行彼此通讯。它们将使用下面的框架图来完成这个过E:(x)

 

q个SOAP信封QSOAP envelopeQ是一个包含以下内容的XML文Q?/span>

 

正如你看到的Q它是非常简单的。它看v来确实就象一个普通的信封或者你?email。你想看看它们是如何动作的吗Q下面跟我们一h吧。其实我们有很多Ҏ(gu)是不用SOAP来在创徏和运行我们自q“Hello World”应用E序的,但是因ؓ(f)我们要保持它的简单性,我会(x)l你一个它q作方式的框架图QschemeQ?/span>

我们?#8220;Hello World”范例?x)包含一个SOAP Service。我们的SOAP Client发送它们的名字到该SOAP ServiceQƈ试图得到一些答复或响应。这个SOAP Service需要部|到一个SOAP Admin的工P以至重定位所有请求的SOAPQProxyQ?RPC Router能够知道它们应该使用哪种服务来运作。总而言之,q个是以下面的方式来q作的:(x)

 

现在Q我们来一步步的看看到底发生了(jin)什么。在Step 1里,HelloWorldClient连接一个SOAP RPC RouterQ请求我们的SOAP Serviceq将包含我们名字的一个字W串传递给它。该SOAP RPC Router?x)检查是否它已经部v?jin)这个SOAP Service。如果它被发现是被部|的Q那么它?yu)传递数据到q个SOAP Serviceq调用特定的Ҏ(gu)Q这个是Step 2。然后SOAP ServiceҎ(gu)?x)被执行Q将q回某个字符串|该值就是SOAP Client的答复或者响应)(j)QStep 3Q。在Step4中,SOAP RPC Router仅仅只是重定向q个数据到SOAP Client。所有在Step1和Step4里传输的数据是通过SOAP Envelope来完成的。正如你所看到的,法是相当简单的Q因此我们只准备兛_(j)实际的代码?/span>

首先Q我们要创徏一个SOAP Service。下面是它的代码Q请不要忘记它攑օHelloWorld/ 目录中(必须被包含在你的CLASSPATH中)(j)Q?/span>

1: // SOAPService.java
2: package HelloWorld;
3: public class SOAPService {
4:   public String sayHi(String x) {
5:     return("Hello my friend, " + x + "! Glad to see you!");
6:   }
7: }

dM注释也是很容易的。要~译它,只需要用下列命o(h)Q?/span>

javac SOAPService.java

W二步,一旦我们准备好?jin)SOAP ServiceQ我们需要用SOAP Service Manager来部|它。这个可以通过很多方式来实玎ͼ但是Z(jin)能让初学SOAP的读者更Ҏ(gu)理解SOAPQ我提供?jin)一个最Ҏ(gu)的方式。我们假设你?a target="_blank">Web ServerQTomcat或其他)(j)已经正常q行Qƈ且你已经正确安装?jin)SOAP。那么当览器访?/span> http://localhost:8080/soap/ Q你?x)看见Apache SOAP的欢q页面。点?em>Run the admin client Q然?Deploy 。你?x)得C个屏q显C,在那里你需要填入IDQScopeQMethodQProvider Type和JAVA Provider的信息到表单域中。你能忽略其他所有的表单域,除非你真的需要它们的信息。我们的“HelloWorld”例子不需要它们,所以,我们填的下面的|(x)

 

ID: urn:HelloWorld_SOAPService
Scope: Application
Methods: sayHi
Provider Type: java
Java Provider - Provider Class: HelloWorld.SOAPService
Java Provider - Static? No

一些注释:(x)ID是我们要从SOAP Client标识我们的SOAP Service的唯一名字。Method包含SOAP Service提供的一pdҎ(gu)。JAVA Provider-Provider Class是SOAP Service Javacȝ名字?/span>

现在Q点?em>Deploy 按钮Q那么你的服务会(x)被部|Ӏ再ơ强调,h意正设|CLASSPATH环境变量。然后,你的HelloWorld.SOAPServicec能够被扑ֈQƈ且所有必需的jar包也能被扑ֈ。这是个几乎每个人都?x)犯的普通错误。现在,你能够点?List Q将?x)看见你的服务已l被部vq来。恭喜!

最后,让我们来创徏一个SOAP Client。代码看h有点复杂Q但是在现实中不?x)只有这么点ѝ?/span>

 1: // HelloWorldClient.java
2: import java.io.*;
3: import java.net

.*;
4: import java.util.*;
5: import org.apache.soap.*;
6: import org.apache.soap.rpc.*;
7: public class HelloWorldClient {
8:   public static void main(String[] arg) throws Exception {
9:     Call c = null;
10:     URL url = null;
11:     Vector params = null;
12:     Response rep = null;
13:     String ourName = "Superman";
14:     String ourUrn = "urn:HelloWorld_SOAPService";
15:     String ourMethod = "sayHi";
16:     url = new URL("http://localhost:8080/soap/Servlet

/
rpcrouter");
17:     System.out.println("Passing to our deployed "+ourUrn+"
our name ("+ourName+"): ");
18:     c = new Call();
19:     c.setTargetObjectURI(ourUrn);
20:     c.setMethodName(ourMethod);
21:     c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
22:     params = new Vector();
23:     params.addElement(new Parameter("ourName", String.class,
ourName, null));
24:     c.setParams(params);
25:     System.out.print("and its answer is: ");
26:     rep = c.invoke(url, "");
27:     if (rep.generatedFault()) {
28:       Fault fault = rep.getFault();
29:       System.out.println("\nCall failed!");
30:       System.out.println("Code = " + fault.getFaultCode());
31:       System.out.println("String = " + fault.getFaultString());
32:     } else {
33:       Parameter result = rep.getReturnValue();
34:       System.out.print(result.getValue());
35:       System.out.println();
36:     }
37:   }
38:}

下面我要做一些解释。在W?3行,我们讄?jin)我们的名字Q这个名字将?x)传递给 SOAP Service。在W?4行,我们讄?jin)我们将要调用的服务的IDQservice IDQ,和第15行里讄的服务方法(service methodQ。有?jin)这个IDQ服务能够被部v到SOAP服务理器(SOAP Service ManagerQ中。我们没有设|Q何其他|仅仅只用刚才那些基础值就可以正常q作?jin)。你能从SOAP的官Ҏ(gu)上得到相关信息Q该文来自SOAP包中Q它们的解释出?jin)本文的范围?/span>

用以下方式编译这个SOAP ClientQ?/span>

javac HelloWorldClient.java

Z(jin)圆满完成它,让我们检查一下针Ҏ(gu)们的试Q是否所有事情都准备qA。Tomcat正在q行Q所有的环境变量都正,SOAP Service被编译和部vQSOAP Client被成功编译。OKQ让我们q行它,你将看到q个屏幕Q?/span>

 

 

 

正如你所看到的,我们的SOAP Client使用SOAP协议成功发送它的名字和接收?jin)一个答复。正如前面所说的QSOAP Service发送和接收的是SOAP envelope。这个是SOAP envelope的源代码?/span>

?strong>发?/strong> 到SOAP Service的SOAP Envelope

<?XML

version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/
soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHi xmlns:ns1="urn:HelloWorld_SOAPService"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/
soap/encoding/">
<ourName xsi:type="xsd:string">Superman</ourName>
</ns1:sayHi>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>:

从SOAP Service接收 的SOAP Envelope

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/
soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHiResponse xmlns:ns1="urn:HelloWorld_SOAPService"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.
org/soap/encoding/">
<return xsi:type="xsd:string">Hello my friend, Superman!
Glad to see you!</return>
</ns1:sayHiResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

要理解SOAP Envelope中的所有标{含义Q我你花一Ҏ(gu)间阅?http://www.w3.org/2001/06/soap-envelope 命名I间规范?/span>

我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是单的Q有的Q强大的Q弹性的。它被用在许多Web应用中,q些应用的数量也在不断增加。学?fn)SOAP是值得的,臛_你要知道它是什么和它是怎么q作?/span>



白19870626 2012-10-16 16:41 发表评论
]]>
关于Ibatis insert后返回gؓ(f)null的解军_法(转)(j) http://www.tkk7.com/baizhihui19870626/articles/389469.html白19870626白19870626Fri, 12 Oct 2012 07:57:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/389469.htmlhttp://www.tkk7.com/baizhihui19870626/comments/389469.htmlhttp://www.tkk7.com/baizhihui19870626/articles/389469.html#Feedback1http://www.tkk7.com/baizhihui19870626/comments/commentRss/389469.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/389469.html
Java代码
Executes a mapped SQL INSERT statement. Insert is a bit different from other update methods, as it provides facilities for returning the primary key of the newly inserted row (rather than the effected rows). This functionality is of course optional.

The parameter object is generally used to supply the input data for the INSERT values.

Parameters:
id - The name of the statement to execute.
parameterObject - The parameter object (e.g. JavaBean, Map, XML etc.).
Returns:
The primary key of the newly inserted row. This might be automatically generated by the RDBMS, or selected from a sequence table or other source.
Throws:
java.sql.SQLException - If an error occurs.

Executes a mapped SQL INSERT statement. Insert is a bit different from other update methods, as it provides facilities for returning the primary key of the newly inserted row (rather than the effected rows). This functionality is of course optional.

The parameter object is generally used to supply the input data for the INSERT values.

Parameters:
id - The name of the statement to execute.
parameterObject - The parameter object (e.g. JavaBean, Map, XML etc.).
Returns:
The primary key of the newly inserted row. This might be automatically generated by the RDBMS, or selected from a sequence table or other source.
Throws:
java.sql.SQLException - If an error occurs.


它的意思是说返回值是新插入记录的主键Q类型ؓ(f)Object主要是因Z键类型可以是int也可以是Stringcd?

然而,如果我们使用下列的配|文件进行插入的话,q回的gؓ(f)null

Xml代码
<insert id="insertPrdcategory" parameterClass="Prdcategory">
insert into Prdcategory ( name,pid,deep ) values ( #name#,
#pid#, #deep# )
</insert>

<insert id="insertPrdcategory" parameterClass="Prdcategory">
insert into Prdcategory ( name,pid,deep ) values ( #name#,
#pid#, #deep# )
</insert>

那我们要怎样解决q个问题Q让它返回插入行的主键呢Q这时我们就是用到<selectKey>,下面仅以MSSQL数据库ؓ(f)例,改写上述配置文gQ具体如下:(x)



Xml代码
<insert id="insertPrdcategory" parameterClass="Prdcategory">
insert into Prdcategory ( name,pid,deep ) values ( #name#,
#pid#, #deep# )
<selectKey resultClass="int" keyProperty="id">
select max(id) from Prdcategory
</selectKey>
</insert>

<insert id="insertPrdcategory" parameterClass="Prdcategory">
insert into Prdcategory ( name,pid,deep ) values ( #name#,
#pid#, #deep# )
<selectKey resultClass="int" keyProperty="id">
select max(id) from Prdcategory
</selectKey>
</insert>


DAO的实现类Ҏ(gu)里面应该这样写?jin)(注意整型转换用IntegercdQ?

Java代码
public int insertPrdcategory(Prdcategory product) throws Exception {
return (Integer)IbatisUtil.getSqlMapper().insert("insertPrdcategory", product);
}

public int insertPrdcategory(Prdcategory product) throws Exception {
return (Integer)IbatisUtil.getSqlMapper().insert("insertPrdcategory", product);
}


q样q是OK?jin)?


白19870626 2012-10-12 15:57 发表评论
]]>
华ؓ(f)彩信模拟器的参数讄 http://www.tkk7.com/baizhihui19870626/articles/388497.html白19870626白19870626Tue, 25 Sep 2012 04:49:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/388497.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388497.htmlhttp://www.tkk7.com/baizhihui19870626/articles/388497.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/388497.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388497.html

华ؓ(f)彩信模拟器的参数讄

最q开发了(jin)一个SP的彩信接入系l,代码~写完成后,觉得有必要进行接发测试。从|上下蝲来华为彩信模拟器Q测试过E中发现始终无法成功。不得已使用DJ Java Decompiler反汇~了(jin)一下代码,l过单分析终于才?jin)解到接发的URL地址和端口如何填写,真是不知道ؓ(f)什么华Z把文写详细一点,搞得大家开发那么篏?
1、mm7Config.xml中的ListenIP、ListenPort分别是接收彩信时的监听地址和端口,q里我用了(jin)127.0.0.1?080Q对应华为彩信模拟器的Send to应该填写http://127.0.0.1:9080/Receiver?
2、mm7Config.xml中的mmscURL、mmscIP分别是彩信中?j)接收彩信时的URL和IP地址Q这里我使用?vas?27.0.0.1Q对应华为彩信模拟器的Listener Port填写80卛_?
q样对mm7Config.xml和华为彩信模拟器q行?jin)适当的修改,启动自己开发的彩信接入pȝ。点?#8220;Send”按钮Q命令窗口还是报错,具体如下Q?
错误Q?#8220;没有说明名称I间前缀“soap-env”?#8221;
2009-6-24 17:20:05 com.sun.xml.internal.messaging.saaj.soap.MessageImpl writeTo
严重: SAAJ0540: Error during saving a multipart message

q个问题E微ȝ(ch)一点,需要在pȝ属性中讄javax.xml.soap.MessageFactory和javax.xml.soap.SOAPConnectionFactory。实际上华ؓ(f)的彩信模拟器MMSCSimulation.exe是一个可执行的jar包,用WinRar该文g展开C的工作目录下Q然后执行java -Xmx1024m -Xms1024m -Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.MessageFactoryImpl -Djavax.xml.soap.SOAPConnectionFactory=com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory com.huawei.mms.simulation.MM7Simulation启动模拟器,可以进行测试啦?
  • 大小: 55.7 KB


白19870626 2012-09-25 12:49 发表评论
]]>
MM7 http://www.tkk7.com/baizhihui19870626/articles/mm7.html白19870626白19870626Tue, 25 Sep 2012 03:40:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/mm7.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388491.htmlhttp://www.tkk7.com/baizhihui19870626/articles/mm7.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/388491.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388491.html中兴MM7接口开?/div>
2010-03-11 14:44
1Q发送彩信的时候一直报告说q接时,q回好像?104 ,(g)查了(jin)|络 ping IP telnet 端口g都好?后来抓包才发?发彩信的时候数据一直走80端口,不会(x)走配|上的端?后来才发现原来要改端口的话是要在q里<mmscIP>10.103.122.180:8080</mmscIP>加上端口h行的.
2Q返?007 {?一般都是参数加的有问题 比如L(fng)+86,serviceCode VASPID sendAddress{?/div>
3Qmm7api的文里面对于smil彩信Q就说了(jin)一个含smil的彩信,必须把content-type讄成multipart-relatedQ如果按照文里面的程Q即使你怎么l合Qsmil都不起作用的Q即使你setPresentionContent(smil)?jin),照样不v作用。原因很单,mixed方式发送彩信,只需要setContentID()pQ而related方式Q必L每一个subContent都setContentID()和setContentLocation()Q这两项的内Ҏ(gu)好相同,比如都ؓ(f)他们的文件名?/div>
(如果不填q两个发下去的时候在诺基亚的手机里面只能看C发的所有文件列?而且文g的名字和原来的不一?,比如原来?01.jpg 在手机里面就昄file001.jpg,讄?jin)这两个参数之后一切正?;

中兴MM7接口开?/div>
2010-03-11 14:44
1Q发送彩信的时候一直报告说q接时,q回好像?104 ,(g)查了(jin)|络 ping IP telnet 端口g都好?后来抓包才发?发彩信的时候数据一直走80端口,不会(x)走配|上的端?后来才发现原来要改端口的话是要在q里<mmscIP>10.103.122.180:8080</mmscIP>加上端口h行的.
2Q返?007 {?一般都是参数加的有问题 比如L(fng)+86,serviceCode VASPID sendAddress{?/div>
3Qmm7api的文档里面对于smil彩信Q就说了(jin)一个含smil的彩信,必须把content-type讄成multipart-relatedQ如果按照文里面的程Q即使你怎么l合Qsmil都不起作用的Q即使你setPresentionContent(smil)?jin),照样不v作用。原因很单,mixed方式发送彩信,只需要setContentID()pQ而related方式Q必L每一个subContent都setContentID()和setContentLocation()Q这两项的内Ҏ(gu)好相同,比如都ؓ(f)他们的文件名?/div>
(如果不填q两个发下去的时候在诺基亚的手机里面只能看C发的所有文件列?而且文g的名字和原来的不一?,比如原来?01.jpg 在手机里面就昄file001.jpg,讄?jin)这两个参数之后一切正?;


今天l于发出?jin)彩信?jin)Q移动的MM7文写的太不全了(jin)Q折腾了(jin)好几天,ȝ是发出去?jin)。MM7ApiI文g如下

Java代码 收藏代码
  1. import com.cmcc.mm7.vasp.message.*;
  2. import com.cmcc.mm7.vasp.service.MM7Sender;
  3. import com.cmcc.mm7.vasp.common.*;
  4. import java.io.*;
  5. import java.text.*;
  6. import com.cmcc.mm7.vasp.conf.*;
  7. public class MM7Api
  8. {
  9. public static void main(String[] args)
  10. {
  11. final MM7Config mm7Config = new MM7Config("./config/mm7Config.xml");
  12. mm7Config.setConnConfigName("./config/ConnConfig.xml");
  13. try
  14. {
  15. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
  16. MM7SubmitReq submit = new MM7SubmitReq();
  17. submit.setTransactionID("13934557531");
  18. submit.addTo(""); //发送到的号?
  19. submit.setVASID("");//讄SP代码
  20. submit.setVASPID(""); //讄服务代码
  21. submit.setServiceCode("0008");//讄业务代码
  22. submit.setSenderAddress("10086"); //讄MM始发方的地址
  23. submit.setSubject("l营分析日报");
  24. submit.setChargedPartyID("13453417863");
  25. submit.setChargedParty((byte)4);
  26. submit.setDeliveryReport(true);
  27. MMContent presentation = MMContent.createFromFile("./test.smil");
  28. presentation.setContentType( "application/smil ");
  29. presentation.setContentID( "test.smil ");
  30. MMContent maincontent = new MMContent();
  31. maincontent.setContentID( "main ");
  32. maincontent.setContentType(MMConstants.ContentType.MULTIPART_RELATED);
  33. maincontent.addSubContent(presentation);
  34. /* MMContent content = new MMContent();
  35. content.setContentType(MMConstants.ContentType.MULTIPART_RELATED);
  36. content.setContentID("main");
  37. MMContent sub1 = MMContent.createFromFile("./test.smil");
  38. sub1.setContentID("test.smil");
  39. sub1.setContentType(MMConstants.ContentType.SMIL);
  40. sub1.setContentLocation("test.smil");
  41. content.addSubContent(sub1);
  42. */
  43. MMContent sub2 = MMContent.createFromFile("./smil.txt");
  44. sub2.setContentID("smil.txt");
  45. sub2.setContentType(MMConstants.ContentType.TEXT);
  46. maincontent.addSubContent(sub2);
  47. MMContent sub3 = MMContent.createFromFile("./a.GIF");
  48. sub3.setContentID("a.GIF");
  49. sub3.setContentType(MMConstants.ContentType.GIF);
  50. maincontent.addSubContent(sub3);
  51. MMContent sub4 = MMContent.createFromFile("./2.txt");
  52. sub4.setContentID("2.txt");
  53. sub4.setContentType(MMConstants.ContentType.TEXT);
  54. maincontent.addSubContent(sub4);
  55. submit.setContent(maincontent);
  56. MM7Sender mm7Sender = new MM7Sender(mm7Config);
  57. MM7RSRes rsRes;
  58. rsRes = (MM7RSRes)mm7Sender.send(submit);
  59. if(rsRes instanceof MM7SubmitRes)
  60. {
  61. MM7SubmitRes submitRes = (MM7SubmitRes)rsRes;
  62. System.out.println(rsRes.getTransactionID());
  63. System.out.println("after!!submitRes.statuscode=" + rsRes.getStatusCode() + ";submitRes.statusText=" + rsRes.getStatusText());
  64. }else{
  65. System.out.println("doQrsRes.statuscode="+rsRes.getStatusCode() + ";rsRes.statusText=" + rsRes.getStatusText());
  66. }
  67. }
  68. catch (Exception e)
  69. {
  70. System.out.println(e);
  71. }
  72. }
  73. }

smil文g格式如下Q?/p>

Xml代码 收藏代码
  1. <smil>
  2. <head>
  3. <layout>
  4. <root-layout width="320" height="240"/>
  5. <region id="Image" width="220" height="260" left="76" top="34"/>
  6. <region id="Text" width="168" height="20" left="76" top="220"/>
  7. </layout>
  8. </head>
  9. <body>
  10. <par dur="20s">
  11. <img src="23.jpeg" region="Image" />
  12. <text src="smil.txt" region="Text" />
  13. </par>
  14. <par dur="20s">
  15. <img src="23.jpg" region="Image" begin="0s" end="20s" ></img>
  16. <text src="2.txt" region="Text" begin="0s" end="20s" ></text>
  17. </par>
  18. </body>
  19. </smil>

需要特别主要的?/font>

1.

submitReq.setVASPID("SP代码") ; //讄SP代码

submitReq.setVASID("服务代码") ; //讄服务代码

submitReq.setServiceCode("业务代码"); //讄业务代码

如果出现rsRes.statuscode=4007;rsRes.statusText=Authority failed为鉴权失败,一般ؓ(f)上述讄不对?/font>

2.当时我是只把smil文g传上去,以ؓ(f)有了(jin)q个文gpȝ?x)根据\径来d所有的文gQ其实不?dng)smil中出现的文g都得自己加到MMContent中上传到服务器?/font>



白19870626 2012-09-25 11:40 发表评论
]]>CMPP和SMPP协议比较http://www.tkk7.com/baizhihui19870626/articles/388433.html白19870626白19870626Mon, 24 Sep 2012 06:28:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/388433.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388433.htmlhttp://www.tkk7.com/baizhihui19870626/articles/388433.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/388433.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388433.htmlCMPP?/span>SMPP协议比较

q同类型协?/span>

CMPP?/span>SMPP都是短信协议中的一U,但它们不是同一cd的协议?/span>SMPP?/span>ESME?/span>SMCQ短信中?j)?j)之间的协议,?/span>CMPP?/span>SP和中国移?/span>ISMG之间的通讯协议?/span>

以下?/span>CMPP 3.0文档中的囄?/span>

<!--[if !vml]-->cmpp_001.JPG
<!--[endif]-->

?/span>CMPP对应的协议有Q联通的SGIP协议Q中国电(sh)信的SMGP协议Q网通的CNGP协议?/span>

作ؓ(f)SPQ只需要了(jin)?/span>CMPPQ不需要了(jin)?/span>SMPP?/span>

最新版本和兼容

SMPP协议是一个国际标准,?/span>SMS论坛制定Q官方网址?/span>smsforum.netQ截?/span>2006q?/span>7?/span>2?/span>Q最新版本是5.0。曾l流行的版本?/span>3.3?/span>3.4?/span>SMPP协议向后兼容的?/span>

CMPP最新版本似乎是3.0。现在(2006q?/span>7月)(j)Q大多数q是使用CMPP 2.0?/span>CMPP协议没有做到向后兼容Q?/span>3.0的文本w也没有讲到兼容的问题,甚至认ؓ(f)Q协议制定者压Ҏ(gu)惌要兼宏V?/span>CMPP 3.0没做到向后兼容导致了(jin)一个问题,是SP无法qx升?/span>

PDU格式

PDU是协议数据单元的~写Q?/span>SMPP?/span>CMPP都用最先一?/span>4位的长度标志整个PDU的长度?/span>

SMPP Packet

消息?/span>

必填参数

可选参?/span>

CMPP Packet

消息?/span>

消息?/span>

<!--[if !vml]-->cmpp_002.JPG
<!--[endif]-->

SMPP是一个国际标准,不同?/span>SMC的是实现可能要增加特定参敎ͼZ(jin)具备更好的扩展性,SMPP 3.4以上版本Q增加了(jin)可选参敎ͼ?/span>5.0中,可选参数叫?/span>TLVTable?/span>

CMPP是中国移动定义的其内?/span>ISMG之间?/span>ISMG?/span>SP之间的通讯标准Q涉?qing)一些具体的计费信息Q但没有可选参数?/span>

?/span>SMPP中,消息头包?/span>4部分Q?/span>PDU长度?/span>Command_Id?/span>Command_Status?/span>Sequence_Id。其?/span>Command_Status字段Q只在回应消息中使用Q存在冗余?/span>

CMPP中,消息头部包括3部分Q?/span>PDU长度?/span>Command_Id?/span>Sequence_Id。个为,CMPP中的消息_(d)不包?/span>Command_StatusQ似乎更好一些?/span>

消息传输模式

SMPP?/span>CMPP都支持异步传输,CMPP中,异步传输的窗口大ؓ(f)16?/span>

CMPP使用一个连接发送短信息和接收短信息?/span>

SMPP支持多种的连接,其中TXcd的连接,只能发送短信息Q?/span>RXcd的连接只能接收短信息Q?/span>TRXcd的连接支持接收和发送短信息?/span>

SMPP 3.4中,消息传输模式分三中:(x)Store And Forward?/span>Datagram?/span>Forward。分别用在大吞吐量、可靠性保证等不同的应用场合?/span>

CMPP没有规定其消息传输的模式Q根据实际用的情况看来Q华为的|关的消息传输模式类?/span>SMPP协议中规定的Datagram模式?/span>



白19870626 2012-09-24 14:28 发表评论
]]>
web.xml作用 http://www.tkk7.com/baizhihui19870626/articles/388072.html白19870626白19870626Wed, 19 Sep 2012 07:15:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/388072.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388072.htmlhttp://www.tkk7.com/baizhihui19870626/articles/388072.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/388072.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388072.htmlweb工程中的web.xml文g有什么作用呢Q它是每个web.xml工程都必ȝ吗?

一个web中完全可以没有web.xml文gQ也是_(d)web.xml文gq不是web工程必须的?/p>


那什么时候需要,什么时候可以不需要呢Q?/p>

要想回答上面的问题,得先?jin)解web.xml文g使用来干什么的。web.xml文g是用来配|:(x)Ƣ迎c(din)servlet、filter{的。当你的web工程没用到这些时Q你可以不用web.xml文g来配|你的web工程?/p>

那么web.xml能做的所有事情都有那些?

其实Qweb.xml的模?Schema)文g中定义了(jin)多少U标{օ素,web.xml中就可以出现它的模式文g所定义的标{օ素,它就能拥有定义出来的那些功能。web.xml的模式文件是由Sun公司定义的,每个web.xml文g的根元素<web-app>中,都必L明这个web.xml使用的是哪个模式文g。如Q?br /><?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

而且web.xml的模式文件中定义的标{ƈ不是定死的,模式文g也是可以改变的,一般来_(d)随着web.mxl模式文g的版本升U,里面定义的功能会(x)来复杂,也即标签元素的种cM(x)来多Q但有些是不常用的,我们只需C一些常用的可以了(jin)?/p>


下面列出web.xml常用的标{օ素及(qing)q些标签元素的功能:(x)

1、指定欢q页面,例如Q?br /><welcome-file-list>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index1.jsp</welcome-file>
</welcome-file-list>
上面的例子指定了(jin)2个欢q页面,昄时按序从第一个找P如果W一个存在,显C第一个,后面的不起作用。如果第一个不存在Q就扄二个Q以此类推?/p>

关于Ƣ迎面Q?/p>

讉K一个网站时Q默认看到的W一个页面就叫欢q页Q一般情况下是由首页来充当欢q页的。一般情况下Q我们会(x)在web.xml中指定欢q页。但web.xmlq不是一个Web的必要文Ӟ没有web.xmlQ网站仍然是可以正常工作的。只不过|站的功能复杂v来后Qweb.xml的确有非常大用处Q所以,默认创徏的动态web工程在WEB-INF文g夹下面都有一个web.xml文g?br />对于tomcat来说Q当你只指定一个web的根名,没有指定具体面Q去讉K时一个webӞ 如果web.xml文g中配|了(jin)Ƣ迎,那么p回指定的那个面作ؓ(f)Ƣ迎,而在文中没有web.xml文gQ或虽然有web.xmlQ但web.xml也没指定Ƣ迎늚情况下,它默认先查找index.html文gQ如果找C(jin)Q就把index.html作ؓ(f)Ƣ迎还回给览器。如果没扑ֈindex.htmlQtomcat去找index.jsp。找到index.jsp把它作为欢q页面返回。而如果index.html和index.jsp都没扑ֈQ又没有用web.xml文g指定Ƣ迎面Q那此时tomcat׃知道该返回哪个文件了(jin)Q它?yu)显CThe requested resource (/XXX) is not available的页面。其中XXX表示web的根名。但如果你指定了(jin)具体面Q是可以正常讉K的?/p>

2、命名与定制URL。我们可以ؓ(f)Servlet和JSP文g命名q定制URL,其中定制URL是依赖一命名的,命名必须在定制URL前。下面拿serlet来D例:(x)
(1)、ؓ(f)Servlet命名Q?br /><servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>net.test.TestServlet</servlet-class>
</servlet>

(2)、ؓ(f)Servlet定制URL?br /><servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


3、定制初始化参数Q可以定制servlet、JSP、Context的初始化参数Q然后可以再servlet、JSP、Context中获取这些参数倹{下面哪servlet来D例:(x)
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>net.test.TestServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>Tommy</param-value>
</init-param>
<init-param>
<param-name>E-mail</param-name>
<param-value>Tommy@163.com</param-value>
</init-param>
</servlet>
l过上面的配|,在servlet中能够调用getServletConfig().getInitParameter("param1")获得参数名对应的倹{?/p>

4、指定错误处理页面,可以通过“异常cd”?#8220;错误?#8221;来指定错误处理页面?br /><error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
-----------------------------
<error-page>
<exception-type>java.lang.Exception<exception-type>
<location>/exception.jsp<location>
</error-page>

5、设|过滤器Q比如设|一个编码过滤器Q过滤所有资?br /><filter>
<filter-name>XXXCharaSetFilter</filter-name>
<filter-class>net.test.CharSetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXCharaSetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

6、设|监听器Q?br /><listener>
<listener-class>net.test.XXXLisenet</listener-class>
</listener>

7、设|会(x)?Session)q期旉Q其中时间以分钟为单位,假如讄60分钟时Q?br /><session-config>
<session-timeout>60</session-timeout>
</session-config>

除了(jin)q些标签元素之外Q还可以往web.xml中添加那些标{օ素呢Q那些标{օ素都能v什么作用呢Q我们只要去查看web.xml的模式文件就能知道。直接看模式文g看不懂,可以找一些中文教E来看看?/p>

白19870626 2012-09-19 15:15 发表评论
]]>
why在重写equals时还必须重写hashcodeҎ(gu)http://www.tkk7.com/baizhihui19870626/articles/388065.html白19870626白19870626Wed, 19 Sep 2012 06:20:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/388065.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388065.htmlhttp://www.tkk7.com/baizhihui19870626/articles/388065.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/388065.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388065.html 

首先我们先来看下Stringcȝ源码Q可以发现String是重写了(jin)ObjectcȝequalsҎ(gu)的,q且也重写了(jin)hashcodeҎ(gu)

复制代码
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }


public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
复制代码

那ؓ(f)什么在重写equalsҎ(gu)旉要重写equalsҎ(gu)呢:(x)
首先equals与hashcode间的关系是这L(fng)Q?/p>

1、如果两个对象相同(即用equals比较q回trueQ,那么它们的hashCodeg定要相同Q?/p>

2、如果两个对象的hashCode相同Q它们ƈ不一定相?即用equals比较q回false)

自我的理解:(x)׃Z(jin)提高E序的效率才实现?jin)hashcodeҎ(gu)Q先q行hashcode的比较,如果不同Q那没就不必在进行equals的比较了(jin)Q这样就大大减少?jin)equals比较?/p>

ơ数Q这Ҏ(gu)需要比较的数量很大的效率提高是很明昄Q一个很好的例子是在集合中的用;

我们都知道java中的List集合是有序的Q因此是可以重复的,而set集合是无序的Q因此是不能重复的,那么怎么能保证不能被攑օ重复的元素呢Q但靠equalsҎ(gu)一h较的

话,如果原来集合中以后又10000个元素了(jin)Q那么放?0001个元素,N要将前面的所有元素都q行比较Q看看是否有重复Q欧码噶的,q个效率可想而知Q因此hashcode

应遇而生?jin),java采用了(jin)hash表,利用哈希法Q也叫散列算法)(j)Q就是将对象数据Ҏ(gu)该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据

只要看对应的hashcode地址上是否有|那么qequals比较Q如果没有则直接插入Q只要就大大减少?jin)equals的用次敎ͼ执行效率大大提高了(jin)?/p>

l箋上面的话题,Z么必要重写hashcodeҎ(gu)Q其实简单的说就是ؓ(f)?jin)保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写?jin)equals而未重写

hashcodeҎ(gu)Q可能就?x)出C个没有关pȝ对象equals相同的(因ؓ(f)equal都是Ҏ(gu)对象的特征进行重写的Q,但hashcode实不相同的

 



白19870626 2012-09-19 14:20 发表评论
]]>
Vector和ArrayList区别 Hashtable和HashMap区别 ArrayList和LinkedList区别http://www.tkk7.com/baizhihui19870626/articles/388061.html白19870626白19870626Wed, 19 Sep 2012 05:51:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/388061.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388061.htmlhttp://www.tkk7.com/baizhihui19870626/articles/388061.html#Feedback0http://www.tkk7.com/baizhihui19870626/comments/commentRss/388061.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388061.htmlVector和ArrayList区别
Vector和ArrayList Vector和ArrayList在用上非常怼,都可用来表示一l数量可变的对象应用的集?q且可以随机地访问其中的元素?br />Vector的方法都是同步的(Synchronized),是线E安全的(thread-safe)Q而ArrayList的方法不是,
׃U程的同步必然要影响性能Q因?
ArrayList的性能比Vector好?br />当Vector或ArrayList中的元素过它的初始大小?Vector?x)将?br />的容量翻?而ArrayList只增?0%的大,q样,ArrayList有?br />于节U内存空间?br />Hashtable?font style="line-height: 36px; word-wrap: normal; word-break: normal" color="#ff0000">HashMap区别

a.Hashtable是承自陈旧的DictionarycȝQHashMapl承自AbstractMapcd时是Java 1.2引进的Map接口的一个实现?br />  b.也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这意味着Q然你可以不用采取Q何特D的行ؓ(f)可以在一?多线E的应用E序中用一个HashtableQ但你必d样地Z个HashMap提供外同步。一个方便的Ҏ(gu)是利用Collectionscȝ?rn)态的synchronizedMap()Ҏ(gu)Q它创徏一个线E安全的Map对象Qƈ把它作ؓ(f)一个封装的对象来返回。这个对象的Ҏ(gu)可以让你同步讉K潜在的HashMap。这么做的结果就是当你不需要同步时Q你不能切断Hashtable中的同步Q比如在一个单U程的应用程序中Q,而且同步增加?jin)很多处理费用?br />  c.W三点不同是Q只有HashMap可以让你空gZ个表的条目的key或value。HashMap中只有一条记录可以是一个空的keyQ但L数量的条目可以是I的value。这是_(d)如果在表中没有发现搜索键Q或者如果发C(jin)搜烦(ch)键,但它是一个空的|那么get()返回null。如果有必要Q用containKey()Ҏ(gu)来区别这两种情况?br />  d.HashMapL?jin)Hashtable的containsҎ(gu)Q保留了(jin)containsValue和containsKeyҎ(gu)
  e.Hashtable中h(hun)ash数组默认大小?1Q增加的方式?old*2+1。HashMap中h(hun)ash数组的默认大是16Q而且一定是2的指?br />
ArrayList和LinkedList区别
对于处理一列数据项,Java提供?jin)两个类ArrayList和LinkedList,ArrayList的内部实现是Z内部数组Object[],所以从概念上讲,它更象数l,但LinkedList的内部实现是Z一l连接的记录,所?它更象一个链表结构,所?它们在性能上有很大的差别?br />从上面的分析可知,在ArrayList的前面或中间插入数据?你必d其后的所有数据相应的后移,q样必然要花费较多时_(d)所?当你的操作是在一列数据的后面d数据而不是在前面或中?q且需要随机地讉K其中的元素时,使用ArrayList?x)提供比较好的性能
而访问链表中的某个元素时,必M链表的一端开始沿着q接方向一个一个元素地L?直到扑ֈ所需的元素ؓ(f)止,所?当你的操作是在一列数据的前面或中间添加或删除数据,q且按照序讉K其中的元素时,应该用LinkedList?jin)?br />如果在编E中,1Q?两种情Ş交替出现,q时,你可以考虑使用Listq样的通用接口,而不用关?j)具体的实现Q在具体的情形下,它的性能由具体的实现来保证?br />配置集合cȝ初始大小
在Java集合框架中的大部分类的大是可以随着元素个数的增加而相应的增加的,我们g不用兛_(j)它的初始大小,但如果我们考虑cȝ性能问题?׃定要考虑可能地讄好集合对象的初始大小,q将大大提高代码的性能?br />比如,Hashtable~省的初始大ؓ(f)101,载入因子?.75,卛_果其中的元素个数过75?它就必须增加大小q新组l元素,所?如果你知道在创徏一个新的Hashtable对象时就知道元素的确切数目如?10,那么,应其初始大小设ؓ(f)110/0.75=148,q样,可以避免重新组l内存ƈ增加大小



白19870626 2012-09-19 13:51 发表评论
]]>java中字W集的问?http://www.tkk7.com/baizhihui19870626/articles/388054.html白19870626白19870626Wed, 19 Sep 2012 03:33:00 GMThttp://www.tkk7.com/baizhihui19870626/articles/388054.htmlhttp://www.tkk7.com/baizhihui19870626/comments/388054.htmlhttp://www.tkk7.com/baizhihui19870626/articles/388054.html#Feedback4http://www.tkk7.com/baizhihui19870626/comments/commentRss/388054.htmlhttp://www.tkk7.com/baizhihui19870626/services/trackbacks/388054.html1、JVM中单个字W占用的字节长度跟编码方式有养I而默认编码方式又跟^台是一一对应的或说^台决定了(jin)默认字符~码方式Q?/span>

2?strong>对于单个字符QISO-8859-1单字节编码,GBK双字节编码,UTF-8三字节编?/span>Q?strong>因此中文q_(中文q_默认字符集编码GBK)下一个中文字W占2个字节,而英文^?英文q_默认字符集编码Cp1252(cM于ISO-8859-1))?/span>

3?strong>getBytes()、getBytes(encoding)函数的作用是使用pȝ默认或者指定的字符集编码方式,字W串~码成字节数l?/span>?/strong>

~码方式军_字节长度Q?strong>在中文^CQ默认的字符集编码是GBKQ?/span>此时如果使用getBytes()或getBytes("GBK")Q?strong>则按照GBK的编码规则将每个中文字符?个byte表示?strong>所以我们看?中文"最lGBK~码l果是Q?-42 -48 -50 -60 ?42?48代表??字,?-50"?-60"则代表了(jin)"?字?/span>

在中文^CQ?span style="background-color: rgb(255,255,255)">如果指定的字W集~码是UTF-8Q那么按照UTF-8对中文的~码规则Q每个中文用3个字节表C,那么"中文"q两个字W最l被~码成:(x)-28 -72 -83?26 -106 -121两组。每3个字节代表一个中文字W?/span>

在中文^CQ如果指定的字符集编码是ISO-8859-1Q由于此字符集是单字节编码,所以用getBytes("ISO-8859-1")Ӟ每个字符只取一个字节,每个汉字只取C(jin)一半的字符。另外一半的字节丢失?jin)。由于这一半的字符在字W集中找不到对应的字W,所以默认用编?3代替Q也是??/strong>

在英文^CQ默认的字符集编码是Cp1252(cM于ISO-8859-1)Q?strong>如果使用GBK、UTF-8q行~码Q得到的字节数组依然是正的(GBK4个字节,UTF-8?个字?。因为在JVM内部是以Unicode存储字符串的Q用getBytes(encoding)?x)让JVMq行一ơUnicode到指定编码之间的转换?/span>对于GBKQJVM依然?x){换成4个字节,对于UTF-8QJVM依然?x){换成6个字节?strong>但是对于ISO-8859-1Q则׃无法转换(2个字?-->1个字节,截取?jin)一半的字节)Q所以{换后的结果是错误的?/span>

在中文^CQ默认的字符集编码是GBKQ于是content.getBytes()得到的是什么呢Q就是下面这4个字节:(x)

byte[0] = -42 hex string = ffffffd6

byte[1] = -48 hex string = ffffffd0

byte[2] = -50 hex string = ffffffce

byte[3] = -60 hex string = ffffffc4

如果新的encoding是GBKQ那么经q解码后Q由于一个字W用2个字节表C。于是最l的l果是Q?/span>

char[0]='? --- byte[0] + byte[1]

char[1]='? --- byte[2] + byte[3]

如果新的encoding是ISO-8859-1Q那么经q解码后Q由于一个字W用1个字节表C,于是原来本应?个字节一赯析的变成单个字节解析Q每个字节都代表?jin)一个汉字字W的一半。这一半的字节在ISO-8859-1中找不到对应的字W,变成了(jin)"?"?jin),最l的l果Q?/span>

char[0]='?' ---- byte[0]

char[1]='?' ---- byte[1]

char[2]='?' ---- byte[2]

char[3]='?' ---- byte[3]

如果新的encoding是UTF-8Q那么经q解码后Q由于一个字W用3个字节表C,于是原来4个字节的数据无法正常的解析成UTF-8的数据,最l的l果也是每一个都变成"?"?/span>

char[0]='?' ---- byte[0]

char[1]='?' ---- byte[1]

char[2]='?' ---- byte[2]

char[3]='?' ---- byte[3]

如果是在英文q_下,׃默认的编码方式是Cp1252Q于是content.getBytes()得到的字节都是被截去一半的D留字符Q所以我们看到在英文q_下,不论指定的encoding是GBK、UTF-8Q其l果和ISO-8859-1都是一L(fng)?/span>

CQ这个方法再ơ证明了(jin)String的getBytes()Ҏ(gu)的危险性,如果我们使用new String(str.getBytes(), encoding)对字W串q行重新~码解码Ӟ我们一定要清楚str.getBytes()Ҏ(gu)q回的字节数l的长度、内容到底是什么,因ؓ(f)在接下来使用新的encodingq行~码解码ӞJavaq不?x)自动地对字节数l进行扩展以适应新的encoding。而是按照新的~码Ҏ(gu)直接对该字节数组q行解析?/span>于是l果像上面的例子一P同样?个原始字节,有些?个一l进行解析,有些每个一l进行解析,有些?个一l进行解析。其l果只能看那种~码方式合适了(jin)?/span>


l论Q?/strong>相同的^CQ同一个中文字W,在不同的~码方式下,得到的是完全不同的字节数l。这些字节数l有可能是正的(只要该字W集支持中文)Q也可能是完全错误的(该字W集不支持中??/span>

CQ不要轻易地使用或滥用StringcȝgetBytes(encoding)Ҏ(gu)Q更要尽量避免用getBytes()Ҏ(gu)。因个方法是q_依赖的,在^C可预知的情况下完全可能得C同的l果?strong>如果一定要q行字节~码Q则用户要确保encoding的方法就是当初字W串输入时的encoding?/span>

———————————————————————————————————————————————————

 

和getBytes(encoding)不同QtoCharArray()q回的是"自然字符"。但是这?自然字符"的数目和内容却是由原始的~码方式军_?/span>?/span>

FileWriter是字W流输出,而OutputStreamWriter是字节流输出在中文q_下,如果使用FileWriterQ不Z如何讄字符集都不会(x)起作用。因为它采用的是默认的系l字W集。即便你讄?jin)System.setProperty("file.encoding", "ISO-8859-1")Q或者在q行时给予参?Dfile.encoding=UTF-8都不?x)v作用。你?x)发现它最l还是都?GB2312"或?GBK"的方式保存?/span>

在中文^CQ如果用OutputStreamWriterQ则在后台写入时?x)把字符{换成字节,此时指定的编码字W集pv作用?jin)。可以看到在指定GBK、UTF-8的情况下中文可以正常的保存和dQ同时文件按照我们给定的方式保存?jin)。而对于ISO-8859-1则变成了(jin)?Q这再次证明?jin)采用ISO-8859-1是不能保存中文的Q而且?x)因Z文编码在ISO-8859-1的编码中找不到对应的字符而默认{换成??/span>

在英文^CQ如果用FileWriterQ不Z如何讄字符集同样都不会(x)起作用。所有的文g都将按照ISO-8859-1的编码方式保存,毫无疑问地变成了(jin)?。在英文q_下,如果使用OutputStreamWriterQ则只有当我们把字符和文件的~码方式正确讄为GBK、UTF-8的情况下Q中文才能正的保存q显C?/span>

通过上述的实验证明,Z(jin)保在不同的q_下,客户端输入的中文可以被正地解析、保存、读取。最好的办法是使用OutputStreamWriter配合UTF-8~码?/span>如果不想使用UTF-8~码Q那么可以考虑使用GB2312Q不使用GBK、GB18030。因为对于某些老式的文本编辑器Q甚至不支持GBK、GB18030的编码,但是对于GB2312则是一定支持的。因为前两者都不是国标但后者是?/span>

关于String的getBytes()QgetBytes(encoding)和new String(bytes, encoding)q三个方法,非常值得注意QA.getBytes()Q用^台默认的~码方式(通过file.encoding属性获?方式来将字符串{换成byte[]。得到的是字W串最原始的字节编码倹{?/span>

B.getBytes(NAME_OF_CHARSET)Q?strong>使用指定的编码方式将字符串{换成byte[]Q如果想要得到正的字节数组Q程序员必须l出正确的NAME_OF_CHARSET。否则得到的׃?x)得到正的l果?/span>

C.new String(bytes, encoding)Q?strong>如果我们在客L(fng)使用UTF-8~码的JSP面发出hQ浏览器~码后的UTF-8字节?x)以ISO-8859-1的Ş式传递到服务器端。所以要得到lHTTP协议传输的原始字节,我们需要先调用getBytes("ISO-8859-1")得到原始的字节,但由于我们客L(fng)的原始编码是UTF-8Q如果l按照ISO-8859-1解码Q那么得到的不是一个中文字W,而是3个ؕ码的字符。所以我们需要再ơ调用new String(bytes,"UTF-8")Q将字节数组按照UTF-8的格式,?个一l进行解码,才能q原为客L(fng)的原始字W?/span>

D.String的getBytes()、getBytes(NAME_OF_CHARSET)Ҏ(gu)都是比较微妙的方法,原则上:(x)传输旉用的是什么编码,我们需要按照这U编码得到字节。new String(bytes, NAME_OF_CHARSET)则更加需要小?j),原则上?x)客户端采用的是什么编码,那么q里的NAME_OF_CHARSET必d客户端保持一致?strong>例如JSP面是GBKQ那么我们接攉面传递而来的参数时必M用new String(parameter.getBytes("ISO-8859-1"), "GBK");如果使用?jin)错误的解码方式Q如使用?jin)UTF-8Q那么得到的很有可能是q?jin)。也是_(d)(x)GBK--->ISO-8859-1--->GBK、UTF-8--->ISO-8859-1--->UTF-8的{换过E是没有问题的。但是GBK--->ISO-8859-1--->UTF-8、UTF-8--->ISO-8859-1--->GBK的字节直接{码则可能DqQ需要另外的转换q程?/span>

CQ?/span>谨慎C用getBytes(NAME_OF_CHARSET)和new String(bytes, NAME_OF_CHARSET)Q除非你很清楚的知道原始的字W编码和传输协议使用的编码。推荐用基于服务器的配|、过滤器讄request/response的characterEncoding、content type属性。还有就是JSP面的pageEncoding属性、HTML meta元素的content type属性。尽量避免频J的在代码中q行字符串{码,即降低了(jin)效率又增加了(jin)风险?/span>

问题Q我们在web应用开发过E中l常遇到输出某种~码的字W,如iso8859-1{,如何输出一个某U编码的字符Ԍ

代码如下Q?/span>
  1. public class StringTest {
  2. public static void main(String[] args){
  3. String str="我是中国?;
  4. try {
  5. byte[] by=str.getBytes("ISO-8859-1");
  6. byte[] by1=str.getBytes("GBK");
  7. byte[] by2=str.getBytes("utf-8");
  8. System.out.println("ISO-8859-1");
  9. System.out.println(by.length);
  10. System.out.println(by[0]);
  11. System.out.println("GBK");
  12. System.out.println(by1.length);
  13. System.out.println(by1[0]);
  14. System.out.println("utf-8");
  15. System.out.println(by2.length);
  16. System.out.println(by2[0]);
  17. //先将字符串以ISO-8859-1q行~码
  18. String tempStr = new String(str.getBytes(), "ISO-8859-1");
  19. //׃中文q_一个中文占两上字节Q所以以ISO-8859-1q行~码Ӟ输出?0个字W的q
  20. System.out.println(tempStr);
  21. //再获取该字符串的ISO-8859-1字节Q以GBK解码Q?
  22. tempStr=new String(tempStr.getBytes("ISO-8859-1"),"GBK");
  23. //q原
  24. System.out.println(tempStr);
  25. }
  26. catch (Exception e) {
  27. System.err.println(e.getMessage());
  28. }
  29. }
  30. }

输出Q?
GBK
10
-50
utf-8
15
-26
???????ú??
我是中国?


白19870626 2012-09-19 11:33 发表评论
]]>
վ֩ģ壺 պӰ߹ۿַ| Ӱ߹ۿѸ| ëƬ߿ò | Ƶվ߹ۿ| ձѹۿ| ձһƬ2019| ۺ뾫Ʒ| ĻһƷ| a߹ۿ| ѹۿվ| AVһլɫӰ| þҹ޾Ʒ| ëƬ벥| ޻ƬëƬ߹ۿ| ˳ۺ߲| һѹۿ| ѵһɫƬ| ŮƵһ| ˾ƷƵ| պëƬ߹ۿ| Ʒa߹ۿ| һëƬȫ| ëƬƵ| ŮƵ| ˳ƵƵ| õ߳| Ůһ| ƷһƵ߹ۿ| ѸԴվ߹ۿ| | g0g0ȫѸƵ| ˬִ̼ëƬ| ޵һ| ߹ۿƬ˳Ƶ | 쿴ѸӰ| 911Ʒձ| 9ȾƷѹۿƵ| һ| | þùɫAVѹۿ| VAĻһ|