﻿<?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-konhon-随笔分类-JSP/Servlet</title><link>http://www.blogjava.net/konhon/category/3032.html</link><description>忘掉過去，展望未來。找回自我，超越自我。
&lt;br&gt;
&lt;b&gt;逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.&lt;/b&gt;&lt;br&gt;&lt;p&gt;
&lt;!-- Search Google --&gt;
&lt;left&gt;
&lt;form method="get" action="http://www.google.com/custom" target="google_window"&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td nowrap="nowrap" valign="top" align="left" height="32"&gt;
&lt;a href="http://www.google.com/"&gt;
&lt;img src="http://www.google.com/logos/Logo_25wht.gif" border="0" alt="Google" align="middle"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;input type="text" name="q" size="31" maxlength="255" value=""&gt;&lt;/input&gt;
&lt;input type="submit" name="sa" value="搜索"&gt;&lt;/input&gt;
&lt;input type="hidden" name="client" value="pub-5408663347953425"&gt;&lt;/input&gt;
&lt;input type="hidden" name="forid" value="1"&gt;&lt;/input&gt;
&lt;input type="hidden" name="ie" value="UTF-8"&gt;&lt;/input&gt;
&lt;input type="hidden" name="oe" value="UTF-8"&gt;&lt;/input&gt;
&lt;input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1;"&gt;&lt;/input&gt;
&lt;input type="hidden" name="hl" value="zh-CN"&gt;&lt;/input&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/form&gt;
&lt;/left&gt;
&lt;!-- Search Google --&gt;
</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:12:04 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:12:04 GMT</pubDate><ttl>60</ttl><item><title>Jsp问答集 </title><link>http://www.blogjava.net/konhon/archive/2006/03/31/38507.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 31 Mar 2006 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/31/38507.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/38507.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/31/38507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/38507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/38507.html</trackback:ping><description><![CDATA[如何混合使用Jsp和SSI #include? <br />在JSP中可以使用如下方式包含纯HTML： <br />&lt;!--#include file="data.inc"--&gt; <br />但是如果data.inc中包含JSP CODE ，我们可以使用： <br />&lt;%@include file="data.inc"%&gt; <br /><br /><br />如何执行一个线程安全的JSP? <br />只需增加如下指令 <br />&lt;%@ page isThreadSafe="false" %&gt; <br /><br /><br />JSP如何处理HTML FORM中的数据? <br />通过内置的request对象即可，如下： <br />&lt;% <br />String item = request.getParameter("item"); <br />int howMany = new Integer(request.getParameter("units")).intValue(); <br />%&gt; <br /><br /><br />在JSP如何包含一个静态文件? <br />静态包含如下：&lt;%@ include file="copyright.html" %&gt; <br />动态包含如下：&lt;jsp:include page="copyright.html" flush="true"/&gt; <br /><br /><br />在JSP中如何使用注释? <br />主要有四中方法： <br />1。&lt;%-- 与 --%&gt; <br />2。// <br />3。/**与**/ <br />4。&lt;!--与--&gt; <br /><br /><br />在JSP中如何执行浏览重定向? <br />使用如下方式即可：response.sendRedirect("http://ybwen.home.chinaren.com/index.html"); <br />也能物理地改变HTTP HEADER属性，如下： <br />&lt;% <br />response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); <br />String newLocn="/newpath/index.html"; <br />response.setHeader("Location",newLocn); <br />%&gt; <br /><br /><br />如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? <br />把如下脚本加入到JSP文件的开始即可： <br />&lt;% <br />response.setHeader("Cache-Control","no-store"); //HTTP 1.1 <br />response.setHeader("Pragma","no-cache"); //HTTP 1.0 <br />response.setDateHeader ("Expires", 0); //prevents caching at the proxy server <br />%&gt; <br /><br /><br />在JSP中如何设置COOKIE? <br />COOKIE是作为HTTP HEADER的一部分被发送的，如下方法即可设置： <br />&lt;% <br />Cookie mycookie = new Cookie("aName","aValue"); <br />response.addCookie(mycookie); <br />%&gt; <br /><br /><br />在JSP中如何删除一个COOKIE? <br />&lt;% <br />Cookie killMyCookie = new Cookie("mycookie", null); <br />killMyCookie.setMaxAge(0); <br />killMyCookie.setPath("/"); <br />response.addCookie(killMyCookie); <br />%&gt; <br /><br /><br />在一个JSP的请求处理中如何停止JSP的执行 <br />如下例： <br />&lt;% <br />if (request.getParameter("wen") != null) { <br />// do something <br />} else { <br />return; <br />} <br />%&gt; <br /><br /><br />在JSP中如何定义方法 <br />你可以定义方法，但是你不能直接访问JSP的内置对象，而是通过参数的方法传递。如下： <br />&lt;%! <br />public String howBadFrom(HttpServletRequest req) { <br />HttpSession ses = req.getSession(); <br />... <br />return req.getRemoteHost(); <br />} <br />%&gt; <br />&lt;% <br />out.print("in general,lao lee is not baddie "); <br />%&gt; <br />&lt;%= howBadFrom(request) %&gt; <br /><br /><br />如果BROWSER已关闭了COOKIES，在JSP中我如何打开SESSION来跟踪 <br />使用URL重写即可，如下： <br />hello1.jsp <br />&lt;%@ page session="true" %&gt; <br />&lt;% <br />Integer num = new Integer(100); <br />session.putValue("num",num); <br />String url =response.encodeURL("hello2.jsp"); <br />%&gt; <br />&lt;a href=&amp;#39;&lt;%=url%&gt;&amp;#39;&gt;hello2.jsp&lt;/a&gt; <br /><br />hello2.jsp <br />&lt;%@ page session="true" %&gt; <br />&lt;% <br />Integer i= (Integer )session.getValue("num"); <br />out.println("Num value in session is "+i.intValue()); <br />%&gt; <br /><br /><br />在JSP中能发送EMAIL吗 <br />可以使用SUN的专用包：sun.net.smtp包。如下脚本使用SmtpClient类发送EMAIL。 <br />&lt;%@ page import="sun.net.smtp.SmtpClient, java.io.*" %&gt; <br />&lt;% <br />String from="ybwen@sina.com"; <br />String to="hewenjun@yeah.net, lei@who.com.cn"; <br />try{ <br />SmtpClient client = new SmtpClient("mail.xxxxx.xxx"); <br />client.from(from); <br />client.to(to); <br />PrintStream message = client.startMessage(); <br />message.println("To: " + to); <br />message.println("Subject: Sending email from JSP!"); <br />message.println("This was sent from a JSP page!"); <br />message.println(); <br />message.println("Cool! "); <br />message.println(); <br />message.println("Good Boy"); <br />message.println("I&amp;#39;m in genius.com"); <br />message.println(); <br />client.closeServer(); <br />} <br />catch (IOException e){ <br />System.out.println("ERROR SENDING EMAIL:"+e); <br />} <br />%&gt; <br /><br /><br />在SERVLET中我能调用一个JSP错误页吗 <br />当然没问题，如下展示了如何在一个SERVLET控制逻辑单元内调用一个JSP错误页面。 <br />protected void sendErrorRedirect(HttpServletRequest request, <br />HttpServletResponse response, String errorPageURL, <br />Throwable e) <br />throws ServletException, IOException { <br />request.setAttribute ("javax.servlet.jsp.jspException", e); <br />getServletConfig().getServletContext(). <br />getRequestDispatcher(errorPageURL).forward(request, <br />response); <br />} <br /><br />public void doPost(HttpServletRequest request,HttpServletResponse response) { <br />try { <br />// do something <br />} catch (Exception ex) { <br />try { <br />sendErrorRedirect(request,response,"/jsp/MyErrorPage.jsp",ex); <br />} catch (Exception e) { <br />e.printStackTrace(); <br />} <br />} <br />} <br /><br /><br />JSP和APPLET如何通讯 <br />JSP如何与EJB SessionBean通讯 <br />下面的代码段作了很好的示范 <br />&lt;%@ page import="javax.naming.*, javax.rmi.PortableRemoteObject, <br />foo.AccountHome, foo.Account" %&gt; <br />&lt;%! <br />//定义一个对SessionBeanHome接口实例的全局引用 <br />AccountHome accHome=null; <br /><br />public void jspInit() { <br />//获得Home接口实例 <br />InitialContext cntxt = new InitialContext( ); <br />Object ref= cntxt.lookup("java:comp/env/ejb/AccountEJB"); <br />accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class); <br />} <br />%&gt; <br />&lt;% <br />//实例化SessionBean <br />Account acct = accHome.create(); <br />//调用远程方法 <br />acct.doWhatever(...); <br />// 如此等等 <br />%&gt; <br /><br /><br />当我使用一个结果集时，如何防止字段为"null"的字域显示在我的HTML输入文本域中? <br />可以定义一个简单的函数来达到目的，如下： <br />&lt;%! <br />String blanknull(String s) { <br />return (s == null) ? "" : s; <br />} <br />%&gt; <br /><br />然后在JSP的FORM中，可以这样使用 <br />&lt;input type="text" name="shoesize" value="&lt;%=blanknull(shoesize)%&gt;"&gt; <br /><br /><br />如何中SERVLET或JSP下载一个文件（如：binary,text,executable)？ <br />现提供两个解决方案： <br />A：使用HTTP，如 <br />点击下载网络恐龙图片(这个地址是假的） <br /><br />B：在Servlet中，通过设置ContentType和使用java.io包的Stream等类可作到.例如： <br />response.setContentType("application/x-msword"); <br />然后想输出缓冲中写一些东东即可。 <br /><br />使用useBean标志初始化BEAN时如何接受初始化参数 <br />使用如下两标签即可： <br />&lt;jsp:getProperty name="wenBean" property="someProperty"/&gt; <br />&lt;jsp:setProperty name="wenBean" property="someProperty" value="someValue"/&gt;<img src ="http://www.blogjava.net/konhon/aggbug/38507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-31 16:43 <a href="http://www.blogjava.net/konhon/archive/2006/03/31/38507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 傳送中文參數</title><link>http://www.blogjava.net/konhon/archive/2006/03/31/38494.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 31 Mar 2006 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/31/38494.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/38494.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/31/38494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/38494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/38494.html</trackback:ping><description><![CDATA[偉送頁 to.jsp<br /><br />&lt;%@ page contentType="text/html; charset=big5" %&gt;<br />&lt;a href="from.jsp?word=&lt;%=java.net.URLEncoder.encode("二廠成型","big5")%&gt;"&gt;傳送字符&lt;/a&gt;<br /><br />接收頁 from.jsp<br /><pre class="overflow"><br />&lt;%@ page contentType="text/html; charset=big5" %&gt;<br /><br />&lt;%<br />request.setCharacterEncoding("big5");<br /><br />if(request.getParameter("word") != null){<br />        String bb = request.getParameter("word");<br />        out.print(bb);<br />}        <br />%&gt; <br /><br /></pre><img src ="http://www.blogjava.net/konhon/aggbug/38494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-31 16:15 <a href="http://www.blogjava.net/konhon/archive/2006/03/31/38494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[轉]樹形 算法</title><link>http://www.blogjava.net/konhon/archive/2006/03/31/38491.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 31 Mar 2006 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/31/38491.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/38491.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/31/38491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/38491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/38491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我喜欢解决算法问题 哈哈为了解决这个问题 我写了一个树状数据结构根节点为世界(我想这个根够大了吧)下面有两个子节点 分别为亚洲 欧洲亚洲的下面还有几个节点分别是中国 韩国......中国下面的几个节点分别是 福建省 湖北省......以次类推就是一个树啦 (不知道这个树是不是楼主需要的 反正没事写着玩呗 起码能对楼主有所启发吧)下面是代码首先是 Type (一个对象是一条记录)package be...&nbsp;&nbsp;<a href='http://www.blogjava.net/konhon/archive/2006/03/31/38491.html'>阅读全文</a><img src ="http://www.blogjava.net/konhon/aggbug/38491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-31 15:54 <a href="http://www.blogjava.net/konhon/archive/2006/03/31/38491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web.xml學習筆記</title><link>http://www.blogjava.net/konhon/archive/2006/03/29/38012.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Wed, 29 Mar 2006 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/29/38012.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/38012.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/29/38012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/38012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/38012.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt;				description				&gt;				 				&lt;				display				&gt;				 				&lt;				icon				&gt;																這三個元素提供了Web容器部署工具用描述應用的信息.				&lt;				icon				&gt;										...&nbsp;&nbsp;<a href='http://www.blogjava.net/konhon/archive/2006/03/29/38012.html'>阅读全文</a><img src ="http://www.blogjava.net/konhon/aggbug/38012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-29 11:52 <a href="http://www.blogjava.net/konhon/archive/2006/03/29/38012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlets/JSP开发技术问答</title><link>http://www.blogjava.net/konhon/archive/2006/03/24/37160.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 24 Mar 2006 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/24/37160.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/37160.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/24/37160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/37160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/37160.html</trackback:ping><description><![CDATA[<b>为什么GenericServlet在init(ServletConfig config)基础上增加了一个init()方法？</b>　<br />　<br />　　init()方法被GenericServlet.init(ServletConfig config)方法调用。<br />　　<br />　　init()方法方便了开发人员定制Servlet的初始化，而无须去维护ServletConfig对象的存储工作。<br />　　<br />　　重写GenericServlet.init(ServletConfig config)必须要显示的调用super.init(config)方法。<br />　　<br />　　<b>ServletContext.getContext(java.lang.String uripath)的作用是什么？</b><br />　　<br />　　返回同一Server中指定的path对应的ServletContext对象,通过该对象可以实现与Server中的其他Context打交道。<br />　　<br />　　uripath必须是以"/"开始（该路径的含义是相对于整个Servlet文档的根路径，而不是当前ServletContext的根路径）。<br />　　<br />　　<b>Servlet生命周期是什么？</b><br />　　<br />　　一般的Servlet(GenericServlet,即与协议无关的Servlet)的生命周期：init() --&gt; GenericServlet.service(ServletRequest req, ServletResponse res) --&gt; destroy.<br />　　<br />　　HttpServlet的生命周期: init() --&gt; GenericServlet.service(ServletRequest req, ServletResponse res)---&gt; service(HttpServletRequest req, HttpServletResponse resp) --&gt; doXXXX()--&gt;destroy.<br />　　<br />　　<b>有没有必要重写GenericServlet.service()方法？</b><br />　　<br />　　对于HttpServlet来说没有必要。只需要重写它的doXXXX()方法就可以了。HttpServlet中service()方法会自动的根据用户请求类型把请求转发给相应的doXXXX()方法（例如doGet()方法）。<br />　　<br />　　<b>ServletRequest.getReader()和ServletRequest.getInputStream()如何使用？</b><br />　　<br />　　注意两个方法不能同时使用。<br />　　<br />　　ServletRequest.getRealPath(String path)方法已经不推荐使用。<br />　　<br />　　请使用ServletContext.getRealPath(String path)方法。<br />　　<br />　　<b>ServletResponse缺省的字符集(charset)是什么?</b><br /><br />　　ServletResponse缺省的字符集(charset)是ISO-8859-1,可以通过setContentType(java.lang.String)方法改变新的字符集。<br />　　<br />　　例如：setContentType("text/html; charset=Shift_JIS").<br />　　<br />　　关于字符集信息，可以浏览RFC 2045<br />　　<br />　　<b>HttpServletRequest.getRequestURI()和HttpServletRequest.getRequestURL()区别是什么?</b>　<br />　<br />　　request.getRequestURI() 返回值类似：/xuejava/requestdemo.jsp<br />　　<br />　　request.getRequestURL() 返回值类似：http://localhost:8080/xuejava/requestdemo.jsp<br />　　<br />　　<b>HttpServletRequest.encodeURL()和HttpServletRequest.encodeRedirectURL(()区别是什么?为什么要有两个不同的方法呢？</b><br />　　<br />　　当用URL-rewriting方式来管理Session的时候，需要用到以上的两个方法。<br />　　<br />　　两个方法的不同点是：两个方法确定是否需要包含session ID的逻辑不同。<br />　　<br />　　在调用HttpServletResponse.sendRedirect前，应该先调用encodeRedirectURL()方法，否则可能会丢失Sesssion信息。 ...<br />　　<br />　　<b>如何使你的Servlet或者JSP实现Single Thread Model?</b>　　<br /><br />　　对于Servlet实现javax.single.SingleThreadModel接口。<br />　　<br />　　对于JSP,在Page Directive中写如下的语句&lt;%@ page isThreadSafe="false" %&gt;<br />　　<br />　　JSP Tag 和 JSP XML-based Tag<br />　　<br />　　...<br />　　<br />　　<b>如何把某一个JSP Page定义成为Error Page?为什么要这样做？</b><br />　　<br />　　实现方法： &lt;%@ page isErrorPage="true" %&gt;<br />　　<br />　　为什么？ 因为需要获取Exception 对象（缺省情况下，在JSP Page中是不能直接使用“隐含对象” exception的）。<br />　　<br />　　<b>JSP Page的执行顺序是如何的？</b><br />　　<br />　　JSP Page的执行顺序如下：<br />　　<br />　　JSP Page Translation. JSP Page --&gt; Servlet source code.<br />　　JSP Page Compilation. Servlet source code --&gt; Servlet class.<br />　　Load Class(First time or the server restarted)<br />　　<br />　　Create instance(可能会很多次，如果JSP Page中声明了&lt;%@ page isThreadSafe="false" %&gt;)<br />　　<br />　　Call jspInit method（一般的JSP Page都没有重写这个方法，重写需要在声明语句段中）。<br />　　<br />　　Call _jspService method（类似与一般HttpServlet的doGet和doPost方法，但是可以同时用来处理Post和Getq请求）。<br />　　<br />　　Call jspDestroy method（Server在卸载Servet的时候，例如当Servlet很久没有使用的情况）。<br />　　<br />　　<b>JSP Page中有哪些隐含对象(Implicity Object)?各自的类型和作用是什么？</b><br />　　<br />　　request --<br />　　reponse --<br />　　session --<br />　　application --<br />　　out --<br />　　page --<br />　　pagecontext --<br />　　exception -- 只有在当前JSP Page为Error Page的时候才有效。<br />　　config --<br />　　<br />　　<b>&lt;jsp:include page="/foo/foo.jsp" %&gt; 和 &lt;@ include file="/foo/foo.jsp" %&gt;的区别是什么？</b><br />　　<br />　　&lt;jsp:include ... -- request time.<br />　　&lt;@ include ... -- Page translation time.<br />　　<br />　　<b>Servlets/JSP Container(Engine)有几种运行方式？</b><br />　　<br />　　Standalone<br />　　Tomcat standalone mode<br />　　In-process<br />　　Tomcat running inside Apache Web Server.<br />　　Out-of-process<br />　　Apache + mod_jk + Tomcat<br />　　<br />　　Servlet,Servlet开发人员，Servlet API, Servlet Container的关系是什么？<br />　　<br />　　Servlet,Servlet开发人员 ---&gt;Servlet API --&gt; Servlet Container<br />　　The parts of an HTTP message<br />　　<br />　　Message part Description<br />　　The initial line： Specifies the purpose of the request or response message<br />　　例子：GET /reports/sales/index.html HTTP/1.0<br />　　The header section:Specifies the meta-information, such as size, type, and encoding,<br />　　about the content of the message<br />　　A blank line:<br />　　An optional message body: The main content of the request or response message<br />　　<br />　　下面是一个Response的例子：<br />　　<br />　　HTTP/1.0 200 OK<br />　　Date: Tue, 01 Dec 2001 23:59:59 GMT<br />　　Content-Type: text/html<br />　　Content-Length: 52<br />　　<br />　　&lt;html&gt;<br />　　&lt;body&gt;<br />　　&lt;h1&gt;Hello, John!&lt;/h1&gt;<br />　　&lt;/body&gt;<br />　　&lt;/html&gt;<br />　　<br />　　<b>HTTP规范中定义了哪些方法？各自有什么用途？</b><br />　　<br />　　GET<br />　　HEAD<br />　　POST<br />　　从 Http 1.1规范开始，增加了以下的方法:<br />　　<br />　　PUT<br />　　OPTIONS<br />　　TRACE<br />　　DELETE<br />　　CONNECT<br />　　<br />　　ServetRequest中为什么要定义:getContentType(),getContentLength()方法。<br />　　<br />　　根据HTTP协议规范，Request 和 Response一样也有这些必不可少的内容！<br />　　<br />　　所以需要首先了解 HTTP Message的概念和其内容的格式，这些东西对于Request和Reponse是一样的。<br />　　<br />　　对于GET方式发送的请求，其内容类型为：null<br />　　<br />　　对于POST方式发送的请求，其内容类型为：application/x-www-form-urlencoded<br />　　<br />　　POST方式发送请求的内容类似于：username=xuejava.<br />　　<br />　　RequestDispatcher.forward()和HttpServletResponse.sendRedirect()的区别是什么？<br />　　<br />　　RequestDispatcher.forward()是在服务器端运行；HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成。<br />　　<br />　　所以RequestDispatcher.forward()对于浏览器来说是“透明的”；而HttpServletResponse.sendRedirect()则不是。<br />　　<br />　　另外，还要注意RequestDispatcher.forward()在调用的时候Response不能已经Commit了（Response.isCommitted()）。<br />　　<br />　　ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)的区别是什么？为什么？<br />　　<br />　　ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径；而ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。<br />　　<br />　　因为ServletRequest具有相对路径的概念；而ServletContext对象无次概念。<br />　　<br />　　<b>如何把请求转移到另外一个Web App中的某个地址？</b><br />　　<br />　　ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)只能把请求转移到同一个Web App中的地址。<br />　　<br />　　如果需要把请求转移到另外一个Web App中的某个地址，可以按下面的做法：<br />　　<br />　　1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)).<br />　　<br />　　2. 调用ServletContext.getRequestDispatcher(String url)方法。<img src ="http://www.blogjava.net/konhon/aggbug/37160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-24 10:53 <a href="http://www.blogjava.net/konhon/archive/2006/03/24/37160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Session详解 </title><link>http://www.blogjava.net/konhon/archive/2006/03/24/37153.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 24 Mar 2006 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/24/37153.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/37153.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/24/37153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/37153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/37153.html</trackback:ping><description><![CDATA[<strong>一、术语session<br /></strong>在我的经验里，session这个词被滥用的程度大概仅次于transaction，更加有趣的是transaction与session在某些语境下的含义是相同的。<br /><br />session，中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一个浏览器会话期间，...”，这里的会话一词用的就是其本义，是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是“用户（客户端）在一次会话期间”这样一句话，它可能指用户的一系列动作（一般情况下是同某个具体目的相关的一系列动作，比如从登录到选购商品到结账登出这样一个网上购物的过程，有时候也被称为一个transaction），然而有时候也可能仅仅是指一次连接，也有可能是指含义①，其中的差别只能靠上下文来推断②。<br /><br />然而当session一词与网络协议相关联时，它又往往隐含了“面向连接”和/或“保持状态”这样两个含义， “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道，比如打电话，直到对方接了电话通信才能开始，与此相对的是写信，在你把信发出去的时候你并不能确认对方的地址是否正确，通信渠道不一定能建立，但对发信人来说，通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来，使得消息之间可以互相依赖，比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者 “一个POP3 session”③。<br /><br />而到了web服务器蓬勃发展的时代，session在web开发语境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构，如“把xxx保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持，所以在某种特定语言的语境下，session也被用来指代该语言的解决方案，比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。<br /><br />鉴于这种混乱已不可改变，本文中session一词的运用也会根据上下文有不同的含义，请大家注意分辨。<br />在本文中，使用中文“浏览器会话期间”来表达含义①，使用“session机制”来表达含义④，使用“session”表达含义⑤，使用具体的“HttpSession”来表达含义⑥<br /><br /><b>二、HTTP协议与状态保持</b><br />HTTP 协议本身是无状态的，这与HTTP协议本来的目的是相符的，客户端只需要简单的向服务器请求下载某些文件，无论是客户端还是服务器都没有必要纪录彼此过去的行为，每一次请求之间都是独立的，好比一个顾客和一个自动售货机或者一个普通的（非会员制）大卖场之间的关系一样。<br /><br />然而聪明（或者贪心？）的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用，就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为，另一方面在服务器端则出现了CGI规范以响应客户端的动态请求，作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。<br /><br />让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠，然而一次性消费5杯咖啡的机会微乎其微，这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案：<br />1、该店的店员很厉害，能记住每位顾客的消费数量，只要顾客一走进咖啡店，店员就知道该怎么对待了。这种做法就是协议本身支持状态。<br />2、发给顾客一张卡片，上面记录着消费的数量，一般还有个有效期限。每次消费时，如果顾客出示这张卡片，则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。<br />3、发给顾客一张会员卡，除了卡号之外什么信息也不纪录，每次消费时，如果顾客出示该卡片，则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。<br /><br />由于HTTP协议是无状态的，而出于种种考虑也不希望使之成为有状态的，因此，后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案，而session机制采用的是在服务器端保持状态的方案。同时我们也看到，由于采用服务器端保持状态的方案在客户端也需要保存一个标识，所以session机制可能需要借助于cookie机制来达到保存标识的目的，但实际上它还有其他选择。<br /><br /><b>三、理解cookie机制</b><br />cookie机制的基本原理就如上面的例子一样简单，但是还有几个问题需要解决：“会员卡”如何分发；“会员卡”的内容；以及客户如何使用“会员卡”。<br /><br />正统的cookie分发是通过扩展HTTP协议来实现的，服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。<br /><br />而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie，如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置，则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示，如果某家分店还发行了自己的会员卡，那么进这家店的时候除了要出示麦当劳的会员卡，还要出示这家店的会员卡。<br /><br />cookie的内容主要包括：名字，值，过期时间，路径和域。<br />其中域可以指定某一个域比如.google.com，相当于总店招牌，比如宝洁公司，也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com，可以用飘柔来做比。<br />路径就是跟在域名后面的URL路径，比如/或者/foo等等，可以用某飘柔专柜做比。<br />路径与域合在一起就构成了cookie的作用范围。<br />如果不设置过期时间，则表示这个cookie的生命期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里，当然这种行为并不是规范规定的。如果设置了过期时间，浏览器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie仍然有效直到超过设定的过期时间。<br /><br />存储在硬盘上的cookie 可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存里的cookie，不同的浏览器有不同的处理方式。对于IE，在一个打开的窗口上按 Ctrl-N（或者从文件菜单）打开的窗口可以与原窗口共享，而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie；对于 Mozilla Firefox0.8，所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。<br /><br />下面就是一个goolge设置cookie的响应头的例子<br /><pre class="overflow">HTTP/1.1 302 Found<br />Location: http://www.google.com/intl/zh-CN/<br />Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com<br />Content-Type: text/html</pre><br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235649_MdbyYrtKVN.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235718_CZMAULRUCN.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />浏览器在再次访问goolge的资源时自动向外发送cookie<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235746_TgiVaUuZME.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />用Firefox可以很容易的观察现有的cookie的值<br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235812_qtRvksXzxP.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />IE也可以设置在接受cookie前询问<br /><br /><b>四、理解session机制</b><br /><br />session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构（也可能就是使用散列表）来保存信息。<br /><br />当程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id，如果已包含一个session id则说明以前已经为此客户端创建过session，服务器就按照session id把这个 session检索出来使用（如果检索不到，可能会新建一个），如果客户端请求不包含session id，则为此客户端创建一个session并且生成一个与此session相关联的session id，session id的值应该是一个既不会重复，又不容易被找到规律以仿造的字符串，这个 session id将被在本次响应中返回给客户端保存。<br /><br />保存这个session id的方式可以采用cookie，这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID，而。比如weblogic对于web应用程序生成的cookie，JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764，它的名字就是 JSESSIONID。<br /><br />由于cookie可以被人为的禁止，必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写，就是把session id直接附加在URL路径的后面，附加方式也有两种，一种是作为URL路径的附加信息，表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />另一种是作为查询字符串附加在URL后面，表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />这两种方式对于用户来说是没有区别的，只是服务器在解析的时候处理的方式不同，采用第一种方式也有利于把session id的信息和正常程序参数区分开来。<br />为了在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session id。<br /><br />另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session id传递回服务器。比如下面的表单<br /><pre class="overflow">&lt;form name="testform" action="/xxx"&gt;<br />&lt;input type="text"&gt;<br />&lt;/form&gt;</pre><br /><br />在被传递给客户端之前将被改写成<br /><pre class="overflow">&lt;form name="testform" action="/xxx"&gt;<br />&lt;input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"&gt;<br />&lt;input type="text"&gt;<br />&lt;/form&gt;</pre><br /><br />这种技术现在已较少应用，笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。<br />实际上这种技术可以简单的用对action应用URL重写来代替。<br /><br />在谈论session机制的时候，常常听到这样一种误解“只要关闭浏览器，session就消失了”。其实可以想象一下会员卡的例子，除非顾客主动对店家提出销卡，否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的，除非程序通知服务器删除一个session，否则服务器会一直保留，程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭，因此服务器根本不会有机会知道浏览器已经关闭，之所以会有这种错觉，是大部分session机制都使用会话cookie来保存session id，而关闭浏览器后这个 session id就消失了，再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求头，把原来的session id发送给服务器，则再次打开浏览器仍然能够找到原来的session。<br /><br />恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为seesion设置了一个失效时间，当距离客户端上一次使用session的时间超过这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。<br /><br /><b>五、理解javax.servlet.http.HttpSession</b><br />HttpSession是Java平台对session机制的实现规范，因为它仅仅是个接口，具体到每个web应用服务器的提供商，除了对规范支持之外，仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。<br /><br />首先，Weblogic Server提供了一系列的参数来控制它的HttpSession的实现，包括使用cookie的开关选项，使用URL重写的开关选项，session持久化的设置，session失效时间的设置，以及针对cookie的各种设置，比如设置cookie的名字、路径、域， cookie的生存时间等。<br /><br />一般情况下，session都是存储在内存里，当服务器进程被停止或者重启的时候，内存里的session也会被清空，如果设置了session的持久化特性，服务器就会把session保存到硬盘上，当服务器进程重新启动或这些信息将能够被再次使用， Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。<br /><br />复制严格说来不算持久化保存，因为session实际上还是保存在内存里，不过同样的信息被复制到各个cluster内的服务器进程中，这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。<br /><br />cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。<br /><br />cookie的路径对于web应用程序来说是一个非常重要的选项，Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。<br /><br />关于session的设置参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869<br /><br /><b>六、HttpSession常见问题</b><br />（在本小节中session的含义为⑤和⑥的混合）<br /><br />1、session在何时被创建<br />一个常见的误解是以为session在有客户端访问时就被创建，然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建，注意如果JSP没有显示的使用 &lt;% @page session="false"%&gt; 关闭session，则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。<br /><br />由于session会消耗内存资源，因此，如果不打算使用session，应该在所有的JSP中关闭它。<br /><br />2、session何时被删除<br />综合前面的讨论，session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止（非持久session）<br /><br />3、如何做到在浏览器关闭时删除session<br />严格的讲，做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作，然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。<br /><br />4、有个HttpSessionListener是怎么回事<br />你可以创建这样的listener去监控session的创建和销毁事件，使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener，而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener，HttpSessionActivationListener和 HttpSessionAttributeListener。<br /><br />5、存放在session中的对象必须是可序列化的吗<br />不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象，在session销毁时会有一个Exception，很奇怪。<br /><br />6、如何才能正确的应付客户端禁止cookie的可能性<br />对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL，具体做法参见[6]<br />http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770<br /><br />7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session<br />参见第三小节对cookie的讨论，对session来说是只认id不认人，因此不同的浏览器，不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。<br /><br />8、如何防止用户打开两个浏览器窗口操作导致的session混乱<br />这个问题与防止表单多次提交是类似的，可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端，同时保存在session里，客户端提交表单时必须把这个id也返回服务器，程序首先比较返回的id与保存在session里的值是否一致，如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口，一般不设置这个id，或者使用单独的id，以防主窗口无法操作，建议不要再window.open打开的窗口里做修改操作，这样就可以不用设置。<br /><br />9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue<br />做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变，需要向其他服务器进程复制新的session值。<br /><br />10、为什么session不见了<br />排除session正常失效的因素之外，服务器本身的可能性应该是微乎其微的，虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过；浏览器插件的可能性次之，笔者也遇到过3721插件造成的问题；理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。<br />出现这一问题的大部分原因都是程序的错误，最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。<br /><br /><b>七、跨应用程序的session共享</b><br /><br />常常有这样的情况，一个大项目被分割成若干小项目开发，为了能够互不干扰，要求每个小项目作为一个单独的web应用程序开发，可是到了最后突然发现某几个小项目之间需要共享一些信息，或者想使用session来实现SSO(single sign on)，在session中保存login的用户信息，最自然的要求是应用程序间能够访问彼此的session。<br /><br />然而按照Servlet规范，session的作用范围应该仅仅限于当前应用程序下，不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范，但是实现的细节却可能各有不同，因此解决跨应用程序session共享的方法也各不相同。<br /><br />首先来看一下Tomcat是如何实现web应用程序之间session的隔离的，从 Tomcat设置的cookie路径来看，它对不同的应用程序设置的cookie路径是不同的，这样不同的应用程序所用的session id是不同的，因此即使在同一个浏览器窗口里访问不同的应用程序，发送给服务器的session id也可以是不同的。<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235848_ApHWDSAInh.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235854_enWszyCQxX.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />根据这个特性，我们可以推测Tomcat中session的内存结构大致如下。<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235909_sNDpkQLtDg.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />笔者以前用过的iPlanet也采用的是同样的方式，估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器，解决的思路很简单，实际实行起来也不难。要么让所有的应用程序共享一个session id，要么让应用程序能够获得其他应用程序的session id。<br /><br />iPlanet中有一种很简单的方法来实现共享一个session id，那就是把各个应用程序的cookie路径都设为/（实际上应该是/NASApp，对于应用程序来讲它的作用相当于根）。<br /><pre class="overflow">&lt;session-info&gt;<br />&lt;path&gt;/NASApp&lt;/path&gt;<br />&lt;/session-info&gt;</pre><br /><br />需要注意的是，操作共享的session应该遵循一些编程约定，比如在session attribute名字的前面加上应用程序的前缀，使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo")，以防止命名空间冲突，导致互相覆盖。<br /><br />在Tomcat中则没有这么方便的选择。在Tomcat版本3上，我们还可以有一些手段来共享session。对于版本4以上的Tomcat，目前笔者尚未发现简单的办法。只能借助于第三方的力量，比如使用文件、数据库、JMS或者客户端cookie，URL参数或者隐藏字段等手段。<br /><br />我们再看一下Weblogic Server是如何处理session的。<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235920_OFuZWKrUSy.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235929_VqyJhESxZq.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/，这是不是意味着在Weblogic Server中默认的就可以共享session了呢？然而一个小实验即可证明即使不同的应用程序使用的是同一个session，各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_03_12_235953_LogterrCRh.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />对于这样一种结构，在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量，比如使用文件、数据库、JMS或者客户端 cookie，URL参数或者隐藏字段等手段，还有一种较为方便的做法，就是把一个应用程序的session放到ServletContext中，这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下，<br /><br />应用程序A<br /><pre class="overflow">context.setAttribute("appA", session); </pre><br /><br />应用程序B<br /><pre class="overflow">contextA = context.getContext("/appA");<br />HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); </pre><br /><br />值得注意的是这种用法不可移植，因为根据ServletContext的JavaDoc，应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值，以上做法在Weblogic Server 8.1中通过。<br /><br />那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢？原来是为了SSO，凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点，修改首先登录的那个应用程序的描述符weblogic.xml，把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录，即使是反过来，先访问cookie路径为/的应用程序，再访问修改过路径的这个，虽然不再提示登录，但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM，因为浏览器和web服务器对basic认证方式有其他的处理方式，第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization，你可以修改所附的示例程序来做这些试验。<br /><br /><b>八、总结</b><br />session机制本身并不复杂，然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器，服务器的经验当作普遍适用的经验，而是始终需要具体情况具体分析。<br />摘要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。<img src ="http://www.blogjava.net/konhon/aggbug/37153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-24 10:35 <a href="http://www.blogjava.net/konhon/archive/2006/03/24/37153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet容器工作原理（一）</title><link>http://www.blogjava.net/konhon/archive/2006/03/24/37134.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 24 Mar 2006 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/24/37134.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/37134.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/24/37134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/37134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/37134.html</trackback:ping><description><![CDATA[<em>编者注:本文和同系列的前面一文“基于Java的Web服务器工作原理”，都摘自“Tomcat 运行内幕”一书（一本有关 Tomcat 的教程）。在阅读本文前，最好先阅读前文，以巩固基础信息。在此，将介绍如何建立两个 servlet 容器。 随附本书的应用程序可以下载 ，如果您有兴趣，可以在近段时间内到 作者网站 下载</em>。<br /><br />　　本文介绍一个简单 servlet 容器的基本原理。现有两个 servlet 容器，第一个很简单，第二个则是根据第一个写出。为了使第一个容器尽量简单，所以没有做得很完整。复杂一些的 servlet 容器 （包括 TOMCAT 4 和 5） 在 TOMCAT 运行内幕的其他章节有介绍。 <br /><br />　　两个 servlet 容器都处理简单的 servlet 及 staticResource 。您可以使用 webroot/ 目录下的 PrimitiveServlet 来测试它。复杂一些的 servlet会超出这些容器的容量，您可以从 TOMCAT  运行内幕 一书学习创建复杂的 servlet 容器。 <br /><br />　　两个应用程序的类都封装在ex02.pyrmont 包下。在理解应用程序如何运作之前，您必须熟悉 javax.servlet.Servlet 接口。首先就来介绍这个接口。随后，就介绍 servlet 容器服务servlet 的具体内容。<br /><br /><br />　　<b>javax.servlet.Servlet 接口</b><br /><br />　　servlet 编程，需要引用以下两个类和接口：javax.servlet 和 javax.servlet.http，在这些类和接口中，javax.servlet.Servlet接口尤为重要。所有的 servlet 必须实现这个接口或继承已实现这个接口的类。<br />　　Servlet 接口有五个方法，如下：<br /><br /><pre class="overflow">&amp;#8226; public void init(ServletConfig config) throws ServletException<br />&amp;#8226; public void service(ServletRequest request, ServletResponse response)  throws ServletException, java.io.IOException<br />&amp;#8226; public void destroy()<br />&amp;#8226; public ServletConfig getServletConfig()<br />&amp;#8226; public java.lang.String getServletInfo()</pre><br /><br />　　init、service和 destroy  方法是 Servlet 生命周期的方法。当 Servlet 类实例化后，容器加载 init，以通知 servlet 它已进入服务行列。init 方法必须被加载，Servelt 才能接收和请求。如果要载入数据库驱动程序、初始化一些值等等，程序员可以重写这个方法。在其他情况下，这个方法一般为空。<br /><br />　　service 方法由 Servlet 容器调用，以允许 Servlet 响应一个请求。Servlet 容器传递 javax.servlet.ServletRequest 对象和 javax.servlet.ServletResponse 对象。ServletRequest 对象包含客户端 HTTP 请求信息，ServletResponse 则封装servlet 响应。这两个对象，您可以写一些需要 servlet 怎样服务和客户怎样请求的代码。 <br /><br />　　从 service 中删除 Servlet 实例之前，容器调用 destroy 方法。在 servlet 容器关闭或servlet 容器需要更多的内存时，就调用它。这个方法只有在servlet 的service 方法内的所有线程都退出的时候，或在超时的时候才会被调用。在 servlet 容器调用 destroy方法之后，它将不再调用 servlet的 service方法。destroy 方法给了 servlet 机会，来清除所有候住的资源（比如：内存，文件处理和线程），以确保在内存中所有的持续状态和 servlet的当前状态是同步的。Listing 2.1 包含了PrimitiveServlet 的代码，此servlet非常简单，您 可以用它来测试本文中的 servlet 容器应用程序。<br /><br />　　PrimitiveServlet 类实现了javax.servlet.Servlet 并提供了五个servlet方法的接口 。它做的事情也很简单：每次调用 init,service 或 destroy方法的时候，servlet就向控制口写入方法名。service 方法也从ServletResponsec对象中获得java.io.PrintWriter 对象，并发送字符串到浏览器。<br /><br /><pre class="overflow">Listing 2.1.PrimitiveServlet.java<br />import javax.servlet.*;<br />import java.io.IOException;<br />import java.io.PrintWriter;<br /><br />public class PrimitiveServlet implements Servlet {<br />    public void init(ServletConfig config) throws ServletException {<br />        System.out.println("init");<br />    }<br /><br />    public void service(ServletRequest request, ServletResponse  response) throws ServletException, IOException {<br />        System.out.println("from service");<br />        PrintWriter out = response.getWriter();<br />        out.println("Hello.Roses are red.");<br />        out.print("Violets are blue.");<br />    }<br /><br />    public void destroy() {<br />        System.out.println("destroy");<br />    }<br /><br />    public String getServletInfo() {<br />        return null;<br />    }<br /><br />    public ServletConfig getServletConfig() {<br />        return null;<br />    }<br />}</pre><br /><br /><br />　　<b>Application 1</b><br /><br />　　现在，我们从 servlet容器的角度来看看 servlet 编程。一个功能健全的 servlet容器对于每个 servlet 的 HTTP请求会完成以下事情：<br /><br />&amp;#8226; 当 servlet 第一次被调用的时候，加载了 servlet类并调用它的init方法（仅调用一次） <br />&amp;#8226; 响应每次请求的时候 ，构建一个javax.servlet.ServletRequest 和 javax.servlet.ServletResponse实例。<br />&amp;#8226; 激活 servlet 的 service 方法，传递 ServletRequest 和 ServletResponse 对象。 <br />&amp;#8226; 当 servlet 类关闭的时候，调用 servlet 的destroy 方法，并卸载 servlet 类。 <br /><br />　　发生在 servlet 容器内部的事就复杂多了。只是这个简单的 servlet 容器的功能不很健全，所以，这它只能运行非常简单的servelt ，并不能调用 servlet 的 init 和destroy 方法。然而，它也执行了以下动作：<br /><br />&amp;#8226; 等待  HTTP 请求。 <br />&amp;#8226; 构建 ServletRequest 和  ServletResponse 对象  <br />&amp;#8226; 如果请求的是一个staticResource，就会激活StaticResourceProcessor实例的 process方法，传递ServletRequest 和 ServletResponse 对象。 <br />&amp;#8226; 如果请求的是一个servlet ,载入该类，并激活它的service 方法，传递ServletRequest 和ServletResponse 对象。注意：在这个servlet 容器，每当 servlet被请求的时候该类就被载入。 <br /><br />　　在第一个应用程序中，servlet容器由六个类组成 。<br /><br />&amp;#8226; HttpServer1 <br />&amp;#8226; Request <br />&amp;#8226; Response <br />&amp;#8226; StaticResourceProcessor <br />&amp;#8226; ServletProcessor1 <br />&amp;#8226; Constants <br /><br />　　正如前文中的应用程序一样，这个程序的进入口（静态 main 方法）是HttpServer 类。这个方法创建了HttpServer实例，并调用它的await方法。这个方法等待 HTTP 请示，然后创建一个 request 对象和 response对象，根据请求是否是staticResource还是 servlet 来分派它们到 StaticResourceProcessor实例或ServletProcessor实例。<br /><br />　　Constants 类包含 static find WEB_ROOT，它是从其他类引用的。 WEB_ROOT 指明 PrimitiveServlet 位置 和容器服务的staticResource。<br />HttpServer1 实例等待 HTTP 请求，直到它收到一个 shutdown 命令。发布 shutdown命令和前文是一样的。<br /><br />　　这个应用程序中的每一个类将在下节介绍。<br /><img src ="http://www.blogjava.net/konhon/aggbug/37134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-24 09:29 <a href="http://www.blogjava.net/konhon/archive/2006/03/24/37134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库乱码解决方案</title><link>http://www.blogjava.net/konhon/archive/2006/03/23/36961.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Thu, 23 Mar 2006 00:06:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/23/36961.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/36961.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/23/36961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/36961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/36961.html</trackback:ping><description><![CDATA[<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">你插入数据的时候，用<br /><img id="Codehighlighter1_11_52_Open_Image" onclick="this.style.display='none'; Codehighlighter1_11_52_Open_Text.style.display='none'; Codehighlighter1_11_52_Closed_Image.style.display='inline'; Codehighlighter1_11_52_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_11_52_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_52_Closed_Text.style.display='none'; Codehighlighter1_11_52_Open_Image.style.display='inline'; Codehighlighter1_11_52_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_11_52_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
				<span id="Codehighlighter1_11_52_Open_Text">
						<span style="COLOR: #008000">/**</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />* 转变字符串的乱码函数<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />* </span>
						<span style="COLOR: #808080">@param</span>
						<span style="COLOR: #008000"> str<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />* </span>
						<span style="COLOR: #808080">@return</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> String getStr(String str)<br /><img id="Codehighlighter1_87_248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_248_Open_Text.style.display='none'; Codehighlighter1_87_248_Closed_Image.style.display='inline'; Codehighlighter1_87_248_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_87_248_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_248_Closed_Text.style.display='none'; Codehighlighter1_87_248_Open_Image.style.display='inline'; Codehighlighter1_87_248_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_87_248_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_87_248_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_92_209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_209_Open_Text.style.display='none'; Codehighlighter1_92_209_Closed_Image.style.display='inline'; Codehighlighter1_92_209_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_92_209_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_209_Closed_Text.style.display='none'; Codehighlighter1_92_209_Open_Image.style.display='inline'; Codehighlighter1_92_209_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">try</span>
						<span id="Codehighlighter1_92_209_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_92_209_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String temp_p </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> str;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #0000ff">byte</span>
								<span style="COLOR: #000000"> [] temp_t </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> temp_p.getBytes(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">ISO8859-1</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String temp </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> String(temp_t);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> temp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_229_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_229_246_Open_Text.style.display='none'; Codehighlighter1_229_246_Closed_Image.style.display='inline'; Codehighlighter1_229_246_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_229_246_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_246_Closed_Text.style.display='none'; Codehighlighter1_229_246_Open_Image.style.display='inline'; Codehighlighter1_229_246_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">catch</span>
						<span style="COLOR: #000000">(Exception e)</span>
						<span id="Codehighlighter1_229_246_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_229_246_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">null</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">向bean里面赋值</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_300_332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_332_Open_Text.style.display='none'; Codehighlighter1_300_332_Closed_Image.style.display='inline'; Codehighlighter1_300_332_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_300_332_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_300_332_Closed_Text.style.display='none'; Codehighlighter1_300_332_Open_Image.style.display='inline'; Codehighlighter1_300_332_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setAction(String action) </span>
				<span id="Codehighlighter1_300_332_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_300_332_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.action </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> getStr(action);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_384_428_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_428_Open_Text.style.display='none'; Codehighlighter1_384_428_Closed_Image.style.display='inline'; Codehighlighter1_384_428_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_384_428_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_384_428_Closed_Text.style.display='none'; Codehighlighter1_384_428_Open_Image.style.display='inline'; Codehighlighter1_384_428_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setAddmanagerid(String addmanagerid) </span>
				<span id="Codehighlighter1_384_428_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_384_428_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.addmanagerid </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> getStr(addmanagerid);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />转换一下，看看可以吗，我的数据库是ORACLE没问题。</span>
		</div><img src ="http://www.blogjava.net/konhon/aggbug/36961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-23 08:06 <a href="http://www.blogjava.net/konhon/archive/2006/03/23/36961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java编程电子书籍下载 </title><link>http://www.blogjava.net/konhon/archive/2006/03/21/36685.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Tue, 21 Mar 2006 12:27:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/21/36685.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/36685.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/21/36685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/36685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/36685.html</trackback:ping><description><![CDATA[<span class="content">Java编程电子书籍下载<br /><br /><br />环境安装配置：<br /><br />TOMCAT的配置<br /><a href="http://download.chinaitlab.com/soft/10791.htm" target="_blank">http://download.chinaitlab.com/soft/10791.htm</a><br /><br />JAVA配置文件编写说明文档<br /><a href="http://download.chinaitlab.com/soft/10010.htm" target="_blank">http://download.chinaitlab.com/soft/10010.htm</a><br /><br />一步一步学会配置Kjava开发环境<br /><a href="http://download.chinaitlab.com/soft/9483.htm" target="_blank">http://download.chinaitlab.com/soft/9483.htm</a><br /><br />Weblogic7开发EJB的配置<br /><a href="http://download.chinaitlab.com/soft/4938.htm" target="_blank">http://download.chinaitlab.com/soft/4938.htm</a><br /><br />图解JSP环境安装配置<br /><a href="http://download.chinaitlab.com/soft/2157.htm" target="_blank">http://download.chinaitlab.com/soft/2157.htm</a><br /><br />Tomcat配置方法<br /><a href="http://download.chinaitlab.com/soft/931.htm" target="_blank">http://download.chinaitlab.com/soft/931.htm</a><br /><br />全程指导Linux下JAVA环境配置<br /><a href="http://download.chinaitlab.com/soft/11272.htm" target="_blank">http://download.chinaitlab.com/soft/11272.htm</a><br /><br />学习方法：<br /><br />通过JB4学习JAVA<br /><a href="http://download.chinaitlab.com/soft/7589.htm" target="_blank">http://download.chinaitlab.com/soft/7589.htm</a><br /><br />10步学习 JavaScript<br /><a href="http://download.chinaitlab.com/soft/6492.htm" target="_blank">http://download.chinaitlab.com/soft/6492.htm</a><br /><br /><a title="Java" href="http://www.blogjava.net/konhon/category/3016.html" target="_blank">Java</a> Sctipt学习不求人<br /><a href="http://download.chinaitlab.com/soft/6361.htm" target="_blank">http://download.chinaitlab.com/soft/6361.htm</a><br /><br />JSP学习指南<br /><a href="http://download.chinaitlab.com/soft/6152.htm" target="_blank">http://download.chinaitlab.com/soft/6152.htm</a><br /><br />JAVA学习文档<br /><a href="http://download.chinaitlab.com/soft/6114.htm" target="_blank">http://download.chinaitlab.com/soft/6114.htm</a><br /><br />J2EE学习笔记<br /><a href="http://download.chinaitlab.com/soft/6048.htm" target="_blank">http://download.chinaitlab.com/soft/6048.htm</a><br /><br />JavaScript学习<br /><a href="http://download.chinaitlab.com/soft/3029.htm" target="_blank">http://download.chinaitlab.com/soft/3029.htm</a><br /><br />Java2 学习指南<br /><a href="http://download.chinaitlab.com/soft/2743.htm" target="_blank">http://download.chinaitlab.com/soft/2743.htm</a><br /><br />Juniper学习指南<br /><a href="http://download.chinaitlab.com/soft/2227.htm" target="_blank">http://download.chinaitlab.com/soft/2227.htm</a><br /><br />J2EE学习资料<br /><a href="http://download.chinaitlab.com/soft/1618.htm" target="_blank">http://download.chinaitlab.com/soft/1618.htm</a><br /><br />JSP由浅入深<br /><a href="http://download.chinaitlab.com/soft/1315.htm" target="_blank">http://download.chinaitlab.com/soft/1315.htm</a><br /><br />面向对象编程：<br /><br />Java面向对象编程指南<br /><a href="http://download.chinaitlab.com/soft/9792.htm" target="_blank">http://download.chinaitlab.com/soft/9792.htm</a><br /><br />JAVA的核心技术：面向对象编程<br /><a href="http://download.chinaitlab.com/soft/9093.htm" target="_blank">http://download.chinaitlab.com/soft/9093.htm</a><br /><br />Java 与 UML 面向对象程序设计<br /><a href="http://download.chinaitlab.com/soft/6053.htm" target="_blank">http://download.chinaitlab.com/soft/6053.htm</a><br /><br />Java 2 编程21天自学通<br /><a href="http://download.chinaitlab.com/soft/10507.htm" target="_blank">http://download.chinaitlab.com/soft/10507.htm</a><br /><br />J2EE编程起步<br /><a href="http://download.chinaitlab.com/soft/10506.htm" target="_blank">http://download.chinaitlab.com/soft/10506.htm</a><br /><br />Java面向对象编程指南<br /><a href="http://download.chinaitlab.com/soft/9792.htm" target="_blank">http://download.chinaitlab.com/soft/9792.htm</a><br /><br />Java专业编程指南<br /><a href="http://download.chinaitlab.com/soft/9791.htm" target="_blank">http://download.chinaitlab.com/soft/9791.htm</a><br /><br />Java服务器高级编程<br /><a href="http://download.chinaitlab.com/soft/9790.htm" target="_blank">http://download.chinaitlab.com/soft/9790.htm</a><br /><br />J2EE EAI编程指南<br /><a href="http://download.chinaitlab.com/soft/9784.htm" target="_blank">http://download.chinaitlab.com/soft/9784.htm</a><br /><br />J2MEMIDP无线设备编程指南<br /><a href="http://download.chinaitlab.com/soft/9765.htm" target="_blank">http://download.chinaitlab.com/soft/9765.htm</a><br /><br />JAVA编程思想 中文版<br /><a href="http://download.chinaitlab.com/soft/9481.htm" target="_blank">http://download.chinaitlab.com/soft/9481.htm</a><br /><br />Java XML编程指南<br /><a href="http://download.chinaitlab.com/soft/9097.htm" target="_blank">http://download.chinaitlab.com/soft/9097.htm</a><br /><br />Java 数据库编程宝典<br /><a href="http://download.chinaitlab.com/soft/9095.htm" target="_blank">http://download.chinaitlab.com/soft/9095.htm</a><br /><br />JAVA的核心技术：面向对象编程<br /><a href="http://download.chinaitlab.com/soft/9093.htm" target="_blank">http://download.chinaitlab.com/soft/9093.htm</a><br /><br />JDBC API数据库编程实作教材<br /><a href="http://download.chinaitlab.com/soft/9087.htm" target="_blank">http://download.chinaitlab.com/soft/9087.htm</a><br /><br />核心 JSF 编程<br /><a href="http://download.chinaitlab.com/soft/7946.htm" target="_blank">http://download.chinaitlab.com/soft/7946.htm</a><br /><br />JAVA 2应用编程150例<br /><a href="http://download.chinaitlab.com/soft/6815.htm" target="_blank">http://download.chinaitlab.com/soft/6815.htm</a><br /><br />JAVA数据库编程JDBC<br /><a href="http://download.chinaitlab.com/soft/6113.htm" target="_blank">http://download.chinaitlab.com/soft/6113.htm</a><br /><br />深入掌握J2EE编程技术<br /><a href="http://download.chinaitlab.com/soft/6030.htm" target="_blank">http://download.chinaitlab.com/soft/6030.htm</a><br /><br />实用J2EE设计模式编程指南<br /><a href="http://download.chinaitlab.com/soft/5033.htm" target="_blank">http://download.chinaitlab.com/soft/5033.htm</a><br /><br />Java for Internet编程技术<br /><a href="http://download.chinaitlab.com/soft/4198.htm" target="_blank">http://download.chinaitlab.com/soft/4198.htm</a><br /><br />Java安全性编程指南<br /><a href="http://download.chinaitlab.com/soft/3773.htm" target="_blank">http://download.chinaitlab.com/soft/3773.htm</a><br /><br />J2ME无线设备编程<br /><a href="http://download.chinaitlab.com/soft/3669.htm" target="_blank">http://download.chinaitlab.com/soft/3669.htm</a><br /><br />J2EE EJB编程实例<br /><a href="http://download.chinaitlab.com/soft/3141.htm" target="_blank">http://download.chinaitlab.com/soft/3141.htm</a><br /><br />Java编程思想 第三版<br /><a href="http://download.chinaitlab.com/soft/2982.htm" target="_blank">http://download.chinaitlab.com/soft/2982.htm</a><br /><br />Java 极限编程<br /><a href="http://download.chinaitlab.com/soft/1707.htm" target="_blank">http://download.chinaitlab.com/soft/1707.htm</a><br /><br />Java2编程详解<br /><a href="http://download.chinaitlab.com/soft/1705.htm" target="_blank">http://download.chinaitlab.com/soft/1705.htm</a><br /><br /><br />网络编程：<br /><br />J2EE网络编程标准教程<br /><a href="http://download.chinaitlab.com/soft/9100.htm" target="_blank">http://download.chinaitlab.com/soft/9100.htm</a><br /><br />Java网络编程实例<br /><a href="http://download.chinaitlab.com/soft/9090.htm" target="_blank">http://download.chinaitlab.com/soft/9090.htm</a><br /><br />Java P2P网络编程技术<br /><a href="http://download.chinaitlab.com/soft/6333.htm" target="_blank">http://download.chinaitlab.com/soft/6333.htm</a><br /><br />Java网络编程<br /><a href="http://download.chinaitlab.com/soft/3871.htm" target="_blank">http://download.chinaitlab.com/soft/3871.htm</a><br /><br />网络编程基础篇之 Java Script<br /><a href="http://download.chinaitlab.com/soft/3618.htm" target="_blank">http://download.chinaitlab.com/soft/3618.htm</a><br /><br />Solaris Shell 编程<br /><a href="http://download.chinaitlab.com/soft/6426.htm" target="_blank">http://download.chinaitlab.com/soft/6426.htm</a><br /><br />SUN Solaris管理手册<br /><a href="http://download.chinaitlab.com/soft/5732.htm" target="_blank">http://download.chinaitlab.com/soft/5732.htm</a><br /><br />Solaris性能管理<br /><a href="http://download.chinaitlab.com/soft/11247.htm" target="_blank">http://download.chinaitlab.com/soft/11247.htm</a><br /><br />Solaris9安装指南<br /><a href="http://download.chinaitlab.com/soft/5022.htm" target="_blank">http://download.chinaitlab.com/soft/5022.htm</a><br /><br />SOLARIS高级系统管理员指南<br /><a href="http://download.chinaitlab.com/soft/3726.htm" target="_blank">http://download.chinaitlab.com/soft/3726.htm</a><br /><br />Solaris操作环境安全<br /><a href="http://download.chinaitlab.com/soft/1500.htm" target="_blank">http://download.chinaitlab.com/soft/1500.htm</a><br /><br />Solaris GNOME2.0桌面用户指南<br /><a href="http://download.chinaitlab.com/soft/1488.htm" target="_blank">http://download.chinaitlab.com/soft/1488.htm</a><br /><br />Solaris 9 12/03 安装指南<br /><a href="http://download.chinaitlab.com/soft/1484.htm" target="_blank">http://download.chinaitlab.com/soft/1484.htm</a><br /><br />Solaris管理员指南<br /><a href="http://download.chinaitlab.com/soft/1475.htm" target="_blank">http://download.chinaitlab.com/soft/1475.htm</a><br /><br />中文Solaris9 系统管理员指南<br /><a href="http://download.chinaitlab.com/soft/1463.htm" target="_blank">http://download.chinaitlab.com/soft/1463.htm</a><br /><br />Solaris安全性专题指导<br /><a href="http://download.chinaitlab.com/soft/746.htm" target="_blank">http://download.chinaitlab.com/soft/746.htm</a><br /><br /><br />XML系列：<br /><br />Java XML编程指南<br /><a href="http://download.chinaitlab.com/soft/9097.htm" target="_blank">http://download.chinaitlab.com/soft/9097.htm</a><br /><br />Java程序设计EJB、XML与数据库<br /><a href="http://download.chinaitlab.com/soft/9094.htm" target="_blank">http://download.chinaitlab.com/soft/9094.htm</a><br /><br />XML 终极教程<br /><a href="http://download.chinaitlab.com/soft/9057.htm" target="_blank">http://download.chinaitlab.com/soft/9057.htm</a><br /><br />Java&amp;XML应用<br /><a href="http://download.chinaitlab.com/soft/6211.htm" target="_blank">http://download.chinaitlab.com/soft/6211.htm</a><br /><br />XML_JAVA指南<br /><a href="http://download.chinaitlab.com/soft/6163.htm" target="_blank">http://download.chinaitlab.com/soft/6163.htm</a><br /><br />JDBC：<br /><br />JDBC API数据库编程实作教材<br /><a href="http://download.chinaitlab.com/soft/9087.htm" target="_blank">http://download.chinaitlab.com/soft/9087.htm</a><br /><br />JAVA数据库编程JDBC<br /><a href="http://download.chinaitlab.com/soft/6113.htm" target="_blank">http://download.chinaitlab.com/soft/6113.htm</a><br /><br />JDBC API 参考教程第三版<br /><a href="http://download.chinaitlab.com/soft/6057.htm" target="_blank">http://download.chinaitlab.com/soft/6057.htm</a><br /><br />JDBC与Java数据库程序设计<br /><a href="http://download.chinaitlab.com/soft/6018.htm" target="_blank">http://download.chinaitlab.com/soft/6018.htm</a><br /><br />Java语言SQL接口 JDBCprogram<br /><a href="http://download.chinaitlab.com/soft/5938.htm" target="_blank">http://download.chinaitlab.com/soft/5938.htm</a><br /><br />JSP应用程序开发指南<br /><a href="http://download.chinaitlab.com/soft/1546.htm" target="_blank">http://download.chinaitlab.com/soft/1546.htm</a><br /><br />用 JDBC 管理数据库连接<br /><a href="http://download.chinaitlab.com/soft/935.htm" target="_blank">http://download.chinaitlab.com/soft/935.htm</a><br /><br />JDO：<br /><br />全面了解JDO数据库编程<br /><a href="http://download.chinaitlab.com/soft/7992.htm" target="_blank">http://download.chinaitlab.com/soft/7992.htm</a><br /><br />Struts：<br /><br />Struts中文手册<br /><a href="http://download.chinaitlab.com/soft/10516.htm" target="_blank">http://download.chinaitlab.com/soft/10516.htm</a><br /><br />Struts架构指导<br /><a href="http://download.chinaitlab.com/soft/7529.htm" target="_blank">http://download.chinaitlab.com/soft/7529.htm</a><br /><br />精通struts技术<br /><a href="http://download.chinaitlab.com/soft/6801.htm" target="_blank">http://download.chinaitlab.com/soft/6801.htm</a><br /><br />Struts 学习起歩问答<br /><a href="http://download.chinaitlab.com/soft/6156.htm" target="_blank">http://download.chinaitlab.com/soft/6156.htm</a><br /><br />Hibernate：<br /><br />Hibernate2.1.2参考手册中文版<br /><a href="http://download.chinaitlab.com/soft/8919.htm" target="_blank">http://download.chinaitlab.com/soft/8919.htm</a><br /><br /><br /><br />JAVA与模式\J2EE模式：<br /><br />J2EE 核心模式<br /><a href="http://download.chinaitlab.com/soft/9785.htm" target="_blank">http://download.chinaitlab.com/soft/9785.htm</a><br /><br />Java 企业设计模式<br /><a href="http://download.chinaitlab.com/soft/9096.htm" target="_blank">http://download.chinaitlab.com/soft/9096.htm</a><br /><br />Java简单工厂创立性模式介绍<br /><a href="http://download.chinaitlab.com/soft/7398.htm" target="_blank">http://download.chinaitlab.com/soft/7398.htm</a><br /><br />EJB设计模式<br /><a href="http://download.chinaitlab.com/soft/6135.htm" target="_blank">http://download.chinaitlab.com/soft/6135.htm</a><br /><br />JAVA设计模式<br /><a href="http://download.chinaitlab.com/soft/6112.htm" target="_blank">http://download.chinaitlab.com/soft/6112.htm</a><br /><br />实用J2EE设计模式编程指南<br /><a href="http://download.chinaitlab.com/soft/5033.htm" target="_blank">http://download.chinaitlab.com/soft/5033.htm</a><br /><br />Java与模式<br /><a href="http://download.chinaitlab.com/soft/3073.htm" target="_blank">http://download.chinaitlab.com/soft/3073.htm</a><br /><br />设计模式Java版<br /><a href="http://download.chinaitlab.com/soft/1723.htm" target="_blank">http://download.chinaitlab.com/soft/1723.htm</a><br /><br /><br />JBuilder开发Servlet及JSP：<br /><br />精通JBuilder<br /><a href="http://download.chinaitlab.com/soft/10565.htm" target="_blank">http://download.chinaitlab.com/soft/10565.htm</a><br /><br />JBuilder速成资料<br /><a href="http://download.chinaitlab.com/soft/9714.htm" target="_blank">http://download.chinaitlab.com/soft/9714.htm</a><br /><br />Jbuilder7和weblogic7整合开发手<br /><a href="http://download.chinaitlab.com/soft/9664.htm" target="_blank">http://download.chinaitlab.com/soft/9664.htm</a><br /><br />JBUILDER9 软件开发项目实践<br /><a href="http://download.chinaitlab.com/soft/9089.htm" target="_blank">http://download.chinaitlab.com/soft/9089.htm</a><br /><br />JbuilderX开发指南<br /><a href="http://download.chinaitlab.com/soft/9088.htm" target="_blank">http://download.chinaitlab.com/soft/9088.htm</a><br /><br />Jbuilder x 指南<br /><a href="http://download.chinaitlab.com/soft/7984.htm" target="_blank">http://download.chinaitlab.com/soft/7984.htm</a><br /><br />JBuilder4开发人员指南<br /><a href="http://download.chinaitlab.com/soft/5939.htm" target="_blank">http://download.chinaitlab.com/soft/5939.htm</a><br /><br />JBuilder7 Weblogic7整和开发培训手册<br /><a href="http://download.chinaitlab.com/soft/4727.htm" target="_blank">http://download.chinaitlab.com/soft/4727.htm</a><br /><br />JBuilder开发数据库应用程序<br /><a href="http://download.chinaitlab.com/soft/1701.htm" target="_blank">http://download.chinaitlab.com/soft/1701.htm</a><br /><br />Java开发指南--Servlets和JSP篇<br /><a href="http://download.chinaitlab.com/soft/9793.htm" target="_blank">http://download.chinaitlab.com/soft/9793.htm</a><br /><br />Java Servlets 编程指南<br /><a href="http://download.chinaitlab.com/soft/9098.htm" target="_blank">http://download.chinaitlab.com/soft/9098.htm</a><br /><br />Oreilly Java Servlet<br /><a href="http://download.chinaitlab.com/soft/6522.htm" target="_blank">http://download.chinaitlab.com/soft/6522.htm</a><br /><br />Java Servlet开发与实例<br /><a href="http://download.chinaitlab.com/soft/6029.htm" target="_blank">http://download.chinaitlab.com/soft/6029.htm</a><br /><br />深入Java Servlet 网络编程<br /><a href="http://download.chinaitlab.com/soft/9783.htm" target="_blank">http://download.chinaitlab.com/soft/9783.htm</a><br /><br />用JSP_Servlet构建三层式管理信息系统<br /><a href="http://download.chinaitlab.com/soft/6034.htm" target="_blank">http://download.chinaitlab.com/soft/6034.htm</a><br /><br />Java Servlet帮助文档<br /><a href="http://download.chinaitlab.com/soft/2981.htm" target="_blank">http://download.chinaitlab.com/soft/2981.htm</a><br /><br />JSP网站编程教程<br /><a href="http://download.chinaitlab.com/soft/11256.htm" target="_blank">http://download.chinaitlab.com/soft/11256.htm</a><br /><br />JSP语法分析<br /><a href="http://download.chinaitlab.com/soft/11257.htm" target="_blank">http://download.chinaitlab.com/soft/11257.htm</a><br /><br />JSP实用教程<br /><a href="http://download.chinaitlab.com/soft/10792.htm" target="_blank">http://download.chinaitlab.com/soft/10792.htm</a><br /><br />JSP语法（1）--HTML注释<br /><a href="http://download.chinaitlab.com/soft/10790.htm" target="_blank">http://download.chinaitlab.com/soft/10790.htm</a><br /><br />JSP应用开发详解<br /><a href="http://download.chinaitlab.com/soft/10025.htm" target="_blank">http://download.chinaitlab.com/soft/10025.htm</a><br /><br />JSP技术揭秘<br /><a href="http://download.chinaitlab.com/soft/9387.htm" target="_blank">http://download.chinaitlab.com/soft/9387.htm</a><br /><br />JSP技术大全<br /><a href="http://download.chinaitlab.com/soft/9388.htm" target="_blank">http://download.chinaitlab.com/soft/9388.htm</a><br /><br />JSP网上书店实例详解<br /><a href="http://download.chinaitlab.com/soft/9386.htm" target="_blank">http://download.chinaitlab.com/soft/9386.htm</a><br /><br />JSP动态网页新技术<br /><a href="http://download.chinaitlab.com/soft/8920.htm" target="_blank">http://download.chinaitlab.com/soft/8920.htm</a><br /><br />JSP 技术大全<br /><a href="http://download.chinaitlab.com/soft/7782.htm" target="_blank">http://download.chinaitlab.com/soft/7782.htm</a><br /><br />JSP高级开发与应用<br /><a href="http://download.chinaitlab.com/soft/7633.htm" target="_blank">http://download.chinaitlab.com/soft/7633.htm</a><br /><br />JSP 完全探索<br /><a href="http://download.chinaitlab.com/soft/7546.htm" target="_blank">http://download.chinaitlab.com/soft/7546.htm</a><br /><br />JSP 高级开发与应用<br /><a href="http://download.chinaitlab.com/soft/7116.htm" target="_blank">http://download.chinaitlab.com/soft/7116.htm</a><br /><br />JSP编程技巧<br /><a href="http://download.chinaitlab.com/soft/7114.htm" target="_blank">http://download.chinaitlab.com/soft/7114.htm</a><br /><br />JSP速成教程<br /><a href="http://download.chinaitlab.com/soft/6882.htm" target="_blank">http://download.chinaitlab.com/soft/6882.htm</a><br /><br />JSP网络编程技术<br /><a href="http://download.chinaitlab.com/soft/6880.htm" target="_blank">http://download.chinaitlab.com/soft/6880.htm</a><br /><br />JSP程序设计指南<br /><a href="http://download.chinaitlab.com/soft/6690.htm" target="_blank">http://download.chinaitlab.com/soft/6690.htm</a><br /><br />最新JSP入门与应用<br /><a href="http://download.chinaitlab.com/soft/6697.htm" target="_blank">http://download.chinaitlab.com/soft/6697.htm</a><br /><br />JSP快速入门<br /><a href="http://download.chinaitlab.com/soft/6636.htm" target="_blank">http://download.chinaitlab.com/soft/6636.htm</a><br /><br />JSP网页编程<br /><a href="http://download.chinaitlab.com/soft/6527.htm" target="_blank">http://download.chinaitlab.com/soft/6527.htm</a><br /><br />JSP 实用教程<br /><a href="http://download.chinaitlab.com/soft/6334.htm" target="_blank">http://download.chinaitlab.com/soft/6334.htm</a><br /><br />JSP入门与提高<br /><a href="http://download.chinaitlab.com/soft/6326.htm" target="_blank">http://download.chinaitlab.com/soft/6326.htm</a><br /><br />JSP语法<br /><a href="http://download.chinaitlab.com/soft/6116.htm" target="_blank">http://download.chinaitlab.com/soft/6116.htm</a><br /><br />掌握自定义JSP标签<br /><a href="http://download.chinaitlab.com/soft/6096.htm" target="_blank">http://download.chinaitlab.com/soft/6096.htm</a><br /><br />JSP 动态网站技术入门与提高<br /><a href="http://download.chinaitlab.com/soft/6019.htm" target="_blank">http://download.chinaitlab.com/soft/6019.htm</a><br /><br />JSP实例入门<br /><a href="http://download.chinaitlab.com/soft/4377.htm" target="_blank">http://download.chinaitlab.com/soft/4377.htm</a><br /><br />JSP教程之与数据库通信<br /><a href="http://download.chinaitlab.com/soft/3673.htm" target="_blank">http://download.chinaitlab.com/soft/3673.htm</a><br /><br />如何成为优秀的JSP 程序员<br /><a href="http://download.chinaitlab.com/soft/3002.htm" target="_blank">http://download.chinaitlab.com/soft/3002.htm</a><br /><br />JSP数据库编程指南<br /><a href="http://download.chinaitlab.com/soft/2946.htm" target="_blank">http://download.chinaitlab.com/soft/2946.htm</a><br /><br />JSP 高级编程<br /><a href="http://download.chinaitlab.com/soft/2635.htm" target="_blank">http://download.chinaitlab.com/soft/2635.htm</a><br /><br />JSP实用编程实例集锦<br /><a href="http://download.chinaitlab.com/soft/2154.htm" target="_blank">http://download.chinaitlab.com/soft/2154.htm</a><br /><br />JSP程序设计精彩实例<br /><a href="http://download.chinaitlab.com/soft/2151.htm" target="_blank">http://download.chinaitlab.com/soft/2151.htm</a><br /><br />JSP即时应用<br /><a href="http://download.chinaitlab.com/soft/1547.htm" target="_blank">http://download.chinaitlab.com/soft/1547.htm</a><br /><br />JSP程序设计精彩实例<br /><a href="http://download.chinaitlab.com/soft/1543.htm" target="_blank">http://download.chinaitlab.com/soft/1543.htm</a><br /><br />JSP实用编程实例集锦<br /><a href="http://download.chinaitlab.com/soft/1537.htm" target="_blank">http://download.chinaitlab.com/soft/1537.htm</a><br /><br />JSP基础<br /><a href="http://download.chinaitlab.com/soft/894.htm" target="_blank">http://download.chinaitlab.com/soft/894.htm</a><br /><br />Eclipse开发Servlet及JSP：<br /><br />Eclipse+Tomcat集成开发servle<br /><a href="http://download.chinaitlab.com/soft/6134.htm" target="_blank">http://download.chinaitlab.com/soft/6134.htm</a><br /><br />J2EE Jboss Ejb With Eclipse 2003<br /><a href="http://download.chinaitlab.com/soft/6045.htm" target="_blank">http://download.chinaitlab.com/soft/6045.htm</a></span><img src ="http://www.blogjava.net/konhon/aggbug/36685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-21 20:27 <a href="http://www.blogjava.net/konhon/archive/2006/03/21/36685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何运行后缀不是jsp的jsp文件？</title><link>http://www.blogjava.net/konhon/archive/2006/03/21/36674.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Tue, 21 Mar 2006 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/21/36674.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/36674.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/21/36674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/36674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/36674.html</trackback:ping><description><![CDATA[<p>需要在你的web.xml中定义如下：</p>
		<p>    &lt;servlet&gt;<br />        &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />        &lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;fork&lt;/param-name&gt;<br />            &lt;param-value&gt;false&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;xpoweredBy&lt;/param-name&gt;<br />            &lt;param-value&gt;false&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />    &lt;/servlet&gt;</p>
		<p>    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;*.jsm&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;<br /></p><img src ="http://www.blogjava.net/konhon/aggbug/36674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-21 18:37 <a href="http://www.blogjava.net/konhon/archive/2006/03/21/36674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 默認首頁</title><link>http://www.blogjava.net/konhon/archive/2006/03/21/36592.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Tue, 21 Mar 2006 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/21/36592.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/36592.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/21/36592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/36592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/36592.html</trackback:ping><description><![CDATA[我的主页在自设的目录里如  e:/mysite/  <br />我想用tomcat作为服务器  <br />键入<a href="http://127.0.0.1/" target="_blank">http://127.0.0.1</a>就显示我在  e:/mysite/  下的index.jsp文件  <br />而不是诸如  <a href="http://127.0.0.1/site/  " target="_blank">http://127.0.0.1/site/  </a><br />请问如何设置  <br />---------------------------------------------------------------  <br /> <br />分2步：  <br />   1  把你的tomcat端口改为80  <br />   2。把你的文件放到webapps目录下的ROOT目录下，最好先把原来的文件备份一下，再删除  <br />         或者做个在tomcat上做虚拟主机，目录就可以随便设  <br />---------------------------------------------------------------  <br /> <br />修改  <br />tomcat_home/conf/server.xml  <br /> <br />將  <br />&lt;Connector  className="org.apache.coyote.tomcat4.CoyoteConnector"  port="8080"  minProcessors="5"  maxProcessors="75"  enableLookups="true"  redirectPort="8443"  acceptCount="100"  debug="0"  connectionTimeout="20000"  useURIValidationHack="false"  disableUploadTimeout="true"/&gt;  <br /> <br />這裡面的8080改成80  <br /> <br /> <br />添加  <br />&lt;Context  path=""  docBase="e:/mysite/"  <br />               debug="0"  privileged="true"&gt;  <br />&lt;/Context&gt;到  <br />&lt;/host&gt;  <br />之前。  <br /><img src ="http://www.blogjava.net/konhon/aggbug/36592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-21 11:42 <a href="http://www.blogjava.net/konhon/archive/2006/03/21/36592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE面试题集锦</title><link>http://www.blogjava.net/konhon/archive/2006/03/14/35163.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Tue, 14 Mar 2006 00:35:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/14/35163.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/35163.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/14/35163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/35163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/35163.html</trackback:ping><description><![CDATA[<P>/**<BR>&nbsp;* By metaphy 2005-11-12<BR>&nbsp;* Version: 0.01<BR>&nbsp;* 注:题目答案来源于metaphy过去的知识或网络,metaphy不能保证其正确或完整性,仅供参考<BR>**/</P>
