??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜精品一区二区麻豆,jizzjizz亚洲,91嫩草私人成人亚洲影院http://m.tkk7.com/badboyryan/category/13321.html<hr color=red> <marquee direction=left bgcolor= aaaaee behavior=scroll scrollamount=2 onmouseover="this.stop();" onmouseout="this.start();" width=500> <font color=green> 在恰当的旉、地点以恰当的方式表辄恰当的h...</font>&nbsp;&nbsp;<font color=blue>阅读的时候请注意分类Q佛曰我日里面是谈笑文章Q其他是各个分类的文章,U极的热情投入到写博的队伍中来,支持blogjava做大做强Q向dudu站长致敬>> > <a href=http://t.qq.com/badboyryan>我的微博敬请收听</a> </font> </marquee> <hr color=blue>zh-cnWed, 18 Sep 2013 05:32:17 GMTWed, 18 Sep 2013 05:32:17 GMT60Ueditor上传囄p|以及上传附g昄“网l错?00”的解决Ҏhttp://m.tkk7.com/badboyryan/archive/2013/09/18/404201.html坏男?/dc:creator>坏男?/author>Wed, 18 Sep 2013 02:09:00 GMThttp://m.tkk7.com/badboyryan/archive/2013/09/18/404201.htmlhttp://m.tkk7.com/badboyryan/comments/404201.htmlhttp://m.tkk7.com/badboyryan/archive/2013/09/18/404201.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/404201.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/404201.htmlUeditor上传囄p|以及上传附g昄“|络错误500

”的解x?br />1、ueditor目录jsp目录下面有一个java文g

Uploader.java
2、把q个文g攑ֈsrc/ueditor包里?br />3、把ueditor/jsp/目录下面的两个jar包放到工E里?br />4 重新~译目ok,可以上传附g,囄?

有点高?/p>

]]>
JVM内存讄http://m.tkk7.com/badboyryan/archive/2010/05/19/321317.html坏男?/dc:creator>坏男?/author>Wed, 19 May 2010 00:48:00 GMThttp://m.tkk7.com/badboyryan/archive/2010/05/19/321317.htmlhttp://m.tkk7.com/badboyryan/comments/321317.htmlhttp://m.tkk7.com/badboyryan/archive/2010/05/19/321317.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/321317.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/321317.html -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
q里有几个问题:
1. 各个参数的含义什么?
2. Z么有的机器我?Xmx?XX:MaxPermSize都设|ؓ512M之后Eclipse可以启动Q而有些机器无法启动?
3. Z上面的参数写入到eclipse.ini文gEclipse没有执行对应的设|?

下面我们一一q行回答

1. 各个参数的含义什么?

参数?vmargs的意思是讄JVM参数Q所以后面的其实都是JVM的参CQ我们首先了解一?span class="hilite2">JVM内存理的机Ӟ然后再解释每个参C表的含义?

?Heap)和非?Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆Q堆是运行时数据区域Q所有类实例和数l的内存均从此处分配。堆是在 Java 虚拟机启动时创徏的?#8221;“?span class="hilite2">JVM中堆之外的内存称为非堆内?Non-heap memory)”。可以看?span class="hilite2">JVM主要理两种cd的内存:堆和非堆。简单来说堆是Java代码可及的内存,是留l开发h员用的Q非堆就?span class="hilite2">JVM留给自己用的Q所以方法区?span class="hilite2">JVM内部处理或优化所需的内?如JIT~译后的代码~存)、每个类l构(如运行时常数池、字D和Ҏ数据)以及Ҏ和构造方法的代码都在非堆内存中?
堆内存分?
JVM初始分配的内存由-Xms指定Q默认是物理内存?/64Q?span class="hilite2">JVM最大分配的内存?Xmx指定Q默认是物理内存?/4。默认空余堆内存于40%ӞJVM׃增大堆直?Xmx的最大限ӞIZ堆内存大?0%ӞJVM会减堆直到-Xms的最限制。因此服务器一般设|?Xms?Xmx相等以避免在每次GC 后调整堆的大?
非堆内存分配
JVM使用-XX:PermSize讄非堆内存初始|默认是物理内存的1/64Q由XX:MaxPermSize讄最大非堆内存的大小Q默认是物理内存?/4?
JVM内存限制(最大?
首先JVM内存限制于实际的最大物理内?废话Q呵?Q假讄理内存无限大的话Q?span class="hilite2">JVM内存的最大D操作pȝ有很大的关系。简单的说就32位处理器虽然可控内存I间?GB,但是具体的操作系l会l一个限Ӟq个限制一般是2GB-3GBQ一般来说Windowspȝ下ؓ1.5G-2GQLinuxpȝ下ؓ2G-3GQ,?4bit以上的处理器׃会有限制了?
2. Z么有的机器我?Xmx?XX:MaxPermSize都设|ؓ512M之后Eclipse可以启动Q而有些机器无法启动?

通过上面?span class="hilite2">JVM内存理的介l我们已l了解到JVM内存包含两种Q堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作pȝ。所以说讄VM参数DE序无法启动主要有以下几U原因:

1) 参数?Xms的值大?XmxQ或?XX:PermSize的值大?XX:MaxPermSizeQ?

2) -Xmx的值和-XX:MaxPermSize的d过?span class="hilite2">JVM内存的最大限Ӟ比如当前操作pȝ最大内存限Ӟ或者实际的物理内存{等。说到实际物理内存这里需要说明一点的是,如果你的内存?024MBQ但实际pȝ中用到的q不可能?024MBQ因为有一部分被硬件占用了?

3. Z上面的参数写入到eclipse.ini文gEclipse没有执行对应的设|?

那ؓ什么同L参数在快h式或者命令行中有效而在eclipse.ini文g中是无效的呢Q这是因为我们没有遵守eclipse.ini文g的设|规则:

参数形如“??#8221;q种形式Q中间有I格的需要换行书写,如果g有空格的需要用双引号包括v来。比如我们?vm C:\Java\jre1.6.0\bin\javaw.exe参数讄虚拟机,在eclipse.ini文g中要写成q样Q?

-vm
C:\Java\jre1.6.0\bin\javaw.exe
按照上面所说的Q最后参数在eclipse.ini中可以写成这个样子:

-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
实际q行的结果可以通过Eclipse?#8220;Help”-“About Eclipse SDK”H口里面?#8220;Configuration Details”按钮q行查看?

另外需要说明的是,Eclipse压羃包中自带的eclipse.ini文g内容是这LQ?

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSizeQ注意最前面是两个连接线Q跟-XX:MaxPermSize参数的含义基本是一LQ我觉得唯一的区别就是前者是eclipse.exe启动的时候设|的参数Q而后者是eclipse所使用?span class="hilite2">JVM中的参数。其实二者设|一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行?注释掉?


3. 其他的启动参数?如果你有一个双核的CPUQ也许可以尝试这个参?

-XX:+UseParallelGC

让GC可以更快的执行。(只是JDK 5里对GC新增加的参数Q?


]]>
Tomcat Server处理一个httph的过E?http://m.tkk7.com/badboyryan/archive/2010/01/06/308457.html坏男?/dc:creator>坏男?/author>Wed, 06 Jan 2010 08:32:00 GMThttp://m.tkk7.com/badboyryan/archive/2010/01/06/308457.htmlhttp://m.tkk7.com/badboyryan/comments/308457.htmlhttp://m.tkk7.com/badboyryan/archive/2010/01/06/308457.html#Feedback1http://m.tkk7.com/badboyryan/comments/commentRss/308457.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/308457.html假设来自客户的请求ؓQ?br /> http://localhost:8080/wsota/wsota_index.jsp

1) h被发送到本机端口8080Q被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该h交给它所在的Service的Engine来处理,q等待来自Engine的回?br /> 3) Engine获得hlocalhost/wsota/wsota_index.jspQ匹配它所拥有的所有虚拟主机Host
4) Engine匚w到名为localhost的HostQ即使匹配不C把请求交l该Host处理Q因Host被定义ؓ该Engine的默认主机)
5) localhost Host获得h/wsota/wsota_index.jspQ匹配它所拥有的所有Context
6) Host匚w到\径ؓ/wsota的ContextQ如果匹配不到就把该h交给路径名ؓ""的Contextd理)
7) path="/wsota"的Context获得h/wsota_index.jspQ在它的mapping table中寻扑֯应的servlet
8) Context匚w到URL PATTERN?.jsp的servletQ对应于JspServletc?br /> 9) 构造HttpServletRequest对象和HttpServletResponse对象Q作为参数调用JspServlet的doGet或doPostҎ
10)Context把执行完了之后的HttpServletResponse对象q回lHost
11)Host把HttpServletResponse对象q回lEngine
12)Engine把HttpServletResponse对象q回lConnector
13)Connector把HttpServletResponse对象q回l客户browser

 


<!----------------------------------------------------------------------------------------------->


<web-app>


<!-- 概述Q?br /> 该文件是所有的WEB APPq的部|配|文Ӟ
每当一个WEB APP被DEPLOYQ该文g都将先被处理Q然后才是WEB APP自己?WEB-INF/web.xml
-->



<!-- +-------------------------+ -->
<!-- | servletcd义部? | -->
<!-- +-------------------------+ -->



<!-- DefaultServlet
当用LHTTPh无法匚wM一个servlet的时候,该servlet被执?br /> URL PATTERN MAPPING : /
-->

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>


