﻿<?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-&lt;b&gt;&lt;font size='4'&gt;萧秋水的博客&lt;/font&gt;&lt;/b&gt;-随笔分类-JSP&amp;SERVLET</title><link>http://www.blogjava.net/Benjamin/category/14121.html</link><description>&lt;br&gt;&lt;font size='2.5'&gt;带着淡淡的倦意，轻轻的忧惺，宛若远山含笑迷蒙，但又如闪电惊雷般震人心魄……&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:07:08 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:07:08 GMT</pubDate><ttl>60</ttl><item><title>用xmlhttp和session监听站内人数(session监听、无刷新取server端数据)</title><link>http://www.blogjava.net/Benjamin/archive/2006/08/15/63703.html</link><dc:creator>萧秋水</dc:creator><author>萧秋水</author><pubDate>Tue, 15 Aug 2006 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/Benjamin/archive/2006/08/15/63703.html</guid><wfw:comment>http://www.blogjava.net/Benjamin/comments/63703.html</wfw:comment><comments>http://www.blogjava.net/Benjamin/archive/2006/08/15/63703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Benjamin/comments/commentRss/63703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Benjamin/services/trackbacks/63703.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">　　这个题目含有许多需要解释的概念，最容易说明的是“站内消息”，这是很多论坛都
有的功能，可以通过web向其他的在线用户发送消息，很多用户都使用过。站内消息的第一个好处是大家都不需要安装客户端，你不用知道对方的MSN或者
QQ，就能与他联系，称赞他的观点或者是给他一顿臭骂。第二个好处是客户管理方便，利用session来维护在线名单，各种脚本都已经把session操
作封装得很易用了，不用像其他无状态的即时通信工具（比如使用UDP通信的工具）一样，要费一些脑细胞来解决在线名单的问题。缺点嘛，就是实时性不好，一
般是在用户跳转或者刷新页面才能探测消息、更新在线名单。<br /><br />　　Session监听嘛，没什么好解释的，java提供了很灵活的事件机制来
监听session，可以监听session的创建和销毁，监控session所携带数据的创建、变化和销毁，可以监听session的锐化和钝化（了解
对象序列化的兄弟应该知道这个），其他的平台是个什么情况我不太清楚，估计也差不多吧。如果能够对所有客户的session进行监控，就不用再去操作麻烦
而危险的Application了。<br /><br />　　Xmlhttp是MS推的一项技术，功能很复杂，可以做很多事情，比如客户端可以在简单的
HTML中打开HTTP连接，主动向server请求数据并获得返回数据，是DOM技术一个非常重要的应用，利用它来写无刷新的动态页面简直是
so easy，做过web开发的兄弟应该明白它的意义有多么重大。<br /><br />一、 session监听<br /><br />　　servlet中对
session的监听有很多接口，功能很灵活，最常用的是监听Session和Attribute。这里要澄清一下概念，servlet中的
session监听和Attribute监听含义有差别，session监听指的不是我们一般所理解的放置一个session或者销毁一个
session，这是Attribute监听的功能，因为servlet中放置session的语法是session.setAttribute
(“session名”,要放入的对象)。而session监听，监听的是HTTP连接，只要有用户与server连接，就算连接的是一个空白的jsp页
面，也会触发session事件，所以此处的session实际上指的是connection，用来统计当前在线用户数最合适了。不知道我说清楚了没有。
下面分别讲解这两种监听方式。<br /><br />1、 session监听<br /><br />　　首先编写一个session监听类，实作HttpSessionListener接口，它的作用是计算当前有多少个在线用户：<br /><br /></font>
		</p>
		<div class="codeStyle">
				<ol>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">/**</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">*@Author bromon</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">*2004-6-12</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">*/</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">package</font>
												</b> org.bromon.test; </font>
								</font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">import</font>
												</b> javax.servlet.*; </font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">import</font>
												</b> javax.servlet.http.*; </font>
								</font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">public</font>
												</b> <b><font color="#0000ff">class</font></b> SessionCount <b><font color="#0000ff">implements</font></b> </font>
								</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionListener.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionListener</u>
										</font>
								</a>
								<font face="Verdana" size="2">
								</font>
						</li>
						<li>
								<font face="Verdana" size="2">{ </font>
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">int</font></b> count=0; </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> sessionCreated(</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionEvent.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionEvent</u>
										</font>
								</a>
								<font face="Verdana" size="2"> se) </font>
						</li>
						<li>
								<font face="Verdana" size="2">    { </font>
						</li>
						<li>
								<font face="Verdana" size="2">        count++; </font>
						</li>
						<li>
								<font face="Verdana" size="2">        <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.out.println(“session创建：”+<b><font color="#0000ff">new</font></b> java.util.<b><a href="http://www.javaresearch.org/source/jdk142/java/util/Date.java.html" target="_blank"><font class="classLink"><u>Date</u></font></a></b>()); </font>
						</li>
						<li>
								<font face="Verdana" size="2">    } </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> sessionDestroyed(</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionEvent.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionEvent</u>
										</font>
								</a>
								<font face="Verdana" size="2"> se) </font>
						</li>
						<li>
								<font face="Verdana" size="2">    { </font>
						</li>
						<li>
								<font face="Verdana" size="2">       count--; </font>
						</li>
						<li>
								<font face="Verdana" size="2">       <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.out.println(“session销毁:”+<b><font color="#0000ff">new</font></b> java.util.<b><a href="http://www.javaresearch.org/source/jdk142/java/util/Date.java.html" target="_blank"><font class="classLink"><u>Date</u></font></a></b>()); </font>
						</li>
						<li>
								<font face="Verdana" size="2">    } </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">int</font></b> getCount() </font>
						</li>
						<li>
								<font face="Verdana" size="2">    { </font>
						</li>
						<li>
								<font face="Verdana" size="2">       <b><font color="#0000ff">return</font></b>(count); </font>
						</li>
						<li>
								<font face="Verdana" size="2">     } </font>
						</li>
						<li>
								<font face="Verdana" size="2">} </font>
						</li>
				</ol>
		</div>
		<p>
				<br />
				<br />
				<br />
				<font face="Verdana" size="2">　　怎么样，是不是一目了然？count被定义为static，是因为要保证整个系统只有这一个count。如果你实在不放心，可以把它写成一个单例类。<br /><br />　　然后在web.xml中声明这个监听器：<br />&lt;listener&gt;<br />&lt;listener-class&gt;<br />org.bromon.test.SessionCount<br />&lt;/listener-class&gt;<br />&lt;/listener&gt;<br /><br />　　编写一个测试页面test.jsp，内容是获得count：<br />&lt;%<br />int count=org.bromon.test.SessionCount.getCount();<br />out.println(count);<br />%&gt;<br /><br />　　需要注意的是，这里根本不涉及任何session的操作。重启动App server，试着连接test.jsp，可以看到监听器已经开始工作。<br /><br />2、 Attribute监听<br />　　作为一个站内消息系统，肯定要获得所有登陆者的ID，才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块，用户通过身份验证之后会产生一个session，保存它的相关信息，比如：<br /></font>
		</p>
		<div class="codeStyle">
				<ol>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">//check.jsp</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;% </font>
						</li>
						<li>
								<font face="Verdana" size="2">    <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> name=request.getParameter(“name”); </font>
						</li>
						<li>
								<font face="Verdana" size="2">    <font color="#ff0000">Name</font>=<b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>(name.getBytes(“ISO8859-1”)); </font>
						</li>
						<li>
								<font face="Verdana" size="2">    session.setAttribute(“user”,name); </font>
						</li>
						<li>
								<font face="Verdana" size="2">%&gt; </font>
						</li>
				</ol>
		</div>
		<p>
				<br />
				<br />
				<font face="Verdana" size="2">　　做过jsp的兄弟应该对这段代码再熟悉不过了，下面写个监听器来监听用户登陆，把所有用户的ID保存到一个List当中，这个监听器实作HttpSessionAttributeListener接口：<br /><br /></font>
		</p>
		<div class="codeStyle">
				<ol>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">/**</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">*@Author bromon</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">*2004-6-12</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<i>
														<font color="#339900">*/</font>
												</i>
										</font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">package</font>
												</b> org.bromon.test; </font>
								</font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">import</font>
												</b> javax.servlet.*; </font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">import</font>
												</b> javax.servlet.http.*; </font>
								</font>
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">import</font>
												</b> java.util.*; </font>
								</font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font size="2">
										<font face="Verdana">
												<b>
														<font color="#0000ff">public</font>
												</b> <b><font color="#0000ff">class</font></b> OnlineList <b><font color="#0000ff">implements</font></b> </font>
								</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionAttributeListener.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionAttributeListener</u>
										</font>
								</a>
								<font face="Verdana" size="2">
								</font>
						</li>
						<li>
								<font face="Verdana" size="2">{ </font>
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/util/List.java.html" target="_blank"><font class="classLink"><u>List</u></font></a></b> list=<b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/util/ArrayList.java.html" target="_blank"><font class="classLink"><u>ArrayList</u></font></a></b>(); </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> attributeAdded(</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionBindingEvent.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionBindingEvent</u>
										</font>
								</a>
								<font face="Verdana" size="2"> se) </font>
						</li>
						<li>
								<font face="Verdana" size="2">    { </font>
						</li>
						<li>
								<font face="Verdana" size="2">        <b><font color="#0000ff">if</font></b>(“user”.equals(se.getName())) </font>
						</li>
						<li>
								<font face="Verdana" size="2">        { </font>
						</li>
						<li>
								<font face="Verdana" size="2">            list.add(se.getValue()); </font>
						</li>
						<li>
								<font face="Verdana" size="2">         } </font>
						</li>
						<li>
								<font face="Verdana" size="2">    } </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> attributeRemoved(</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionBindingEvent.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionBindingEvent</u>
										</font>
								</a>
								<font face="Verdana" size="2"> se) </font>
						</li>
						<li>
								<font face="Verdana" size="2">    { </font>
						</li>
						<li>
								<font face="Verdana" size="2">         <b><font color="#0000ff">if</font></b>(“user”.equals(se.getName())) </font>
						</li>
						<li>
								<font face="Verdana" size="2">         { </font>
						</li>
						<li>
								<font face="Verdana" size="2">            list.remove(se.getValue()); </font>
						</li>
						<li>
								<font face="Verdana" size="2">         } </font>
						</li>
						<li>
								<font face="Verdana" size="2">    } </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> attributeReplaced(</font>
								<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionBindingEvent.java.html" target="_blank">
										<font class="classLink" face="Verdana" size="2">
												<u>HttpSessionBindingEvent</u>
										</font>
								</a>
								<font face="Verdana" size="2"> se){} </font>
						</li>
						<li>
								<br />
						</li>
						<li>
								<font face="Verdana" size="2">    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">static</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/util/List.java.html" target="_blank"><font class="classLink"><u>List</u></font></a></b> getList() </font>
						</li>
						<li>
								<font face="Verdana" size="2">    { </font>
						</li>
						<li>
								<font face="Verdana" size="2">         <b><font color="#0000ff">return</font></b>(list); </font>
						</li>
						<li>
								<font face="Verdana" size="2">     } </font>
						</li>
						<li>
								<font face="Verdana" size="2">} </font>
						</li>
				</ol>
		</div>
		<p>
				<br />
				<br />
				<font face="Verdana" size="2">写个简单的jsp来得到用户列表：<br />&lt;%<br />    java.util.List list=org.bromon.test.OnlineList.getList();<br />    out.println(“共有”+list.size()+”名用户已登陆：”);<br />    for(int I=0;I&lt;lise.size();i++)<br />    {<br />        out.println(list.get(i));<br />    }<br />%&gt;<br /><br />也许你说，这有什么神奇呢，监听session而已，不着急，看看xmlhttp。<br /><br />二、 XMLHTTP<br /><br />　　XMLHTTP的用处很多，这里只说我们需要的，就是无刷新的与server通信，看这段代码：<br /><br /></font>
		</p>
		<div class="codeStyle">
				<ol>
						<li>
								<font face="Verdana" size="2">&lt;script language=<font color="#ff33ff">"javascript"</font>&gt;  </font>
						</li>
						<li>
								<font face="Verdana" size="2">xml = <b><font color="#0000ff">new</font></b> ActiveXObject(<font color="#ff33ff">"Microsoft.XMLHTTP"</font>);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">var post=<font color="#ff33ff">" "</font>;<i><font color="#339900">//构造要携带的数据 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.open(<font color="#ff33ff">"POST"</font>,<font color="#ff33ff">"http://localhost:7001/TestWL/index.jsp"</font>,<b><font color="#0000ff">false</font></b>);<i><font color="#339900">//使用POST方法打开一个到服务器的连接，以异步方式通信 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.setrequestheader(<font color="#ff33ff">"content-length"</font>,post.<b><font color="#0000ff">length</font></b>);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.setrequestheader(<font color="#ff33ff">"content-type"</font>,<font color="#ff33ff">"application/x-www-form-urlencoded"</font>);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.send(post);<i><font color="#339900">//发送数据 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">var res = xml.responseText;<i><font color="#339900">//接收服务器返回的数据 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">document.write(res);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;/script&gt; </font>
						</li>
				</ol>
		</div>
		<p>
				<br />
				<br />
				<br />
				<font face="Verdana" size="2">　　豁然开朗，这段代码就是打开一个HTTP连接，以标准
