﻿<?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-天蝎无敌-文章分类-JSP学习心得</title><link>http://www.blogjava.net/javasunnyboy/category/6075.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 02:05:42 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 02:05:42 GMT</pubDate><ttl>60</ttl><item><title>TinyMCE</title><link>http://www.blogjava.net/javasunnyboy/articles/73024.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Sat, 30 Sep 2006 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/73024.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/73024.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/73024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/73024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/73024.html</trackback:ping><description><![CDATA[
		<div class="EntryContent">TinyMCE，见 <a href="http://tinymce.moxiecode.com/index.php">http://tinymce.moxiecode.com/index.php</a><p>感觉比FCKEditor要好一些。可以考虑使用这个东西来做些事情。 :D<br />但下载后发现，TinyMCE并不支持上传图片及管理。不如FCKEditor。</p></div>
<img src ="http://www.blogjava.net/javasunnyboy/aggbug/73024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-09-30 14:29 <a href="http://www.blogjava.net/javasunnyboy/articles/73024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 下的树型菜单</title><link>http://www.blogjava.net/javasunnyboy/articles/50397.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Sun, 04 Jun 2006 23:13:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/50397.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/50397.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/50397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/50397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/50397.html</trackback:ping><description><![CDATA[
		<p>/******************************************************************************<br /> * 标题：在struts里的实现dtree通用树型结构<br /> * 作者：蔡毅（caiyi0903@hotmail.com）<br /> * 时间：2004年12月27日<br /> * 备注：转贴请保留这段，谢谢！<br /> *****************************************************************************/<br /><br />在这里简单介绍一下该树型结构的做法：<br />1 下载dtree.js文件和dree.css样式表文件以及一些树相关的图片。这里提供附件给大家下载<br /><br />2 我们看看树的主要字段：<br /><br />ID：主键<br />PID：父类ID<br />NAME：结点名称<br />URL：结点连接的URL<br />TITLE：类似ALT的一种结点显示内容<br />TARGET：连接打开的目标<br />ICON：图片文件，没有指定将使用默认的图片<br />ICONOPEN：打开结点后的图片文件，没有指定将使用默认的图片<br />OPEN：boolean类型，结点是否打开。<br />上面是用来显示的每个字段的含义，大家应该能看出其通用性了。<br /><br />3 下面来看看树的组成文件：<br /><br />&lt;div class="dtree"&gt;<br /><b>&lt;%--接收从Action里传过来的集合，这个集合是封装了上面的一些属性--%&gt;</b><br />&lt;logic:present name="treeCol"&gt;<br />&lt;script type="text/javascript"&gt;<br />  d = new dTree('d');<br />&lt;logic:iterate id="treeList" name="treeCol"&gt;<br /><b>&lt;%--配合struts标签来添加树的结点--%&gt;</b><br />        d.add(&lt;bean:write name="treeList" property="id"/&gt;,&lt;bean:write name="treeList" property="superId"/&gt;,'&lt;bean:write name="treeList" property="name"/&gt;','http://www.urlHere.com','','mainFrame','','');<br />&lt;/logic:iterate&gt;<br /><b>&lt;%--在页面生成树结构--%&gt;</b><br />  document.write(d);<br />&lt;/logic:present&gt;<br />&lt;/script&gt;<br />&lt;/div&gt;<br />&lt;%----%&gt;<br /><br />只需要在action里组装需要显示的结点集合，配合迭代标签和即可实现动态树的生成了。。<br />另外，调用d.openAll();可以打开所有结点。<br />调用d.closeAll();可以关闭所有结点。<br />调用d.openTo(id);可以打开指定ID的结点</p>
		<p>大家有什么疑问可以在评论中说明！！</p>
