﻿<?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-执着的笨蛋-随笔分类-j2ee</title><link>http://www.blogjava.net/lcs/category/26135.html</link><description>黑暗的SH！灰暗的人生！</description><language>zh-cn</language><lastBuildDate>Fri, 25 Apr 2008 04:47:01 GMT</lastBuildDate><pubDate>Fri, 25 Apr 2008 04:47:01 GMT</pubDate><ttl>60</ttl><item><title>jsp显示word、excel</title><link>http://www.blogjava.net/lcs/archive/2008/04/23/194980.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 23 Apr 2008 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/23/194980.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/194980.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/23/194980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/194980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/194980.html</trackback:ping><description><![CDATA[也许会有用！<br />
<br />
word页面只要在jsp头设置如下指令：<br />
&lt;%@page contentType="application/msword;charset=GBK" %&gt;<br />
<br />
excel如下：<br />
&lt;%@page contentType="application/vnd.ms-excel;charset=GBK" %&gt;<br />
<img src ="http://www.blogjava.net/lcs/aggbug/194980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-23 11:32 <a href="http://www.blogjava.net/lcs/archive/2008/04/23/194980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>农历日期</title><link>http://www.blogjava.net/lcs/archive/2008/02/19/180669.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 19 Feb 2008 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/02/19/180669.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/180669.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/02/19/180669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/180669.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/180669.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文件名 year.jsp&lt;%@&nbsp;page&nbsp;contentType="text/html;charset=gb2312"&nbsp;language="java"&nbsp;import="java.sql.*"&nbsp;%&gt;&nbsp;&lt;%@&nbsp;page&nbsp;import="java.util.*,java.io.*,java.text...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2008/02/19/180669.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/180669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-02-19 14:28 <a href="http://www.blogjava.net/lcs/archive/2008/02/19/180669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache+tomcat访问servlet！</title><link>http://www.blogjava.net/lcs/archive/2007/12/03/164907.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 03 Dec 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/12/03/164907.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/164907.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/12/03/164907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/164907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/164907.html</trackback:ping><description><![CDATA[<pre>赶鸭子上架，非要查这种东西！</pre>
<pre>问题：servlet在不写端口号时 访问不到（404），写端口号就可以访问</pre>
<pre>解决办法：</pre>
<pre>将  http.conf文件中  </pre>
<pre>JkMount /servlet/* ajp13 </pre>
<pre>改为</pre>
<pre>   JkMount /* ajp13</pre>
<pre>&nbsp;</pre>
<pre>就这么简单！
</pre>
<pre>http://book.77169.org/ask25/how173515.htm</pre>
<img src ="http://www.blogjava.net/lcs/aggbug/164907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-12-03 16:36 <a href="http://www.blogjava.net/lcs/archive/2007/12/03/164907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html乱码问题（原）</title><link>http://www.blogjava.net/lcs/archive/2007/11/28/163623.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 28 Nov 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/28/163623.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/163623.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/28/163623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/163623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/163623.html</trackback:ping><description><![CDATA[今天偶然发现的，原来&lt;input type="hidden" /&gt;和&lt;input type="text" /&gt;在页面传值（中文）时是不一样的。<br />
<br />
&lt;input type="text" /&gt;在页面传中文时需要处理否则可能会出现乱码，而&lt;input type="hidden" /&gt;不用作中文处理！<br />
<br />
真是奇妙！！！！！<br />
<br />
另附：jsp 中文乱码处理代码一段。<br />
<br />
String str =&nbsp; new String(request.getParameter("name").getBytes("ISO-8859-1"));<br />
<br />
<br />
<img src ="http://www.blogjava.net/lcs/aggbug/163623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-28 09:58 <a href="http://www.blogjava.net/lcs/archive/2007/11/28/163623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 Java 的 Properties 类读取配置文件信息（转）</title><link>http://www.blogjava.net/lcs/archive/2007/11/12/159956.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 12 Nov 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/12/159956.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/159956.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/12/159956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/159956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/159956.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 利用 Java 的 Properties 类读取配置文件信息 &nbsp; 在我们平时写程序的时候，有些参数是经常改变的，而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块，在开发的时候我们连接本地的数据库那么 IP ，数据库名称，表名称，数据库主机等信息是我们本地的，要使得这个操作数据的模块具有通用性，那么以上信息就不能写死在程序里。通常我们的做法是用配置文件来解决。 &...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2007/11/12/159956.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/159956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-12 14:07 <a href="http://www.blogjava.net/lcs/archive/2007/11/12/159956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP动态输出Excel及中文乱码的解决 </title><link>http://www.blogjava.net/lcs/archive/2007/10/26/156011.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 26 Oct 2007 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/10/26/156011.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/156011.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/10/26/156011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/156011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/156011.html</trackback:ping><description><![CDATA[<p>[正文] 1 页</p>
<p><br />
　　最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。</p>
<p>　　首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中。</p>
<p>&nbsp;</p>
<p>　　写一个javaBean,利用JExcelApi来动态生成excel文档，我这里写一个最简单的，示意性的。复杂的你可能还要查询数据库什么的。</p>
<p>///////////////////////////Test.java///////////////////////////////////////////<br />
package com.jagie.test;<br />
import java.io.*;<br />
import jxl.*;<br />
import jxl.write.*;<br />
import jxl.format.*;<br />
import java.util.*;<br />
import java.awt.Color;</p>
<p>public class Test{<br />
　public static void writeExcel(OutputStream os) throws Exception {<br />
　　jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);<br />
　　jxl.write.WritableSheet ws = wwb.createSheet("TestSheet1", 0);<br />
　　jxl.write.Label labelC = new jxl.write.Label(0, 0, "我爱中国");<br />
　　ws.addCell(labelC);<br />
　　jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20, WritableFont.BOLD, false,<br />
　　UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);<br />
　　jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);<br />
　　wcfFC.setBackground(jxl.format.Colour.RED);<br />
　　labelC = new jxl.write.Label(6, 0, "中国爱我",wcfFC);<br />
　　ws.addCell(labelC);<br />
　　//写入Exel工作表<br />
　　wwb.write();<br />
　　//关闭Excel工作薄对象<br />
　　wwb.close();<br />
　}</p>
<p>　//最好写一个这样的main方法来测试一下你的这个class是否写好了。<br />
　public static void main(String[] args)throws Exception{<br />
　　File f=new File("kk.xls");<br />
　　f.createNewFile();<br />
　　writeExcel(new FileOutputStream(f));<br />
　}<br />
} </p>
<p>　　写一个jsp,来利用Test这个javabean输出excel文档。</p>
<p>///////////////////////////test_excel.jsp//////////////////////////</p>
<p>＜%@page import="com.jagie.test.Test" %＞<br />
＜%<br />
　response.reset();<br />
　response.setContentType("application/vnd.ms-excel");<br />
　Test.writeExcel(response.getOutputStream());<br />
%＞ </p>
<p>　　这样就大功告成了，你用ie访问test_excel.jsp就能在ie里面打开动态生成的excel文档了。一点乱码也没有。<br />
&nbsp;<br />
------------------------------------------------------------<br />
[正文] 2页&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
　　也许有人会问:response.reset();可不可以不要这一句,我的建议是一定要写，除非你能保证response的buffer里面没有别的东西。</p>
<p>　　还有人也许会问:我在jsp开头加上＜%@page contentType="application/vnd.ms-excel;charset=GBK" %＞这一句，去掉response.setContentType("application/vnd.ms-excel");行不行?回答这个问题很简单，就是查看jsp服务器编译jsp后生成的java代码，如果改成这样，我的welogic7编译test_excel.jsp后生成的java文件的示意性代码是这样的:</p>
<p>public void _jspService(javax.servlet.http.HttpServletRequest request, <br />
javax.servlet.http.HttpServletResponse response) throws java.io.IOException, <br />
javax.servlet.ServletException { </p>
<p>　// declare and set well-known variables:<br />
　javax.servlet.ServletConfig config = getServletConfig();<br />
　javax.servlet.ServletContext application = config.getServletContext();<br />
　javax.servlet.jsp.tagext.Tag _activeTag = null;<br />
　// variables for Tag extension protocol</p>
<p>　Object page = this;<br />
　javax.servlet.jsp.JspWriter out;<br />
　javax.servlet.jsp.PageContext pageContext =<br />
　javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, <br />
　request, response, null, true, 8192, true);</p>
<p>　response.setHeader("Content-Type", "application/vnd.ms-excel; charset=GBK");<br />
　out = pageContext.getOut();<br />
　JspWriter _originalOut = out;</p>
<p>　javax.servlet.http.HttpSession session = request.getSession(true);</p>
<p>　try { // error page try block<br />
　　response.setContentType("application/vnd.ms-excel;charset=GBK");<br />
　　out.print("\r\n\r\n\r\n\r\n");<br />
　　out.print("\r\n");<br />
　　//[ /test_excel.jsp; Line: 6]<br />
　　response.reset(); //[ /test_excel.jsp; Line: 7]<br />
　　//response.setContentType("application/vnd.ms-excel"); <br />
　　//[ /test_excel.jsp; Line: 8]<br />
　　Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 9]<br />
　　} catch (Throwable __ee) {<br />
　　　while (out != null &amp;&amp; out != _originalOut) out = pageContext.popBody();<br />
　　((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);<br />
　}</p>
<p>　//before final close brace...<br />
} </p>
<p>　　很明显，屏蔽response.setContentType("application/vnd.ms-excel");后，在Test.writeExcel(response.getOutputStream());之前，response.reset(); 之后没有设置response contenttype的正确类型，当然输出为乱码了。而正确输出excel的jsp的编译后源码是这样的:</p>
<p>public void _jspService(javax.servlet.http.HttpServletRequest request, <br />
javax.servlet.http.HttpServletResponse response) throws java.io.IOException,<br />
javax.servlet.ServletException <br />
{ <br />
　// declare and set well-known variables:<br />
　javax.servlet.ServletConfig config = getServletConfig();<br />
　javax.servlet.ServletContext application = config.getServletContext();<br />
　javax.servlet.jsp.tagext.Tag _activeTag = null;<br />
　// variables for Tag extension protocol</p>
<p>　Object page = this;<br />
　javax.servlet.jsp.JspWriter out;<br />
　javax.servlet.jsp.PageContext pageContext =<br />
　　javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8192, true);</p>
<p>　out = pageContext.getOut();<br />
　JspWriter _originalOut = out;</p>
<p>　javax.servlet.http.HttpSession session = request.getSession(true);</p>
<p>　try { // error page try block<br />
　　out.print("\r\n");<br />
　　//[ /test_excel.jsp; Line: 2]<br />
　　response.reset(); //[ /test_excel.jsp; Line: 3]<br />
　　response.setContentType("application/vnd.ms-excel"); //[ /test_excel.jsp; Line: 4]<br />
　　Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 5]<br />
　} catch (Throwable __ee) {<br />
　　while (out != null &amp;&amp; out != _originalOut) out = pageContext.popBody();<br />
　　((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);<br />
　}</p>
<p>　 //before final close brace...<br />
} </p>
<p>　　大家可以看到在response.reset();之后,Test.writeExcel(response.getOutputStream());之前正确的设置了response的输出内容。所以输出就正常了。</p>
<p>　　最后，希望这篇文章能对你有所启发,如有错误之处，敬请批评指正!</p>
<img src ="http://www.blogjava.net/lcs/aggbug/156011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-10-26 09:19 <a href="http://www.blogjava.net/lcs/archive/2007/10/26/156011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于《Servlet 2.3 过滤器编程》（转）</title><link>http://www.blogjava.net/lcs/archive/2007/09/27/148607.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 27 Sep 2007 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/09/27/148607.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/148607.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/09/27/148607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/148607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/148607.html</trackback:ping><description><![CDATA[偶得<br />
<br />
看了网上一篇译文《Servlet 2.3 过滤器编程》原文 《Filter code with Servlet 2.3 model 》出自http://www.javawold.com/。里面讲了四个例子，有三个意思不大，没有仔细看。 <br />
&nbsp;&nbsp;&nbsp;下面这个过滤器示例跟踪用户请求，向网络管理员报告谁在她的网站上以及每个用户正在访问那个页面。<font face="宋体">测试结果图如下：</font><br />
<br />
<img height="433" alt="" src="http://www.java3z.com/cwbwebhome/article/article1/images/filter1.gif" width="664" />
<div class="entry-more" id="more">
<p>一、web.xml文件<br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;!DOCTYPE web-app<br />
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"&gt;</p>
<p>&lt;web-app&gt;<br />
&lt;!-- CLICKSTREAM LOGGER --&gt;<br />
&lt;filter&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;clickstreamFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;filter-class&gt;com.java3z.examples.ClickstreamFilter&lt;/filter-class&gt;<br />
&lt;/filter&gt; <br />
<br />
&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;clickstreamFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;clickstreamFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;*.html&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>&lt;listener&gt;<br />
&nbsp;&nbsp;&lt;listener-class&gt;com.java3z.examples.ClickstreamLogger&lt;/listener-class&gt;<br />
&lt;/listener&gt; <br />
&lt;!-- END CLICKSTREAM LOGGER --&gt; </p>
<p>&lt;/web-app&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这注册了ClickstreamFilter并设置其处理*.jsp和*.html来的请求。这也将ClickstreamLogger注册为一个监听器以在应用事件发生时接受他们。 </p>
<p>二、既是ServletContextListener又是 HttpSessionListener监听器ClickstreamLogger类</p>
<script type="text/javascript">
			function TempSave(ElementID)
			{
				CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
				CommentsPersistDiv.save("CommentXMLStore");
			}
			function Restore(ElementID)
			{
				CommentsPersistDiv.load("CommentXMLStore");
				document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
			}
		
                  </script><!--ene TempSave--><font face="宋体"></font>
<pre><font face="宋体">package com.java3z.examples;<br />
import java.util.*;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
<br />
public class ClickstreamLogger implements ServletContextListener, HttpSessionListener<br />
{<br />
Map clickstreams = new HashMap();<br />
<br />
public ClickstreamLogger() <br />
{<br />
// System.out.println("ClickstreamLogger constructed");<br />
}<br />
<br />
public void contextInitialized(ServletContextEvent sce)<br />
{<br />
// System.out.println("ServletContext Initialised");<br />
<br />
sce.getServletContext().setAttribute("clickstreams", clickstreams);<br />
}<br />
<br />
public void contextDestroyed(ServletContextEvent sce)<br />
{<br />
sce.getServletContext().setAttribute("clickstreams", null);<br />
// System.out.println("ServletContext Destroyed");<br />
}	<br />
<br />
public void sessionCreated(HttpSessionEvent hse)<br />
{<br />
// System.out.println("Session Created");<br />
HttpSession session = hse.getSession();<br />
<br />
Clickstream clickstream = new Clickstream();<br />
session.setAttribute("clickstream", clickstream);<br />
<br />
clickstreams.put(session.getId(), clickstream);<br />
}<br />
<br />
public void sessionDestroyed(HttpSessionEvent hse)<br />
{<br />
// System.out.println("Session Destroyed");<br />
<br />
HttpSession session = hse.getSession();<br />
<br />
Clickstream stream = (Clickstream)session.getAttribute("clickstream");<br />
<br />
clickstreams.remove(session.getId());<br />
<br />
System.out.println("Final session clickstream:\n" + stream);<br />
}<br />
}<br />
<br />
ClickstreamLogger类在servlet环境创建时设置全局属性getServletContext.setAttribute("clickstreams", clickstreams),一个<br />
Map,在用户访问网站时设置会话属性session.setAttribute("clickstream", clickstream),并将可记录会话数据的对象clickstream <br />
放入Map,以便在JSP页面中输出网站访问者的信息。<br />
<br />
三、过滤器ClickstreamFilter类<br />
<br />
</font></pre>
<pre><font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package com.java3z.examples;</font></pre>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">import java.io.IOException;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">import javax.servlet.*;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">import javax.servlet.http.*;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">&nbsp;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">public class ClickstreamFilter implements Filter {<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>protected FilterConfig filterConfig;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>private final static String FILTER_APPLIED = "_clickstream_filter_applied";<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">&nbsp;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>public void init(FilterConfig config) throws ServletException {<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp; </span>this.filterConfig = filterConfig;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">&nbsp;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>public void doFilter(ServletRequest request, ServletResponse response,<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FilterChain chain) throws IOException, ServletException {<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp; </span>// 确保该过滤器在每次请求中只被使用一次<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp; </span>if (request.getAttribute(FILTER_APPLIED) == null) {<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>request.setAttribute(FILTER_APPLIED, Boolean.TRUE);<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HttpSession session = ((HttpServletRequest)request).getSession();<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Clickstream stream = (Clickstream)session.getAttribute("clickstream");<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>stream.addRequest(((HttpServletRequest)request));<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">&nbsp;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp; </span>// 传递请求<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp;&nbsp;&nbsp; </span>chain.doFilter(request, response);<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">&nbsp;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体"><span>&nbsp; </span>public void destroy() { }<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span lang="EN-US" style="font-family: 宋体">}<O:P></O:P></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: 宋体">&nbsp;<O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 20.25pt"><span lang="EN-US" style="font-family: 宋体">doFilter ()方法取得用户的session，从中获取Clickstream，并将当前请求数据加到Clickstream中。其中使用了一个特殊的 FILTER_APPLIED标记属性来标注此过滤器是否已经被当前请求使用（可能会在请求调度中发生）并且忽略所有其他的过滤器行为。<O:P></O:P></span></p>
<pre><font face="宋体"><br />
<br />
四、保存请求数据的Clickstream类<br />
</font>
<pre><font face="宋体">package com.java3z.examples;<br />
import java.util.*;<br />
import java.io.*;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
<br />
public class Clickstream implements Serializable<br />
{<br />
List clickstream = new ArrayList();<br />
String hostname = null;<br />
HttpSession session = null;<br />
String initialReferrer = null;<br />
Date start = new Date();<br />
Date lastRequest = new Date();<br />
boolean bot = false;//是否是机器人访问<br />
<br />
public Clickstream()<br />
{<br />
}<br />
<br />
public void addRequest(HttpServletRequest request)<br />
{<br />
lastRequest = new Date();<br />
<br />
if (hostname == null) {<br />
hostname = request.getRemoteHost();<br />
session = request.getSession();	<br />
}<br />
<br />
// if this is the first request in the click stream<br />
if (clickstream.size() == 0)<br />
{<br />
// setup initial referrer<br />
if (request.getHeader("REFERER") != null)<br />
{<br />
initialReferrer = request.getHeader("REFERER");<br />
}<br />
else<br />
{<br />
initialReferrer = "";<br />
}<br />
<br />
// decide whether this is a bot<br />
bot = BotChecker.isBot(request, this);<br />
}<br />
<br />
clickstream.add(request.getServerName() + <br />
(request.getServerPort() != 80 ? ":" + request.getServerPort() : "") +<br />
request.getRequestURI() + <br />
(request.getQueryString() != null ? "?" + request.getQueryString() : ""));<br />
<br />
// System.out.println(this.toString());<br />
}<br />
<br />
public String getHostname()<br />
{<br />
return hostname;<br />
}<br />
<br />
public boolean isBot()<br />
{<br />
return bot;<br />
}<br />
<br />
public void setBot(boolean value)<br />
{<br />
this.bot = value;<br />
}<br />
<br />
public HttpSession getSession()<br />
{<br />
return session;<br />
}<br />
<br />
public String getInitialReferrer()<br />
{<br />
return initialReferrer;<br />
}<br />
<br />
public Date getStart()<br />
{<br />
return start;<br />
}<br />
<br />
public Date getLastRequest()<br />
{<br />
return lastRequest;<br />
}<br />
<br />
public List getStream()<br />
{<br />
return clickstream;<br />
}<br />
<br />
public String toString()<br />
{<br />
StringBuffer output = new StringBuffer();<br />
<br />
output.append("Clickstream for: " + hostname + "\n"); <br />
output.append("Session ID: " + (session != null ? session.getId() + "" : "") + "\n"); <br />
output.append("Initial Referrer: " + initialReferrer + "\n");<br />
output.append("Stream started: " + start + "\n");<br />
output.append("Last request: " + lastRequest + "\n");<br />
<br />
long streamLength = lastRequest.getTime() - start.getTime();<br />
<br />
output.append("Stream length:" + <br />
(streamLength &gt; 3600000 ?<br />
" " + (streamLength / 3600000) + " hours" : "") +<br />
(streamLength &gt; 60000 ?<br />
" " + ((streamLength / 60000) % 60) + " minutes" : "") +<br />
(streamLength &gt; 1000 ?<br />
" " + ((streamLength / 1000) % 60) + " seconds" : "") +<br />
"\n");<br />
<br />
Iterator clickstreamIt = clickstream.iterator();<br />
<br />
int count = 0;<br />
while (clickstreamIt.hasNext())<br />
{<br />
count++;<br />
<br />
output.append(count + ": " + clickstreamIt.next() + "\n");<br />
}<br />
<br />
return output.toString();<br />
}<br />
}<br />
</font></pre>
<font face="宋体">五、是机器人吗？<br />
<br />
BotChecker类用来确定客户端是否是一个机器人。<br />
<br />
</font>
<pre><font face="宋体">package com.java3z.examples;<br />
import java.util.*;<br />
import java.io.*;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
<br />
public class BotChecker <br />
{<br />
public static String[] botHosts = {"inktomi.com", "inktomisearch.com", "googlebot.com", "linuxtoday.com.au"};<br />
<br />
public static boolean isBot(HttpServletRequest request, Clickstream stream)<br />
{<br />
String requestURI = request.getRequestURI();<br />
<br />
// if it requested robots.txt, it's a bot<br />
if (requestURI.indexOf("robots.txt") &gt;= 0)<br />
{<br />
return true;<br />
}<br />
<br />
// it requested a RSS feed from our backend, it's a bot<br />
if (requestURI.indexOf("/backend/") &gt;= 0)<br />
{<br />
return true;<br />
}<br />
<br />
for (int i = 0; i &lt; botHosts.length; i++)<br />
{<br />
if (request.getRemoteHost().indexOf(botHosts[i]) &gt;= 0)<br />
{<br />
return true;<br />
}<br />
}<br />
<br />
return false;<br />
}<br />
}<br />
<br />
六、测试：请下载测试这个WEB应用的所有文件。</font></pre>
</pre>
</div>
<img src ="http://www.blogjava.net/lcs/aggbug/148607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-09-27 11:35 <a href="http://www.blogjava.net/lcs/archive/2007/09/27/148607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Servelet API入门基础教程 (转)</title><link>http://www.blogjava.net/lcs/archive/2007/09/27/148600.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 27 Sep 2007 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/09/27/148600.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/148600.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/09/27/148600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/148600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/148600.html</trackback:ping><description><![CDATA[<p>&nbsp;在Servlet之前Java服务器端编程使用C或Perl编写复杂的CGI来实现来完成，Java Servlet API的出现极大地简化了Java在服务器端编程的复杂性同时能最大限度地发挥Java的的整体优势。<br />
　　在这个专题中我们由浅入深地向大家介绍Java Servlet的基本特征、开发环境的配置以及Servlet的一些主要API类。</p>
<p style="text-indent: 2em">Servlet是一种独立于平台和协议的服务器端的Java应用程序，可以生成动态的Web页面</p>
<p style="text-indent: 2em"><strong>一、概述</p>
<p style="text-indent: 2em"></strong>Servlet是一种独立于平台和协议的服务器端的Java应用程序，可以生成动态的Web页面。 </p>
<p style="text-indent: 2em">Servlet是位于Web 服务器内部的服务器端的Java应用程序，与传统的从命令行启动的Java应用程序不同，Servlet由Web服务器进行加载，该Web服务器必须包含支持Servlet的Java虚拟机。 </p>
<p style="text-indent: 2em">Java Servlet 与 Applet 的比较: </p>
<p style="text-indent: 2em">相似之处：</p>
<p style="text-indent: 2em">* 它们不是独立的应用程序，没有main()方法。</p>
<p style="text-indent: 2em">* 它们不是由用户或程序员调用，而是由另外一个应用程序(容器)调用。</p>
<p style="text-indent: 2em">* 它们都有一个生存周期，包含init()和destroy()方法。</p>
<p style="text-indent: 2em">不同之处：</p>
<p style="text-indent: 2em">* Applet具有很好的图形界面(AWT)，与浏览器一起，在客户端运行。</p>
<p style="text-indent: 2em">* Servlet 则没有图形界面，运行在服务器端。</p>
<p style="text-indent: 2em">Java Servlet 与 CGI(Common Gateway Interface) 的比较: </p>
<p style="text-indent: 2em">与传统的CGI和许多其他类似CGI的技术相比，Java Servlet具有更高的效率，更容易使用，功能更强大，具有更好的可移植性，更节省投资。在未来的技术发展过程中，Servlet有可能彻底取代CGI。</p>
<p style="text-indent: 2em">* 高效 </p>
<p style="text-indent: 2em">在传统的CGI中，每个请求都要启动一个新的进程，如果CGI程序本身的执行时间较短，启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中，每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。 </p>
<p style="text-indent: 2em">在传统CGI中，如果有N个并发的对同一CGI程序的请求，则该CGI程序的代码在内存中重复装载了N次；而对于Servlet，处理请求的是N个线程，只需要一份Servlet类代码。在性能优化方面，Servlet也比CGI有着更多的选择。</p>
<p style="text-indent: 2em">* 方便</p>
<p style="text-indent: 2em">Servlet提供了大量的实用工具例程，例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。</p>
<p style="text-indent: 2em">* 功能强大 </p>
<p style="text-indent: 2em">在Servlet中，许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如，Servlet能够直接和Web服务器交互，而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据，使得数据库连接池之类的功能很容易实现。</p>
<p style="text-indent: 2em">* 可移植性好</p>
<p style="text-indent: 2em">Servlet用Java编写，Servlet API具有完善的标准。因此，为IPlanet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。</p>
<p style="text-indent: 2em">* 节省投资 </p>
<p style="text-indent: 2em">不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用，而且对于现有的服务器，如果它不支持Servlet的话，要加上这部分功能也往往是免费的(或只需要极少的投资)。</p>
<p style="text-indent: 2em">Java Servlet 与 JSP(JavaServer Pages) 的比较: </p>
<p style="text-indent: 2em">JavaServer Pages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术，JSP并没有增加任何本质上不能用Servlet实现的功能。但是，在JSP中编写静态HTML更加方便，不必再用println语句来输出每一行HTML代码。更重要的是，借助内容和外观的分离，页面制作中不同性质的任务可以方便地分开：比如，由页面设计者进行HTML设计，同时留出供Servlet程序员插入动态内容的空间。</p>
<p style="text-indent: 2em"><strong>Java Servlet API 2.2 简介</p>
<p style="text-indent: 2em"></strong>Java Servlet API 2.2 的类和接口组成两个Java 包，即：javax.servlet 和 javax.servlet.http(还包括javax.servlet.jsp包，不在本篇文章讨论范围之内)。</p>
<p style="text-indent: 2em">javax.servlet 包提供了控制 Servlet 生命周期所必需的 Servlet 接口，是编写 Servlet 时必须要实现的。</p>
<p style="text-indent: 2em">javax.servlet.http 包提供了从Servlet 接口派生出的专门用于处理 HTTP 请求的抽象类和一般的工具类。所有的Servlet 对象都要实现Servlet 接口，大多数情况下是作为已经实现了Servlet 接口的javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet 这两个抽象类的子类来间接实现Servlet 接口。</p>
<p style="text-indent: 2em"><strong>javax.servlet 包定义的类和接口：</strong></p>
<p style="text-indent: 2em">interface RequestDispatcher </p>
<p style="text-indent: 2em">//定义一种对象，用于从客户接受请求，并将请求发送到服务器上任何指定的资源，如一个Servlet 、JSP 或 HTML 文件。</p>
<p style="text-indent: 2em">interface Servlet </p>
<p style="text-indent: 2em">//定义了所有 Servlet 必须实现的方法。</p>
<p style="text-indent: 2em">interface ServletConfig</p>
<p style="text-indent: 2em">//定义Servlet config 对象，由Servlet 引擎用在 Servlet 初始化时，向 Servlet 传递信息。</p>
<p style="text-indent: 2em">interface ServletContext </p>
<p style="text-indent: 2em">//定义了一系列方法，以便Servlet与其运行的环境通信。</p>
<p style="text-indent: 2em">interface ServletRequest</p>
<p style="text-indent: 2em">//定义了用于向Servlet传递客户请求信息的对象。</p>
<p style="text-indent: 2em">interface ServletResponse</p>
<p style="text-indent: 2em">//定义了一个对象，由Servlet用于向客户发送响应。</p>
<p style="text-indent: 2em">interface SingleThreadModel</p>
<p style="text-indent: 2em">//用于保证Servlet在任一时刻，只处理一个请求。</p>
<p style="text-indent: 2em">class GenericServlet</p>
<p style="text-indent: 2em">//继承Servlet接口，定义了一个通用的，与协议无关的Servlet。</p>
<p style="text-indent: 2em">class ServletInputStream</p>
<p style="text-indent: 2em">//定义了一个输入流，用于由Servlet从中读取客户请求的二进制数据。</p>
<p style="text-indent: 2em">class ServletOutputStream</p>
<p style="text-indent: 2em">//定义了一个输出流，用于由Servlet向客户发送二进制数据。</p>
<p style="text-indent: 2em">class ServletException</p>
<p style="text-indent: 2em">//定义了一个当Servlet遇到问题时可以抛出的异常。</p>
<p style="text-indent: 2em">class UnavailableException</p>
<p style="text-indent: 2em">//定义了一种异常，用于由Servlet指明它永远或暂时不可用。</p>
<p style="text-indent: 2em"><strong>javax.servlet.http 包定义的类和接口：</strong></p>
<p style="text-indent: 2em">interface HttpServletRequest</p>
<p style="text-indent: 2em">//继承了ServletRequest 接口，为HTTPServlet 提供请求信息。</p>
<p style="text-indent: 2em">interface HttpServletResponse</p>
<p style="text-indent: 2em">//继承了ServletResponse 接口，为HTTPServlet 输出响应信息提供支持。</p>
<p style="text-indent: 2em">interface HttpSession</p>
<p style="text-indent: 2em">//为维护 HTTP 用户的会话状态提供支持。</p>
<p style="text-indent: 2em">interface HttpSessionBindingListener</p>
<p style="text-indent: 2em">//使得某对象在加入一个会话或从会话中删除时能够得到通知。</p>
<p style="text-indent: 2em">interface HttpSessionContext</p>
<p style="text-indent: 2em">//由Servlet 2.1 定义，该对象在新版本已不被支持。</p>
<p style="text-indent: 2em">class Cookie</p>
<p style="text-indent: 2em">//用在Servlet 中使用Cookie 技术</p>
<p style="text-indent: 2em">class HttpServlet</p>
<p style="text-indent: 2em">//定义了一个抽象类，继承 GenericServlet 抽象类，应被 HTTPServlet 继承。</p>
<p style="text-indent: 2em">class HttpSessionBindingEvent</p>
<p style="text-indent: 2em">//定义了一种对象，当某一个实现了HttpSessionBindingListener接口的对象被加入会话或从会//话中删除时，会收到该类对象的一个句柄</p>
<p style="text-indent: 2em">class HttpUtils</p>
<p style="text-indent: 2em">//提供了一系列便于编写HTTPServlet 的方法。</p>
<p style="text-indent: 2em">下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。 </p>
<p style="text-indent: 2em">HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet，请扩展 HttpServlet 类， 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 &lt;FORM&gt; 和 &lt;/FORM&gt; 标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时，它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。 </p>
<p style="text-indent: 2em">(1) init() 方法 </p>
<p style="text-indent: 2em">在 Servlet 的生命期中，仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器，以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet，都不会重复执行 init() 。 </p>
<p style="text-indent: 2em">缺省的 init() 方法通常是符合要求的，但也可以用定制 init() 方法来覆盖它，典型的是管理服务器端资源。 例如，可能编写一个定制 init() 来只用于一次装入 GIF 图像，改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数，并用它的 ServletConfig 对象参数来启动配置， 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前，应确保已完成了 init() 方法。 </p>
<p style="text-indent: 2em">(2) service() 方法 </p>
<p style="text-indent: 2em">service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象，该对象的service() 方法就要被调用，而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如， 如果 HTTP 请求方法为 GET，则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法，不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。 </p>
<p style="text-indent: 2em">当一个客户通过HTML 表单发出一个HTTP POST请求时，doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时，应该使用doPost()方法。 </p>
<p style="text-indent: 2em">当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时，doGet()方法被调用。与GET请求相关的参数添加到URL的后面，并与这个请求一起发送。当不会修改服务器端的数据时，应该使用doGet()方法。 </p>
<p style="text-indent: 2em">Servlet的响应可以是下列几种类型： </p>
<p style="text-indent: 2em">一个输出流，浏览器根据它的内容类型(如text/HTML)进行解释。 </p>
<p style="text-indent: 2em">一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。 </p>
<p style="text-indent: 2em">(3) destroy() 方法 </p>
<p style="text-indent: 2em">destroy() 方法仅执行一次，即在服务器停止且卸装Servlet 时执行该方法。典型的，将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的，但也可以覆盖它，典型的是管理服务器端资源。例如，如果 Servlet 在运行时会累计统计数据，则可以编写一个 destroy() 方法，该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。 </p>
<p style="text-indent: 2em">当服务器卸装 Servlet 时，将在所有 service() 方法调用完成后，或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程，因此请确认在调用 destroy() 方法时，这些线程已终止或完成。 </p>
<p style="text-indent: 2em">(4) GetServletConfig()方法 </p>
<p style="text-indent: 2em">GetServletConfig()方法返回一个 ServletConfig 对象，该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。 </p>
<p style="text-indent: 2em">(5) GetServletInfo()方法 </p>
<p style="text-indent: 2em">GetServletInfo()方法是一个可选的方法，它提供有关servlet 的信息，如作者、版本、版权。 </p>
<p style="text-indent: 2em">当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时，均需要 "请求"和"响应"对象作为参数。"请求"对象提供有关请求的信息，而"响应"对象提供了一个将响应信息返回给浏览器的一个通信途径。</p>
<p style="text-indent: 2em">javax.servlet 软件包中的相关类为ServletResponse和ServletRequest，而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。 </p>
<p style="text-indent: 2em">Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用"请求"对象的方法获知客户机环境，服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用"响应"对象的方法发送响应，该响应是准备发回客户机的。</p>
<br />
<p><span class="f14">进行Servlet开发所需要的基本环境是JSDK以及一个支持Servlet的Web服务器</span></p>
<p style="text-indent: 2em"><strong>&nbsp;&nbsp; 编写Servlet所需要的开发环境</strong> <br />
<br />
　　进行Servlet开发所需要的基本环境是JSDK以及一个支持Servlet的Web服务器。 <br />
<br />
&nbsp;&nbsp;&nbsp; <strong>1.JSDK(Java Servlet Development Kit) <br />
</strong><br />
　　JSDK包含了编译Servlet应用程序所需要的Java类库以及相关的文档。对于利用Java 1.1进行开发的用户，必须安装JSDK。JSDK已经被集成进Java 1.2 Beta版中，如果利用Java 1.2或以上版本进行开发，则不必安装JSDK。 <br />
<br />
　　JSDK可以在Javasoft公司的站点免费下载，其地址是：　　 http://www.sun.com/software/jwebserver/redirect.html<br />
　<br />
<strong>　　2.支持Servlet的Web服务器</strong> <br />
<br />
　　Servlet需要运行在支持Servlet的Web服务器上。目前支持Servlet的Web服务器SUN公司的JSWDK1.0.1。如果现有的Web服务器不支持Servlet，则可以利用一些第三方厂商的服务器增加件(add－ons)来使Web服务器支持Servlet，这其中Live Software公司(http://www.livesoftware.com)提供了一种称为JRun的产品，通过安装JRun的相应版本，可以使Microsoft IIS和Netscape Web Server支持Servlet。 <br />
<br />
　　<strong>开发Servlet的过程</strong> <br />
<br />
　　下面举一个简单的Servlet 例子来说明开发Servlet的过程。 <br />
<br />
<strong>　　1.编写Servlet代码</strong> <br />
<br />
　　Java Servlet API是一个标准的Java扩展程序包，包含两个Package∶javax.servlet和javax.servlet.http。对于想开发基于客户自定义协议的开发者，应该使用javax.servlet包中的类与界面；对于仅利用HTTP协议与客户端进行交互的开发者，则只需要使用javax.servlet.http包中的类与界面进行开发即可。 <br />
<br />
　　下面是一个servlet的程序代码(RequestInfoExample.java)∶ <br />
<br />
<code>import java.io.*;<br />
import java.servlet.*;<br />
import javax.servlet.*;<br />
<br />
public class RequestInfoExample extends HttpServlet {<br />
　 public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
　　 throws IOException, ServletException<br />
　 {<br />
　　 response.setContentType("text/html");<br />
　　 PrintWriter out = response.getWriter();<br />
　　 out.println("＜html＞");<br />
　　 out.println("＜body＞");<br />
　　 out.println("＜head＞");<br />
　　 out.println("＜title＞Request Information Example＜/title＞");<br />
　　 out.println("＜/head＞");<br />
　　 out.println("＜body＞");<br />
　　 out.println("＜h3＞Request Information Example＜/h3＞");<br />
　　 out.println("Method: " + request.getMethod());<br />
　　 out.println("Request URI: " + request.getRequestURI());<br />
　　 out.println("Protocol: " + request.getProtocol());<br />
　　 out.println("PathInfo: " + request.getPathInfo());<br />
　　 out.println("Remote Address: " + request.getRemoteAddr());<br />
　　 out.println("＜/body＞");<br />
　　 out.println("＜/html＞");<br />
　 }<br />
<br />
　 public void doPost(HttpServletRequest request, HttpServletResponse res)<br />
　 throws IOException, ServletException<br />
　 {<br />
　　 doGet(request, response);<br />
　 }<br />
}</code><br />
　　该servlet实现如下功能∶当用户通过浏览器访问该servlet时，该servlet向客户端浏览器返回一个HTML页面∶ <br />
<br />
<code>------------------------------------------------<br />
Request Information Example<br />
<br />
Method: GET <br />
Request URI: /examples/servlet/RequestInfoExample <br />
Protocol: HTTP/1.1 <br />
Path Info: null <br />
Remote Address: 127.0.0.1 <br />
--------------------------------------------------</code><br />
　　有关servlet程序说明∶ <br />
<br />
　　* 基于HTTP协议的servlet必须引入javax.servlet和javax.servlet.http包； <br />
<br />
　　* HelloServlet从类HttpServlet派生，HttpServlet是GenericServlet的一个派生类，通过 GenericServlet实现了Servlet界面。HttpServlet为基于HTTP协议的servlet提供了基本的支持； <br />
<br />
　　* HttpServletRequest对象包含了客户端请求的信息，可以通过该参数取得客户端的一些信息(例如IP地址、浏览器类型等)以及HTTP请求类型(例如GET、HEAD、POST、PUT等)；HttpServletResponse对象用于完成Servlet与客户端的交互，通过调用HttpServletResponse.getOutputStream()客户取得向客户端进行输出的输出流，向客户端发送HTML页面。<br />
<br />
　　* 编写了doGet方法，对于HTML POST 请求，调用Servlet 的doPost()方法。 <br />
<br />
<strong>　　2.编译Servlet代码</strong> <br />
<br />
　　利用JDK 1.2.2 对Servlet代码进行编译(假设Web服务器采用jswdk-1.0.1)，其命令行为: <br />
<br />
　　c:\＞ javac －d C:\jswdk-1.0.1\examples\WEB-INF\servlets HelloServlet.java <br />
<br />
　　进行编译时必须确保HelloServlet.java 文件拷贝到目录C:\jswdk-1.0.1\examples\WEB- INF\servlets 下面。<br />
　<br />
　　<strong>3.测试Servlet <br />
</strong><br />
　　现在可以对HelloServlet进行测试了，打开浏览器，键入： <br />
<br />
　　http://localhost:8080/examples/servlet/RequestInfoExample<br />
<br />
　　其中localhost是安装有jswdk-1.0.1的机器，8080是端口号。 </p>
<br />
<br />
<p style="text-indent: 2em"><span class="f14">希尔排序法基本思想是：取一个间隔，将长序列分成若干短的子序列，对每个子序列进行直插排序；然后逐渐缩小间隔，重复以上过程，直到间隔为1</span> </p>
<p>&nbsp;&nbsp;&nbsp; 前面我们学习了两种插入排序法,但当要排序的数组长度越长并且数值越不成顺序,比较和交换的次数就越多,效率越低。因此D.L.Shell在1959年提出了缩小增量排序法（又叫希尔排序法），基本思想是：取一个间隔，将长序列分成若干短的子序列，对每个子序列进行直插排序；然后逐渐缩小间隔，重复以上过程，直到间隔为1。可以看到这种算法，较好的克服了直接插入排序法的不足。<br />
<br />
<br />
　　下面是示例：<br />
<br />
<code>8 7 4 3 6 1 //是要排序的数值，我们以一半的长度为间隔3<br />
3 7 4 8 6 1 //第一次，取得3，小于前面的8，交换位置<br />
3 6 4 8 7 1 //第二次，取得6，小于前面的7，交换位置<br />
3 6 1 8 7 4 //第三次，取得1，小于前面的4，交换位置<br />
1 6 3 4 7 8 //第四次，再缩小间隔，为2，取得1小于3，交换位置，取得7，大于前面的3，不变；取得8大于6，不变，取得4小于8，交换位置<br />
1 3 4 6 7 8 //第五次，再缩小间隔，为1，取得6，大于1，不变；取得3小于6，交换位置；取得4，小于6，交换位置；取得7，大于前面的6，不变；取得8 ，大于7，不变</code><br />
　　以下是代码：<br />
<br />
<code>void paixu( ) //用希尔排序法, <br />
{<br />
　 int N=13;// N为前后纪录位置的增量<br />
　 for (int Z= N/2; Z; Z = Z/2)//每次缩小增量<br />
　　 for (int i = Z; i &lt; N; i++)//从增两大小开始比较<br />
　　 {<br />
　　　 int temp = apai[i]; //将后一个备份<br />
　　　 for (int j = i; j &gt;= Z &amp;&amp; temp &lt; a[j - Z]; j -= Z) //与他在同一个子序列的数一个个的较<br />
　　　 { <br />
　　　　 a[j] = a[j -Z]; //如果小于,就交换<br />
　　　 }//end for<br />
　　　 a[j] = temp; //找到合适的插入点,放入其中<br />
　　 }//end for<br />
}//end <br />
<br />
</code><br />
　　我们再来看最后一种关于数组的排序方法,就是快速排序法,它是目前最快的一种排序的方法.它的基本思想是:通过一趟排序将待排序的记录分割为独立的两部分,其中一部分记录的数值均比另一部分记录的数值小,然后继续分别对这两部分进行排序,直到整个序列有序为止.<br />
<br />
　　具体做法: 任取待排序列的某个记录(我们可以取第一个数)作为基准，按照该数值大小，将整个序列分成两个序列——左侧的所有记录的数值都比基准小（或者相等），右侧的都比基准大，基准则放在两个子序列之间，显然这时基准放在了最后应该放置的位置。分别对左右子序列重复上面的过程，直到最后所有的记录都放在相应的位置。<br />
<br />
　　示例如下:<br />
<br />
<code>7 8 4 3 6 1 //是要排序的数值<br />
1 8 4 3 6 //第一次，取得7，作为基准，1为right值,7&gt;1,交换位置<br />
1 4 3 6 8 //第二次, 8为left值，7&lt;8,放到最后;<br />
1 4 3 6 8 //第三次，left取得4，小于7，放到前面,<br />
1 4 6 3 8 //第四次,right取6,小于7,放到前面<br />
1 4 6 3 8 //第五次，left=right=3,小于7，放到前面,<br />
1 4 6 3 7 8 //7放入合适位置,第一趟排序完成<br />
//后面,在以1为基准排序<br />
&#8230;&#8230;<br />
//直到成功</code><br />
　　代码如下:<br />
<br />
<code>void paixu(int a[],int low,int high;)//用快速排序法<br />
{<br />
　 // low, high表示扫描的范围<br />
<br />
　 int pivot;//存放中心索引及其值的局部变量<br />
　 int scanup,scandown,mid;//用于扫描的索引<br />
　 if (high-low&lt;=0) //如果数组中的元素少于两个,则返回<br />
　　 return;<br />
　 else <br />
　　 if(high-low==1) //如果有两个元素,对其进行比较<br />
　　 {<br />
　　　 if(apai[high]&lt;apai[low]) //如果后一个比前一个小,<br />
　　　　 Swap(apai[low],apai[high]);//那么交换位置<br />
　　　　 return;<br />
　　 }//end if<br />
　 mid=(low+high)/2;//取得中心索引<br />
　 pivot=apai[mid];//将中间索引的值,赋给pivot<br />
　 Swap(apai[mid],apai[low]);//交换pivot及低端元素的值<br />
　 Scanup=low+1;<br />
　 Scandown=high;//初始化扫描索引scanup和scandown<br />
　 do{<br />
　　 //从低端子表向上扫描,当scanup进入高端子表或遇到大于pivot的元素时结束.<br />
　　 while(scanup&lt;=scandown &amp;&amp; apai[scanup]&lt;=pivot)<br />
　　　 scanup++;<br />
　　　 //从高端子表向下扫描,当scandown遇到小于或等于pivot的元素时结束<br />
　　 while(piovt&lt;apai[scandown])<br />
　　　 scandown--;<br />
　　　 //如果两个索引还在各自的子表中,则表示两个元素错位,将两个元素换位<br />
　　　 if(scanup&lt;scandown)<br />
　　　　 Swap(apai[scanup],apai[scandown]);<br />
　 }while(scanup&lt;scandown);<br />
　 //将pivot拷贝到scandown位置,分开两个子表<br />
　 apai[low]=apai[scandown];<br />
　　 apai[scandown]=pivot;<br />
　 //如果低端子表(low至scandown-1)有2个或更多个元素,则进行递归调用<br />
　 if(low&lt;scandown-1)<br />
　　 paixu(apai,low,scandown-1);<br />
　　 //如果高端子表(scandown+1至high) 有2个或更多个元素,则进行递归调用<br />
　 if(scandown+1&lt;high)<br />
　　 paixu(apai, scandown+1, high);<br />
}</code><br />
　　关于排序的问题已经够多了,就到这里吧,如果大家有兴趣,可以看已看这方面的书.</p>
<br />
<br />
HttpServlet 是从GenericServlet 继承而来，因此它具有GenericServlet 类似的方法和对象，是我们使用Servlet编程经常用到的包，它支持HTTP 的post 和 get 等方法。<br />
<br />
　　编程思路：下面的例子，运行结果是输出简单地返回客户发送给服务器的请求行和头部信息，以及一些可访问的HTTP 信息等。<br />
<br />
<br />
　　SnoopServlet.java 的源代码如下：<br />
<br />
<code>import java.io.IOException;<br />
import java.io.PrintWriter;<br />
import java.util.Enumeration;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
<br />
<br />
public class SnoopServlet extends HttpServlet {<br />
<br />
　 public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
　 throws ServletException, IOException<br />
　 {<br />
　　 PrintWriter out = response.getWriter();<br />
　　 response.setContentType("text/plain");<br />
<br />
　　 out.println("Snoop Servlet");<br />
　　 out.println();<br />
　　 out.println("Servlet init parameters:");<br />
　　 Enumeration e = getInitParameterNames();<br />
　　 while (e.hasMoreElements()) {<br />
　　　 String key = (String)e.nextElement();<br />
　　　 String value = getInitParameter(key);<br />
　　　 out.println(" " + key + " = " + value); <br />
　　 }<br />
　　 out.println();<br />
<br />
　　 out.println("Context init parameters:");<br />
　　 ServletContext context = getServletContext();<br />
　　 Enumeration enum = context.getInitParameterNames();<br />
　　 while (enum.hasMoreElements()) {<br />
　　　 String key = (String)enum.nextElement();<br />
　　　 Object value = context.getInitParameter(key);<br />
　　　 out.println(" " + key + " = " + value);<br />
　　 }<br />
　　 out.println();<br />
<br />
　　 out.println("Context attributes:");<br />
　　 enum = context.getAttributeNames();<br />
　　 while (enum.hasMoreElements()) {<br />
　　　 String key = (String)enum.nextElement();<br />
　　　 Object value = context.getAttribute(key);<br />
　　　 out.println(" " + key + " = " + value);<br />
　　 }<br />
　　 out.println();<br />
<br />
　　 out.println("Request attributes:");<br />
　　 e = request.getAttributeNames();<br />
　　 while (e.hasMoreElements()) {<br />
　　　 String key = (String)e.nextElement();<br />
　　　 Object value = request.getAttribute(key);<br />
　　　 out.println(" " + key + " = " + value);<br />
　　 }<br />
　　 out.println();<br />
　　 out.println("Servlet Name: " + getServletName());<br />
　　 out.println("Protocol: " + request.getProtocol());<br />
　　 out.println("Scheme: " + request.getScheme());<br />
　　 out.println("Server Name: " + request.getServerName());<br />
　　 out.println("Server Port: " + request.getServerPort());<br />
　　 out.println("Server Info: " + context.getServerInfo());<br />
　　 out.println("Remote Addr: " + request.getRemoteAddr());<br />
　　 out.println("Remote Host: " + request.getRemoteHost());<br />
　　 out.println("Character Encoding: " + request.getCharacterEncoding());<br />
　　 out.println("Content Length: " + request.getContentLength());<br />
　　 out.println("Content Type: "+ request.getContentType());<br />
　　 out.println("Locale: "+ request.getLocale());<br />
　　 out.println("Default Response Buffer: "+ response.getBufferSize());<br />
　　 out.println();<br />
　　 out.println("Parameter names in this request:");<br />
　　 e = request.getParameterNames();<br />
　　 while (e.hasMoreElements()) {<br />
　　　 String key = (String)e.nextElement();<br />
　　　 String[] values = request.getParameterValues(key);<br />
　　　 out.print(" " + key + " = ");<br />
　　　 for(int i = 0; i &lt; values.length; i++) {<br />
　　　　　 out.print(values[i] + " ");<br />
　　　 }<br />
　　　 out.println();<br />
　　 }　<br />
　　 out.println();<br />
　　 out.println("Headers in this request:");<br />
　　 e = request.getHeaderNames();<br />
　　 while (e.hasMoreElements()) {<br />
　　　　 String key = (String)e.nextElement();<br />
　　　　 String value = request.getHeader(key);<br />
　　　　 out.println(" " + key + ": " + value);<br />
　　 }<br />
　　 out.println(); <br />
　　 out.println("Cookies in this request:");<br />
　　 Cookie[] cookies = request.getCookies();<br />
　　 if (cookies != null) {<br />
　　　 for (int i = 0; i &lt; cookies.length; i++) {<br />
　　　　 Cookie cookie = cookies[i];<br />
　　　　 out.println(" " + cookie.getName() + " = "+ cookie.getValue());<br />
　　　 }<br />
　　 }<br />
　　 out.println();<br />
<br />
　　 out.println("Request Is Secure: " + request.isSecure());<br />
　　 out.println("Auth Type: " + request.getAuthType());<br />
　　 out.println("HTTP Method: " + request.getMethod());<br />
　　 out.println("Remote User: " + request.getRemoteUser());<br />
　　 out.println("Request URI: " + request.getRequestURI());<br />
　　 out.println("Context Path: " + request.getContextPath());<br />
　　 out.println("Servlet Path: " + request.getServletPath());<br />
　　 out.println("Path Info: " + request.getPathInfo());<br />
　　 out.println("Path Trans: " + request.getPathTranslated());<br />
　　 out.println("Query String: " + request.getQueryString());<br />
<br />
　　 out.println();<br />
　　 HttpSession session = request.getSession();<br />
　　 out.println("Requested Session Id: " +<br />
　　 request.getRequestedSessionId());<br />
　　 out.println("Current Session Id: " + session.getId());<br />
　　 out.println("Session Created Time: " + session.getCreationTime());<br />
　　 out.println("Session Last Accessed Time: " +session.getLastAccessedTime());<br />
　　 out.println("Session Max Inactive Interval Seconds: " + session.getMaxInactiveInterval());<br />
　　 out.println();<br />
　　 out.println("Session values: ");<br />
　　 Enumeration names = session.getAttributeNames();<br />
　　 while (names.hasMoreElements()) {<br />
　　　 String name = (String) names.nextElement();<br />
　　　 out.println(" " + name + " = " + session.getAttribute(name));<br />
　　 }<br />
　 }<br />
}</code><br />
　　编程技巧说明：<br />
<br />
　　程序输出Init Parameters(初始化参数)、Attribute names in this request、Parameter names in this request、Headers in this request、Cookies in this request 和 Session Information等信息。<br />
方法getRequestURI返回的对象URI 是作为URL 的一部分，是去掉URL 中用于指定机器的那部分；方法getPathInfo 返回的字符串是客户向Servlet 传送的各种选项，这些选项是跟在Servlet 的URL 之后的，方法getPathTranslated 返回的字符串是Servlet 的自己的绝对路径名，SnoopServlet.class 文件位置是C:\jswdk-1.0.1\examples\WEB-INF\servlets\SnoopServlet.class，则方法getPathTranslated 返回的字符串值就是它。<br />
<br />
　　在浏览器中输入如下的地址：<br />
<br />
<code>http://localhost:8080/examples/servlet/SnoopServlet</code><br />
　　则会输出结果。<br />
<br />
<br />
Cookie 是一小块可以嵌入HTTP 请求和响应中的数据，它在服务器上产生，并作为响应头域的一部分返回用户。浏览器收到包含Cookie 的响应后，会把Cookie 的内容用&#8220;关键字/值&#8221; 对的形式写入到一个客户端专为存放Cookie 的文本文件中。浏览器会把Cookie 及随后产生的请求发给相同的服务器，服务器可以再次读取Cookie 中存Cookie 可以进行有效期设置，过期的Cookie 不会发送给服务器。<br />
<br />
<br />
　　Servlet API 提供了一个Cookie 类，封装了对Cookie 的一些操作。Servlet 可以创建一个新的Cookie，设置它的关键字、值及有效期等属性，然后把Cookie 设置在HttpServletResponse 对象中发回浏览器，还可以从HttpServletRequest 对象中获取Cookie。<br />
<br />
　　编程思路：Cookie 在实际的Servlet 编程中是很广泛应用，下面是一个从Servlet 中获取Cookie 信息的例子。<br />
<br />
　　ShowCookies.java 的源代码如下：<br />
<br />
<code>import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
<br />
/**<br />
* ＜p＞This is a simple servlet that displays all of the<br />
* Cookies present in the request<br />
*/<br />
<br />
public class ShowCookies extends HttpServlet<br />
{<br />
　public void doGet(HttpServletRequest req, HttpServletResponse resp)<br />
　throws ServletException, java.io.IOException<br />
　{<br />
<br />
　　// Set the content type of the response<br />
　　resp.setContentType("text/html;charset=gb2312");<br />
<br />
　　// Get the PrintWriter to write the response<br />
　　java.io.PrintWriter out = resp.getWriter();<br />
<br />
　　// Get an array containing all of the cookies<br />
　　Cookie cookies[] = req.getCookies();<br />
<br />
　　// Write the page header<br />
　　out.println("＜html＞");<br />
　　out.println("＜head＞");<br />
　　out.println("＜title＞Servlet Cookie Information＜/title＞");<br />
　　out.println("＜/head＞");<br />
　　out.println("＜body＞");<br />
<br />
　　if ((cookies == null) || (cookies.length == 0)) {<br />
　　　out.println("没有 cookies ");<br />
　　}<br />
　　else {<br />
　　　out.println("＜center＞＜h1＞响应消息中的Cookies 信息 ＜/h1＞");<br />
　　　// Display a table with all of the info<br />
　　　out.println("＜table border＞");<br />
　　　out.println("＜tr＞＜th＞Name＜/th＞＜th＞Value＜/th＞" + "＜th＞Comment＜/th＞＜th＞Max Age＜/th＞＜/tr＞");<br />
　　　for (int i = 0; i ＜ cookies.length; i++) {<br />
　　　　Cookie c = cookies[i];<br />
　　　　out.println("＜tr＞＜td＞" + c.getName() + "＜/td＞＜td＞" +<br />
　　　　c.getValue() + "＜/td＞＜td＞" + c.getComment() + "＜/td＞＜td＞" + c.getMaxAge() + "＜/td＞＜/tr＞");<br />
　　}<br />
　　out.println("＜/table＞＜/center＞");<br />
　}<br />
　// Wrap up<br />
　out.println("＜/body＞");<br />
　out.println("＜/html＞");<br />
　out.flush();<br />
}<br />
<br />
/**<br />
* ＜p＞Initialize the servlet. This is called once when the<br />
* servlet is loaded. It is guaranteed to complete before any<br />
* requests are made to the servlet<br />
* @param cfg Servlet configuration information<br />
*/<br />
<br />
public void init(ServletConfig cfg)<br />
throws ServletException<br />
{<br />
　super.init(cfg);<br />
}<br />
<br />
/**<br />
* ＜p＞Destroy the servlet. This is called once when the servlet<br />
* is unloaded.<br />
*/<br />
<br />
public void destroy()<br />
{<br />
　super.destroy();<br />
}<br />
}<br />
</code><br />
　　注意：Cookie 进行服务器端与客户端的双向交流，所以它涉及到安全性问题。<br />
<p><strong>&nbsp;使用Java Servlet API 进行会话管理<br />
<br />
</strong>　　javax.servlet.http.HttpSession 接口封装了HTTP 会话的细节，该会话与一段时间内特定的Web 客户对Web 服务器的多个请求相关。管理会话数据主要涉及到3个方面：会话交换、会话重定位和会话持久性，只有实现了java.io.Serializable 接口的数据对象才能够被交换、重定位和保持。这个接口主要是让对象具有序列化的能力，它可以将对象的状态信息写入任意的输出流中如：文件、网络连接等。<br />
<br />
　　编程思路：下面是实现一个简单在商场购物的例子，当用户选购商品(糖果、收音机和练习簿)放入购物袋中，保存选购的商品信息。<br />
<br />
　　ShowBuy.java 的源代码如下：<br />
<br />
<code>import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
import java.io.*;<br />
import java.util.*;<br />
<br />
public class ShowBuy extends HttpServlet<br />
{<br />
　public void doGet(HttpServletRequest req, HttpServletResponse res)<br />
　throws ServletException, java.io.IOException<br />
　{<br />
　　String[] item={"糖果","收音机","练习簿"}; <br />
　　//获取会话对象<br />
　　HttpSession session=req.getSession(true);<br />
　　//获取选择的商品数目<br />
　　Integer itemCount=(Interger) session.getValue("itemCount");<br />
　　//如果没放入商品则数目为0<br />
　　if (itemCount==null){<br />
　　　itemCount=new Integer(0);<br />
　　}<br />
<br />
　　// Set the content type of the response<br />
　　res.setContentType("text/html;charset=gb2312");<br />
　　PrintWriter out=res.getWriter();<br />
<br />
　　//取得POST上来的表单信息<br />
　　String[] itemsSelected;<br />
　　String itemName;<br />
　　itemsSelected=req.getParameterValues("item"); <br />
　　//将选中的商品放入会话对象<br />
　　if(itemsSelected !=null){<br />
　　　for(int i=0;i＜itemsSelected.length;i++){<br />
　　　　itemName=itemsSelected[i];<br />
　　　　itemCount=new Integer(itemCount.intValue()+1);<br />
　　　　session.putValue("Item" + itemCount,itemName);<br />
　　　　//将商品名称定义为ItemX<br />
　　　　session.putValue("itemCount",itemCount);<br />
　　　　//将商品数量放入会话对象 <br />
　　　}<br />
　　}<br />
<br />
　　// Write the page header<br />
　　out.println("＜html＞");<br />
　　out.println("＜head＞");<br />
　　out.println("＜title＞购物袋的内容＜/title＞");<br />
　　out.println("＜/head＞");<br />
　　out.println("＜body＞");<br />
　　out.println("＜center＞＜h1＞你放在购物袋中的商品是： ＜/h1＞＜/center＞");<br />
　　//将购物袋的内容写入页面 <br />
　　for (int i = 1; i ＜ itemCount.intValue(); i++) {<br />
　　　String item =(String) session.getValue("Item"+i);<br />
　　　//取出商品名称 <br />
　　　out.println(items[Integer.parseInt(item)]);<br />
　　　out.println("＜BR＞");<br />
　　}<br />
　　// Wrap up<br />
　　out.println("＜/body＞");<br />
　　out.println("＜/html＞");<br />
　　out.close();<br />
　}<br />
}</code><br />
　　客户端的ShowBuy.html 的源代码如下：<br />
<br />
<code>＜HTML＞<br />
＜HEAD＞<br />
　＜TITLE＞购物袋的实例 ＜/TITLE＞<br />
＜/HEAD＞<br />
＜BODY＞<br />
　＜CENTER＞＜H1＞百货商场＜/H1＞＜/CENTER＞<br />
　＜HR＞<br />
　＜FORM ACTION='servlet/ShowBuy" METHOD="POST"＞<br />
　　选购商品<br />
　　＜p＞＜INPUT TYPE="Checkbox" NAME="item" VALUE="0"＞<br />
　　　第一种：糖果＜/p＞<br />
　　＜p＞＜INPUT TYPE="Checkbox" NAME="item" VALUE="1"＞<br />
　　　第二种：收音机＜/p＞<br />
　　＜p＞＜INPUT TYPE="Checkbox" NAME="item" VALUE="2"＞<br />
　　　第三种：练习簿＜/p＞<br />
　　＜HR＞<br />
　　＜INPUT TYPE="Submit" NAME="bt_submit" VALUE="加入购物袋"＞<br />
　＜/FORM＞<br />
＜/BODY＞<br />
＜/HTML＞</code><br />
<strong>　　编程技巧说明：<br />
</strong><br />
　　在Servlet 中进行会话管理时，首先要获得会话对象。HttpServletRequest.getSession()对象返回与请求相关的当前HttpSession 对象，并且当该对象不存在时就新创建一个对象；HttpServletRequest.getSession(true)实现相同的功能。如果参数是false，当不存在会话对象时，将返回一个null 值。<br />
<br />
<code>//获取会话对象<br />
HttpSession session=req.getSession(true);<br />
//获取选择的商品数目<br />
Integer itemCount=(Interger) session.getValue("itemCount");</code><br />
　　具体操作时，当用户选择商品后，单击&#8220;加入购物袋"按钮，Servlet 输出用户选择的商品。</span></p>
<img src ="http://www.blogjava.net/lcs/aggbug/148600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-09-27 11:31 <a href="http://www.blogjava.net/lcs/archive/2007/09/27/148600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic session问题 </title><link>http://www.blogjava.net/lcs/archive/2007/09/27/148585.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 27 Sep 2007 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/09/27/148585.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/148585.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/09/27/148585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/148585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/148585.html</trackback:ping><description><![CDATA[<p>在找东西时偶然看到的觉得很有趣就粘过来了，也许以后用得着！<br />
<br />
删除了论坛中一些回复，或许应该改个名字叫：服务器之间的重定向！<br />
<br />
<br />
<br />
最近在做一个单点登录的接口，基本实现如下：<br />
1. webApp-A <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (session.getAttribute("UserID") != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect(ssoURL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
2. webApp-B (在另外一台服务器上)<br />
&nbsp;&nbsp; 显示登录界面，登录，然后返回我webApp-A的一URL<br />
3. webApp-A 根据 返回URL中的result参数判断登录的结果，并设置session变量UserID<br />
<br />
问题就出在了在重定向到ssoURL，并从webAPP-B返回后，weblogic的sessionid变了，所有的session 变量都没有了，刷新一次sessionid就变一次,同样的程序用tomcat一点问题都没有，不知道问题出在哪，该怎么解决<br />
<br />
-------------------------------------------------------------------<br />
webApp-A和webApp-B 分别跑在不同的服务器上<br />
webApp-A 中会重定向到webApp-B的URL<br />
webApp-B 中也会重定到webApp-A的URL<br />
-----------------------------------------------------------------<br />
<br />
<table style="table-layout: fixed; word-break: break-all; word-wrap: break-word" width="100%">
    <tbody>
        <tr>
            <td>测试代码如下：<br />
            a.jsp<br />
            <br />
            &lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />
            &lt;html&gt;<br />
            &lt;head&gt;<br />
            &lt;title&gt;<br />
            a<br />
            &lt;/title&gt;<br />
            &lt;/head&gt;<br />
            &lt;body bgcolor="#ffffff"&gt;<br />
            &lt;h1&gt;<br />
            JBuilder Generated JSP<br />
            &lt;/h1&gt;<br />
            &lt;%<br />
            out.println("SessionID:"+session.getId());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect("http://localhost:8080/wtui/b.jsp");<br />
            %&gt;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;<br />
            <br />
            <br />
            b.jsp<br />
            <br />
            &lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />
            &lt;html&gt;<br />
            &lt;head&gt;<br />
            &lt;title&gt;<br />
            b<br />
            &lt;/title&gt;<br />
            &lt;/head&gt;<br />
            &lt;body bgcolor="#ffffff"&gt;<br />
            &lt;h1&gt;<br />
            JBuilder Generated JSP<br />
            &lt;/h1&gt;<br />
            &lt;%<br />
            out.println("SessionID:"+session.getId());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect("http://localhost:7001/wtui/c.jsp");<br />
            %&gt;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;<br />
            <br />
            <br />
            c.jsp <br />
            <br />
            &lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />
            &lt;html&gt;<br />
            &lt;head&gt;<br />
            &lt;title&gt;<br />
            c<br />
            &lt;/title&gt;<br />
            &lt;/head&gt;<br />
            &lt;body bgcolor="#ffffff"&gt;<br />
            &lt;h1&gt;<br />
            JBuilder Generated JSP<br />
            &lt;/h1&gt;<br />
            &lt;% out.println("SessionID:"+session.getId());<br />
            %&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;A href="a.jsp"&gt;&lt;br&gt;返回&lt;/A&gt;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;<br />
            <br />
            <br />
            把a.jsp,c.jsp 放到本机的7001端口，b.jsp 放到本机的8080端口，<br />
            (我的7001端口是weblogic 8.1 sp2,8080端口是tomcat 5.0),然后 http://localhost:7001/wtui/a.jsp<br />
            最后可以看到c.jsp显示出来的session id, 刷新一下页面，看看是不是每次session id 都在变？<br />
            </td>
        </tr>
    </tbody>
</table>
<br />
---------------------------------------------------------------------------------------------------------------<br />
<br />
今天下午总算是找到了问题的原因了<br />
只要把a.jsp中的<br />
response.sendRedirect("http://localhost:8080/wtui/b.jsp");<br />
改为<br />
response.sendRedirect("http://127.0.0.1:8080/wtui/b.jsp");<br />
<br />
就一切正常了，原来做模拟环境的时候没有找两台机器，只是在同一机器开了两个端口。<br />
<br />
不过我还是想知道为什么weblogic为出现这种问题<br />
</p>
（完）
<img src ="http://www.blogjava.net/lcs/aggbug/148585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-09-27 11:17 <a href="http://www.blogjava.net/lcs/archive/2007/09/27/148585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提升JSP应用程序的七大绝招</title><link>http://www.blogjava.net/lcs/archive/2007/09/25/148007.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 25 Sep 2007 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/09/25/148007.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/148007.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/09/25/148007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/148007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/148007.html</trackback:ping><description><![CDATA[<p>最近没什么可写的，这是昨天无意间找到的留着有空时看看<br />
<br />
来源:51CTO.com<br />
<br />
你时常被客户抱怨JSP页面响应速度很慢吗？你想过当客户访问次数剧增时，你的WEB应用能承受日益增加的访问量吗？本文讲述了调整JSP和servlet的一些非常实用的方法，它可使你的servlet和JSP页面响应更快，扩展性更强。而且在用户数增加的情况下，系统负载会呈现出平滑上长的趋势。在本文中，我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升。其中，某些调优技术是在你的编程工作中实现的。而另一些技术是与应用服务器的配置相关的。在本文中，我们将详细地描述怎样通过调整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</p>
<p>{</p>
<p>　private javax.sql.DataSource testDS = null; </p>
<p>　public void init(ServletConfig config) throws ServletException</p>
<p>　{</p>
<p>super.init(config); </p>
<p>Context ctx = null;</p>
<p>try</p>
<p>{ </p>
<p>　ctx = new InitialContext();</p>
<p>　testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");</p>
<p>}</p>
<p>catch(NamingException ne)</p>
<p>{</p>
<p>　ne.printStackTrace(); </p>
<p>}</p>
<p>catch(Exception e)</p>
<p>&nbsp;</p>
<p>　}</p>
<p>　public javax.sql.DataSource getTestDS()</p>
<p>　{</p>
<p>return testDS;</p>
<p>　}</p>
<p>　...</p>
<p>　... </p>
<p>} </p>
<p><br />
方法 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>&#183; 如果没有必要，就应该关闭JSP页面中对HttpSession的缺省设置： 如果你没有明确指定的话，每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话，那可以通过如下的JSP页面指示符来禁止它：</p>
<p>＜%@ page session="false"%＞&nbsp; </p>
<p><br />
&#183; 不要在HttpSession中存放大的数据对像：如果你在HttpSession中存放大的数据对像的话，每当对它进行读写时，应用服务器都将对其进行序列化，从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大，那系统的性能就下降得越快。</p>
<p>&#183; 当你不需要HttpSession时，尽快地释放它：当你不再需要session时，你可以通过调用HttpSession.invalidate()方法来释放它。</p>
<p>&#183; 尽量将session的超时时间设得短一点：在JSP应用服务器中，有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话，系统会将相关的session自动从内存中释放。超时时间设得越大，系统的性能就会越低，因此最好的方法就是尽量使得它的值保持在一个较低的水平。方法 4: 将页面输出进行压缩</p>
<p>压缩是解决数据冗余的一个好的方法，特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩，这种方法可以戏剧性地减少HTML文件的下载时间。因此，如果你将servlet或JSP页面生成的HTML页面进行压缩的话，那用户就会觉得页面浏览速度会非常快。但不幸的是，不是所有的浏览器都支持gzip压缩，但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段：</p>
<p>public void doGet(HttpServletRequest request, HttpServletResponse response)</p>
<p>throws IOException, ServletException </p>
<p>{</p>
<p>　OutputStream out = null</p>
<p>　String encoding = request.getHeader("Accept-Encoding"); </p>
<p>　if (encoding != null &amp;&amp; encoding.indexOf("gzip") != -1)</p>
<p>　{</p>
<p>request.setHeader("Content-Encoding" , "gzip");</p>
<p>out = new GZIPOutputStream(request.getOutputStream());</p>
<p>　}</p>
<p>　else if (encoding != null &amp;&amp; encoding.indexOf("compress") != -1)</p>
<p>　{</p>
<p>request.setHeader("Content-Encoding" , "compress");</p>
<p>out = new ZIPOutputStream(request.getOutputStream());</p>
<p>　} </p>
<p>　else</p>
<p>　{</p>
<p>out = request.getOutputStream();</p>
<p>　}</p>
<p>　...</p>
<p>　... </p>
<p>}&nbsp; </p>
<p><br />
方法 5: 使用线程池</p>
<p>应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理，并为它们分派service()方法，当service()方法调用完成后，与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源，这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。另外，我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时，它会创建数量等于最小线程数的一个线程池，当客户有请求时，相应地从池从取出一个线程来进行处理，当处理完成后，再将线程重新放入到池中。如果池中的线程不够地话，系统会自动地增加池中线程的数量，但总量不能超过最大线程数。通过使用线程池，当客户端请求急剧增加时，系统的负载就会呈现的平滑的上升曲线，从而提高的系统的可伸缩性。</p>
<p>方法 6: 选择正确的页面包含机制</p>
<p>在JSP中有两种方法可以用来包含另一个页面：1、使用include指示符(＜%@ includee file=&#8221;test.jsp&#8221; %＞)。2、使用jsp指示符(＜jsp:includee page=&#8221;test.jsp&#8221; flush=&#8221;true&#8221;/＞)。在实际中我发现，如果使用第一种方法的话，可以使得系统性能更高。</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=</p>
<p>"package.className" type="typeName"＞</p>
<p>＜/jsp:useBean＞ </p>
<p>&nbsp;</p>
<p>其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话，它将影响系统的性能。</p>
<p>举例来说，如果你只想在一次请求中使用某个bean，但你却将这个bean的生命周期设置成了session，那当这次请求结束后，这个bean将仍然保留在内存中，除非session超时或用户关闭浏览器。这样会耗费一定的内存，并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期，并在bean的使命结束后尽快地清理它们，会使用系统性能有一个提高。</p>
<p>其它一些有用的方法 </p>
<p>&#183; 在字符串连接操作中尽量不使用&#8220;＋&#8221;操作符：在java编程中，我们常常使用&#8220;＋&#8221;操作符来将几个字符串连接起来，但你或许从来没有想到过它居然会对系统性能造成影响吧？由于字符串是常量，因此JVM会产生一些临时的对像。你使用的&#8220;＋&#8221;越多，生成的临时对像就越多，这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替&#8220;＋&#8221;操作符。</p>
<p>&#183; 避免使用System.out.println()方法：由于System.out.println()是一种同步调用，即在调用它时，磁盘I/O操作必须等待它的完成，因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具，为了解决这个矛盾，我建议你最好使用Log4j工具(http://Jakarta.apache.org )，它既可以方便调试，而不会产生System.out.println()这样的方法。</p>
<p>&#183; ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销，因为它将所有的原始输出都转换为字符流来输出，因此如果使用它来作为页面输出的话，系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题，但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。</p>
<p>总结</p>
<p>本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能，并因此提升整个J2EE应用的性能。通过这些调优技术，你可以发现其实并不是某种技术平台（比如J2EE和.NET之争）决定了你的应用程序的性能，重要是你要对这种平台有一个较为深入的了解，这样你才能从根本上对自己的应用程序做一个优化！<br />
</p>
<img src ="http://www.blogjava.net/lcs/aggbug/148007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-09-25 10:57 <a href="http://www.blogjava.net/lcs/archive/2007/09/25/148007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>