<!-- InvokerServlet
处理一个WEB APP中的匿名servlet
当一个servlet被编写ƈ~译攑օ/WEB-INF/classes/中,却没有在/WEB-INF/web.xml中定义的时?br /> 该servlet被调用,把匿名servlet映射?servlet/ClassName的Ş?br /> URL PATTERN MAPPING : /servlet/*
-->

<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>


<!-- JspServlet
当请求的是一个JSP面的时候(*.jspQ该servlet被调?br /> 它是一个JSP~译器,请求的JSP面~译成ؓservlet再执?br /> URL PATTERN MAPPING : *.jsp
-->

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>



<!-- +---------------------------+ -->
<!-- | servlet映射定义部分 | -->
<!-- +---------------------------+ -->


<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>


<!-- +------------------------+ -->
<!-- | 其它部分Q略d | -->
<!-- +------------------------+ -->

... ... ... ...

</web-app>


<!----------------------------------------------------------------------------------------------->

 


<!----------------------------------------------------------------------------------------------->



<!-- 启动Server
在端?005处等待关闭命?br /> 如果接受?SHUTDOWN"字符串则关闭服务?br /> -->

<Server port="8005" shutdown="SHUTDOWN" debug="0">


<!-- Listener ???
目前没有看到q里
-->

<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>


<!-- Global JNDI resources ???
目前没有看到q里Q先略去
-->

<GlobalNamingResources>
... ... ... ...
</GlobalNamingResources>


<!-- Tomcat的Standalone Service
Service是一lConnector的集?br /> 它们q一个Engine来处理所有Connector收到的请?br /> -->

<Service name="Tomcat-Standalone">


<!-- Coyote HTTP/1.1 Connector
className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
port : 在端口号8080处侦听来自客户browser的HTTP1.1h
minProcessors : 该Connector先创?个线E等待客戯求,每个h׃个线E负?br /> maxProcessors : 当现有的U程不够服务客户hӞ若线EL不75个,则创建新U程来处理请?br /> acceptCount : 当现有线E已l达到最大数75Ӟ为客戯求排?br /> 当队列中h数超q?00Ӟ后来的请求返回Connection refused错误
redirectport : 当客戯求是httpsӞ把该h转发到端?443?br /> 其它属性略
-->

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080"
minProcessors="5" maxProcessors="75" acceptCount="100"
enableLookups="true"
redirectPort="8443"
debug="0"
connectionTimeout="20000"
useURIValidationHack="false"
disableUploadTimeout="true" />


<!-- Engine用来处理Connector收到的Httph
它将匚wh和自q虚拟LQƈ把请求{交给对应的Host来处?br /> 默认虚拟L是localhost
-->

<Engine name="Standalone" defaultHost="localhost" debug="0">


<!-- 日志c,目前没有看到Q略d -->

<Logger className="org.apache.catalina.logger.FileLogger" .../>

<!-- RealmQ目前没有看刎ͼ略去?-->

<Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>


<!-- 虚拟Llocalhost
appBase : 该虚拟主机的根目录是webapps/
它将匚wh和自qContext的\径,q把h转交l对应的Context来处?br /> -->

<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">


<!-- 日志c,目前没有看到Q略d -->

<Logger className="org.apache.catalina.logger.FileLogger" .../>


<!-- ContextQ对应于一个Web App
path : 该Context的\径名?"Q故该Context是该Host的默认Context
docBase : 该Context的根目录是webapps/mycontext/
-->

<Context path="" docBase="mycontext" debug="0"/>


<!-- 另外一个ContextQ\径名?wsota -->

<Context path="/wsota" docBase="wsotaProject" debug="0"/>


</Host>

</Engine>

</Service>

</Server>


<!----------------------------------------------------------------------------------------------->
1. 如何加大tomcatq接?/strong>

在tomcat配置文gserver.xml中的<Connector ... />配置中,和连接数相关的参数有Q?br /> minProcessorsQ最空闲连接线E数Q用于提高系l处理性能Q默认gؓ10
maxProcessorsQ最大连接线E数Q即Qƈ发处理的最大请求数Q默认gؓ75
acceptCountQ允许的最大连接数Q应大于{于maxProcessorsQ默认gؓ100
enableLookupsQ是否反查域名,取gؓQtrue或false。ؓ了提高处理能力,应设|ؓfalse
connectionTimeoutQ网l连接超Ӟ单位Q毫U。设|ؓ0表示怸时Q这栯|有隐患的。通常可设|ؓ30000毫秒?br />
其中和最大连接数相关的参CؓmaxProcessors和acceptCount。如果要加大q发q接敎ͼ应同时加大这两个参数?br />

web server允许的最大连接数q受制于操作pȝ的内核参数设|,通常Windows?000个左叻ILinux?000个左叟뀂Unix中如何设|这些参敎ͼ请参?a target="_blank">Unix常用监控和管理命?/a>

tomcat4中的配置CZQ?br /> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="10" maxProcessors="1024"
enableLookups="false" redirectPort="8443"
acceptCount="1024" debug="0" connectionTimeout="30000" />

对于其他端口的侦听配|,以此cL?br />
2. tomcat中如何禁止列目录下的文g
在{tomcat_home}/conf/web.xml中,把listings参数讄成false卛_Q如下:
<servlet>
...
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
...
</servlet>

3. 如何加大tomcat可以使用的内?/strong>

tomcat默认可以使用的内存ؓ128MBQ在较大型的应用目中,q点内存是不够的Q需要调大?br />
Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下讄Q?br /> JAVA_OPTS='-Xms【初始化内存大小?-Xmx【可以用的最大内存?
需要把q个两个参数D大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存ؓ256MBQ可以用的最大内存ؓ512MB

4. 如何d默认讉K面
修改文gweb.xmlQ在welcome-list里面dindex.wml作ؓ默认的访问页?br /> <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>



]]>
Tomcat 与oracle做成服务启动序的问题解?/title><link>http://m.tkk7.com/badboyryan/archive/2009/06/17/282939.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Wed, 17 Jun 2009 15:06:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2009/06/17/282939.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/282939.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2009/06/17/282939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/282939.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/282939.html</trackback:ping><description><![CDATA[<p>Z么tomcat和oracle都做成服务了Q但是tomcat的应用无效呢Q?br /> <br /> <br /> 解决办法Q?br /> 打开bin/service.bat文gQ?/p> <p>echo Using JVM:              %PR_JVM%<br /> "%EXECUTABLE%" //IS//%SERVICE_NAME% --StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap --StartParams start --StopParams stop</p> <p>一句后面加?--DependsOn   oracle侦听服务Qoracledatabse<br /> 注意用;号隔开依赖的服?br /> 再执行bin/service.bat install jnszcg Q即可安?span class="hilite1">Tomcat</span>服务Qƈ且依赖oracle<br /> <br /> 其实很简单就是制定服务的依赖关系Q?br /> <br /> 最后采取的Ҏ成功了:<br /> <br /> 1、把tomcat做到服务里面Q手工启动;<br /> 2、新Z个批处理net start tomcat <br /> 3、新Z个Q务,在计机启动的时候执行批处理ok<br /> 是不是问题已l解决了<br /> <br /> </p> <img src ="http://m.tkk7.com/badboyryan/aggbug/282939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2009-06-17 23:06 <a href="http://m.tkk7.com/badboyryan/archive/2009/06/17/282939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把你的应用设|ؓJBOSS的默认应?/title><link>http://m.tkk7.com/badboyryan/archive/2007/12/06/165815.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Thu, 06 Dec 2007 07:45:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/12/06/165815.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/165815.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/12/06/165815.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/165815.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/165815.html</trackback:ping><description><![CDATA[<p>1、删除jbossweb-tomcat55.sar 里面的ROOT.WAR<br /> 2、把你的应用攑֜jboss-4.0.5.GA\server\default\deploy\下面<br />    比如名称为MYAPP.war<br /> 3、新Z个jboss-web.xml<br />  <jboss-web><br />            <context-root>/</context-root><br />       </jboss-web><br /> 4、重新启动jboss<br /> 我的环境是jboss-4.0.5.GA<br /> </p> <p>最q要研究一下JBOSS的一pd产品Q?br /> </p> <p> </p> <img src ="http://m.tkk7.com/badboyryan/aggbug/165815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-12-06 15:45 <a href="http://m.tkk7.com/badboyryan/archive/2007/12/06/165815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nod32与CVSNT不兼?/title><link>http://m.tkk7.com/badboyryan/archive/2007/10/23/155171.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Tue, 23 Oct 2007 01:34:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/10/23/155171.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/155171.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/10/23/155171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/155171.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/155171.html</trackback:ping><description><![CDATA[<p>具体的错误是q样的:安装完成了CVS服务器以后,客户端登录的时候报<br /> </p> <p>Error reading from server <192.168.0.108>: -1: Unknown error<br /> </p> <p>解决的方法是q样的:NODE 32里面IMON点击后-Q?gt;<br /> </p> <p>双H口点击SETUp按钮Q-><br /> </p> <p>弹出的窗口里面MiscellaneousQ-><br /> </p> <p>ExcluSionQ-><br /> <br /> </p> <p>Edit--><br /> </p> <p>C:\Program Files\CVSNT\cvsservice.exeQ->d上就ok?br /> </p> <p>你的CVSpd了!Q!<br /> </p> <p> </p> <p><br />  </p> <p> </p> <img src ="http://m.tkk7.com/badboyryan/aggbug/155171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-10-23 09:34 <a href="http://m.tkk7.com/badboyryan/archive/2007/10/23/155171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jira如何配置使用LDAP认证http://m.tkk7.com/badboyryan/archive/2007/09/28/149062.html坏男?/dc:creator>坏男?/author>Fri, 28 Sep 2007 05:16:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/09/28/149062.htmlhttp://m.tkk7.com/badboyryan/comments/149062.htmlhttp://m.tkk7.com/badboyryan/archive/2007/09/28/149062.html#Feedback9http://m.tkk7.com/badboyryan/comments/commentRss/149062.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/149062.html今天的手又痒痒了Q觉得应该是时候写点东西了?br />q一周的旉在忙zLDAP认证Q这个已l不是什么新鲜名词了概念免了;
之所以学LDAP,q是ZSSO和PORTAL?br />l过一周的旉Q搭建好了LDAP服务器,用的开源的APACHE的DSQ还有APACHE的studioQ配|v来非常的单主要掌握几个要点就好了Q?br />1、server.xml的配|?br />Adding your own partition resp. suffix
d自己的数据格?br /><property name="contextPartitionConfigurations">
  <set>
    <ref bean="examplePartitionConfiguration"/>
    <ref bean="myPartitionConfiguration"/>
  </set>
</property>
然后查询examplePartitionConfiguration把他的bean配置重新复制一份需要修改几个地?br /><bean id="myPartitionConfiguration"
      class="org.apache.directory.server.core.partition.
                            impl.btree.MutableBTreePartitionConfiguration">
Next give the partition a name and change the suffix to o=mydomain
<property name="name" value="mydomain" />

<property name="contextEntry">
    <value>
      objectClass: top
      objectClass: domain
      objectClass: extensibleObject
      dc: example ---> o:mydomaim
    </value>
</property>
重新启动apache dsQ?br />
2、LDIF文g的格?br />W一步:l织l构以及理员信?br />dn: o=chinantn,dc=com
objectclass: organization
objectclass: top
o: chinantn

dn: cn=manager,o=chinantn,dc=com
objectclass: organizationalPerson
objectclass: person
objectclass: top
cn: manager
sn: badboyryan
userpassword:: c2VjcmV0

dn: ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: departments

dn: ou=market,ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: market

dn: ou=developer,ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: developer

dn: ou=service,ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: service

dn: ou=finance,ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: finance

dn: ou=directorate,ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: directorate

dn: ou=engineer,ou=departments,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: engineer

dn: ou=partners,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: partners

dn: ou=customers,ou=partners,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: customers

dn: ou=suppliers,ou=partners,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: suppliers

dn: ou=employees,ou=partners,o=chinantn,dc=com
objectclass: organizationalUnit
objectclass: top
ou: employees

W二步:人员信息

dn: uid=scf,ou=developer,ou=departments,o=chinantn,dc=com
objectClass: person
objectClass: uidObject
objectClass: organizationalPerson
objectClass: top
cn: sss
sn: scf
uid: scf
userpassword:: e01ENX1YTXNwY1ZWVFhUbFh1K1M0QllLY0hBPT0=
人员信息少写一点了Q有IZ再慢慢的补充上?br />W三步:导入LDIF文gQ这个时候LDAP服务器里面就有了一|Q组l结构)
W四步:被指jira让他利用LDAP认证来登录系l,如下图所C:




l过上面的折腑ְ完成了一个通过LDAP认证的小例子了?br />注意转帖的时候带上:
©所有:http://badboyryan.blogjava.net
随意的{帖不受法律约束?br />



]]>
LDAP:error code 一览表http://m.tkk7.com/badboyryan/archive/2007/09/26/148200.html坏男?/dc:creator>坏男?/author>Wed, 26 Sep 2007 01:30:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/09/26/148200.htmlhttp://m.tkk7.com/badboyryan/comments/148200.htmlhttp://m.tkk7.com/badboyryan/archive/2007/09/26/148200.html#Feedback2http://m.tkk7.com/badboyryan/comments/commentRss/148200.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/148200.html0 LDAP_SUCCESS Success
1 LDAP_OPERATIONS_ERROR Operations error
2 LDAP_PROTOCOL_ERROR Protocol error
3 LDAP_TIMELIMIT_EXCEEDED Timelimit exceeded
4 LDAP_SIZELIMIT_EXCEEDED Sizelimit exceeded
5 LDAP_COMPARE_FALSE Compare false
6 LDAP_COMPARE_TRUE Compare true
7 LDAP_STRONG_AUTH_NOT_SUPPORTED Strong authentication not supported
8 LDAP_STRONG_AUTH_REQUIRED Strong authentication required
9 LDAP_PARTIAL_RESULTS Partial results
16 LDAP_NO_SUCH_ATTRIBUTE No such attribute
17 LDAP_UNDEFINED_TYPE Undefined attribute type
18 LDAP_INAPPROPRIATE_MATCHING Inappropriate matching
19 LDAP_CONSTRAINT_VIOLATION Constraint violation
20 LDAP_TYPE_OR_VALUE_EXISTS Type or value exists
21 LDAP_INVALID_SYNTAX Invalid syntax
32 LDAP_NO_SUCH_OBJECT No such object
33 LDAP_ALIAS_PROBLEM Alias problem
34 LDAP_INVALID_DN_SYNTAX Invalid DN syntax
35 LDAP_IS_LEAF Object is a leaf
36 LDAP_ALIAS_DEREF_PROBLEM Alias dereferencing problem
48 LDAP_INAPPROPRIATE_AUTH Inappropriate authentication
49 LDAP_INVALID_CREDENTIALS Invalid credentials
50 LDAP_INSUFFICIENT_ACCESS Insufficient access
51 LDAP_BUSY DSA is busy
52 LDAP_UNAVAILABLE DSA is unavailable
53 LDAP_UNWILLING_TO_PERFORM DSA is unwilling to perform
54 LDAP_LOOP_DETECT Loop detected
64 LDAP_NAMING_VIOLATION Naming violation
65 LDAP_OBJECT_CLASS_VIOLATION Object class violation
66 LDAP_NOT_ALLOWED_ON_NONLEAF Operation not allowed on nonleaf
67 LDAP_NOT_ALLOWED_ON_RDN Operation not allowed on RDN
68 LDAP_ALREADY_EXISTS Already exists
69 LDAP_NO_OBJECT_CLASS_MODS Cannot modify object class
70 LDAP_RESULTS_TOO_LARGE Results too large
80 LDAP_OTHER Unknown error
81 LDAP_SERVER_DOWN Can't contact LDAP server
82 LDAP_LOCAL_ERROR Local error
83 LDAP_ENCODING_ERROR Encoding error
84 LDAP_DECODING_ERROR Decoding error
85 LDAP_TIMEOUT Timed out
86 LDAP_AUTH_UNKNOWN Unknown authentication method
87 LDAP_FILTER_ERROR Bad search filter
88 LDAP_USER_CANCELLED User cancelled operation
89 LDAP_PARAM_ERROR Bad parameter to an ldap routine
90 LDAP_NO_MEMORY Out of memory

]]>
jms消息cdQ{Q?/title><link>http://m.tkk7.com/badboyryan/archive/2007/08/06/134713.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Mon, 06 Aug 2007 07:45:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/08/06/134713.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/134713.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/08/06/134713.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/134713.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/134713.html</trackback:ping><description><![CDATA[ <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> </td> </tr> <tr> <td> <strong> </strong> </td> </tr> </tbody> </table> <span id="hrdnznd" class="oblog_text"> <p>在JMS1.1规范中规定了5UJMS消息cd,分别如下:</p> <p>1.创徏一个TextMessage</p> <p>TextMessage message;</p> <p>message = session.createTextMessage();</p> <p>2.解包一个TextMessage</p> <p> <br />去解包一个TextMessagecd的消息,客户端可以用Message.getTextҎQ?/p> <p> <br />String stockInfo; </p> <p>stockInfo = message.getText();</p> <p>3.创徏一个BytesMessage</p> <p>byte[] stockData; </p> <p>BytesMessage message;</p> <p>message = session.createBytesMessage();</p> <p>message.writeBytes(stockData);</p> <p> <br />4.解包一个BytesMessage</p> <p> <br />当接收到一个ByteMessageӞ可以使用下面的方式来解包Q?/p> <p> <br />byte[] stockInfo; </p> <p>int length;<br />length = message.readBytes(stockData);<br />消息体被拯到字节数l,客户端程序可以读取这个树l来解释数据?/p> <p>5.创徏一个MapMessage</p> <p>MapMessage message;</p> <p>message = session.createMapMessage();<br />...其他代码<br />message.setString("Name", "CN-Java");</p> <p>message.setDouble("Value", stockValue);</p> <p>message.setLong("Time", stockTime);</p> <p>message.setDouble("Diff", stockDiff);<br />message.setString("Info", "Recent server announcement causes market interest");</p> <p>6.解包一个MapMessage</p> <p>stockName = message.getString("Name");</p> <p>stockDiff = message.getDouble("Diff");</p> <p>stockValue = message.getDouble("Value");</p> <p>stockTime = message.getLong("Time");<br />如果你想得到整个元素的列表,可以使用MapMessage.getMapNamesҎ来获得?/p> <p>7.创徏一个StreamMessage</p> <p> <br />和MapMessage怼Q一个应用程序可以按序列发送多个字D到一个消息中Q这些字D都是原始类型的Q要做这些,你可以用一个StreamMessageQ?/p> <p>message.writeString(stockName);</p> <p>message.writeDouble(stockValue);</p> <p>message.writeLong(stockTime);<br />message.writeDouble(stockDiff);<br />message.writeString(stockInfo);</p> <p>8.解包一个StreamMessage</p> <p> <br />StreamMessage中的元素必须按照被写入的序dQ?/p> <p>stockName = message.readString();</p> <p>stockValue = message.readDouble();</p> <p>stockTime = message.readLong();</p> <p>stockDiff = message.readDouble();</p> <p>stockInfo = message.readString();</p> <p>9.创徏一个ObjectMessage</p> <p>ObjectMessage message;</p> <p>message = session.createObjectMessage();</p> <p>message.setObject(stockObject);</p> <p>10.解包ObjectMessage</p> <p>去解包ObjectMessage,使用ObjectMessage.getObject得到对象Q一但对象被取出来,客户端程序用Java造型语句对象还原成原始对象?br />StockObject stockObject;<br />stockObject = (StockObject)message.getObject();</p> </span> <img src ="http://m.tkk7.com/badboyryan/aggbug/134713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-08-06 15:45 <a href="http://m.tkk7.com/badboyryan/archive/2007/08/06/134713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天复习一下Eclipse里面的快捷键http://m.tkk7.com/badboyryan/archive/2007/07/17/130753.html坏男?/dc:creator>坏男?/author>Tue, 17 Jul 2007 02:35:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/07/17/130753.htmlhttp://m.tkk7.com/badboyryan/comments/130753.htmlhttp://m.tkk7.com/badboyryan/archive/2007/07/17/130753.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/130753.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/130753.html
1、查看eclipse的快捷键

  Ctrl +Shift+L

2、修?br />
    Ctrl+Shilf+L+L

q样可以自己定义快捷键了!

]]>
Ireport设计jasper报表提高java报表开发效?/title><link>http://m.tkk7.com/badboyryan/archive/2007/07/05/128290.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Thu, 05 Jul 2007 03:21:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/07/05/128290.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/128290.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/07/05/128290.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/128290.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/128290.html</trackback:ping><description><![CDATA[今天发现了小家碧玉,jasperQ用ireport2.0设计报表Q大致流E是q样的:<br /><br />1、设|classpath把mysql的jdbc驱动加到里面Q?br /><br />2、连接数据库Q?br /><br />3、设定动态链?br /><br />4、报表查?br /><br />5、设计报?br /><br />6、编译,选择jrviewer<br /><br />7、在设计报表的时候把字段的属性里面,TExtField里面的stretch  with over flow勾上不然不显C啊<br /><br />     common里面的stretch type选择relative to tallest object<br /><br />8、执行报表(使用动态连l)<br /><br />9、看到效果了吗?<br /><br />10、用的时候在jsp里面调用.jasper文g啊!Q!<br /><br /><br /><img src ="http://m.tkk7.com/badboyryan/aggbug/128290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-07-05 11:21 <a href="http://m.tkk7.com/badboyryan/archive/2007/07/05/128290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder2007企业版破解及汉化Ҏhttp://m.tkk7.com/badboyryan/archive/2007/06/21/125487.html坏男?/dc:creator>坏男?/author>Thu, 21 Jun 2007 02:08:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/06/21/125487.htmlhttp://m.tkk7.com/badboyryan/comments/125487.htmlhttp://m.tkk7.com/badboyryan/archive/2007/06/21/125487.html#Feedback12http://m.tkk7.com/badboyryan/comments/commentRss/125487.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/125487.html 

JBUILDER2007企业版下?

支持q雷http://altd.borland.com/akdlm/download/jbuilder/JBuilder_2007/Enterprise/JBuilder2007_enttrial.zip

破解补丁的两个文?

http://www.china-polo.com.cn/[JBuilder.2007.].sanct6.jar

http://www.china-polo.com.cn/[JBuilder.2007.].sanctuary.jar

q两个文件放到csdn的下载频道了攒点U分

http://download.csdn.net/user/songchaunfang

 

破解说明Q?
两个jar文g复制到X:\JBuilder2007\jbuilder\eclipse\plugins\com.borland.sanctuary.client.core_6.0.0 目录下(X:\JBuilder2007 为您的安装目录)?


官方中文包下载地址(支持q雷):
http://eclipse.cdpa.nsysu.edu.tw/downloads/drops/L-3.2.1_Language_Packs-200609210945/NLpack1-eclipse-SDK-3.2.1-win32.zip

中文包安装方?把中文包里的两个目录:license和features 解压?X:\JBuilder2007\jbuilder\eclipse\
目录?



]]>
java中的Boxing和unboxinghttp://m.tkk7.com/badboyryan/archive/2007/06/12/123733.html坏男?/dc:creator>坏男?/author>Tue, 12 Jun 2007 14:39:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/06/12/123733.htmlhttp://m.tkk7.com/badboyryan/comments/123733.htmlhttp://m.tkk7.com/badboyryan/archive/2007/06/12/123733.html#Feedback2http://m.tkk7.com/badboyryan/comments/commentRss/123733.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/123733.html

邢红?/a> 发表?2007-6-8 16:00:58

最q给替一个朋友出的几道java的面试题Q主要是面试java高工程师,报酬是晚饭Q已l落的卖艺的境地?br />题目很简?br />   Integer i1 = 100;
   Integer i2 = 100;
   Integer i3 = 1000;
   Integer i4 = 1000;
   System.out.println(i1==i2);
   System.out.println(i3==i4);
很遗憾,没有一个答对的Q正答案是
true
false
如果面试者写q样的写是错误的Q就通过?br />q个的原因要从java5的Boxing和unboxing谈vQboxing是装基本cd的对象,unboxing是转换对象到基本类型?br />Integer, Long, Float, Double, Short, Character etc.都是q样的类型他们是immutable?br />Boxing
在jdk1.4.2中,
必须?/ Assigning primitive type to wrapper type
   Integer iWrapper = new Integer(10);
java5?br /> // Assigning primitive type to wrapper type
   Integer iWrapper = 10;
unboxing
在jdk1.4.2中,
int iPrimitive = iWrapper.intValue();
java5?br />int iPrimitive = iWrapper;
下面是基本类型作为对象存储的范围Q?br />boolean values true and false
All byte values
short values between -128 and 127
int values between -128 and 127
char in the range \u0000 to \u007F
如果int values between -128 and 127QVM使用相同的对象,否则创徏新的对象?br />所以这D代码,大家不要奇?br />System.out.println(0L == 0);
System.out.println(((Long)0L).equals(0));
W二行代码是0不等?
因ؓ大家犯这L一个错?br /> static private final String LOCK = "LOCK";
  void testMethod() {
    synchronized(LOCK) {
    ...
    }
  }
应该用newQ不要直?Q对于intQ最好用int a[0] Q因为array也是对象Q不像IntegerQa[0]的值可以改变?br />



]]>
如何通过java或jsp向数据库存取二进制图?/title><link>http://m.tkk7.com/badboyryan/archive/2007/06/01/121285.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Fri, 01 Jun 2007 00:38:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/06/01/121285.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/121285.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/06/01/121285.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/121285.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/121285.html</trackback:ping><description><![CDATA[前几天突然看到学校音乐站上的囄原来是存储在数据库上?是二q制而不是用\径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个ȝ,首先要存储二q制文g在数据库中要搞清楚下面几个内?<br />1 mysql存储大容量的二进制文件的格式是blobQ其实除了图片还可以存别?br />2 要向数据库存储二q制的文件一定要把要存储的数据{换成二进制流<br />废话׃多说了,大家看看代码很容易明白,先来看一个appE序Q当焉先您要在数据库中先徏立一个用于保存图片的表和相应的列Q数据格式ؓblob<br />package com.lizhe;<br />import java.io.*;<br />import java.sql.*;<br />public class PutImg {<br />public void putimg() {<br />try {<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />String url = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";<br />Connection conn = DriverManager.getConnection(url);<br />Statement stmt = conn.createStatement();<br />//stmt.execute("insert into imgt (id) values (5)");<br />stmt.close();<br />PreparedStatement pstmt = null;<br />String sql = "";<br />File file = new File("c:\blog.jpg");<br />InputStream photoStream = new FileInputStream(file);<br />//sql = " UPDATE imgt SET img = ? ";<br /><br />sql = "INSERT INTO imgtable (img) VALUES (?)";<br /><br />pstmt = conn.prepareStatement(sql);<br />pstmt.setBinaryStream(1, photoStream, (int) file.length());<br />pstmt.executeUpdate();<br />pstmt.close();<br />conn.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}<br />public static void main(String args[]){<br />PutImg pi=new PutImg();<br />pi.putimg();<br />}<br />}<br /><br />InputStream photoStream = new FileInputStream(file);<br />可以很清楚的看到我们首先把一个图片文?当然也可以是别的什么文?转换成了一个二q制输入?br />pstmt.setBinaryStream(1, photoStream, (int) file.length());<br />q个Ҏ大家L一下API文档,W一个参数是通配W位|没的说,W二个参数是?q和以往的stringcd的参C太一?我刚看到的时候也觉得豁然开朗了,但是到这里还没完,不同于以往的字W串参数,q里我们q需要第三个参数来设|这个流的长?q里也就是这个文件的长度,导出数据库中的sql,一切都清楚?br />INSERT INTO `m_diy` VALUES (2,? JFIF HH?? ExifMM* b j ( 1 r 2 ?i H H Adobe Photoshop CS Windows2007:03:18 23:08:15 ? ??? ? ........{等<br />其实是文件先转换成了二进制的?然后插入Csql语言?向数据库写入了很长很长的一Dsql语句<br /><br /><br /><br />然后我们再来写一个appE序这个文件读出来,存储成一个图片文?br />package com.lizhe;<br />import java.io.*;<br />import java.sql.*;<br />class GetImg {<br /><br />private static final String URL = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";<br />private Connection conn = null; <br />private PreparedStatement pstmt = null; <br />private ResultSet rs = null; <br />private File file = null; <br /><br />public void blobRead(String outfile, int picID) throws Exception {<br />FileOutputStream fos = null;<br />InputStream is = null;<br />byte[] Buffer = new byte[4096];<br />try {<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />conn = DriverManager.getConnection(URL);<br />pstmt = conn.prepareStatement("select img from imgt where id=?");<br />pstmt.setInt(1, picID); // 传入要取的图片的ID<br />rs = pstmt.executeQuery();<br />rs.next();<br />file = new File(outfile);<br />if (!file.exists()) {<br />file.createNewFile(); // 如果文g不存在,则创?br />}<br />fos = new FileOutputStream(file);<br />is = rs.getBinaryStream("img");<br />int size = 0;<br /><br />while ((size = is.read(Buffer)) != -1) {<br />// System.out.println(size);<br />fos.write(Buffer, 0, size);<br />}<br />} catch (Exception e) {<br />System.out.println( e.getMessage());<br />} finally {<br />// 关闭用到的资?br />fos.close();<br />rs.close();<br />pstmt.close();<br />conn.close();<br />}<br />}<br />public static void main(String[] args) {<br />try {<br />GetImg gi=new GetImg();<br />gi.blobRead("c:/getimgs/1.jpg", 5);<br />} catch (Exception e) {<br />System.out.println("[Main func error: ]" + e.getMessage());<br />}<br />}<br />}<br />q里需要注意的?br />is = rs.getBinaryStream("img");<br />img是数据库中相应的列名,其实和rs.getString()Ҏ差不?只不q这个方法是d二进制流?br />最后在帖两个bspȝ上用的文件给大家参?br />通过struts的action向数据库写入二进制图?br />/*<br />* Generated by MyEclipse Struts<br />* Template path: templates/java/JavaClass.vtl<br />*/<br />package com.lizhe.struts.action;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.PreparedStatement;<br />import java.sql.Statement;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.upload.FormFile;<br />import com.lizhe.struts.form.UpimgForm;<br />/** <br />* MyEclipse Struts<br />* Creation date: 05-18-2007<br />* <br />* XDoclet definition:<br />* @struts.action path="/upimg" name="upimgForm" input="/userhomepage.jsp"<br />* @struts.action-forward name="userhome" path="/userhomepage.jsp" redirect="true" contextRelative="true"<br />*/<br />public class UpimgAction extends Action {<br />/*<br />* Generated Methods<br />*/<br />/** <br />* Method execute<br />* @param mapping<br />* @param form<br />* @param request<br />* @param response<br />* @return ActionForward<br />* @throws IOException <br />* @throws FileNotFoundException <br />*/<br />public ActionForward execute(ActionMapping mapping, ActionForm form,<br />HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {<br />UpimgForm upimgForm = (UpimgForm) form;// TODO Auto-generated method stub<br /><br />FormFile file=upimgForm.getFile();<br />InputStream is=file.getInputStream();<br /><br />try {<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />String url = "jdbc:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterEncoding=gb2312";<br />Connection conn = DriverManager.getConnection(url);<br />Statement stmt = conn.createStatement();<br />//stmt.execute("insert into img (id) values (5)");<br />stmt.close();<br />PreparedStatement pstmt = null;<br />String sql = "";<br />//File file = new File("c:\blog.jpg");<br />//InputStream photoStream = new FileInputStream(file);<br />//sql = " UPDATE imgt SET img = ? ";<br /><br />sql = "INSERT INTO img (img) VALUES (?)";<br /><br />pstmt = conn.prepareStatement(sql);<br />pstmt.setBinaryStream(1, is, (int) file.getFileSize());<br />pstmt.executeUpdate();<br />pstmt.close();<br />conn.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br /><br />return mapping.findForward("userhomepage");<br />}<br />}<br />和app的方式几乎是一L<br />W二个文件是通过jsp数据库中的囄昄在页面上<br />q个有些不同<br /><%@ page contentType="text/html;charset=gb2312"%> <br /><%@ page import="java.sql.*" %> <br /><%@ page import="java.util.*"%> <br /><%@ page import="java.text.*"%> <br /><%@ page import="java.io.*"%> <br /><%@ page import="java.awt.*"%> <br /><html> <br /><body> <br /><% <br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />String url="jdbc:mysql://localhost/img?user=root&password=root";<br />Connection con = DriverManager.getConnection(url); <br />String sql = "select * from imgt where id=5"; <br />Statement stmt = con.createStatement(); <br /><br />ResultSet rs = stmt.executeQuery(sql); <br />if(rs.next()) { <br />InputStream in = rs.getBinaryStream("img"); <br />ServletOutputStream op = response.getOutputStream(); <br />int len; <br />byte[] buf=new byte[1024]; <br />while((len= in.read(buf))!=-1) { <br />op.write(buf, 0, len); <br />} <br />op.close(); <br />in.close(); <br />} <br /><br />rs.close(); <br />stmt.close(); <br />con.close(); <br />%> <br /></body> <br /></html> <br /><img src ="http://m.tkk7.com/badboyryan/aggbug/121285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-06-01 08:38 <a href="http://m.tkk7.com/badboyryan/archive/2007/06/01/121285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZWEB应用开发的javaE序员必备工?/title><link>http://m.tkk7.com/badboyryan/archive/2007/05/18/118237.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Fri, 18 May 2007 01:29:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/05/18/118237.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/118237.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/05/18/118237.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/118237.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/118237.html</trackback:ping><description><![CDATA[ <p> <font face="黑体" size="4"> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td valign="top" width="86%">一个好的程序员除了具备扎实的基本功外,q应该具有更为灵zȝ逻辑思维与判断能力。除此之外,撑握一些行之有效的辅助工具也很重要。工Ʋ善其事,必先利其器。有好的工具辅助Q所做的工作事半功倍。下面向大家推荐ZWEB应用开发的javaE序员应该必备的辅助开发工兗?br /><br />  1QJava剖析工具 -- profiler<br />  是一个全功能的Java剖析工具QprofilerQ,专用于分析J2SE和J2EE应用E序。它把CPU、执行A和内存的剖析l合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以扑ֈ效能瓉、抓出内存漏?(memory leaks)、ƈ解决执行l的问题。它让你得以对heap walker作资源回收器的root analysisQ可以轻易找出内存漏失;heap快照QsnapshotQ模式让未被参照QreferenceQ的对象、稍微被参照的对象、或在终l(finalizationQ队列的对象都会被移除;整合_以便剖析览器的Java外挂功能?br />下蝲地址Qhttp://www.ej-technologies.com/download/overview.html<br /><br /><br />  <br />  2Q冗余代码检查 -- Simian<br />  Simian UI 是一个用来发现重复代码的eclipse插gQ对于改善设计,消除冗余代码很有帮助?br />安装ҎQ用eclipse的Help->Software Updateq行安装。站点地址?http://www.integility.com/eclipse/<br />安装后,按照提示重新启动eclipse。在希望q行分析的项目上点击右键Q选择Simian->Add Simian to this projectQ就可以目q行代码查?br /><br /><br />  3Q浏览器端调试工PIEQ -- Internet Explorer Developer Toolbar<br />  微Y发布了Internet Explorer Developer Toolbar Beta版。该产品让开发h员能够深入探索和理解Web面Q帮助开发者更好地创徏Web应用。浏览和修改Web늚文档对象模型QDOMQ。具备以下特性:<br />Q通过多种技术方式定位、选定Web上的特定元素?br />Q禁止或ȀzIE讄?br />Q查看HTML对象的类名、IDQ以及类似链接\径、tab序、快捷键{细节?br />Q描l表根{单元格、图片或选定标签的轮廓?br />Q显C图片象素、大、\径、替代文字等?br />Q即旉定义览器窗口大到800x600或自定义大小?br />Q清I浏览器~存和cookieQ被清除可从所有对象或l定域中选择?br />Q直接访问关联W3C规范参考、IE开发组blog或其他来源?br />Q显C计时标尺Q帮助对齐对象?br />该工h可集成在IEH口Q或以Q动窗口Ş式存在?br /><br />下蝲地址Q从微Y官方下蝲<br /><br /><br /><br />  4Q浏览器端调试工PFirefoxQ -- Firebug<br />  JavaScript, CSS, HTMLQAjax调试工具。功能包括HTML/CSS查,除错工具Q错误控制台和命令行{。可对javascript做调试和性能分析Q查看html代码的结构,css样式动态提C,ƈ昄面错误Q浏览树型结构的DOM数据Q可以显Cjavascript的log{等功能?br /><br />下蝲地址Qhttp://www.getfirebug.com/ </td> <td valign="top" width="14%"> <div align="right"> <font color="gray">    </font> </div> <script type="text/javascript"> <!-- google_ad_client = "pub-1552958637257019"; google_ad_width = 160; google_ad_height = 600; google_ad_format = "160x600_as"; google_ad_channel =""; google_ad_type = "text"; google_color_border = "A8DDA0"; google_color_bg = "EBFFED"; google_color_link = "0000CC"; google_color_url = "008000"; google_color_text = "6F6F6F"; //--> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1552958637257019&dt=1179451618468&lmt=1179451618&format=160x600_as&output=html&correlator=1179451618468&url=http%3A%2F%2Fwww.cn-java.com%2Ftarget%2Fnews.php%3Fnews_id%3D3817&color_bg=EBFFED&color_text=6F6F6F&color_link=0000CC&color_url=008000&color_border=A8DDA0&ad_type=text&ref=http%3A%2F%2Fwww.cn-java.com%2F&cc=99&flash=9&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency=""> </iframe> </td> </tr> </tbody> </table> </font> </p> <img src ="http://m.tkk7.com/badboyryan/aggbug/118237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-05-18 09:29 <a href="http://m.tkk7.com/badboyryan/archive/2007/05/18/118237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 入門與應用(二) http://m.tkk7.com/badboyryan/archive/2007/03/05/101868.html坏男?/dc:creator>坏男?/author>Mon, 05 Mar 2007 03:48:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/03/05/101868.htmlhttp://m.tkk7.com/badboyryan/comments/101868.htmlhttp://m.tkk7.com/badboyryan/archive/2007/03/05/101868.html#Feedback1http://m.tkk7.com/badboyryan/comments/commentRss/101868.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/101868.html假設您要從資料n中查詢出一些字Ԍ然後填寫到表單的下拉選單中?

例如一個示意的JavaE式如下Q?
1
2
3
4
5
6
7
8
package onlyfun.caterpillar;
 
publicclass Option {
public String[] getOptions() {
// 實際上這些字串是從資料庫中查到的啦?/font>
returnnew String[] {"良葛?, "毛美?, "c_?};
}
}


傛_的字串陣列,您要填寫C拉選單中Q當Ӟ首先我們要在dwr.xml中開發這個物件?
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN""http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
<allow>
<create creator="new" javascript="OPT">
<param name="class" value="onlyfun.caterpillar.Option"/>
</create>
</allow>
</dwr>


這是我們的E頁?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<script src="option.js" type="text/javascript"></script>
<script src="dwr/interface/OPT.js" type="text/javascript"></script>
<script src="dwr/engine.js" type="text/javascript"></script>
<script src="dwr/util.js" type="text/javascript"></script>
 
</head>
 
<body>
達R: <select id="opts"></select>
</body>
</html>


傛_的字串陣列會填入opts這個select中,我們的option.js如下?
1
2
3
4
5
6
7
8
window.onload = function() {
OPT.getOptions(populate);
};
 
function populate(list){
DWRUtil.removeAllOptions("opts");
DWRUtil.addOptions("opts", list);
}


夠簡單了…不需要解釋了?

看一下結果…?


好啦Q我知道有h在說了,這個程式有夠無聊?img alt="Dead" src="http://www.javaworld.com.tw/jute/images/smiles/smile_dead.gif" width="15" />

改一下!是個不錯的例了,例如連動方塊Q唔Q在Ajax in action中叫啥?Dynamic double comboQ?

假設一個會d資料庫中查詢資料的JavaE式C意如下Q?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package onlyfun.caterpillar;
 
import java.util.Map;
import java.util.TreeMap;
 
publicclass Bike {
  private Map<String, String[]> bikes;
  
  public Bike() {
    bikes = new TreeMap<String, String[]>();
    bikes.put("2000", new String[] {"2000 T1", "2000 T2", "2000 T3"});
    bikes.put("2001", new String[] {"2001 A1", "2001 A2"});
    bikes.put("2002", new String[] {"2002 BW1", "2002 BW2", "2002 BW"});
    bikes.put("2003", new String[] {"2003 S320"});
    bikes.put("2004", new String[] {"2004 TA1", "2004 TA2", "2004 TA3"});
  }
  
  public String[] getYears() {
    String[] keys = new String[bikes.size()];
    int i = 0;
    for(String key : bikes.keySet()) {
      keys[i++] = key;
    }
    return keys;
  }
  
  public String[] getBikes(String year) {
    return bikes.get(year);
  }
}


getYears()跟getBkies()分別表示產品的年份跟型號Q這邊用Map模擬Q實際上資料是來自資料n的查詢?

一樣的Q在dwr.xml中設定:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN""http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
<allow>
<create creator="new" javascript="Bike" scope="application">
<param name="class" value="onlyfun.caterpillar.Bike"/>
</create>
</allow>
</dwr>


我們會有個腳t車q䆾與型號查詢頁面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Insert title here</title>
<script type='text/javascript' src='dwr/interface/Bike.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='bike.js'></script>
</head>
<body onload="refreshYearList();">
  q䆾Q?lt;select id="years" onchange="refreshBikeList();"></select><br/><br/>
  型號Q?lt;select id="bikes"></select><br/>
</body>
</html>


注意Q在選完W一個年份後Q會觸發onchange事gQ接著第二個下拉選單會自動填上應q䆾的型號,而不是按鈕按下,再去取得W二個下拉選單,然後refresh...blah...blah...

bike.js如下?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function refreshYearList() {
Bike.getYears(populateYearList);
}
 
function populateYearList(list){
DWRUtil.removeAllOptions("years");
DWRUtil.addOptions("years", list);
refreshBikeList();
}
 
function refreshBikeList() {
var year = $("years").value;
Bike.getBikes(year, populateBikeList);
}
 
function populateBikeList(list){
DWRUtil.removeAllOptions("bikes");
DWRUtil.addOptions("bikes", list);
}


一樣很單?

看個無聊的畫面…XD




Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1239538



]]>
IBM Portal的web剪切出现q的解军_法!http://m.tkk7.com/badboyryan/archive/2007/01/05/91997.html坏男?/dc:creator>坏男?/author>Fri, 05 Jan 2007 07:00:00 GMThttp://m.tkk7.com/badboyryan/archive/2007/01/05/91997.htmlhttp://m.tkk7.com/badboyryan/comments/91997.htmlhttp://m.tkk7.com/badboyryan/archive/2007/01/05/91997.html#Feedback1http://m.tkk7.com/badboyryan/comments/commentRss/91997.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/91997.html文档出处Q?a href="/badboyryan/archive/2007/01/05/91997.html">http://m.tkk7.com/badboyryan/archive/2007/01/05/91997.html

同事在用IBM Portal的WEB剪切的时候,预览效果的时候发现页面全部是qwhyQ?br />
其实q个问题是编码的问题Q理解了jsp里面的编码是解决问题的关键,看看q段代码Q?br /><%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="GB18030"%>
<%@ taglib uri="<%@ taglib uri="<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="/common/tiles/level2pageTiles.jsp" flush="true"> 
      <tiles:put name="header" value="/daohang/shouye/display_l_1_indexHeader.jsp" />
      <tiles:put name="top" value="/common/jsppage/top.jsp" />
      <tiles:put name="middle" value="/daohang/shouye/display_l_1_indexMiddle.jsp"/>
      <%-- 带计数器的ؓ/common/jsppage/bottom2.jsp --%>
      <tiles:put name="bottom" value="/common/jsppage/bottom.jsp"/>
</tiles:insert>

我们看到QpageEncoding="GB18030"的作用是表示了该JSP文g使用的编码方式,q个属性主要是用于应用服务器在解析JSP文gQƈ转换为servlet时用;
contentType="text/html; charset=gb2312" 的作用是Q表C|页采用GB2312国标?q也是简体中文标准版?如果不加,部分览器会自动选择~码,从而导致ؕ码出?所以最好还是要加上Q?br /><meta   httpQequiv=″ContentQType?  content=″text/html;   charset=gb2312?gt;        
     <!Q-|页内容cdQTXT或HTML格式Q编码方式ؓGB2312   Q->      
因ؓJSP要经q两ơ编? W一阶段会用到pageEncoding, W二阶段会用 utf-8 至utf-8, W三阶段是由web容器Z的网? 用的是contentType.

阶段一?JSPC?JSP至JAVA(.java)原码?译", 它会ҎpageEncoding 的设定读取JSP. l果?由指定的 pageEncoding(utf-8,Big5,gb2312)的JSP 译成统一的utf-8 JAVA原码(.java). 如果pageEncoding讑֮错了, 或沒讑֮(预设ISO8859-1), 出来?在这个阶D就已是中文q.
阶段二是?JAVAC的JAVA原码至JAVA BYTECODE的编? 不论JSP的编写时是用(utf-8,Big5,gb2312),l过阶段一的结果全都是utf-8的ENCODING的JAVA原码.
JAVAC?utf-8的ENCODINGdAVA原码, ~译成字串是 utf-8 ENCODING的二q制?.class). 這这?JAVA VIRTUAL MACNHINE 对常数字串在 二进制码(JAVA BYTECODE)內表单的规范.
阶段三是TOMCAT(或其的application container)载入和执?階段二得来的JAVA二进制码, 输出的结? 也就是BROWSER(客戶?) 見到? q时一早隐藏在階段一和二的参数contentType, 发挥了功效.
Portal WEB剪切出现q是因为原始剪切源的原因而引L需要注意在面里面把编码方式写全、写对基本就没有问题了,q有注意如果出现Q说明是在字W集中找不到q个字符是览器解析不了,比如&nbspQ解决的办法把他替换为全角的I格Q?br />




]]>
动态类型判定,q行时多态问?/title><link>http://m.tkk7.com/badboyryan/archive/2007/01/05/91899.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Fri, 05 Jan 2007 01:53:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/01/05/91899.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/91899.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/01/05/91899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/91899.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/91899.html</trackback:ping><description><![CDATA[class A<br />{<br />   public void func1()<br />   {<br />      System.out.println("A func1 is calling");<br />   }<br />   public void func2()<br />   {<br />      func1();<br />   }<br />}<br />class B extends A<br />{<br />   public void func1()<br />   {<br />      System.out.println("B fun1 is calling");<br />   }<br />}<br />class C<br />{<br />   public static void main(String [] args)<br />   {<br />      B b=new B();<br />      A a=b;<br />      callA(a);<br />      callA(new B());<br />   }<br />   public static void callA(A a)<br />   {<br />      a.func1();<br />      a.func2();<br />   }<br />}<br /><br /><br /><span id="post2" style="FONT-SIZE: 12px; COLOR: #000000">q行l果Q?br /><br />D:\>javac C.java<br /><br />D:\>java C<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br /><br />单来_是RTTIQ动态类型判定,也就?br /><br />B b=<b>new B();</b><br />A a=<b>new B();</b><br /><br />只要{号双cd是什么类型,而且已经覆盖父类的方法,那么调用该方法时Q会自动知道相应的B中的覆盖Ҏ。这是一定的Q运行时多态?br /><br />==================================================<br /><br />只对Ҏq行动态判定,属性的取值看Q等号左边,也就是编译时cd?br /><br />A和Bd一个属性,在烦取|看结果:<br /><br />class A<br />{<br />   <b>public String name = "A CLASS";</b><br />   public void func1()<br />   {<br />      System.out.println("A func1 is calling");<br />   }<br />   public void func2()<br />   {<br />      func1();<br />   }<br />}<br />class B extends A<br />{<br />   <b>public String name = "B CLASS";</b><br />   public void func1()<br />   {<br />      System.out.println("B fun1 is calling");<br />   }<br />}<br />public class C<br />{<br />   public static void main(String [] args)<br />   {<br />      B b=new B();<br />      A a=b;<br />      callA(a);<br />      callA(new B());<br />      <br />      <b><br />      System.out.println(a.name);<br />      System.out.println(b.name);<br />      System.out.println(new B().name);<br />      </b><br />   }<br />   public static void callA(A a)<br />   {<br />      a.func1();<br />      a.func2();<br />   }<br />}<br /><br />q行l果Q?br /><br />D:\>javac C.java<br /><br />D:\>java C<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br />A CLASS<br />B CLASS<br />B CLASS<br /></span><img src ="http://m.tkk7.com/badboyryan/aggbug/91899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-01-05 09:53 <a href="http://m.tkk7.com/badboyryan/archive/2007/01/05/91899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转帖]多线E设计要?/title><link>http://m.tkk7.com/badboyryan/archive/2007/01/05/91890.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Fri, 05 Jan 2007 01:28:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/01/05/91890.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/91890.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/01/05/91890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/91890.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/91890.html</trackback:ping><description><![CDATA[ <span id="post1" style="FONT-SIZE: 12px; COLOR: #000000">1.多线E中有主内存和工作内存之分, 在JVM中,有一个主内存Q专门负责所有线E共享数据;而每个线E都有他自己U有的工作内存, d存和工作内存分贝在JVM的stack区和heap区?br /><br />2.U程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', ?'Waiting'几个状态,<br />'Ready' 表示U程正在{待CPU分配允许q行的时间?br /><br /><br />3.U程q行ơ序q不是按照我们创Z们时的顺序来q行的,CPU处理U程的顺序是不确定的Q如果需要确定,那么必须手工介入Q用setPriority()Ҏ讄优先U?br /><br />4.我们无从知道一个线E什么时候运行,两个或多个线E在讉K同一个资源时Q需要synchronized<br /><br />5. 每个U程会注册自己,实际某处存在着对它的引用,因此Q垃圑֛收机制对它就“束手无{”了?br /><br />6. DaemonU程区别一般线E之处是Q主E序一旦结束,DaemonU程׃l束?br /><br />7. 一个对象中的所有synchronizedҎ都共享一把锁Q这把锁能够防止多个Ҏ寚w用内存同时q行的写操作。synchronized staticҎ可在一个类范围内被怺间锁定v来?br /><br />8. 对于讉K某个关键׃n资源的所有方法,都必L它们设ؓsynchronizedQ否则就不能正常工作?br /><br />9. 假设已知一个方法不会造成冲突Q最明智的方法是不要使用synchronizedQ能提高些性能?br /><br />10. 如果一?同步"Ҏ修改了一个变量,而我们的Ҏ要用到这个变?可能是只?,最好将自己的这个方法也设ؓ synchronized?br /><br />11. synchronized不能l承Q 父类的方法是synchronizedQ那么其子类重蝲Ҏ中就不会l承“同步”?br /><br />12. U程堵塞Blocked有几个原因造成Q?br /><br />(1)U程在等候一些IO操作 <br />(2)U程试图调用另外一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用?br /><br />13.原子型操?atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着q些操作是线E安全的Q?但是大部分情况下Q我们ƈ不能正确使用Q来看看 i = i + 1 , i是int型,属于原始型变量:<br /><br />(1)从主内存中读取i值到本地内存. <br />(2)g本地内存装蝲到线E工作拷贝中. <br />(3)装蝲变量1. <br />(4)i ?1. <br />(5)结果给变量i. <br />(6)i保存到线E本地工作拷贝中. <br />(7)写回d? <br /><br />注意原子型操作只限于W?步到W?步的d以及W?到第7步的? i的D是可能被同时执行i=i+1的多U程中断打扰(在第4??br /><br />double 和long 变量是非原子型的(non-atomic)。数l是object 非原子型?br /><br /><br /><br />14. ׃13条的原因Q我们解军_法是Q?br /><br />class xxx extends Thread{<br /><br />//i会被l常修改<br />private int i;<br /><br />public synchronized int read(){ return i;}<br /><br />public synchronized void update(){ i = i + 1;}<br /><br />..........<br /><br />}<br /><br />15. Volatile变量Q?volatile变量表示保证它必L与主内存保持一_它实际是"变量的同?, 也就是说对于volatile变量的操作是原子型的Q如用在long ?double变量前?br /><br /><br />16. 使用yield()会自动放弃CPUQ有时比sleep更能提升性能?br /><br />17. sleep()和wait()的区别是Qwait()Ҏ被调用时会解除锁定,但是我们能用它的地方只是在一个同步的Ҏ或代码块内?br /><br />18. 通过刉羃同步范_可能的实现代码块同步,wait(毫秒?可在指定的毫U数可退出waitQ对于wait()需要被notisfy()或notifyAll()t醒?br /><br />19. 构造两个线E之间实旉信的方法分几步Q?br />(1). 创徏一个PipedWriter和一个PipedReader和它们之间的道;<br />PipedReader in = new PipedReader(new PipedWriter())<br />(2). 在需要发送信息的U程开始之前,外部的PipedWriter导向l其内部的Writer实例out<br />(3). 在需要接受信息的U程开始之前,外部的PipedReader导向l其内部的Reader实例in<br />(4). q样攑օout的所有东西度可从in中提取出来?br /><br />20. synchronized带来的问题除性能有所下降外,最大的~点是会带来死锁DeadLockQ只有通过谨慎设计来防止死锁,其他毫无办法Q这也是U程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()Ҏ<br /><br />21. 在大量线E被堵塞Ӟ最高优先的线E先q行。但是不表示低别线E不会运行,q行概率而已?br /><br />22. U程l的主要优点是:使用单个命o可完成对整个U程l的操作。很需要用到线E组?br /><br />23. 从以下几个方面提升多U程的性能Q?br /><br />查所有可能Block的地方,可能的多的使用sleep或yield()以及wait();<br /><br />可能g长sleep(毫秒?的时?<br /><br />q行的线E不用超q?00个,不能太多Q?br /><br />不同q_linux或windows以及不同JVMq行性能差别很大?br /><br />24. 推荐几篇相关英文文章:<br /><br /><a target="_blank">Use Threading Tricks to Improve Programs</a><br /></span> <img src ="http://m.tkk7.com/badboyryan/aggbug/91890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-01-05 09:28 <a href="http://m.tkk7.com/badboyryan/archive/2007/01/05/91890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>准确的掌?String c?/title><link>http://m.tkk7.com/badboyryan/archive/2007/01/05/91886.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Fri, 05 Jan 2007 01:19:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/01/05/91886.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/91886.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/01/05/91886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/91886.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/91886.html</trackback:ping><description><![CDATA[ <span id="post1" style="FONT-SIZE: 12px; COLOR: #000000">public class J0 {<br />public static void main(String[] args) {<br />String str1 = new String("strOne");<br />String str2 = new String("strOne");<br />String str3 = "strTwo";<br />String str4 = "strTwo";<br /><br />System.out.println(str1 == str2);<br />System.out.println(str3 == str4);<br /><br />}<br />}<br />估计{案是什么?<br />是不是false,false Q?br />因ؓ String cM能直?"==" h较!new 出来的两个String对象不在同一内存?br />应该?"equals()"?br />------------------------------------<br />可是{案是:false,true;<br />------------------------------------<br />怎么理解呢?<br /><br /><span id="post3" style="FONT-SIZE: 12px; COLOR: #000000">String str = new String("string");<br /> ?String str = "string";<br /><br />声明:以下解释是保证正的Q我会从内存I间上来解释Q比较清楚?br /><br />区别是,new String是在堆空间上分配一个空_指针指向这个空_每一个new都是新的I间Q?=判断当然是不{?br /><br />而String str = "ssss"Q说一下,在每U语a中对于字W串都有Ҏ的处理?br />Java有一个专门的字符串池来保存可以重用的字符丌Ӏ对于相同的字面|也就?双引号里面你看到东西"Q相同,多少个变量他们都指向相同的空_==判断当然相等?br /><br />所以最正确的判断字W串内容相等的方法,是用equalsҎ。Stringc这个immuable的类已经覆盖了这个从Objectcȝ承的eqaulsҎQ达C对于内容相等的判断?br /></span><br /></span> <img src ="http://m.tkk7.com/badboyryan/aggbug/91886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-01-05 09:19 <a href="http://m.tkk7.com/badboyryan/archive/2007/01/05/91886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPringInAction配书源代码下?/title><link>http://m.tkk7.com/badboyryan/archive/2007/01/04/91672.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Thu, 04 Jan 2007 00:35:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2007/01/04/91672.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/91672.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2007/01/04/91672.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/91672.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/91672.html</trackback:ping><description><![CDATA[真的难找啊,书上说的那个|站把中国的IPl封了;Q?br />因ؓ文g比较大,所以放到我的ftpI间了?br />侠客岛的朋友可以L们的ftp下蝲啊!<br />攑ֈ侠客岛目录里面了<br />文g名称Qspring_in_action_source.rar<br />侠客岛群P<font color="#0000ff">26858781<br /></font><br />推荐一个网址Q?br /><br />http://secure.manning.com/books/walls2/source<br /><br /><br /><img src ="http://m.tkk7.com/badboyryan/aggbug/91672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2007-01-04 08:35 <a href="http://m.tkk7.com/badboyryan/archive/2007/01/04/91672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 正则表达?U常用的功能http://m.tkk7.com/badboyryan/archive/2006/12/31/91163.html坏男?/dc:creator>坏男?/author>Sun, 31 Dec 2006 06:54:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/31/91163.htmlhttp://m.tkk7.com/badboyryan/comments/91163.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/31/91163.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/91163.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/91163.html
  下面单的说下它的4U常用功能:
  
  查询Q?/strong>
  