<P><STRONG>一、基础问答</STRONG></P>
<P>　　<STRONG>1.下面哪些类可以被继承?</STRONG></P>
<P>　　　java.lang.Thread (T)<BR>　　　java.lang.Number (T)<BR>　　　java.lang.Double (F)<BR>　　　java.lang.Math&nbsp; (F)<BR>　　　java.lang.Void&nbsp; (F)<BR>　　　java.lang.Class&nbsp; (F)<BR>　　　java.lang.ClassLoader (T)</P>
<P>　　<STRONG>2.抽象类和接口的区别</STRONG></P>
<P>　　(1)接口可以被多重implements,抽象类只能被单一extends<BR>　　(2)接口只有定义,抽象类可以有定义和实现<BR>　　(3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)</P>
<P>　　<STRONG>3.Hashtable的原理,并说出HashMap与Hashtable的区别</STRONG></P>
<P>　　HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.<BR>HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.</P>
<P>　　<STRONG>4.forward和redirect的区别</STRONG></P>
<P>　　forward: an internal transfer in servlet<BR>　　redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等</P>
<P>　　<STRONG>5.什么是Web容器?</STRONG></P>
<P>　　实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.</P>
<P>　　6.解释下面关于J2EE的名词</P>
<P>　　(1)JNDI:Java Naming &amp; Directory Interface,JAVA命名目录服务.主要提供的功能是：提供一个目录系统，让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能.<BR>　　(2)JMS：Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.<BR>　　(3)JTA：Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.<BR>　　(4)JAF: <A title=Java HREF="/konhon/category/3016.html" target=_blank><a title="Java" href="http://www.blogjava.net/konhon/category/3016.html" target="_blank">Java</a></A> Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.<BR>　　(5)RMI:Remote Method Interface,远程方法调用</P>
<P>　　<STRONG>7.EJB是基于哪些技术实现的？并说 出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别.</STRONG></P>
<P>　　EJB包括Session Bean、Entity Bean、Message Driven Bean，基于JNDI、RMI、JAT等技术实现.</P>
<P>　　SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个由现有企业应用程序实现的实体.</P>
<P>　　Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行，不同的是 Stateful Session Bean 可以记录呼叫者的状态，因此通常来说，一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫 Stateless Session Bean 的时候，EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之，很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时，会是同一个 Bean 的 Instance 在执行.从内存方面来看， Stateful Session Bean 与 Stateless Session Bean 比较， Stateful Session Bean 会消耗 J2EE Server 较多的内存，然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.</P>
<P>　　<STRONG>8.XML的解析方法</STRONG></P>
<P>　　Sax,DOM,JDOM</P>
<P>　　<STRONG>9.什么是Web Service?</STRONG></P>
<P>　　Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。<BR>Web Service所使用的是Internet上统一、开放的标准，如HTTP、XML、SOAP（简单对象访问协议）、WSDL等，所以Web Service可以在任何支持这些标准的环境（Windows,Linux）中使用。</P>
<P>　　注：SOAP协议（Simple Object Access Protocal,简单对象访问协议）,它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下，软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性，这有助于大量异构程序和平台之间的互操作性，从而使存在的应用程序能够被广泛的用户访问。</P>
<P>　　优势：</P>
<P>　　(1).跨平台。<BR>　　(2).SOAP协议是基于XML和HTTP这些业界的标准的，得到了所有的重要公司的支持。<BR>　　(3).由于使用了SOAP，数据是以ASCII文本的方式而非二进制传输，调试很方便；并且由于这样，它的数据容易通过防火墙，不需要防火墙为了程序而单独开一个“漏洞”。<BR>　　(4).此外，WebService实现的技术难度要比CORBA和DCOM小得多。<BR>　　(5).要实现B2B集成，EDI比较完善与比较复杂；而用WebService则可以低成本的实现，小公司也可以用上。<BR>　　(6).在C/S的程序中，WebService可以实现网页无整体刷新的与服务器打交道并取数。</P>
<P>　　缺点：</P>
<P>　　(1).WebService使用了XML对数据封装，会造成大量的数据要在网络中传输。<BR>　　(2).WebService规范没有规定任何与实现相关的细节，包括对象模型、编程语言，这一点，它不如CORBA。</P>
<P>　　<STRONG>10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?</STRONG></P>
<P>　　答：多线程有两种实现方法，分别是继承Thread类与实现Runnable接口<BR>　　同步的实现方面有两种，分别是synchronized,wait与notify</P>
<P>　　<STRONG>11.JSP中动态INCLUDE与静态INCLUDE的区别？</STRONG> </P>
<P>　　动态INCLUDE用jsp:include动作实现</P>
<P>&lt;jsp:include page="included.jsp" flush="true"/&gt;</P>
<P>　　它总是会检查所含文件中的变化，适合用于包含动态页面，并且可以带参数</P>
<P>　　静态INCLUDE用include伪码实现,定不会检查所含文件的变化，适用于包含静态页面</P>
<P>　　&lt;%@ include file="included.htm" %&gt;</P><img src ="http://www.blogjava.net/konhon/aggbug/35163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-14 08:35 <a href="http://www.blogjava.net/konhon/archive/2006/03/14/35163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何直接在浏览器内运行SQL命令</title><link>http://www.blogjava.net/konhon/archive/2006/03/13/35045.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Mon, 13 Mar 2006 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/13/35045.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/35045.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/13/35045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/35045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/35045.html</trackback:ping><description><![CDATA[本文示范了如何用一个Java Servlet、一个JSP页面和一个静态Java类构造出一个SQL网关应用。利用这个应用，你可以直接在浏览器内执行SQL命令，浏览器将把SQL命令提交给远程服务器上的数据库系统，然后返回结果。 <BR><BR>　　如果你正在使用ISP（Internet Service Provider）提供的数据库，可能已经熟悉SQL网关应用的概念了。有的ISP会提供一个操作数据库的HTML页面，就象本文提供的网关应用一样。如果ISP没有提供这样的界面，你可以把本文的程序上载到服务器，以后要访问ISP服务器上的数据库就很方便了。 <BR><BR>　　SQL网关应用不仅可以用于开发过程，而且还可以直接提供给比较熟悉系统的最终用户使用。当然，允许最终用户直接在数据库上运行SQL命令会带来一些安全隐患，应当慎重考虑。 <BR><BR>　　本文要求读者具备一定的Java、Servlet、JSP和数据库的基础知识，如果要运行本文的程序，还要有一个Servlet/JSP服务器和数据库服务器。在下面的说明中，我们要使用的是Tomcat 4.0和MySQL，但它应该也能在其他JSP/Servlet容器中运行；如果你要改用MySQL之外的其他数据库，只要提供一个适当的驱动程序，然后修改数据库连接字符串就可以了。 <BR><BR>　　<B>一、用户界面</B> <BR><BR>　　图1就是本文SQL网关的用户界面。在这个界面中，SQL网关已经执行了一条SQL命令并返回了结果。 <BR><BR>
<CENTER><IMG src="http://www.computernews.com.cn/techimages/2004101401/248850.gif"> <BR><BR>图1：SQL网关的用户界面 </CENTER><BR><BR>　　从图1可以看出，页面底部的一条信息显示出最近执行的SQL命令影响的行数。如果SQL命令是一个SELECT语句，当SELECT语句执行成功，页面底部将用HTML表格显示出查询结果，如图二所示。 <BR><BR>
<CENTER><IMG src="http://www.computernews.com.cn/techimages/2004101401/248851.gif"> <BR><BR>图2：HTML表格显示出查询结果集</CENTER><BR><BR>　　当然，如果SQL命令执行失败，SQL网关将返回异常信息。 <BR><BR>　　<B>二、设计JSP页面</B> <BR><BR>　　在JSP页面中，我们首先放入一个Scriptlet，它的功能是从session对象提取两个属性： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>&lt;!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;
&lt;% 
   String sqlStatement=(String)session.getAttribute("sqlStatement");
   if (sqlStatement == null)    sqlStatement = "";
   String message =  (String) session.getAttribute("message");
   if (message == null)  message = "";