<img src ="http://www.blogjava.net/javasunnyboy/aggbug/50397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-06-05 07:13 <a href="http://www.blogjava.net/javasunnyboy/articles/50397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 5.0环境下上传的.xls，.rar文件在下载时直接以浏览器打开乱码的问题解决</title><link>http://www.blogjava.net/javasunnyboy/articles/50092.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Sat, 03 Jun 2006 00:43:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/50092.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/50092.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/50092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/50092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/50092.html</trackback:ping><description><![CDATA[在$Tomcat 5.0_HOME/conf/web.xml文件中　添加以下代码<br /><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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mime</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">extension</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">xls</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">extension</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mime</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">application</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">xls</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">mime</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">mime</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span></div><img src ="http://www.blogjava.net/javasunnyboy/aggbug/50092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-06-03 08:43 <a href="http://www.blogjava.net/javasunnyboy/articles/50092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>昨天查资料时看到了一篇好文章，对我的项目很有帮助</title><link>http://www.blogjava.net/javasunnyboy/articles/47565.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Mon, 22 May 2006 22:40:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/47565.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/47565.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/47565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/47565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/47565.html</trackback:ping><description><![CDATA[
		<table class="fixedTable blogpost" cellspacing="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!B8728BDC64B4FCA8!261">以下引用自<a href="http://spaces.msn.com/windlee/blog/cns!b8728bdc64b4fca8!231/wind_lee'">http://spaces.msn.com/windlee/blog/cns!b8728bdc64b4fca8!231/wind_lee'</a>初燃之炎.伏翼之风的Blog<br /><br />用WEB端做SOCKET服务器(如Resin)</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
								</td>
						</tr>
						<tr>
								<td id="msgcns!B8728BDC64B4FCA8!261">
										<div>
												<font color="#0080ff">很久没上来留言了，这一阵子平时也是偶尔想起这里，这次心血来潮想留点什么，也希望高手提供一些更先进的编程思想。这次就谈SOCKET，这里这方面的介绍还是比较多的，大多都是C/S结构的为服务端，但是结合其它的应用上就差些，必须单独启动服务，如果扩展到B/S结构就有很多优势(其实也是个人感觉)...... <br /><br />我就把一些简单结构提出来，供大家参考和指教: <br /><br />结构：</font>
										</div>
										<div>
												<font color="#0080ff">Message.java 消息类，用来组装通讯消息 <br /><br />MessageServlet.java 用servlet调用下类，为了和Resin等同时启动 <br />MessageServer.java 启动封装类，指定监听端口 <br /><br />ServerListener.java 服务端管理类，起分发、处理等用途 <br />ClientListener.java 每个客户端的监听线程 <br />MessageListener.java 每条消息的线程，处理完则关闭 </font>
										</div>
										<div>
												<font color="#0080ff">至于Message.java，我就不把我的文件全拷来，用个最简单的代替吧，大家也可以提供自己的想法，我自己的那个针对性太强，适用性太低，就参考下类吧(字符串处理比较直观，用byte比较稳定): <br />package net.fool; <br /><br />import java.io.Serializable; <br />public class Message implements Serializable{ <br />//信息类型 <br />//private MessageType type = MessageType.HALFBAKED; //大家各抒己见吧 <br />//信息内容 <br />private String content = ""; <br />//构造函数 <br />public Message(String mess){ <br />this.content = mess; <br />} <br />public String toString(){ <br />return this.content; <br />} <br />} </font>
										</div>
										<div>
												<font color="#0080ff">至于MessageServlet.java <br />只是一个在init方法里启动服务，在destroy中关闭服务而已 <br />比如对resin来说只要在某一个配置应用的web.xml添加 <br />&lt;servlet&gt; <br />&lt;servlet-name&gt;mss&lt;/servlet-name&gt; <br />&lt;servlet-class&gt;net.fool.MessageServlet&lt;/servlet-class&gt; <br />&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />&lt;/servlet&gt; <br />这一段文字，就可以在resin启动时启动该socket服务了 <br /><br />package net.fool; <br /><br />import javax.servlet.*; <br />import javax.servlet.http.*; <br /><br />public class MessageServlet extends HttpServlet{ <br />public void doGet(HttpServletRequest req, <br />HttpServletResponse resp) <br />throws ServletException, java.io.IOException{ <br />} <br />public void doPost(HttpServletRequest req, <br />HttpServletResponse resp) <br />throws ServletException, java.io.IOException{ <br />} <br /><br />/** <br />* &lt;p&gt;初始化servlet. <br />* <br />* @param cfg Servlet configuration information <br />*/ <br />public void init(ServletConfig cfg) <br />throws ServletException{ <br />super.init(cfg); <br />MessageServer mb = MessageServer.Connect(5678); <br />} <br /><br />/** <br />* &lt;p&gt;清除servlet. <br />*/ <br />public void destroy(){ <br />super.destroy(); <br />MessageServer.DisConnect(); <br />} <br />} <br />至于MessageServer.java, <br />则是创建一个ServerSocket,并启动监听线程，然后客户端连接上就可以做后面的事情了 <br /><br />package net.fool; <br /><br />import java.util.*; <br />import java.io.*; <br />import java.net.*; <br />import java.nio.*; <br /><br />public class MessageServer{ <br />private static int messagePort = 5678; <br /><br />private static MessageServer mess; <br />private static ServerSocket server; <br />private static ServerListener serverListener; <br /><br />private MessageServer(){ <br />try{ <br />server = new ServerSocket(messagePort); <br />System.out.println("MessageServer listening to *:"+String.valueOf(messagePort)+""); <br />serverListener = new ServerListener(server); <br />serverListener.start(); <br />}catch(Exception e){ <br />e.printStackTrace(); <br />} <br />} <br /><br />public synchronized static MessageServer Connect(int port){ <br />MessageServer.messagePort = port; <br />if (mess == null) { <br />mess = new MessageServer(); <br />}else if(server.getLocalPort()!=port){ <br />DisConnect(); <br />mess = new MessageServer(); <br />} <br />return mess; <br />} <br /><br />public synchronized static MessageServer Connect(){ <br />return Connect(messagePort); <br />} <br /><br />public synchronized static void DisConnect(){ <br />try{ <br />mess = null; <br />System.out.println("close MessageServer for port:"+String.valueOf(server.getLocalPort())+""); <br />serverListener = null; <br />server.close(); <br />}catch(Exception e){} <br />} <br />} <br />ServerListener.java, <br />则是一个监听线程，也是一个主服务线程 <br /><br />package net.fool; <br /><br />import java.util.*; <br />import java.io.*; <br />import java.net.*; <br /><br />public class ServerListener extends Thread{ <br />private ServerSocket serverSocket; <br /><br />private static Hashtable clients = new Hashtable(); <br />//对应每个客户端的登陆信息 <br />private static Hashtable messages = new Hashtable(); <br />//未处理消息集合 <br /><br />private static Socket clientSocket; //多客户端 <br /><br />public ServerListener(ServerSocket serverSocket) throws Exception{ <br />super("ServerListener"); <br />this.serverSocket=serverSocket; <br />} <br /><br />public void run(){ <br />try{ <br />while(true){ <br />clientSocket=serverSocket.accept(); <br /><br />Response(clientSocket); <br />}//while <br />}catch(Exception e){System.out.println(e);} <br />}//run <br /><br />public static void Response(Socket client) throws Exception{ <br />try{ <br />ClientListener clistener = new ClientListener(client,clients); <br />clistener.start(); <br />}catch(Exception e){ <br />System.out.println("连接到" +client.getInetAddress().getHostAddress()+"失败!"); <br />} <br />} <br /><br />//添加消息，可从B/S结构中传入需发布的消息 <br />public static boolean addMessage(Message mess) throws Exception{ <br />boolean flag = false; <br />synchronized(messages){ <br />try{ <br />messages.put(mess,"newMessage"); //待扩充 <br /><br />MessageListener mlistener = new MessageListener(mess,messages); <br />mlistener.start(); <br />}catch(Exception e){ <br />System.out.println("发布消息" +mess.toString()+"失败!"); <br />return flag; <br />} <br />} <br /><br />flag = true; <br />return flag; <br />} <br /><br />//根据消息类型处理消息 消息分发 <br />//这里只是发送到所有客户端 <br />public synchronized static boolean releaseMessage(Message mess) throws Exception{ <br />Enumeration enumeration = clients.keys(); <br />for(;enumeration.hasMoreElements();){ <br />try{ <br />Socket soc = (Socket)enumeration.nextElement(); <br />DataOutputStream dos = new DataOutputStream(soc.getOutputStream()); <br />dos.write(mess.toString().getBytes("GBK")); <br />}catch(Exception e){} <br />} <br />return true; <br />} <br />}//class <br />ClientListener.java, <br />则是每一个客户端监听线程，得到客户端发送的消息,整理起来,把相关消息丢给主服务分发消息 <br /><br />package net.fool; <br /><br />import java.util.*; <br />import java.io.*; <br />import java.net.*; <br /><br />public class ClientListener extends Thread{ <br />private static Hashtable clients; <br />private Message userMessage; <br />private Socket socket; <br /><br />private BufferedReader reader; <br />private boolean listening = true; <br /><br />public ClientListener(Socket socket,Hashtable clients) throws Exception{ <br />super("ClientListener"); <br />this.clients=clients; <br />this.socket=socket; <br /><br />this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); <br />} <br /><br />public void run(){ <br />try { <br />listener(); <br />}catch(Exception e) { <br />e.printStackTrace(); <br />}finally{ <br />synchronized(clients){ <br />//String ss_c = ("断开连接:"+socket); <br />clients.remove(socket); <br />try{ <br />socket.close(); <br />reader.close(); <br />//ServerListener.releaseMessage(某人下线消息); <br />}catch(Exception ex){} <br />//System.out.println(ss_c); <br />} <br />} <br />} <br /><br />private void listener() throws Exception{ <br />synchronized(clients){ <br />clients.put(socket,userMessage); <br />} //扩展后应放在下面的循环内,当为某人的上线消息时才执行这个 <br /><br />while(listening) { <br /><br />//读取客户端发送来的消息 <br />String rLine = reader.readLine(); <br />if(rLine==null||rLine.equals("\r\n")) break;; <br />Message me = new Message(rLine); <br /><br />//当为某人的上线消息时 synchronized...... <br /><br />ServerListener.addMessage(me); <br />} <br />} <br />}//class <br />MessageListener.java, <br />则是每一条消息监听线程，只是让消息堆积起来慢慢处理 <br /><br />package net.fool; <br /><br />import java.util.*; <br />import java.io.*; <br />import java.net.*; <br /><br />public class MessageListener extends Thread{ <br />private static Hashtable messages; <br />private Message message; <br />private boolean listening = true; <br /><br />public MessageListener(Message message,Hashtable messages) throws Exception{ <br />super("MessageListener"); <br />this.messages=messages; <br />this.message=message; <br />} <br /><br />public void run(){ <br />try { <br />listener(); <br />}catch(Exception e) { <br />e.printStackTrace(); <br />}finally{ <br />synchronized(messages){ <br />messages.remove(message); <br />try{ <br />message = null; <br />}catch(Exception ex){} <br />} <br />} <br />} <br /><br />private void listener() throws Exception{ <br />while(listening){ <br /><br />//本条消息的处理 <br />//包括即时和等待，存储和丢失，个人和群发等等判断，待扩充Message类 <br />try{ <br />listening = !ServerListener.releaseMessage(message); <br />}catch(Exception e){e.printStackTrace();} <br />} <br />} <br /><br />}//class </font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/javasunnyboy/aggbug/47565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-05-23 06:40 <a href="http://www.blogjava.net/javasunnyboy/articles/47565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts中应尽量避免使用session.setAttribute()</title><link>http://www.blogjava.net/javasunnyboy/articles/40545.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Tue, 11 Apr 2006 23:07:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/40545.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/40545.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/40545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/40545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/40545.html</trackback:ping><description><![CDATA[Struts项目中如果要从action向jsp页面传递数据，并且该数据只在一个jsp页面中，应当使用request.setAttribute()，而尽量不使用session.setAttribute()方法。<br />原因：session会占服务器端的内存，并且如果管理不当，会造成不同jsp页面的数据干扰。<img src ="http://www.blogjava.net/javasunnyboy/aggbug/40545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-04-12 07:07 <a href="http://www.blogjava.net/javasunnyboy/articles/40545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提升JSP应用程序的七个方法</title><link>http://www.blogjava.net/javasunnyboy/articles/40427.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Tue, 11 Apr 2006 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/40427.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/40427.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/40427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/40427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/40427.html</trackback:ping><description><![CDATA[
		<span class="checkoutHeader">
				<strong>本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能，并因此提升整个J2EE应用的性能。</strong>
		</span>
		<div class="content">
				<p>    你时常被客户抱怨JSP页面响应速度很慢吗？你想过当客户访问次数剧增时，你的WEB应用能承受日益增加的访问量吗？本文讲述了调整JSP和servlet的一些非常实用的方法，它可使你的servlet和JSP页面响应更快，扩展性更强。而且在用户数增加的情况下，系统负载会呈现出平滑上长的趋势。在本文中，我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升。 <br />　　其中，某些调优技术是在你的编程工作中实现的。而另一些技术是与应用服务器的配置相关的。在本文中，我们将详细地描述怎样通过调整servlet和JSP页面，来提高你的应用程序的总体性能。在阅读本文之前，假设你有基本的servlet和JSP的知识。 </p>
				<p>　　方法一：在servlet的init()方法中缓存数据 </p>
				<p>　　当应用服务器初始化servlet实例之后，为客户端请求提供服务之前，它会调用这个servlet的init()方法。在一个servlet的生命周期中，init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作，就可大大地提高系统性能。 </p>
				<p>　　例如，通过在init()方法中建立一个JDBC连接池是一个最佳例子，假设我们是用jdbc2.0的DataSource接口来取得数据库连接，在通常的情况下，我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中，如果每次SQL请求都要执行一次JNDI查询的话，那系统性能将会急剧下降。解决方法是如下代码，它通过缓存DataSource，使得下一次SQL调用时仍然可以继续利用它： </p>
				<p>public class ControllerServlet extends HttpServlet <br />{ <br />　private javax.sql.DataSource testDS = null; <br />　public void init(ServletConfig config) throws ServletException <br />　{ <br />　　super.init(config); <br />　　Context ctx = null; <br />　　try <br />　　{ <br />　　　ctx = new InitialContext(); <br />　　　testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS"); <br />　　} <br />　　catch(NamingException ne) <br />　　{ <br />　　　ne.printStackTrace(); <br />　　} <br />　　catch(Exception e) <br />　　{ <br />　　　e.printStackTrace(); <br />　　} <br />　} </p>
				<p>　public javax.sql.DataSource getTestDS() <br />　{ <br />　　return testDS; <br />　} <br />　... <br />　... <br />} </p>
				<p>　　方法 2:禁止servlet和JSP 自动重载(auto-reloading) </p>
				<p>　　Servlet/JSP提供了一个实用的技术，即自动重载技术，它为开发人员提供了一个好的开发环境，当你改变servlet和JSP页面后而不必重启应用服务器。然而，这种技术在产品运行阶段对系统的资源是一个极大的损耗，因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。 </p>
				<p>　　方法 3: 不要滥用HttpSession </p>
				<p>　　在很多应用中，我们的程序需要保持客户端的状态，以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性，从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中，是通过HttpSession对像来实现session的功能的，但在方便的同时，它也给系统带来了不小的负担。因为每当你获得或更新session时，系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能。 </p>
				<p>　　如果没有必要，就应该关闭JSP页面中对HttpSession的缺省设置。 如果你没有明确指定的话，每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话，那可以通过如下的JSP页面指示符来禁止它： </p>
				<p>＜%@ page session="false"%＞ </p>
				<p>
						<br />　　不要在HttpSession中存放大的数据对像：如果你在HttpSession中存放大的数据对像的话，每当对它进行读写时，应用服务器都将对其进行序列化，从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大，那系统的性能就下降得越快。 </p>
				<p>　　当你不需要HttpSession时，尽快地释放它：当你不再需要session时，你可以通过调用HttpSession.invalidate()方法来释放它。尽量将session的超时时间设得短一点：在JSP应用服务器中，有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话，系统会将相关的session自动从内存中释放。超时时间设得越大，系统的性能就会越低，因此最好的方法就是尽量使得它的值保持在一个较低的水平。 </p>
				<p>　　方法 4: 将页面输出进行压缩 </p>
				<p>　　压缩是解决数据冗余的一个好的方法，特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩，这种方法可以戏剧性地减少HTML文件的下载时间。因此，如果你将servlet或JSP页面生成的HTML页面进行压缩的话，那用户就会觉得页面浏览速度会非常快。但不幸的是，不是所有的浏览器都支持gzip压缩，但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段： </p>
				<p>public void doGet(HttpServletRequest request, <br />HttpServletResponse response) <br />throws IOException, ServletException <br />{ <br />　OutputStream out = null <br />　String encoding = request.getHeader("Accept-Encoding"); <br />　if (encoding != null &amp;&amp; encoding.indexOf("gzip") != -1) <br />　{ <br />　　request.setHeader("Content-Encoding" , "gzip"); <br />　　out = new GZIPOutputStream(request.getOutputStream()); <br />　} <br />　else if (encoding != null &amp;&amp; encoding.indexOf("compress") != -1) <br />　{ <br />　　request.setHeader("Content-Encoding" , "compress"); <br />　　out = new ZIPOutputStream(request.getOutputStream()); <br />　} <br />　else <br />　{ <br />　　out = request.getOutputStream(); <br />　} <br />　... <br />　... <br />} </p>
				<p>　　方法 5: 使用线程池 </p>
				<p>　　应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理，并为它们分派service()方法，当service()方法调用完成后，与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源，这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。 </p>
				<p>　　另外，我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时，它会创建数量等于最小线程数的一个线程池，当客户有请求时，相应地从池从取出一个线程来进行处理，当处理完成后，再将线程重新放入到池中。如果池中的线程不够地话，系统会自动地增加池中线程的数量，但总量不能超过最大线程数。通过使用线程池，当客户端请求急剧增加时，系统的负载就会呈现的平滑的上升曲线，从而提高的系统的可伸缩性。</p>
				<p>　　方法 6: 选择正确的页面包含机制 </p>
				<p>　　在JSP中有两种方法可以用来包含另一个页面： </p>
				<p>1、使用include指示符 </p>
				<p>＜%@ includee file=”test.jsp” %＞ </p>
				<p>
						<br />2、使用jsp指示符 </p>
				<p>＜jsp:includee page=”test.jsp” flush=”true”/＞ </p>
				<p>
						<br />　　在实际中发现，如果使用第一种方法的话，可以使得系统性能更高。 </p>
				<p>　　方法 7:正确地确定javabean的生命周期 </p>
				<p>　　JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用＜jsp:useBean＞标签，可以将javabean直接插入到一个JSP页面中。它的使用方法如下： </p>
				<p>＜jsp:useBean id="name" scope="page|request|session|application" class= <br />"package.className" type="typeName"＞ <br />＜/jsp:useBean＞ </p>
				<p>
						<br />　　其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话，它将影响系统的性能。 </p>
				<p>　　举例来说，如果你只想在一次请求中使用某个bean，但你却将这个bean的生命周期设置成了session，那当这次请求结束后，这个bean将仍然保留在内存中，除非session超时或用户关闭浏览器。这样会耗费一定的内存，并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期，并在bean的使命结束后尽快地清理它们，会使用系统性能有一个提高。 </p>
				<p>　　其它一些有用的方法 </p>
				<p>　　1、在字符串连接操作中尽量不使用“＋”操作符：在java编程中，我们常常使用“＋”操作符来将几个字符串连接起来，但你或许从来没有想到过它居然会对系统性能造成影响吧？由于字符串是常量，因此JVM会产生一些临时的对像。你使用的“＋”越多，生成的临时对像就越多，这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“＋”操作符。 </p>
				<p>　　2、避免使用System.out.println()方法：由于System.out.println()是一种同步调用，即在调用它时，磁盘I/O操作必须等待它的完成，因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具，为了解决这个矛盾，我建议你最好使用Log4j工具(http://Jakarta.apache.org )，它既可以方便调试，而不会产生System.out.println()这样的方法。 </p>
				<p>　　3、ServletOutputStream 与 PrintWriter的权衡：使用PrintWriter可能会带来一些小的开销，因为它将所有的原始输出都转换为字符流来输出，因此如果使用它来作为页面输出的话，系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题，但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。 </p>
				<p>　　总结 </p>
				<p>　　本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能，并因此提升整个J2EE应用的性能。通过这些调优技术，你可以发现其实并不是某种技术平台（比如J2EE和.NET之争）决定了你的应用程序的性能，重要是你要对这种平台有一个较为深入的了解，这样你才能从根本上对自己的应用程序做一个优化。</p>
				<p>
				</p>
		</div>
<img src ="http://www.blogjava.net/javasunnyboy/aggbug/40427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-04-11 12:14 <a href="http://www.blogjava.net/javasunnyboy/articles/40427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java获取路径几种途径</title><link>http://www.blogjava.net/javasunnyboy/articles/30235.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Fri, 10 Feb 2006 15:25:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/30235.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/30235.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/30235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/30235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/30235.html</trackback:ping><description><![CDATA[<DIV>在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上</DIV>
<DIV>&nbsp;</DIV>
<DIV>1.可以在servlet的init方法里</DIV>
<DIV>String path = getServletContext().getRealPath("/");</DIV>
<DIV>这将获取web项目的全路径</DIV>
<DIV>例如 :E:\eclipseM9\workspace\tree\</DIV>
<DIV>tree是我web项目的根目录</DIV>
<DIV>&nbsp;</DIV>
<DIV>2.你也可以随时在任意的class里调用</DIV>
<DIV>this.getClass().getClassLoader().getResource("/").getPath();</DIV>
<DIV>这将获取 到classes目录的全路径</DIV>
<DIV>例如 : E:\eclipseM9/workspace/tree/WEB-INF/classes/</DIV>
<DIV>&nbsp;</DIV>
<DIV>这个方法也可以不在web环境里确定路径,比较好用</DIV>
<DIV>&nbsp;</DIV>
<DIV>3.request.getContextPath();</DIV>
<DIV>获得web根的上下文环境</DIV>
<DIV>如 /tree</DIV>
<DIV>tree是我的web项目的root context</DIV><img src ="http://www.blogjava.net/javasunnyboy/aggbug/30235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2006-02-10 23:25 <a href="http://www.blogjava.net/javasunnyboy/articles/30235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用bean:write时输出的结果是HTML源代码而不是HTML效果</title><link>http://www.blogjava.net/javasunnyboy/articles/24867.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Tue, 20 Dec 2005 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/24867.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/24867.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/24867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/24867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/24867.html</trackback:ping><description><![CDATA[输出的结果页面显示出html 源代码而不是 显示html 的排版后的效果原因: <BR>在bean:write中输出时的filter 设置错误<BR>解决办法: <BR>在bean:write中输出时的filter 设置应为false<BR>例如:<BR>&lt;bean:write name="news" property="contentBody" filter="false" /&gt;<BR>如果设置为<BR>&lt;bean:write name="news" property="contentBody" filter="true" /&gt;<BR>那么就会把contentBody 的html代码转化<BR>比如如果contentBody中含有&lt;p&gt; 结果就会变成为&amp;lt;p&amp;gt<BR><img src ="http://www.blogjava.net/javasunnyboy/aggbug/24867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2005-12-20 21:09 <a href="http://www.blogjava.net/javasunnyboy/articles/24867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JSP中文问题的一点心得。</title><link>http://www.blogjava.net/javasunnyboy/articles/24318.html</link><dc:creator>大狗刀刀</dc:creator><author>大狗刀刀</author><pubDate>Fri, 16 Dec 2005 23:47:00 GMT</pubDate><guid>http://www.blogjava.net/javasunnyboy/articles/24318.html</guid><wfw:comment>http://www.blogjava.net/javasunnyboy/comments/24318.html</wfw:comment><comments>http://www.blogjava.net/javasunnyboy/articles/24318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javasunnyboy/comments/commentRss/24318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javasunnyboy/services/trackbacks/24318.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原来一编程时一直使用GBK作为默认编码，也很少出现中文问题。但最近在使用Eclipse进行编程，将默认的编码方式变成了UTF－8。这一改变也产生了新的问题。当表单使用Post方式提交时，可以使用String myParam=new String(request.getParameter("myParam").getBytes("ISO-8859-1"),"UTF-8");的语句来读取。但当表单使用Get方式提交时，比如："myUrl.jsp?myParam=中文"这样的方式如果myParam处的中文数为单数时比如“中国人”，使用上面的方法读出的最后一个字为乱码。这个问题困扰了我一天，今天早晨终于在网上找到了解决办法。<BR>　　在提交之前可以使用java.net.URLEncoder.encode();方法先将中文转换成UTF－8格式，就可以解决了。例如：myUrl.jsp?myParam=&lt;%java.net.URLEncoder.encode(myVar,"UTF-8")%&gt;</P><img src ="http://www.blogjava.net/javasunnyboy/aggbug/24318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javasunnyboy/" target="_blank">大狗刀刀</a> 2005-12-17 07:47 <a href="http://www.blogjava.net/javasunnyboy/articles/24318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>