的HTTP格式传递数据，如果你喜欢，可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一
个轮询，每隔一段时间刷新一次用户列表，当然，是不需要刷新页面的：<br /><br /></font>
		</p>
		<div class="codeStyle">
				<ol>
						<li>
								<font face="Verdana" size="2">&lt;html&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;head&gt;&lt;title&gt;探测器&lt;/title&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;script language=<font color="#ff33ff">"javascript"</font>&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">function detect() </font>
						</li>
						<li>
								<font face="Verdana" size="2">{ </font>
						</li>
						<li>
								<font face="Verdana" size="2">xml = <b><font color="#0000ff">new</font></b> ActiveXObject(<font color="#ff33ff">"Microsoft.XMLHTTP"</font>);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">var post=<font color="#ff33ff">" "</font>;<i><font color="#339900">//构造要携带的数据 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.open(<font color="#ff33ff">"POST"</font>,<font color="#ff33ff">"http://localhost:7001/TestWL/index.jsp"</font>,<b><font color="#0000ff">false</font></b>);<i><font color="#339900">//使用POST方法打开一个到服务器的连接，以异步方式通信 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.setrequestheader(<font color="#ff33ff">"content-length"</font>,post.<b><font color="#0000ff">length</font></b>);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.setrequestheader(<font color="#ff33ff">"content-type"</font>,<font color="#ff33ff">"application/x-www-form-urlencoded"</font>);  </font>
						</li>
						<li>
								<font face="Verdana" size="2">xml.send(post);<i><font color="#339900">//发送数据 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">var res = xml.responseText;<i><font color="#339900">//接收服务器返回的数据 </font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">list.innerText=res; </font>
						</li>
						<li>
								<font face="Verdana" size="2">setTimeout(“detect()”,5000);<i><font color="#339900">//每隔5秒钟轮询一次</font></i></font>
						</li>
						<li>
								<font face="Verdana" size="2">}  </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;/script&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;body onload=”detect()”&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;a id=”list”&gt;&lt;/a&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;/body&gt; </font>
						</li>
						<li>
								<font face="Verdana" size="2">&lt;/html&gt; </font>
						</li>
				</ol>
		</div>
		<br />
		<br />
		<font face="Verdana" size="2">　　这样的通信方式数据量很小，不用重新传递整个页面，5秒钟轮一次，普通PC也能承受较大的在线数。构造一个探测器来监听在线列表和消息，效果是很好的，即使你的客户坐在电脑前袖手旁观，键鼠都不碰一下，也能保证数据即时传递，页面也不会发生跳转和刷新。<br /><br />　　Session监听加上XMLHTTP通信，开发一个较为完善的站内消息系统实在易如反掌。 </font>