以下是代码片D:
String str="abc efg ABC";

String regEx="a|f"; //表示a或f

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.find();

  
  如果str中有regExQ那么rs为trueQ否则ؓflase。如果想在查找时忽略大小写,则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
  
  提取Q?/strong>

以下是代码片D:
String regEx=".+\(.+)$";

String str="c:\dir1\dir2\name.txt";

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.find();

for(int i=1;i<=m.groupCount();i++){

System.out.println(m.group(i));

}

  
  以上的执行结果ؓname.txtQ提取的字符串储存在m.group(i)中,其中i最大gؓm.groupCount();
  
  分割Q?br />  
以下是代码片D:
String regEx="::";

Pattern p=Pattern.compile(regEx);

String[] r=p.split("xd::abc::cde");

执行后,r是{"xd","abc","cde"}Q其实分割时q有跟简单的ҎQ?

String str="xd::abc::cde";

String[] r=str.split("::");

  
  替换Q删除)Q?/strong>
  
以下是代码片D:
String regEx="a+"; //表示一个或多个a

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher("aaabbced a ccdeaa");

String s=m.replaceAll("A");
  
  l果?Abbced A ccdeA"
  
  如果写成IZQ既可达到删除的功能Q比如:
  
String s=m.replaceAll("");
  
  l果?bbced ccde"
  
  附:
  
 \D {於 [^0-9] 非数?
 \s {於 [ \t\n\x0B\f ] I白字元
 \S {於 [^ \t\n\x0B\f ] 非空白字?
 \w {於 [a-zA-Z_0-9] 数字或是英文?
  \W {於 [^a-zA-Z_0-9] 非数字与英文?
  
  ^ 表示每行的开?br />  $ 表示每行的结?br />

]]>
ZRMI的分布式银行自助l端监控pȝ的研I及实现http://m.tkk7.com/badboyryan/archive/2006/12/31/91159.html坏男?/dc:creator>坏男?/author>Sun, 31 Dec 2006 06:49:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/31/91159.htmlhttp://m.tkk7.com/badboyryan/comments/91159.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/31/91159.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/91159.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/91159.html
ZRMI的分布式银行自助l端监控pȝ的研I及实现
张永?sup>1Q张?sup>2
(1Q陕西师范大学计机U学学院 陕西 西安 710062Q?Q西安胦l学?陕西 西安 710061)


q年来随着我国金融体制攚w的不断深人,银行企业不断利用信息技术拓宽业务,其中对于自助银行Q其得C飞速发展,因此Q依托现在计机技术、网l通信技术、数据安全技术开发出能对各种自助l端q行监控Q网l拓展性良好,使用灉|方便Q安全的银行自助l端监控pȝ成ؓ当务之急。利用J2EEpȝq_[1]Q能有效地实现分布式多层体系l构的应用程序开发?/p>

1 RMI[2]

RMI(Remote Method InvocationQ远E方法调?是J2EE技术中的一,是Java语言实现有力|络功能的固有机ӞRMI允许Java~写分布式对象,q允许对象在内存中通信Q可跨越Java虚拟机通信[3-4]Q也可跨物理设备?br />
RMI实现实际上由3个抽象层建立Q?/p>

StubsQSkeletons Layer(存根/L?QRemote Reference Layer(q程引用?QTransport Layer(传输??/p>

2 监控pȝ的设计与实现

2Q? pȝ|络l构

本系l以中国银行内部Intranet|络Z托,采用集中式网l结构构成。如?所C?/p>

pȝ采用一台监控服务器Q连在中国银行Intranetd|上Q和提供数据源的前置机放入同一|段。服务器L上运行Web服务器、应用服务器和数据库服务器,为用h供Web方式讉K。监控客L以浏览器的Ş式在工作站上通过|络直接讉Kweb服务器,q行信息查询、监控管理、报表打印、系l维护等。Intranet环境内其他用户可通过路由器、DDN专线从相应工作站以web形式讉KWeb服务器?/p>

2Q? pȝ逻辑层次l构?/strong>

监控pȝ由数据库服务器、应用服务器、web服务器和览器组成,通过IntranetQInternet与综合前|系l连接?br />
本文?层结构模式应用于银行自助l端监控pȝQ这3层分别是Q客户层QWeb?应用逻辑?Q数据存储层(见图2)?/p>

q种l构无疑是富有生命力的,监控C用浏览器直接与银行Intranetq接Q监控服务器(监控服务器由Application Server和DB Servet两台服务器组?在接入Intranet之前与一个Web Serverq接Q再通过Web Server接入Internet。通过Internet在监控服务器与监控台之间建立物理q接?/p>

2.3 应用pȝl构

自助讑֤监控pȝ是监控前端自助设备运行状态,交易情况的网上应用系l,他的数据来自于数据采集模块。前端自助设备运行时发送状态交易数据到前置机、主机系l,由前|机、主机系l进行处理,q将状态数据、交易情况记入数据库或LOG文g中。如?所C,q控系l数据采集模块定旉集数据库或LOG文g中的数据到监控数据库中,监控应用pȝ负责对监控数据统一处理Qƈ通过监控客户端实时请求发送到监控客户端进行显C及其他处理?/p>

3 RMI技术在监控pȝ中的应用

中国银行天|分行在每个地区都下设支行Q每个支行负责管理本地区的ATM|点Q因此各个支行之间网点ATM自助讑֤的状态、交易信息不能共享.那么各个地区的监控客L只能通过本地区支行的监控服务器实时监控本地区的ATM|点的自助终端设备,Z使n处各个地区的监控客户端都能够监控各个支行所辖的ATM|点自助l端讑֤Q就必须采用分布式的监控pȝ。每个支行都讄一台监控服务器Q与各自所在支行的前置pȝ相连接,利用RMI技术将实时监控、远E控制、查询统计组件注册ؓq程对象Q监控客h在Q何支行的监控服务器上的注册服务表用远E对象的名字查找相应q程对象Q然后调用他的方法,可以像监控本地区的ATM自助l端讑֤那样监控其他地区的ATM自助l端讑֤?

下面本文以对ATM状态的实时监控如何借助RMI技术实现做以讨?sup>[5]?/p>

3Q? 定义q程接口

在Java中,q程对象是实现远E接口的cȝ实例Q远E接口声明每个要q程调用的方法。在需要创Z个远E对象的时候,通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。远E接口具有如下特点:

(1)q程接口必须为public属性?br />
(2)q程接口必须扩展接口javaQrmiQRemote?br />
(3)除与应用E序本n特定的例外之外,q程接口中的每个Ҏ都必d自己的throws从句中声明javaQrmiQRemoteException?br />
(4)作ؓ参数或返回g递的一个远E对?不管是直接,q是本地对象中嵌?必须声明E接口,而不应声明ؓ实施cR?br />
下面是对ATM状态实时监控的q程接口ATM_StatusShow_Interface的定义?/p>

3Q? 实现q程接口[6]

q程对象实现cdL展远E对象javaQrmiQUnicastRemoteObjectc,q实现所定义的远E接口。远E对象的实现cM包含实现每个q程接口所指定的远E方法的代码。这个类也可以含有附加的ҎQ但客户只能使用q程接口中的Ҏ。因为客h指向接口的一个句柄,而不是他的哪个类。必Mؓq程对象定义构造函敎ͼ即只准备定义一个默认构造函敎ͼ用他调用基础cL造函数?/p>

3Q? ~写服务器类

通过ATM_StatusShow_Server创徏一个远E对象的实例Qƈ通过javaQrmiQregistryQLocateRegistrycȝcreateRegistryҎ从指定端口号启动注册服务E序Q注册服务程序的~省q行端口?099。必dq程对象名字l定到对q程对象的引用上?/p>

3Q? ~写使用q程服务的客hcR?/strong>

客户机类的主要功能有2个:一是通过NamingQlookupҎ来构造注册服务程序stubE序实例Q二是调用服务器q程对象上的q程Ҏ?/p>

3Q? E对象实现创建根和干

要创建存根程序和L文gQ应以包含远E对象实现的已编译类包全名运行rmic~译器。存?Stub)是远E对象在客户端的代理Q他RMI调用传递给服务器端的主?Skeleton)Q后者负责将该调用传递给实际的远E方法:

q行rmicQRMI目录下就会多?个新c:

ATM_StatusShow_Impl_StubQclass

ATM_StatusShow_Impl_SkelQclass

他们分别对应的是存根(stub)和主?skeleton)?/p>

4 l??/strong>

本系l在中国银行天|分行的支持下已投入用,l过多次试和实际运行,用户对于本系l的评h比较满意。在q行速度和运行稳定性上都能辑ֈ要求。对于用L日常工作负担起到了较大减ȝ作用Q提高了工作效率Q简化了沟通手l,丰富了查询能力,使统计结果更加实时、灵zd准确。从技术角度上看,本系l采用RMI技术非常好地解决了分布式应用的问题?br />

 
本文摘自《现代电子技术?/div>

]]>中间件编E之RMI在Java中的应用 http://m.tkk7.com/badboyryan/archive/2006/12/31/91151.html坏男?/dc:creator>坏男?/author>Sun, 31 Dec 2006 06:18:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/31/91151.htmlhttp://m.tkk7.com/badboyryan/comments/91151.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/31/91151.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/91151.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/91151.html  Internet/Intranet的飞速发展得Web应用日益q泛而复杂,Web早已不仅仅是媒体信息的览工具Q它正逐步发展成ؓ分布异构环境中企业应用的通用前端和事务处理的展现H口。在分布式环境异构中Q各U机器所采用的操作系l、网l通信协议和应用Y件千差万别,要实C息共享和软g资源的整合十分困难,然而一个健壮的分布式计框架能为可UL的分布式应用软g开发带来巨大的便利和好处?
  分布式对象技术主要是在分布式异构环境下徏立应用系l框架和对象构g。在应用pȝ框架的支撑下Q开发者可以将软g功能装为更易管理和使用的对象,q些对象可以跨越不同的Y、硬件^台进行互操作。目前,分布式互操作标准主要有Microsoft的COM/DCOM标准、Sun公司的Java RMI标准和OMGl织的CORBA标准?
  Java RMI调用实例
  Java RMI?
  q程Ҏ调用QRMIQRemote Method InvocationQ是jdk1.1中引入的分布式对象Y件包Q它的出现大大简化了分布异构环境中Java应用之间的通信?
  
  要用RMIQ必L建四个主要的c:q程对象的本地接口、远E对象实现、RMI客户机和RMI服务器。RMI服务器生成远E对象实现的一个实例,q用一个专有的URL注册。RMI客户机在q程RMI服务器上查找服务对象Qƈ它转换成本地接口类型,然后像对待一个本地对象一样用它?
  
  下面是一个简单的RMI实例QRMI客户机通过RMI服务器提供的Ҏ实现对两个双_ֺ点数的加减q算。例子虽然很单,但掌握了Java RMI调用的基本原理和ҎQ在实现复杂应用Ӟ我们需要做的也只是完善q程对象的实现类而已?
  
  RMI实例分析
  
  1.q程对象的本地接口声明(RMIOperate.javaQ?
  
  该类仅仅是一个接口声明,RMI客户机可以直接用它QRMI服务器必通过一个远E对象来实现它,q用某个专有的URL注册它的一个实例?
  
  具体代码如下Q?
  
  package wf.rmi; //包名
  import java.rmi.*; //导入cd
  /*RMI本地接口必须从Remote接口z*/
   public interface RMIOperate extends Remote
  {
   /*接口中的具体Ҏ声明Q注意必d明抛出RemoteException*/
   public double add(double x, double y) throws RemoteException;
  //输入两个点敎ͼq回其和
   public double minus(double x, double y) throws RemoteException;
  //输入两个点敎ͼq回其差
  }
  2.q程对象实现c(OperateImpl.javaQ?
  q个cd实现RMI客户用的q程服务对象的本地接口,它必MUnicastRemoteObjectl承Q构造函数应抛出RemoteException异常?
  具体代码如下Q?
  
  package wf.rmi; //包名
  //导入需要的cd
  import java.rmi.*;
  import wf.rmi.RMIOperate;
  import java.rmi.server.UnicastRemoteObject;
  public class OperateImpl extends UnicastRemoteObject implements RMIOperate
  {
   /*构造函?/
   public OperateImpl() throws RemoteException
   {
   }
   /*实现本地接口中声明的addҎ*/
   public double add(double x, double y) throws RemoteException
   {
   double z = x + y;
   return z;
   }
   /*实现本地接口中声明的minusҎ*/
   public double minus(double x, double y) throws RemoteException
   {
   double z = x - y;
   return z;
   }
  }
  3.RMI服务器类QRMIServer.javaQ?
  该类创徏q程对象实现cOperateImpl的一个实例,然后通过一个专有的URL来注册它。所谓注册就是通过Java.rmi.Naming.bind()Ҏ或Java.rmi.Naming.rebind()ҎQ将OperateImpl实例l定到指定的URL上?
  
  具体实现代码如下Q?
  
  package wf.rmi; //包名
  //导入需要的cd
  import java.rmi.Naming;
  import wf.rmi.OperateImpl;
  public class RMIServer
  {
   public static void main(String[] args)
   {
   try
   {
    //创徏q程对象的实现实?br />    OperateImpl operObj = new OperateImpl();
    //提示信息
    System.out.println("RMI Server Starting...");
    //实例注册到专有的URL
    Naming.rebind("rmi:///RMIOperate", operObj);
    //{待RMI客户用的提示信息
    System.out.println("Waiting RMI Client Invoke...");
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
   }
  }
  4.RMI客户机类QRMIClient.javaQ?
  
  RMI客户使用java.rmi.Naming.lookup()ҎQ在指定的远E主Z查找RMI服务对象Q若扑ֈ把它{换成本地接口RMIOperatecd。它与CORBA不同之处在于RMI客户机必ȝ道提供RMI服务L的URLQ这个URL可以通过rmi://host/path或rmi://host:port/path来指定,如果省略端口P默认?099。Java.rmi.Naming.lookup()Ҏ可能产生三个异常QJava.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLExceptionQ三个异帔R需要捕莗?
  
  下面是详l代码:
  
  package wf.rmi; //包名
  //导入需要的cd
  import java.rmi.*;
  import java.net.*;
  import java.io.*;
  public class RMIClient
  {
    public static void main(String[] args)
    {
      try
      {
        BufferedReader readIn = new BufferedReader(new
  InputStreamReader(System.in));
        String host = "localhost"; //默认为本C?br />   //带输入参数时Q将host讄为指定主?br />        if (args.length > 0)
          host = args[0];
        //Ҏ指定的URL定位q程实现对象
  RMIOperate rmiObj = (RMIOperate)Naming.lookup("rmi://" + host +
  "/RMIOperate");      //提示输入q算参数1
  System.out.println("Please Input Data1: ");
        String str1 = readIn.readLine(); //d输入参数1
        double x = 0;
        try
        {
     x = Double.parseDouble(str1); //分析输入参数1Q{换ؓdoublecd
        }
       catch(NumberFormatException nfe)
        {
          x = 0; //如果转换异常Q则重置x?
        }
   //提示输入q算参数2
        System.out.println("Please Input Data2: ");
        String str2 = readIn.readLine();//d输入参数2
        double y = 0;
        try
        {
          y = Double.parseDouble(str2); //分析输入参数2Q{换ؓdoublecd
        }
        catch(NumberFormatException nfe)
        {
          y = 0; //如果转换异常Q则重置y?
        }
   //调用q程对象的本地接口方法,实现输入参数的加、减q算Qƈ输出l果
       System.out.println("Data1 Add Data2 Result is: " + rmiObj.add(x, y));
       System.out.println("Data1 minus Data2 Result is: " +
    rmiObj.minus(x, y));
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
    }
  }
  RMI Server/Client的编译与q行
  
  (1).~译所有的源代?如图1)
   
  ?
  (2).生成客户端存根和服务器框?如图2)
   
  ?
  q将构造OperateImpl_Stub.class和OperateImpl_Skel.class。这时可所有的Class文g打包成jarQƈ其分别|于RMI客户机和RMI服务器的ClassPath?如图3):
   
  ?
  当然Q也可以只将RMIOperate.class、RMIClient.class和OperateImpl_Stub.class复制到RMI客户机,RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class复制到RMI服务器?
  (3).启动RMI注册(如图4)
   
  ?
  (4).q行和调?
  ?在服务器上执行RMIServer(如图5)
   
  ?
  ?在本地客h上运行RMIClient(如图6)
   
  ?
  ?在远E客h上运行RMIClientQ须指明RMI服务器主机名或IP地址Q如?Q?
   
  ?
  xQRMI调用完成?br />
        摘自Q?a >http://youngyj1982.bokee.com/

]]>
Spring交流学习徏?/title><link>http://m.tkk7.com/badboyryan/archive/2006/12/25/89821.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Mon, 25 Dec 2006 01:34:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2006/12/25/89821.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/89821.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2006/12/25/89821.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/89821.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/89821.html</trackback:ping><description><![CDATA[Zpȝ的学习SPRING的精华思想建立一个QQ,<font color="#0000ff">qq侠客岛:26858781<br /></font><br />Ƣ迎spring的高手进入?br /><br /><img src ="http://m.tkk7.com/badboyryan/aggbug/89821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2006-12-25 09:34 <a href="http://m.tkk7.com/badboyryan/archive/2006/12/25/89821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>展示JDBC存取ORACLE大型数据对象LOB几种情况的示范类http://m.tkk7.com/badboyryan/archive/2006/12/20/88986.html坏男?/dc:creator>坏男?/author>Wed, 20 Dec 2006 02:34:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/20/88986.htmlhttp://m.tkk7.com/badboyryan/comments/88986.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/20/88986.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/88986.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/88986.htmlimport java.io.*;
import java.util.*;
import java.sql.*;
  
public class LobPros
{
  
    /**
     * ORACLE驱动E序
     */
    private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
  
    /**
     * ORACLEq接用URL
     */
    private static final String URL = "jdbc:oracle:thin:@test2000:1521:orac";
  
    /**
     * 用户?
     */
    private static final String USER = "user";
  
    /**
     * 密码
     */
    private static final String PASSWORD = "pswd";
  
    /**
     * 数据库连?
     */
    private static Connection conn = null;
  
    /**
     * SQL语句对象
     */
    private static Statement stmt = null;
  
    /**
     * @roseuid 3EDA089E02BC
     */
    public LobPros()
    {
  
    }
  
    /**
     * 往数据库中插入一个新的CLOB对象
     *
     * @param infile - 数据文g
     * @throws java.lang.Exception
     * @roseuid 3EDA04A902BC
     */
    public static void clobInsert(String infile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 插入一个空的CLOB对象 */
            stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
            /* 查询此CLOB对象q?*/
            ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
            while (rs.next()) {
                /* 取出此CLOB对象 */
                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
                /* 向CLOB对象中写入数?*/
                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
                BufferedReader in = new BufferedReader(new FileReader(infile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * 修改CLOB对象Q是在原CLOB对象基础上进行覆盖式的修改)
     *
     * @param infile - 数据文g
     * @throws java.lang.Exception
     * @roseuid 3EDA04B60367
     */
    public static void clobModify(String infile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 查询CLOB对象q?*/
            ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
            while (rs.next()) {
                /* 获取此CLOB对象 */
                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");   
                /* q行覆盖式修?*/
                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
                BufferedReader in = new BufferedReader(new FileReader(infile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * 替换CLOB对象Q将原CLOB对象清除Q换成一个全新的CLOB对象Q?
     *
     * @param infile - 数据文g
     * @throws java.lang.Exception
     * @roseuid 3EDA04BF01E1
     */
    public static void clobReplace(String infile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 清空原CLOB对象 */
            stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
            /* 查询CLOB对象q?*/
            ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
            while (rs.next()) {
                /* 获取此CLOB对象 */
                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
                /* 更新数据 */
                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
                BufferedReader in = new BufferedReader(new FileReader(infile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * CLOB对象d
     *
     * @param outfile - 输出文g?
     * @throws java.lang.Exception
     * @roseuid 3EDA04D80116
     */
    public static void clobRead(String outfile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 查询CLOB对象 */
            ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");
            while (rs.next()) {
                /* 获取CLOB对象 */
                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
                /* 以字WŞ式输?*/
                BufferedReader in = new BufferedReader(clob.getCharacterStream());
                BufferedWriter out = new BufferedWriter(new FileWriter(outfile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                out.close();
                in.close();
            }
        } catch (Exception ex) {
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * 向数据库中插入一个新的BLOB对象
     *
     * @param infile - 数据文g
     * @throws java.lang.Exception
     * @roseuid 3EDA04E300F6
     */
    public static void blobInsert(String infile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 插入一个空的BLOB对象 */
            stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())");
            /* 查询此BLOB对象q?*/
            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
            while (rs.next()) {
                /* 取出此BLOB对象 */
                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
                /* 向BLOB对象中写入数?*/
                BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
                BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * 修改BLOB对象Q是在原BLOB对象基础上进行覆盖式的修改)
     *
     * @param infile - 数据文g
     * @throws java.lang.Exception
     * @roseuid 3EDA04E90106
     */
    public static void blobModify(String infile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 查询BLOB对象q?*/
            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
            while (rs.next()) {
                /* 取出此BLOB对象 */
                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
                /* 向BLOB对象中写入数?*/
                BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
                BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * 替换BLOB对象Q将原BLOB对象清除Q换成一个全新的BLOB对象Q?
     *
     * @param infile - 数据文g
     * @throws java.lang.Exception
     * @roseuid 3EDA0505000C
     */
    public static void blobReplace(String infile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 清空原BLOB对象 */
            stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'");
            /* 查询此BLOB对象q?*/
            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
            while (rs.next()) {
                /* 取出此BLOB对象 */
                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
                /* 向BLOB对象中写入数?*/
                BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
                BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * BLOB对象d
     *
     * @param outfile - 输出文g?
     * @throws java.lang.Exception
     * @roseuid 3EDA050B003B
     */
    public static void blobRead(String outfile) throws Exception
    {
        /* 讑֮不自动提?*/
        boolean defaultCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
  
        try {
            /* 查询BLOB对象 */
            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'");
            while (rs.next()) {
                /* 取出此BLOB对象 */
                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
                /* 以二q制形式输出 */
                BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));
                BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
                int c;
                while ((c=in.read())!=-1) {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            /* 正式提交 */
            conn.commit();
        } catch (Exception ex) {
            /* 出错回滚 */
            conn.rollback();
            throw ex;
        }
  
        /* 恢复原提交状?*/
        conn.setAutoCommit(defaultCommit);
    }
  
    /**
     * 建立试用表?
     * @throws Exception
     */
    public static void createTables() throws Exception {
        try {
            stmt.executeUpdate("CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)");
            stmt.executeUpdate("CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)");
        } catch (Exception ex) {
  
        }
    }
  
    /**
     * @param args - 命o行参?
     * @throws java.lang.Exception
     * @roseuid 3EDA052002AC
     */
    public static void main(String[] args) throws Exception
    {
        /* 装蝲驱动,建立数据库连?*/
        Class.forName(DRIVER);
        conn = DriverManager.getConnection(URL,USER,PASSWORD);
        stmt = conn.createStatement();
  
        /* 建立试表格 */
        createTables();
  
        /* CLOB对象插入试 */
        clobInsert("c:/clobInsert.txt");
        clobRead("c:/clobInsert.out");
  
        /* CLOB对象修改试 */
        clobModify("c:/clobModify.txt");
        clobRead("c:/clobModify.out");
  
        /* CLOB对象替换试 */
        clobReplace("c:/clobReplace.txt");
        clobRead("c:/clobReplace.out");
  
        /* BLOB对象插入试 */
        blobInsert("c:/blobInsert.doc");
        blobRead("c:/blobInsert.out");
  
        /* BLOB对象修改试 */
        blobModify("c:/blobModify.doc");
        blobRead("c:/blobModify.out");
  
        /* BLOB对象替换试 */
        blobReplace("c:/blobReplace.doc");
        blobRead("c:/bolbReplace.out");
  
        /* 关闭资源退?*/
        conn.close();
        System.exit(0);
    }
}


]]>
javascript中文排序http://m.tkk7.com/badboyryan/archive/2006/12/19/88790.html坏男?/dc:creator>坏男?/author>Tue, 19 Dec 2006 06:39:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/19/88790.htmlhttp://m.tkk7.com/badboyryan/comments/88790.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/19/88790.html#Feedback1http://m.tkk7.com/badboyryan/comments/commentRss/88790.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/88790.html javascript中文排序
  原文来自Q?a class="ubblink" target="_blank" rel="external">风微柳细
原来的方法是用个大中文字数组Q一个个比较Q:Q?br />
以下为引用内?
更新[2005.10.06]Q?br />JavaScript提供了一U更便的Ҏ用于比较两个字符东y—localeCompare()QlocaleCompare()使用本地特定的顺序来比较两个字符Ԍ语法如下Q?br />string.localeCompare(target)
参数target是要与stringq行比较的字W串?br />如果string于targetQ则localeCompare()q回于0的数Q?br />如果string大于targetQ返回大?的数Q?br />如果相等Q或按照本地序的约定两者顺序相当)Q则q回0?br />利用该方法替换上面冗长的作法后,除了代码减少了之外,q行速度也快了不,而且q支持其它字W库的本地排序?br />修改后代码如下:

该方法目前已作ؓECMAScript v3标准Q在支持JavaScript 1.5QMozilla、Netscape 6+Q以及JScript 5.5QIE 5.5+Q的览器中均得C支持?

代码如下Q?br />
<script type="text/javascript">
<!--
     function startSort(){
          var a=document.getElementById('s').value;
          a=a.split(',')
          a.sort();
          document.getElementById('r1').value=a;
          a.sort(function(a,b){return a.localeCompare(b)});
          document.getElementById('r2').value=a;
     }
         
//-->
</script>
<p>包含汉字的字W串数组(用逗号","隔开)Q?lt;br />
<textarea id="s" style="width: 100%; overflow: scroll; word-wrap: normal;" rows="10">张韶?b?abort,张学?something,Ҏ,五月?刘d?香蕉,apple,范玮?阿桑</textarea></p>

<p style="text-align: center"><input type="button" value="排序试" onclick="startSort()" style="width: 300px" /></p>

<p>默认排序l果Q?lt;br />
<textarea id="r1" style="width: 100%; overflow: scroll; word-wrap: normal;" rows="10"></textarea></p>

<p>汉字拼音序排序l果Q?lt;br />
<textarea id="r2" style="width: 100%; overflow: scroll; word-wrap: normal;" rows="10"></textarea></p>



]]>
用Delphi开发JNI(Java Native Interface)应用http://m.tkk7.com/badboyryan/archive/2006/12/19/88661.html坏男?/dc:creator>坏男?/author>Mon, 18 Dec 2006 21:41:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/19/88661.htmlhttp://m.tkk7.com/badboyryan/comments/88661.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/19/88661.html#Feedback1http://m.tkk7.com/badboyryan/comments/commentRss/88661.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/88661.html阅读全文

]]>
JDK6初体?/title><link>http://m.tkk7.com/badboyryan/archive/2006/12/18/88411.html</link><dc:creator>坏男?/dc:creator><author>坏男?/author><pubDate>Mon, 18 Dec 2006 00:24:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/archive/2006/12/18/88411.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/88411.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/archive/2006/12/18/88411.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/88411.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/88411.html</trackback:ping><description><![CDATA[我推荐网路冷眼的blogQ上面有几篇介绍jdk1.6新特性的文章Q?br />地址在这Q?a href="/lewhwa"><br />http://m.tkk7.com/lewhwa</a><br /><br /><img src ="http://m.tkk7.com/badboyryan/aggbug/88411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">坏男?/a> 2006-12-18 08:24 <a href="http://m.tkk7.com/badboyryan/archive/2006/12/18/88411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 配置Log4jhttp://m.tkk7.com/badboyryan/archive/2006/12/01/84788.html坏男?/dc:creator>坏男?/author>Fri, 01 Dec 2006 03:44:00 GMThttp://m.tkk7.com/badboyryan/archive/2006/12/01/84788.htmlhttp://m.tkk7.com/badboyryan/comments/84788.htmlhttp://m.tkk7.com/badboyryan/archive/2006/12/01/84788.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/84788.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/84788.html Log4J的配|文?Configuration File)是用来讄记录器的U别、存攑֙和布局的,它可接key=value格式的设|或xml格式的设|信息。通过配置Q可以创建出Log4J的运行环境?br />
1. 配置文g
Log4J配置文g的基本格式如下:

#配置根Logger
log4j.rootLogger 
=   [ level ]   ,  appenderName1 ,  appenderName2 ,
 ?br />
#配置日志信息输出目的地Appender
log4j.appender.appenderName 
=
 fully.qualified.name.of.appender.class 
  log4j.appender.appenderName.option1 
=
 value1 
  …?br />  log4j.appender.appenderName.optionN 
=
 valueN 

#配置日志信息的格式(布局Q?br />log4j.appender.appenderName.layout 
=
 fully.qualified.name.of.layout.class 
  log4j.appender.appenderName.layout.option1 
=
 value1 
  …?br />  log4j.appender.appenderName.layout.optionN 
=  valueN 

其中 [level] 是日志输出别,共有5U:
FATAL      0  
ERROR     
3
 
WARN      
4
 
INFO      
6
 
DEBUG     
7


Appender
为日志输出目的地QLog4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?br />org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br />org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br />org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)

LayoutQ日志输出格式,Log4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

打印参数: Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q如?
  %m   输出代码中指定的消息
  %p   输出优先U,即DEBUGQINFOQWARNQERRORQFATAL 
  %r   输出自应用启动到输出该log信息耗费的毫U数 
  %c   输出所属的cȝQ通常是所在类的全名?br />  %t   输出产生该日志事件的U程名?br />  %n   输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n”?br />  %d   输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss
, SSS}Q输出类|2002q?0?8日?/span> 22 Q?/span> 10 Q?/span> 28 Q?/span> 921
 
  %l   输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:
10

2. 在代码中初始化Logger:
1Q在E序中调?strong>BasicConfigurator.configure()
ҎQ给根记录器增加一个ConsoleAppenderQ输出格式通过PatternLayout设ؓ"%-4r [%t] %-5p %c %x - %m%n"Q还有根记录器的默认U别?strong>Level.DEBUG
.
2Q配|放在文仉Q通过命o行参C递文件名字,通过PropertyConfigurator.configure(args[x])解析q|;
3Q配|放在文仉Q通过环境变量传递文件名{信息,利用log4j默认的初始化q程解析q|;
4Q配|放在文仉Q通过应用服务器配|传递文件名{信息,利用一个特D的servlet来完成配|?br />
3. Z同的 Appender 讄日志输出U别Q?/strong>
当调试系l时Q我们往往注意的只是异常别的日志输出Q但是通常所有别的输出都是攑֜一个文仉的,如果日志输出的别是BUGQ?那就慢慢L吧?br />q时我们也许会想要是能把异常信息单独输出C个文仉该多好啊。当然可以,Log4j已经提供了这L功能Q我们只需要在配置中修?strong>Appender
?font color="#990000">Threshold
p实现,比如下面的例子:

[配置文g]
### set log levels ###
log4j.rootLogger
= debug ,  stdout ,  D ,
 E

### 输出到控制台 ###
log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target
=
System.out
log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=  %d{ABSOLUTE} %5p %c{ 1
}:%L - %m%n

### 输出到日志文件?##
log4j.appender.D
=
org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File
=
logs/log.log
log4j.appender.D.Append
=
true
log4j.appender.D.Threshold
=
DEBUG ## 输出DEBUGU别以上的日?/strong>
log4j.appender.D.layout
=
org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern
= %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]
 %m%n

### 保存异常信息到单独文件?##
log4j.appender.E
=
org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File
=
logs/error.log ## 异常日志文g?br />log4j.appender.E.Append = true
log4j.appender.E.Threshold
=
ERROR ## 只输出ERRORU别以上的日?!!
log4j.appender.E.layout
=
org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern
= %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

[代码中用]
public   class  TestLog4j  {
    
public   static   void  main(String[] args) 
{
        PropertyConfigurator.configure(
" D:/Code/conf/log4j.properties "
);
        Logger logger 
=  Logger.getLogger(TestLog4j. class
);
        logger.debug(
" debug "
);
        logger.error(
" error "
);
    }

}

q行一下,看看异常信息是不是保存在了一个单独的文gerror.log中?br />
http://m.tkk7.com/zJun/archive/2006/06/28/55511.html


]]>
վ֩ģ壺 ޹˾Ʒ| һĻ߹ۿ| ƬӰԺۿ| ޳aƬ777777| ߹ۿƵ| һëƬ߲| һŮ| aƵƷѹۿ| ù͵v͵v| ëƬv߲һ| AƵվ| Ļ˳й| ޾ƷŮþþþ9999| ձɫַ| պƵ߹ۿ| һд | vavava888www| 99߾ƷƵۿ| avרavëƬ| ޳av| ɫƷƵ| 鶹Ƶѹۿ| þ99Ʒһ| պ Ļ| ޾Ʒ߲| õ788Ƶ| ҰƵѹۿȫ| ˳ɫ77777߹ۿ| avƷfc2| ֻƬþù| Ļ| һëƬѿa| һ岻 | պAVһ| ޼Ůۺ99| Ļһ| Ļ߹ۿ| Ѹվ߹ۿ| ٸԼA | ƷŮٸaѾþ | ۺɫ¶|