%&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　第一个属性sqlStatement 表示SQL命令字符串，第二个属性message 是包含结果信息的字符串。如果这两个属性的值是null，则表示它们尚未被设置，我们把sqlStatement和message变量设置成空字符串。 <BR><BR>　　JSP页面还有一个HTML表单，HTML表单包含一个文本区域（TEXTAREA）和一个“执行”按钮。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>&lt;form action="../servlet/test.SQLGatewayServlet" method="post"&gt;
&lt;b&gt;SQL命令:&lt;/b&gt;&lt;br&gt;
&lt;textarea name="sqlStatement" cols=60 rows=8&gt;
&lt;%=sqlStatement%&gt;&lt;/textarea&gt;&lt;br&gt;
&lt;br&gt;
&lt;input type="submit" value="执行"&gt;
&lt;/form&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　表单中的文本区域用来输入SQL命令。我们将sqlStatement变量的值作为文本区域的默认内容，文本区域的大小是宽60字符、高8行。当JSP页面第一次运行时，这个文本区域的内容为空。如果用户点击文本区域下面的“执行”按钮，JSP页面把表单内容提交给SQLGatewayServlet（稍后再详细介绍）。 <BR><BR>　　JSP页面底部的表格显示出message字符串的内容。如前所述，message的内容是运行SQL命令的结果。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>&lt;b&gt;SQL命令执行结果:&lt;/b&gt;&lt;br&gt;
&lt;table cellpadding="5" border="1"&gt;
&lt;%=message%&gt;
&lt;/table&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　<B>三、编写Servlet</B> <BR><BR>　　SQLGatewayServlet首先导入java.sql包以便使用JDBC类。另外，它还要声明一个Connection对象，以便Servlet之内的所有方法都可以使用数据库连接。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class SQLGatewayServlet extends HttpServlet{

    private Connection connection;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　当Servlet引擎开始运行这个Servlet，Servlet的init方法就打开一个数据库连接： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>public void init() throws ServletException{
    try{
        Class.forName("org.gjt.mm.mysql.Driver");
        String dbURL = "jdbc:mysql://localhost/murach";
        String username = "root";
        String password = "";
        connection = DriverManager.getConnection
	(dbURL, username, password);
    }
    catch(ClassNotFoundException e){
        System.out.println("找不到数据库驱动程序.");
    }
    catch(SQLException e){
        System.out.println("不能打开数据库连接: "
                           + e.getMessage());
    }
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　在这个例子中，Servlet利用一个MysQL数据库的驱动程序打开murach数据库的连接，数据库和Servlet运行在同一个服务器上。此外，Servlet使用MySQL的默认用户名字root，密码为空。不过，你可以修改这里的代码，只要有适当的驱动程序，就可以让Servlet连接到任何服务器上的任何数据库（有关MySQL数据库的更多信息，请参见www.mysql.com）。 <BR><BR>　　Servlet引擎关闭Servlet之前，调用destroy方法关闭数据库连接，释放连接资源： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>public void destroy() {
    try{
        connection.close();
    }
    catch(SQLException e){
        System.out.println("不能关闭数据库连接: " + e.getMessage());
    }
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　前面介绍的JSP页面要调用Servlet的doPost方法，doPost方法调用doGet方法： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
                   throws IOException, ServletException{
     doGet(request, response);
 }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　在doGet方法之中，第一个语句首先获取用户在JSP页面中输入的SQL命令，第二个语句声明message变量： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>public void doGet(HttpServletRequest request,
                   HttpServletResponse response)
                   throws IOException, ServletException{

     String sqlStatement = request.getParameter("sqlStatement");
     String message = "";</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　然后，在try块之内，第一个语句利用Connection对象创建Statement对象，接下来的两个语句利用String对象的trim方法和substring方法返回用户输入的SQL命令的前六个字符。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>try{
     Statement statement = connection.createStatement();
     sqlStatement = sqlStatement.trim();
     String sqlType = sqlStatement.substring(0, 6);</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　如果SQL命令的前六个字符是“select”，则利用Statement的executeQuery方法执行SQL语句，获得一个ResultSet对象，把这个对象传递给SQLUtil类（稍后详细说明）的getHtmlRows方法，getHtmlRows方法将把记录集中的记录格式化成HTML表格并返回。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>if  (sqlType.equalsIgnoreCase("select")){
     ResultSet resultSet = statement.executeQuery(sqlStatement);
     // 构造一个String，其中包含HTML表格形式的结果集数据
     message = SQLUtil.getHtmlRows(resultSet);
 }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　如果SQL语句的前六个字符不是“select”，则我们调用Statement对象的executeUpdate方法，executeUpdate方法返回当前操作影响的行数——如果这个数字是0，则该SQL命令是一个DDL命令，例如DROP TABLE或CREATE TABLE等；否则，则表明SQL命令可能是DML命令，如INSERT、UPDATE或DELETE命令。无论是哪一种SQL命令，我们都把message变量设置成相应的消息。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>else
     {
         int i = statement.executeUpdate(sqlStatement);
         if (i == 0) // 这是一个DDL命令
           message =
             "&lt;tr&gt;&lt;td&gt;" +
               "命令执行成功." +
             "&lt;/td&gt;&lt;/tr&gt;";
         else // 这是一个INSERT、UPDATE或DELETE命令
             message =
               "&lt;tr&gt;&lt;td&gt;" +
                 "SQL命令执行成功。&lt;br&gt;" +
                 "已更改" + i + " 行。" +
                "&lt;/td&gt;&lt;/tr&gt;";
     }
     statement.close();
 }</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　如果try块里面的任何一个语句抛出一个SQLException，catch块就设置message变量，使其包含有关该SQLException的信息。例如，如果在表单中输入的SQL命令语法错误，下面设置的message变量值将帮助你排解错误。 <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>catch(SQLException e){
    message = "&lt;tr&gt;&lt;td&gt;执行SQL命令时遇到错误：&lt;br&gt;"
            + e.getMessage() + "&lt;/tr&gt;&lt;/td&gt;";
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　在catch块之后，接下来的三个语句获得session对象，把sqlStatement和message变量设置为session的属性： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>HttpSession session = request.getSession();
 session.setAttribute("message", message);
 session.setAttribute("sqlStatement", sqlStatement);</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　接下来，最后两个语句创建一个RequestDispatcher，并转发request和response对象给前文介绍的JSP页面： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>RequestDispatcher dispatcher =
     getServletContext().getRequestDispatcher(
         "/sql/sql_gateway.jsp");
 dispatcher.forward(request, response);</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　<B>四、编写工具类</B> <BR><BR>　　下面来看看工具类SQLUtil的代码： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>package test;
import java.sql.*;
public class SQLUtil{</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　SQLUtil类包含一个getHtmlRows静态方法，前面的Servlet正是通过调用该方法将结果集格式化成HTML表格。getHtmlRows的输入参数是一个ResultSet对象，其返回值是一个String对象，这个String对象的内容是记录集的所有列表题和行的HTML代码。为了构造出这样一个String对象，getHtmlRows声明了一个名为htmlRows的StringBuffer对象，然后在方法执行过程中向这个StringBuffer对象追加数据。在getHtmlRows方法的末尾，我们用toString方法将StringBuffer的内容转换成String，最后将这个String返回给Servlet： <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>public static synchronized String getHtmlRows(ResultSet results)
throws SQLException{
    StringBuffer htmlRows = new StringBuffer();
    ResultSetMetaData metaData = results.getMetaData();
    int columnCount = metaData.getColumnCount();
    // 将记录集中列的名称作为HTML表格列的标题
    htmlRows.append("&lt;tr&gt;");
    for (int i = 1; i &lt;= columnCount; i++)
        htmlRows.append("&lt;td&gt;&lt;b&gt;" + metaData.getColumnName(i) + "&lt;/td&gt;");
    htmlRows.append("&lt;/tr&gt;");
    // 对于结果集中的每一行...
    while (results.next()){
        htmlRows.append("&lt;tr&gt;");
        // 将该行中的每一个列转换成一个表格单元
        for (int i = 1; i &lt;= columnCount; i++)
            htmlRows.append("&lt;td&gt;" + results.getString(i) + "&lt;/td&gt;");
    }
    htmlRows.append("&lt;/tr&gt;");
    return htmlRows.toString();
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>　　为了获得记录集对象的列标题，getHtmlRows方法利用ResultSet的getMetaData方法来创建一个ResultSetMetaData对象，ResultSetMetaData对象包含了有关记录集的描述信息，例如列的数量、列的名称可以分别调用ResultSetMetaData的getColumnCount和getColumnName方法获得。 <BR><BR>　　为了提取记录集的数据，getHtmlRows方法利用一个嵌套的循环，即while循环里面嵌套的for循环，来提取每一个行里面每一个列的值。在循环之内，我们用记录集的getString方法来获取各个字段的值，不管字段值原来的类型是什么，getString方法都会将它转换成String。 <BR><BR>　　请注意这个方法的声明中带有synchronized关键词，这是为了避免两个或两个以上的Servlet线程同时执行该方法。 <BR><img src ="http://www.blogjava.net/konhon/aggbug/35045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-13 15:30 <a href="http://www.blogjava.net/konhon/archive/2006/03/13/35045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP实现论坛树型结构的具体算法</title><link>http://www.blogjava.net/konhon/archive/2006/03/13/35044.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Mon, 13 Mar 2006 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/13/35044.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/35044.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/13/35044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/35044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/35044.html</trackback:ping><description><![CDATA[实现论坛树型结构的算法很多，我现在的JSP论坛采用的也是当中的一种：不用递归实现树型结构的算法，现在我将论坛树型结构的具体算法和大家介绍一下，和大家一起交流。
<P>&nbsp;</P>
<P>1、演示表的结构： </P>
<P>　　　表名：mybbslist <BR>　　　字段 　　　　数据类型　　说明 <BR>　　　BBSID　　　　自动编号 　 <BR>　　　RootID 　　　Int　　　　 根帖ID，本身为根帖则RootID = ID <BR>　　　FID　　　　　Int 　　　　父帖ID，上一层帖子的ID，如是根帖则FID = 0 <BR>　　　DEPTH　　　　Int 　　　　根帖Level=0，其他依据回复的深度递增 <BR>　　　BBSSubject 　Char　　　　主题 </P>
<P><BR>2。创建表： </P>
<P><BR>create table mybbslist ( <BR>　forumID int(20) not null, <BR>　bbsID int auto_increment primary key, <BR>　rootid int(20) not null, <BR>　fid int(20) not null, <BR>　depth int(20) not null, <BR>　userID int(20) not null, <BR>　bbsUser varchar(24) not null, <BR>　bbsSubject varchar(100) not null, <BR>　bbsContent text, <BR>　bbsTime varchar(30), <BR>　bbsRead int(20), <BR>　bbsReply int(20), <BR>INDEX forumID (forumID))&nbsp; </P>
<P>3、连接MYSQL数据库的BEAN </P>
<P><BR>package netzero; <BR>import java.sql.*; <BR>public class mydb <BR>{ <BR>String driverName = "org.gjt.mm.mysql.Driver"; <BR>Connection conn = null; <BR>Statement stmt = null; <BR>ResultSet rs = null; <BR>String connURL= "jdbc:mysql://localhost/mybbs?user=root&amp;password=how&amp;useUnicode=true&amp;characterEncode=8859_1"; <BR>//String connURL= "jdbc:mysql://localhost/netzerobbs?user=root&amp;password=how"; <BR>public mydb() <BR>{ <BR>try <BR>{ <BR>Class.forName(driverName); <BR>} <BR>catch (java.lang.ClassNotFoundException e) <BR>{ <BR>System.err.println("netzero(String): " + e.getMessage()); <BR>} <BR>} </P>
<P><BR>public ResultSet executeQuery(String sql) throws SQLException <BR>{ <BR>conn = DriverManager.getConnection(connURL); <BR>stmt = conn.createStatement(); <BR>rs = stmt.executeQuery(sql); <BR>return rs; <BR>} </P>
<P><BR>public boolean closeConn() <BR>{ <BR>try <BR>{ <BR>if (rs!=null) rs.close(); <BR>if (stmt!=null) stmt.close(); <BR>if (conn!=null) conn.close(); <BR>return true; <BR>} <BR>catch ( SQLException ex ) <BR>{ <BR>System.err.println("closeConn: " + ex.getMessage()); <BR>return false; <BR>} <BR>} </P>
<P><BR>} <BR>&nbsp;</P>
<P>4、显示论坛的JSP程序 </P>
<P><BR>&lt;jsp:useBean id="mybbs" scope="session" class="netzero.mydb" /&gt; <BR>&lt;%@ page contentType="text/html;charset=gb2312" %&gt; <BR>&lt;%@ page import="java.io.*" %&gt; <BR>&lt;%@ page import="java.sql.*" %&gt; <BR>&lt;% <BR>int intRowCount; <BR>out.print("显示论坛树形结构"); <BR>out.print("&lt;br&gt;&lt;br&gt;"); <BR>try { <BR>String sql="select * from mybbslist order by rootid desc,depth,fid,bbsid"; <BR>ResultSet rs = mybbs.executeQuery(sql); <BR>if (rs.next()) <BR>{ <BR>rs.last(); <BR>intRowCount=rs.getRow(); <BR>out.print("论坛树中有"); <BR>out.print(intRowCount); <BR>out.print("个叶子节点"); <BR>rs.first(); <BR>int j=0; <BR>int Depth = 0; <BR>out.print("&lt;ul&gt;"); <BR>while(j&lt;intRowCount) <BR>{ <BR>int rsDepth=rs.getInt("Depth"); <BR>if (rsDepth&lt;Depth) <BR>{ <BR>for(int i=1;i&lt;Depth+1;i=i+1) <BR>{ <BR>out.print("&lt;/ul&gt;"); <BR>} <BR>} <BR>rsDepth=rs.getInt("Depth"); <BR>if (rsDepth&gt;Depth) <BR>{ <BR>out.print("&lt;ul&gt;"); <BR>} <BR>out.print("&lt;li&gt;"); </P>
<P><BR>String bbssubject=rs.getString("bbssubject"); <BR>out.print(bbssubject); <BR>out.print("&lt;/li&gt;"); <BR>Depth = rs.getInt("Depth"); <BR>j=j+1; <BR>rs.next(); <BR>} <BR>out.print("&lt;/ul&gt;"); <BR>} <BR>else <BR>{ <BR>out.print("数据库中无记录"); <BR>} <BR>}catch (SQLException E) { <BR>out.println("SQLException: " + E.getMessage()); <BR>out.println("SQLState: " + E.getSQLState()); <BR>out.println("VendorError: " + E.getErrorCode()); <BR>} <BR>%&gt; <BR>&lt;% //关闭mysql连接 <BR>try { <BR>if(!mybbs.closeConn()); <BR>} catch (Exception ex) { <BR>System.err.println("closeConn: " + ex.getMessage()); <BR>} <BR>%&gt; <BR>&nbsp;<BR></P><img src ="http://www.blogjava.net/konhon/aggbug/35044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-13 15:26 <a href="http://www.blogjava.net/konhon/archive/2006/03/13/35044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将JSP在内存生成的图片显示到页</title><link>http://www.blogjava.net/konhon/archive/2006/03/13/35042.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Mon, 13 Mar 2006 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2006/03/13/35042.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/35042.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2006/03/13/35042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/35042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/35042.html</trackback:ping><description><![CDATA[<P>Imaging_ToWeb.jsp</P>
<P>&lt;%@ page autoFlush="false"&nbsp; import="java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.*"%&gt;<BR>&lt;%<BR>&nbsp;&nbsp;&nbsp; String ImageStr = request.getParameter("ID_Text");<BR>&nbsp;&nbsp;&nbsp; if(ImageStr==null || ImageStr.equals(""))<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("text/html; charset=gb2312");<BR>&nbsp;%&gt;<BR>&lt;HTML&gt;<BR>&nbsp;&lt;HEAD&gt;<BR>&nbsp; &lt;title&gt;Http://www.lionsky.net&lt;/title&gt;<BR>&nbsp; &lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<BR>&nbsp;&lt;/HEAD&gt;<BR>&nbsp;&lt;body&gt;<BR>&nbsp; &lt;form id="Form1" method="post"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;input type="text" id="ID_Text" name=ID_Text&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;input type=submit value="GO"&gt;<BR>&nbsp; &lt;/form&gt;<BR>&nbsp;&lt;/body&gt;<BR>&lt;/HTML&gt; </P>
<P>&lt;%<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.clear();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("image/jpeg");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.addHeader("pragma","NO-cache");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.addHeader("Cache-Control","no-cache");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.addDateHeader("Expries",0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int width=300, height=100;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics g = image.getGraphics();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //以下填充背景颜色<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(Color.lightGray);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.fillRect(0, 0, width, height);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String random="random";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //以下设置前景色<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(Color.BLACK);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString("<A href='http://www.knowsky.com",10,20/'><FONT color=#000000>Http://www.knowsky.com",10,20</FONT></A>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString("Author:Lion[lion-a@sohu.com]",10,40);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawLine(10,50,290,50);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString(ImageStr,10,70);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.dispose();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletOutputStream outStream = response.getOutputStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(outStream);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; encoder.encode(image);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outStream.close();<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>%&gt;<BR></P><img src ="http://www.blogjava.net/konhon/aggbug/35042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2006-03-13 15:23 <a href="http://www.blogjava.net/konhon/archive/2006/03/13/35042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java examples (example source code) </title><link>http://www.blogjava.net/konhon/archive/2005/09/09/12500.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 09 Sep 2005 00:37:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2005/09/09/12500.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/12500.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2005/09/09/12500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/12500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/12500.html</trackback:ping><description><![CDATA[Java examples (example source code) <BR><A href="http://www.java2s.com/ExampleCode/J2ME/CatalogJ2ME.htm"><BR>http://www.java2s.com/ExampleCode/J2ME/CatalogJ2ME.htm</A><img src ="http://www.blogjava.net/konhon/aggbug/12500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2005-09-09 08:37 <a href="http://www.blogjava.net/konhon/archive/2005/09/09/12500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet的重定向技术综述</title><link>http://www.blogjava.net/konhon/archive/2005/09/09/12497.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Fri, 09 Sep 2005 00:06:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2005/09/09/12497.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/12497.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2005/09/09/12497.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/12497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/12497.html</trackback:ping><description><![CDATA[<DIV class=forumcontent>有关JSP/Servlet的重定向技术综述如下[补充]<BR><BR>1.RequestDispatcher.forward()<BR>是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.<BR>但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.<BR><BR>重定向后浏览器地址栏URL不变.<BR><BR>例:在servlet中进行重定向<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doPost(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>throws&nbsp;ServletException,IOException<BR><IMG id=Codehighlighter1_112_327_Open_Image onclick="this.style.display='none'; Codehighlighter1_112_327_Open_Text.style.display='none'; Codehighlighter1_112_327_Closed_Image.style.display='inline'; Codehighlighter1_112_327_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_112_327_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_327_Closed_Text.style.display='none'; Codehighlighter1_112_327_Open_Image.style.display='inline'; Codehighlighter1_112_327_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_112_327_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_112_327_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>response.setContentType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html;&nbsp;charset=gb2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>ServletContext&nbsp;sc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;getServletContext();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>RequestDispatcher&nbsp;rd&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>rd&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sc.getRequestDispatcher(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/index.jsp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">定向的页面</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>rd.forward(request,&nbsp;response);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV><BR>通常在servlet中使用，不在jsp中使用。<BR><BR>2.response.sendRedirect()<BR>是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.<BR>重定向后在浏览器地址栏上会出现重定向页面的URL<BR>例:在servlet中重定向<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doPost(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>throws&nbsp;ServletException,IOException<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_114_210_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_210_Open_Text.style.display='none'; Codehighlighter1_114_210_Closed_Image.style.display='inline'; Codehighlighter1_114_210_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_114_210_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_210_Closed_Text.style.display='none'; Codehighlighter1_114_210_Open_Image.style.display='inline'; Codehighlighter1_114_210_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_114_210_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_114_210_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>response.setContentType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html;&nbsp;charset=gb2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>response.sendRedirect(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/index.jsp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>由于response是jsp页面中的隐含对象，故在jsp页面中可以用response.sendRedirect()直接实现重定位。<BR>注意：<BR>(1).使用response.sendRedirect时，前面不能有HTML输出。<BR>这并不是绝对的，不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制，一般在8K（我是说JSP　SERVER），这就意味着，除非你关闭了cache，或者你使用了out.flush()强制刷新，那么在使用sendRedirect之前，有少量的HTML输出也是允许的。<BR>(2).response.sendRedirect之后，应该紧跟一句return;<BR>我们已经知道response.sendRedirect是通过浏览器来做转向的，所以只有在页面处理完成后，才会有实际的动作。既然你已经要做转向了，那么后的输出还有什么意义呢？而且有可能会因为后面的输出导致转向失败。<BR>比较：<BR>(1).Request Dispatcher.forward()是容器中控制权的转向，在客户端浏览器地址栏中不会显示出转向后的地址；<BR>(2).response.sendRedirect()则是完全的跳转，浏览器将会得到跳转的地址，并重新发送请求链接。这样，从浏览器的地址栏中可以看到跳转后的链接地址。<BR>前者更加高效，在前者可以满足需要时，尽量使用RequestDispatcher.forward()方法.<BR><BR>注：在有些情况下，比如，需要跳转到一个其它服务器上的资源，则必须使用HttpServletResponse.sendRequest()方法。<BR><BR>3.<?xml:namespace prefix = jsp /><jsp:forward page=""></jsp:forward> <BR><BR>它的底层部分是由RequestDispatcher来实现的，因此它带有RequestDispatcher.forward()方法的印记。<BR><BR><BR>如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。<BR>另外要注意：它不能改变浏览器地址，刷新的话会导致重复提交<BR><BR>4.修改HTTP header的Location属性来重定向<BR>通过设置直接修改地址栏来实现页面的重定向。<BR>jsp文件代码如下：<BR><BR>＜%<BR>response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);<BR>String newLocn = "/newpath/jsa.jsp";<BR>response.setHeader("Location",newLocn);<BR>%＞<BR><BR>5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面<BR>在html文件中，下面的代码：<BR>
<META http-equiv=refresh content="300; url=target.jsp"><BR>它的含义：在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间，以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。<BR>由上可知，可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。<BR>关键代码：<BR>String content=stayTime+";URL="+URL;<BR>response.setHeader("REFRESH",content);<BR><BR>如果总结得不够全面，请各位发表自己的意见或经验。<BR></DIV></jsp:forward><img src ="http://www.blogjava.net/konhon/aggbug/12497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2005-09-09 08:06 <a href="http://www.blogjava.net/konhon/archive/2005/09/09/12497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP Error</title><link>http://www.blogjava.net/konhon/archive/2005/09/08/12443.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Thu, 08 Sep 2005 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2005/09/08/12443.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/12443.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2005/09/08/12443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/12443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/12443.html</trackback:ping><description><![CDATA[剛開始撰寫JSP時，總是會被JSP的除錯訊息所困擾，如果沒有稍微瞭解JSP與Servlet之間運作關係的初學者，所看到的只是一堆除錯訊息，甚至例外發生的訊息，這些訊息雖然包括詳細的錯誤訊息，但對於初學者而言卻是不友善、不易閱讀理解的。基本上，只要瞭解JSP與Servlet之間的運作關係，並瞭解Java編譯訊息與例外處理，要瞭解在撰寫JSP網頁時，因錯誤而產生的錯誤報告頁面就不是件難事。 <BR>
<P></P>我們知道JSP終究會轉換為Servlet，而運行時真正動作的是Servlet類，所以錯誤可能發生在兩個時候：一個是JSP轉換為 Servlet原始碼時，因為JSP語法錯誤而導致無法生成Servlet原始碼，或是已轉換為Servlet程式碼，但編譯時編譯器檢查出錯誤，這稱之為Translation Time Processing Errors；第二個錯誤發生的時期在於客戶請求執行Servlet時，因為程式邏輯或運行時未考慮到的錯誤而產生例外，這稱之為Client Request Time Processing Errors。 <BR>
<P></P>如何在JSP運行時判別錯誤發生的種類？如果錯誤報告頁面出現"....encountered an internal error...."，就有可能是轉換時期錯誤，或是"Generated servlet error: [javac] Compiling 1 source file...."，就有可能是編譯器在編譯Servlet程式碼時發現錯誤，這個時候您必須檢查一下JSP語法是否有錯誤，或是程式邏輯有明顯可讓編譯器檢查出的錯誤。 <BR><img src ="http://www.blogjava.net/konhon/aggbug/12443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2005-09-08 16:52 <a href="http://www.blogjava.net/konhon/archive/2005/09/08/12443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp+tomcat+mysql&amp;sevlet&amp;javabean配置全过程 [轉]</title><link>http://www.blogjava.net/konhon/archive/2005/08/10/9699.html</link><dc:creator>konhon 优华</dc:creator><author>konhon 优华</author><pubDate>Wed, 10 Aug 2005 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/konhon/archive/2005/08/10/9699.html</guid><wfw:comment>http://www.blogjava.net/konhon/comments/9699.html</wfw:comment><comments>http://www.blogjava.net/konhon/archive/2005/08/10/9699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/konhon/comments/commentRss/9699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/konhon/services/trackbacks/9699.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P>在配置jsp开发环境的过程中会碰到不少问题，感谢网上的许多前辈的经验总结，作者cl41的JSP连接Mysql数据库攻略和作者Saulzy的MySQL学习笔记等文章对我来说简直是雪中送碳，为了帮助象我一样的初学者在此总结了不少作者的经验，非常感谢他们的无私奉献精神，也希望更多的人把这种精神发扬光大，呵呵，再次对所参考文章的作者表示最崇高的敬意！<BR>以下软件下载连接地址无法显示的话，请直接到官方网站下载即可！<BR>&nbsp;<BR>软件下载<BR>Mysql<BR>下载版本：mysql-4.1.13-win32.zip(Windows downloads) <BR><A href="http://dev.mysql.com/downloads/mysql/4.1.html">http://dev.mysql.com/downloads/mysql/4.1.html</A></P>
<P>JDBC驱动<BR>下载版本：mysql-connector-java-3.1.10.zip<BR><A href="http://dev.mysql.com/downloads/connector/j/3.1.html">http://dev.mysql.com/downloads/connector/j/3.1.html</A></P>
<P>下载j2sdk<BR>下载版本：jdk-1_5_0_04-windows-i586-p.exe<BR><A href="http://java.sun.com/j2se/1.5.0/download.jsp">http://java.sun.com/j2se/1.5.0/download.jsp</A></P>
<P>下载tomcat<BR>下载版本: jakarta-tomcat-5.5.9.exe<BR><A href="http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi">http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi</A></P>
<P>安装,配置j2sdk：</P>
<P>执行j2sdk安装程序，按默认设置进行安装，也可自定义路径，但需修改下面的配置</P>
<P>配置j2sdk:</P>
<P>配置环境变量:</P>
<P>我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量： <BR>JAVA_HOME=C:\Program Files\Java\jdk1.5.0_04<BR>CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;<BR>path=%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem</P>
<P>写一个简单的java程序来测试J2SDK是否已安装成功： <BR>public class hello<BR>{ <BR>&nbsp;public static void main(String args[])<BR>&nbsp;{ <BR>&nbsp;System.out.println("Hello"); <BR>&nbsp;} <BR>} </P>
<P>将程序保存为文件名为hello.java的文件。 </P>
<P>打开命令提示符窗口，进入到hello.java所在目录，键入下面的命令 <BR>javac hello.java <BR>java hello <BR>此时若打印出来hello则安装成功，若没有打印出这句话，仔细检查以上配置是否正确。<BR>注意系统文件夹选项中应确定“隐藏已知文件类型的扩展名”不勾选（我的电脑—工具—查看） </P>
<P>安装,配置tomcat<BR>执行tomcat安装程序，按默认设置进行安装，也可自定义路径，但需修改下面的配置</P>
<P>我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量<BR>CATALINA_HOME=C:\Program Files\Apache Software Foundation\Tomcat 5.5<BR>CATALINA_BASE=C:\Program Files\Apache Software Foundation\Tomcat 5.5 </P>
<P>修改环境变量中的classpath，把tomat安装目录下的common\lib下的servlet-api.jar添加到classpath中去，<BR>修改后的classpath如下： <BR>classpath=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar;</P>
<P>启动tomcat，在IE中访问<A href="http://localhost:8080/">http://localhost:8080</A>，若看到tomcat的欢迎页面的话说明安装成功。</P>
<P>安装mysql<BR>解压缩mysql-4.1.13-win32.zip，运行setup.exe<BR>首先出现的是安装向导欢迎界面,直接点击“Next”<BR>继续，选择安装类型,选择“自定义”custom安装，然后点“Next”下一步，出现自定义安装界面<BR>选择安装路径：C:\MySQL Server 4.1(可自定义)<BR>点“OK”返回到自定义安装界面，路径已改为设置的路径<BR>点“Next”，准备开始安装<BR>点“Install”开始安装<BR>完成后出现创建MySQL.com帐号的界面<BR>如果是首次使用MySQL，选“Create anew free MySQL.com accout”<BR>点“Next”，输入你的Email地址和自己设定的用于登录MySQL.com的密码<BR>填完后点“Next”进入第二步<BR>填写姓名等相关信息，填完点“Next”，进入第三步<BR>填完电话号码、公司名称等信息后，点“Next”，<BR>然后出现预览你刚才填的信息的界面，点“Next”出现安装完成界面<BR>注意，这里有个配置向导的选项（Configure the MySQL Server now），<BR>建议勾选立即配置你的MySQL。许多说安装完MySQL后无法启动，原因就在于没有配置MySQL。<BR>点击“Finish”完成安装，并开始配置MySQL<BR>点“Next”，进入配置类型选择页面。选“Detailed configuration”(详细配置)<BR>点“Next”，进入服务类型选择页面。选“Developer Machine”（开发者机器），这样占用系统的资源不会很多<BR>点“Next”后，进入数据库用法选择页面。选择“Multifunctional Database”<BR>点“Next”，进入选择InnoDB数据存放位置页面<BR>不用更改设置，直接放在Installation Path安装目录里即可，然后点“Next”，选择MySQL的同时联接数<BR>选择“Manual Setting”，设置为100(根据自己需要，酌情设置)<BR>点“Next”，配置MySQL在TCP/IP通讯环境中的端口选择默认的3306端口即可。<BR>点“Next”，选择MySQL中的字符设置<BR>注意，这里的选择将会影响你是否能在MySQL中使用中文。选择gb2312字符集以便支持简体中文<BR>点“Next”，设置Windows服务选项<BR>注意，这里的选择很关键。<BR>“Install As Windows Service”一定要勾选，这是将MySQL作为Windows的服务运行。<BR>“Service Name”就用默认的“MySQL”<BR>下面的“Launch the MySQL Server automatically”一定要勾选，这样Windows启动时，MySQL就会自动启动服务，要不然就要手工启动MySQL。<BR>许多人说安装MySQL后无法启动、无法连接、出现10061错误，原因就在这里。<BR>点“Next”，设置根帐号root的登录密码<BR>“Modify Security Settings”是设置根帐号的密码，输入你设定的密码即可。<BR>“Create An Anonymous Account”是创建一个匿名帐号，这样会导致未经授权的用户非法访问你的数据库，有安全隐患，建议不要勾选。<BR>点“Next”，MySQL配置向导将依据你上面的所有设定配置MySQL，以便MySQL的运行符合你的需要<BR>点“Execute”开始配置，当出现“Service started successfully”时，说明你的配置完成，MySQL服务启动成功<BR>点“Finish”完成，整个MySQL的配置完成，剩下的就是用MySQL客户端连接MySQL服务器，然后使用了。</P>
<P><BR>安装JDBC驱动：<BR>解压缩mysql-connector-java-3.1.10.zip<BR>将要使用的是mysql-connector-java-3.1.10-bin-g.jar和mysql-connector-java-3.1.10-bin.jar</P>
<P>配置<BR>在C:\Program Files\Java目录下建立mysqlforjdbc子目录，进入该目录将mysql-connector-java-3.1.10-bin.jar到该目录下<BR>进入C:\Program Files\Java\jdk1.5.0_04\lib目录将mysql-connector-java-3.1.10-bin-g.jar拷贝到该目录下<BR>然后配置classpath，追加%JAVA_HOME%\lib\mysql-connector-java-3.1.10-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.10-bin.jar;到该环境变量中去<BR>追加以后环境变量如下：<BR>CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib\servlet-api.jar;%JAVA_HOME%\lib\mysql-connector-java-3.1.10-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.10-bin.jar;<BR>配置这个的目的是让java应用程序找到连接mysql的驱动．</P>
<P><BR>查看并启动MySQL服务<BR>在Windows XP下安装完MySQL后，它就已经自动启动服务了，并且在开始菜单中有其客户端的快捷方式连接<BR>可以通过Windows的服务管理器查看。“开始”－“运行”，输入“services.msc”，回车。<BR>弹出Windows的服务管理器，然后就可以看见服务名为“mysql”的服务项了，其右边标明“已启动”<BR>在开始菜单-所有程序-MySQL-MySQL Server 4.1-MySQL Command Line Client用客户端的快捷方式连接<BR>输入安装是设置的密码即可</P>
<P><BR>数据库的使用</P>
<P>Mysql安装完毕以后，在开始菜单-所有程序-MySQL-MySQL Server 4.1-MySQL Command Line Client用客户端的快捷方式连接<BR>输入安装时设置的密码</P>
<P>使用mysql的基本命令(在mysql命令行编辑每输入完命令后最后一定要有分号)<BR>显示数据库：show databases;<BR>使用数据库：use 数据库名；</P>
<P><BR>建库<BR>在mysql里建一个数据库first，以及在数据库里建一个表about<BR>命令：create database first;</P>
<P>为数据库设置权限（用户和密码）<BR>命令：grant all privileges on first.* to <A href="mailto:test@localhost">test@localhost</A> identified by&nbsp; “123456”;<BR>当你执行完这个命令以后，只要你再以用户名：test,密码：123456登录时你就只可以对first这个数据库操作，这样避开使用root<BR>输入命令：use first;<BR>使用first数据库；</P>
<P>在first库中建表<BR>命令：create table about(id int(8) primary key,name varchar(10));</P>
<P>在表中假如数据：<BR>命令：insert into&nbsp; about values('xyw1026','laojiang');</P>
<P>退出<BR>命令：exit</P>
<P></P>
<P>JSP连接mysql<BR>在C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps目录下建立子目录myapp<BR>进入C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp目录下<BR>用记事本编写一个文件保存为first.jsp<BR>代码如下：<BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <BR>String url ="jdbc:mysql://localhost/softforum?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <BR>//first为你的数据库名 <BR>Connection conn= DriverManager.getConnection(url); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from first"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt;</P>
<P>在浏览器中输入：<BR><A href="http://127.0.0.1:8080/myapp/first.jsp">http://127.0.0.1:8080/myapp/first.jsp</A><BR>若出现：<BR>id|num<BR>0 |laojiang</P>
<P>数据库操作成功，恭喜你</P>
<P>表示配置成功</P>
<P></P>
<P><BR>进入C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp目录<BR>在myapp目录下新建一个目录WEB-INF，注意，目录名称是区分大小写的； <BR>在WEB-INF下用记事本新建一个文件，命名为web.xml，内容如下： </P>
<P>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; </P>
<P>&lt;!DOCTYPE web-app <BR>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <BR>"<A href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</A>"&gt; </P>
<P>&lt;web-app&gt; <BR>&lt;display-name&gt;My Web Application&lt;/display-name&gt; <BR>&lt;description&gt; <BR>A application for test. <BR>&lt;/description&gt; <BR>&lt;/web-app&gt; </P>
<P>在myapp下用记事本新建一个测试的jsp页面，文件名为index.jsp，文件内容如下： </P>
<P>&lt;html&gt;&lt;body&gt;&lt;center&gt; <BR>Now time is: &lt;%=new java.util.Date()%&gt; <BR>&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; </P>
<P><BR>重启Tomcat <BR>打开浏览器，输入<A href="http://localhost:8080/myapp/index.jsp">http://localhost:8080/myapp/index.jsp</A> <BR>看到当前时间的话说明成功安装。 </P>
<P></P>
<P>建立自己的Servlet： <BR>用记事本新建一个servlet程序，文件名为HelloWorld.java，文件内容如下： </P>
<P>import java.io.*;<BR>import javax.servlet.*;<BR>import javax.servlet.http.*;<BR>public class HelloWorld extends HttpServlet<BR>{<BR>public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException<BR>{</P>
<P>response.setContentType("text/html"); <BR>PrintWriter out = response.getWriter();<BR>out.println("&lt;html&gt;&lt;head&gt;&lt;title&gt;");<BR>out.println("This is my first Servlet");<BR>out.println("&lt;/title&gt;&lt;/head&gt;&lt;body&gt;");<BR>out.println("&lt;h1&gt;Hello,World!&lt;/h1&gt;");<BR>out.println("&lt;/body&gt;&lt;/html&gt;");</P>
<P>}<BR>} </P>
<P><BR>编译 <BR>将HelloWorld.java剪切到C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes目录下<BR>命令行方式下输入： <BR>cd C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes<BR>javac HelloWorld.java <BR>用javac HelloWorld.java来编译这个文件，如果出现无法import javax.servlet.*<BR>则将C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib目录下的servlet-api.jar文件拷贝并添加到<BR>C:\Program Files\Java\jre1.5.0_04\lib\ext目录中去就可以了</P>
<P>然后在C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes下会产生一个编译后的servlet文件：HelloWorld.class<BR>用记事本打开C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\ROOT\WEB-INF目录下的web.xml如下所示，添加后的内容如下: <BR>.<BR>.<BR>.<BR>&lt;!-- JSPC servlet mappings start --&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;org.apache.jsp.index_jsp&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.jsp.index_jsp&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;org.apache.jsp.index_jsp&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/index.jsp&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</P>
<P>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/HelloWorld&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</P>
<P>&lt;!-- JSPC servlet mappings end --&gt;</P>
<P>&lt;/web-app&gt;</P>
<P>这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet“映射”到/servlet/HelloWorld地址上 </P>
<P>启动Tomcat，启动浏览器，输入<A href="http://localhost:8080//servlet/HelloWorld">http://localhost:8080//servlet/HelloWorld</A> 如果看到输出HelloWorld！就说明编写的servlet成功了。 <BR>注意：修改了web.xml以及新加了class，都要重启Tomcat </P>
<P><BR>也可以在自己创建的目录下测试如：<BR>将HelloWorld.class拷贝到C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF\classes目录下<BR>其中classes目录若没有就创建一个<BR>用记事本打开C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF目录下的web.xml如下所示，修改后的内容如下: <BR>.<BR>.<BR>.<BR>&lt;!-- JSPC servlet mappings start --&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/HelloWorld&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</P>
<P>&lt;!-- JSPC servlet mappings end --&gt;</P>
<P>&lt;/web-app&gt;</P>
<P><BR>启动Tomcat，启动浏览器，输入<A href="http://localhost:8080/myapp/servlet/HelloWorld">http://localhost:8080/myapp/servlet/HelloWorld</A> 如果看到输出HelloWorld！就说明编写的servlet成功了。 <BR>注意：修改了web.xml以及新加了class，都要重启Tomcat </P>
<P><BR>建立自己的javaBean： </P>
<P>用记事本新建一个java程序，文件名为TestBean.java，文件内容如下： <BR>package test; <BR>public class TestBean{ <BR>private String name = null; <BR>public TestBean(String strName_p){ <BR>this.name=strName_p; <BR>} <BR>public void setName(String strName_p){ <BR>this.name=strName_p; <BR>} <BR>public String getName(){ <BR>return this.name; <BR>} <BR>} </P>
<P>编译 <BR>将TestBean.java放在c:\test下，使用如下命令编译： <BR>C:\test&gt;javac TestBean.java <BR>然后在c:\Test下会产生一个编译后的bean文件：TestBean.class <BR>将TestBean.class文件剪切到C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF\classes\test目录下，<BR>若无某些子目录则创建一个 </P>
<P>新建一个TestBean.jsp文件，文件内容为： <BR>&lt;%@ page import="test.TestBean" %&gt; <BR>&lt;html&gt;&lt;body&gt;&lt;center&gt; <BR>&lt;% <BR>TestBean testBean=new TestBean("This is a test java bean."); <BR>%&gt; <BR>Java bean name is: &lt;%=testBean.getName()%&gt; <BR>&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; </P>
<P>重启Tomcat，启动浏览器，输入<A href="http://localhost:8080/myapp/TestBean.jsp">http://localhost:8080/myapp/TestBean.jsp</A> 如果看到输出Java bean name is: This is a test java bean<BR>就说明编写的javaBean成功了。 </P>
<P><BR>（特别注明：本文内容均来自互联网）</P>
<P></P></SPAN><img src ="http://www.blogjava.net/konhon/aggbug/9699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/konhon/" target="_blank">konhon 优华</a> 2005-08-10 08:54 <a href="http://www.blogjava.net/konhon/archive/2005/08/10/9699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>