<img src ="http://www.blogjava.net/Benjamin/aggbug/63703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Benjamin/" target="_blank">萧秋水</a> 2006-08-15 16:05 <a href="http://www.blogjava.net/Benjamin/archive/2006/08/15/63703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在TOMCAT配置数据源，调用数据源</title><link>http://www.blogjava.net/Benjamin/archive/2006/08/15/63700.html</link><dc:creator>萧秋水</dc:creator><author>萧秋水</author><pubDate>Tue, 15 Aug 2006 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/Benjamin/archive/2006/08/15/63700.html</guid><wfw:comment>http://www.blogjava.net/Benjamin/comments/63700.html</wfw:comment><comments>http://www.blogjava.net/Benjamin/archive/2006/08/15/63700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Benjamin/comments/commentRss/63700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Benjamin/services/trackbacks/63700.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000" face="Verdana" size="2">1、在TOMCAT里配置数据源，在&lt;host&gt;&lt;/host&gt;之间加上下面的代码，具体的参数根据自己情况修改<br />   &lt;Context path="" docBase="E:\WEB_CODE\DEMO\WEB" debug="0"&gt;<br />   <br />   &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />                    
prefix="localhost_xzm_log." suffix=".txt"<br />           timestamp="true"/&gt;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">          &lt;Environment name="maxExemptions" type="java.lang.Integer"<br />                     
value="15"/&gt;<br />          &lt;Parameter name="context.param.name" value="context.param.value"<br />                    
override="false"/&gt;         
<br />          <br />          &lt;Resource name="jdbc/tzwdb" auth="Container"<br />                   
type="oracle.jdbc.pool.OracleDataSource"/&gt; <br />          &lt;ResourceParams name="jdbc/tzwdb"&gt;<br />           
&lt;parameter&gt;&lt;name&gt;factory&lt;/name&gt;&lt;value&gt;oracle.jdbc.pool.OracleDataSourceFactory&lt;/value&gt;&lt;/parameter&gt;           
<br />           
&lt;parameter&gt;&lt;name&gt;driverClassName&lt;/name&gt;&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;&lt;/parameter&gt;<br />           
&lt;parameter&gt;&lt;name&gt;url&lt;/name&gt;&lt;value&gt;jdbc:oracle:thin:@127.0.0.1:1521:ORCL&lt;/value&gt;&lt;/parameter&gt;<br />           
&lt;parameter&gt;&lt;name&gt;username&lt;/name&gt;&lt;value&gt;demo&lt;/value&gt;&lt;/parameter&gt;<br />           
&lt;parameter&gt;&lt;name&gt;password&lt;/name&gt;&lt;value&gt;demo&lt;/value&gt;&lt;/parameter&gt;<br />           
&lt;parameter&gt;&lt;name&gt;serverName&lt;/name&gt;&lt;value&gt;127.0.0.1&lt;/value&gt;&lt;/parameter&gt;           
<br />           
&lt;parameter&gt;&lt;name&gt;databaseName&lt;/name&gt;&lt;value&gt;ORCL&lt;/value&gt;&lt;/parameter&gt;           
<br />           
&lt;parameter&gt;&lt;name&gt;portNumber&lt;/name&gt;&lt;value&gt;1521&lt;/value&gt;&lt;/parameter&gt;
<br />           
&lt;parameter&gt;&lt;name&gt;maxActive&lt;/name&gt;&lt;value&gt;30&lt;/value&gt;&lt;/parameter&gt;<br />           
&lt;parameter&gt;&lt;name&gt;maxIdle&lt;/name&gt;&lt;value&gt;10&lt;/value&gt;&lt;/parameter&gt;
<br />           
&lt;parameter&gt;&lt;name&gt;maxWait&lt;/name&gt;&lt;value&gt;500&lt;/value&gt;&lt;/parameter&gt;           
<br />           
&lt;parameter&gt;&lt;name&gt;description&lt;/name&gt;&lt;value&gt;oracle&lt;/value&gt;&lt;/parameter&gt;           
<br />          &lt;/ResourceParams&gt;<br />            <br />          &lt;Resource name="mail/Session" auth="Container"<br />                   
type="javax.mail.Session"/&gt;<br />          &lt;ResourceParams name="mail/session"&gt;<br />            &lt;parameter&gt;<br />              &lt;name&gt;mail.smtp.host&lt;/name&gt;<br />              &lt;value&gt;localhost&lt;/value&gt;<br />            &lt;/parameter&gt;<br />          &lt;/ResourceParams&gt;<br />   <br />   &lt;/Context&gt;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">2、连接数据库</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">import java.sql.Connection;<br />import java.sql.PreparedStatement;<br />import java.sql.SQLException;<br />import java.sql.Statement;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">import javax.naming.Context;<br />import javax.naming.InitialContext;<br />import javax.sql.DataSource;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">import org.apache.log4j.Logger;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">/**<br /> * @author : 萧秋水<br /> * <br /> * @contact me : </font>
				<a href="mailto:cnyanhai@hotmail.com">
						<font color="#000000" face="Verdana" size="2">cnyanhai@hotmail.com</font>
				</a>
				<br />
				<font color="#000000" face="Verdana" size="2"> * <br /> */<br />public class DBManager {</font>
		</p>
		<p>
				<br />
				<font color="#000000" face="Verdana" size="2">    static Logger logger = Logger.getLogger(DBManager.class.getClass());</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private Context initCtx = null;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private Context ctx = null;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private DataSource ds = null;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private long timeout = 5000;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private Statement theStatement = null;</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private PreparedStatement thePstmt = null;<br /><br />    private static final String userName = "tzw";</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private static final String password = "ywsoft";</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    /***************************************************************************<br />     * <br />     * 初试化initCtx<br />     * <br />     * 取得数据源对象<br />     *  <br />     **************************************************************************/</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    public DBManager() {<br />        try {<br />            initCtx = new InitialContext();<br />            //init context，read config web.xml<br />            if (initCtx == null) {<br />               
throw new Exception("Initial Failed!");<br />            }<br />            ctx = (Context) initCtx.lookup("java:comp/env");<br />           
//find "jdbc/tzwdb" object this configruation in the SERVER.XML of<br />            // Tomcat<br />            if (ctx != null) {<br />               
ds = (DataSource) ctx.lookup("jdbc/tzwdb");<br />            }<br />            if (ds == null) {<br />               
throw new Exception("Look up DataSource Failed!");<br />            }<br />        } catch (Exception e) {<br />           
logger.error("Look up DataSource error! -- " + e.getMessage());<br />        }<br />    }</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    /***************************************************************************<br />     * <br />     * get Connection<br />     * <br />     * @return Connection<br />     *  <br />     **************************************************************************/</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    public synchronized Connection getConnection() {<br />        //get connection and set to delay time<br />        long startTime = new java.util.Date().getTime();<br />        Connection con = null;<br />        while (con == null) {<br />            con = newConnection();<br />            if (con != null) {<br />               
logger.info("Create New Connection!");<br />                break;<br />            }<br />            try {<br />               
logger.info("Connection timeout，Please wait " + timeout + "ms");<br />                wait(timeout);<br />            } catch (InterruptedException e) {<br />               
logger.warn("Connection timeout! -- " + e.getMessage());<br />            }<br />           
if ((new java.util.Date().getTime() - startTime) &gt;= timeout) {<br />                logger.warn("Connection timeout!");<br />                break;<br />            }<br />        }<br />        return con;<br />    }</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    private Connection newConnection() {<br />        Connection con = null;<br />        try {<br />            con = ds.getConnection(userName, password);<br />            if (con == null) {<br />               
throw new Exception("Create Connection Failed!");<br />            }<br />        } catch (Exception e) {<br />           
logger.warn("Create Connection Failed! -- " + e.getMessage());<br />        }<br />        return con;<br />    }</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    /***************************************************************************<br />     * <br />     * release the connection<br />     *  <br />     **************************************************************************/</font>
		</p>
		<p>
				<font color="#000000" face="Verdana" size="2">    public synchronized void freeConnection(Connection conn, PreparedStatement pstmt) {<br />        try {<br />            //close PreparedStatement<br />            if (pstmt != null) {<br />                pstmt.close();<br />                pstmt = null;<br />            }<br />        } catch (Exception e) {<br />           
logger.warn("release stmt,pstmt error! -- " + e.getMessage());<br />        }<br />        try {<br />            //close Connection<br />            if (conn != null) {<br />                conn.close();<br />                conn = null;<br />            }<br />        } catch (SQLException e) {<br />            logger.warn("release conn error! -- " + e.getMessage());<br />        }<br />    }</font>
		</p>
		<font color="#000000" face="Verdana" size="2">}<br />   <br /></font>
<img src ="http://www.blogjava.net/Benjamin/aggbug/63700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Benjamin/" target="_blank">萧秋水</a> 2006-08-15 16:03 <a href="http://www.blogjava.net/Benjamin/archive/2006/08/15/63700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在TOMCAT下JSP的中文处理解决方案</title><link>http://www.blogjava.net/Benjamin/archive/2006/08/15/63701.html</link><dc:creator>萧秋水</dc:creator><author>萧秋水</author><pubDate>Tue, 15 Aug 2006 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/Benjamin/archive/2006/08/15/63701.html</guid><wfw:comment>http://www.blogjava.net/Benjamin/comments/63701.html</wfw:comment><comments>http://www.blogjava.net/Benjamin/archive/2006/08/15/63701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Benjamin/comments/commentRss/63701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Benjamin/services/trackbacks/63701.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">方法一：<font color="#ff0000">new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK")<br /></font><br />方法二：<br />1、<br />在jsp中加入下面两行<br />         <font color="#ff0000"> &lt;%@ page contentType="text/html; charset=GBK" language="java" %&gt;<br />         
&lt;meta http-equiv="Content-Type" content="text/html; charset=GBK"&gt;<br /></font>2、<br />在TOMCAT中找到<font color="#ff0000">SetCharacterEncodingFilter.java</font>，他们位于<font color="#ff0000">D:\Tomcat5.0.27\webapps\jsp-examples\WEB-INF\classes\filters</font>，加到你的工程文件里去，并修改包名。<br />3、<br />配置WEB.XML，</font>
		<font face="Verdana" size="2">在web.xml里加入这一段<br /><font color="#ff0000"> &lt;filter&gt;<br />    &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />    &lt;filter-class&gt;utils.SetCharacterEncodingFilter&lt;/filter-class&gt;<br />    &lt;init-param&gt;<br />      &lt;param-name&gt;encoding&lt;/param-name&gt;<br />      &lt;param-value&gt;GB2312&lt;/param-value&gt;<br />    &lt;/init-param&gt;<br />  &lt;/filter&gt;<br />  &lt;filter-mapping&gt;<br />    &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />  &lt;/filter-mapping&gt;<br /></font>4、修改server.xml中两个部分<br /><font color="#ff0000">&lt;Connector port="8090"<br />              
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />              
enableLookups="false" redirectPort="8443" acceptCount="100"<br />               debug="0" connectionTimeout="20000" <br />              
disableUploadTimeout="true" URIEncoding='GB2312'/&gt;<br />&lt;Connector className="org.apache.coyote.tomcat5.CoyoteConnector"<br /></font></font>
		<font color="#ff0000" face="Verdana" size="2">              
port="8009" minProcessors="5" maxProcessors="75"<br /></font>
		<font color="#ff0000" face="Verdana" size="2">               enableLookups="true" redirectPort="8443"<br /></font>
		<font color="#ff0000" face="Verdana" size="2">              
acceptCount="10" debug="0" connectionTimeout="0"<br /></font>
		<font color="#ff0000" face="Verdana" size="2">              
useURIValidationHack="false" protocol="AJP/1.3"<br />               </font>
		<font color="#ff0000" face="Verdana" size="2">protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" <br /></font>
		<font face="Verdana" size="2">
				<font color="#ff0000">               URIEncoding='GB2312'/&gt;</font>
		</font>
<img src ="http://www.blogjava.net/Benjamin/aggbug/63701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Benjamin/" target="_blank">萧秋水</a> 2006-08-15 16:03 <a href="http://www.blogjava.net/Benjamin/archive/2006/08/15/63701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JSP中执行dos命令</title><link>http://www.blogjava.net/Benjamin/archive/2006/08/15/63698.html</link><dc:creator>萧秋水</dc:creator><author>萧秋水</author><pubDate>Tue, 15 Aug 2006 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/Benjamin/archive/2006/08/15/63698.html</guid><wfw:comment>http://www.blogjava.net/Benjamin/comments/63698.html</wfw:comment><comments>http://www.blogjava.net/Benjamin/archive/2006/08/15/63698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Benjamin/comments/commentRss/63698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Benjamin/services/trackbacks/63698.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<font color="#000000" face="Verdana" size="2">     在JSP中我们经常要调用服务器端的一些dos命令，已达到一些特殊的效果，但同时调用服务器端的dos命令也存在着一些安全隐患，因此需要慎重使用。</font>
				</p>
				<p>
						<font color="#000000" face="Verdana" size="2">    
以下以一个例子来说明用jsp执行dos的过程，比如在服务器端每天都会自动生成一个目录（目录名称为当天的日期），再此目录下会生成一些当天的新闻文
件，管理员会把这些文件几个月作一次备份，备份完后在把这些文件删除。</font>
				</p>
				<p>
						<font color="#000000" face="Verdana" size="2">     如果在服务器上，我们可以在dos下直接执行c:\j2sdk\jar cf d:\bak\200502.jar d:\news\20050101 命令， 然后再把20050101目录删除即可。</font>
				</p>
				<p>
						<font color="#000000" face="Verdana" size="2">     在JSP中我们应当这么来写</font>
				</p>
				<p>
						<font color="#000000" face="Verdana" size="2">&lt;%<br />//执行dos命令<br />String commandstr = "c:/j2sdk/jar cf d:/bak/200502.jar d:/news/20050101";<br />Process p ;<br />try {<br />   p = Runtime.getRuntime().exec(commandstr);<br />//等待刚刚执行的命令的结束   <br />while (true){  <br />           if(p.waitFor() == 0)   break;<br />   }    <br />   <br />} catch (Exception e) {<br />    out.println(e.toString());<br />   }</font>
				</p>
				<p>
						<font color="#000000" face="Verdana" size="2">//删除已经打包的文件及其目录<br />File f = new File("d:/news/20020101");<br />String[] allFiles = f.list();<br />for (int i = 0; i &lt; allFiles.length; i++) {<br />   File delF = new File("d:/news/20050101/"+allFiles[i]);<br />   delF.delete();<br />}<br />File delD = new File("d:/news/20050101");<br />delD.delete();<br />%&gt;</font>
				</p>
				<p>
						<font color="#000000" face="Verdana" size="2">    
在jsp中以下代码必须执行，如果没有该代码，则由于删除文件的速度快于打包的速度，因此当压缩包还没有打包完成，一些文件已经被删除，加入下面的代码，
会在此一直做循环，一直p.waitFor()（这个方法的说明是：等待子进程的结束，如果已经结束，一般返回0）返回0为止才会接着执行后面的代码<br />while (true){  <br />           if(p.waitFor() == 0)   break;<br />   } <br /></font>
				</p>
		</div>
<img src ="http://www.blogjava.net/Benjamin/aggbug/63698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Benjamin/" target="_blank">萧秋水</a> 2006-08-15 16:00 <a href="http://www.blogjava.net/Benjamin/archive/2006/08/15/63698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>