﻿<?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-神仙的技术博客</title><link>http://www.blogjava.net/wuxingjia/</link><description>J道人生</description><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 23:00:29 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 23:00:29 GMT</pubDate><ttl>60</ttl><item><title>J2EE程序员之路之武功修为片</title><link>http://www.blogjava.net/wuxingjia/archive/2008/05/16/200756.html</link><dc:creator>伍兴佳</dc:creator><author>伍兴佳</author><pubDate>Thu, 15 May 2008 16:47:00 GMT</pubDate><guid>http://www.blogjava.net/wuxingjia/archive/2008/05/16/200756.html</guid><wfw:comment>http://www.blogjava.net/wuxingjia/comments/200756.html</wfw:comment><comments>http://www.blogjava.net/wuxingjia/archive/2008/05/16/200756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxingjia/comments/commentRss/200756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxingjia/services/trackbacks/200756.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：EasyJF开源团队(<a onclick="showLinkBubble(this);return false" href="http://www.easyjf.com/" target="_blank" link="http://www.easyjf.com">www.easyjf.com</a><wbr>) 大峡<br />
<br />
　　经常会跟一些朋友讨论怎么样才能学好Java,学到什么程度才算撑握了Java的问题。其中有一个J2EE程序员层次及武功修为的问题，有点意思。这里就把讨论的内容大致整理一下发出来，大家继续讨论。　　纵观国内的软件行业，靠Java吃饭的程序员还真不是少，而且Java程序员是有很大优越感的，毕竟对于很多用b/s搞开发的业内朋友来说，Java技术意味着难度大、门槛高，因此相对来说Java程序员比其它的程序员(如php、.net)收入高就理所当然。然而J2EE所涉及到的范畴是很广的，不能一个Java程序员就概括了事，而应该具有层次及水平之分，很多时候经常需要进行分类或评级，有时他评、有时自评。　　谈到国内J2EE领域的程序员层次水平，当前流行的称谓及评级不外乎就下面几种：　　第一种是精通掌握记事本、Dreamweaver等工具来写JSP+JavaBean数据库应用的是J2EE程序员； <br />
　　第二种是用JBuilder、Eclipse等专用Java开发工具写着一堆一堆过程式Java Bean，而且还能精通Struts+Spring+Hibernate等应用框架的高级J2EE程序员； <br />
　　第三种是用Together建模，然后生成一堆Java接口或代码，开口闭口都是设计模式的资深Java程序同及高级系统分析、构架师； <br />
　　最后还有一种是整天在BlogJava或JavaEye上谈经论道的大师们，这些大师技术水平难以触摸，武功门派也各具特色，不好归类，有时不好称为程序员（因为有的时候他们甚至不写或者写不出程序），但又做着与J2EE程序员密切相关的事情，我们暂且就归为&#8220;牛牛&#8221;或&#8220;大师&#8221;。　　称谓毕竟只是称谓，带有点主观或者功利色彩，有时很难鉴定一个人应该属于什么，因此，我们再从纯技术的角度，也即武功修为的角度，作了一个简单的分析及归类，把2EE领域程序员大致分成以下几个层次，可以作为大家自评的一个参考标准：　　第一个层次：精通掌握Java语法、能调试基本的程序错误，精通掌握JSP+Java Bean写一些N年前ASP、PHP翻版的Java Web应用程序（如论坛、网站新闻发布系统、OA、网上商城等），精通JDBC使用、精通SQL语句、精通XML等。　　第二个层次：掌握设计模式原理及应用，掌握基于OO的分析及设计方法,并能精通熟练使用几种Java专业设计及开发工具，精通掌握流行的J2EE框架如Hibernate、EJB、Webwork、Spring的原理及应用，精通J2EE中一两个组成部分(如Servlet、EJB等)的工作原理及细节。　　第三个层次：少林的高僧有两种，禅僧及武僧。J2EE程序员的第三个层次也同样有禅、武两个分支，这里我们重点分析一下：　　第一个分支属于走的禅僧线路。在练完第二个层次中的各种武功基础上，结合实际项目中的千奇百怪的用户需求，游刃有余的选择适合的技术方案为客户解决问题，并形成自己的一套解决方案。达到这一个层次的J2EE程序员已经不在乎使用任何工具、任何框架了，而是根据不同的对手，使用不同的武器或招式来应对。好比 <a onclick="showLinkBubble(this);return false" href="http://www.iask.com/n?k=%D0%A1%C0%EE%B7%C9%B5%B6" target="_blank" link="http://www.iask.com/n?k=%D0%A1%C0%EE%B7%C9%B5%B6">小李飞刀</a><wbr>一样，只有达到了&#8220;手中无刀、心中有刀&#8221;的境界，才能达到&#8220;出手一刀，例不虚发&#8221;的效果。这一层次的武功属于一个熟练度问题，刀练得多了、遇到的对手多了，再加上前面的武功修为，就算做不到例不虚发，也可达到十发九中。　　第二个分支属于走的武僧线路，在撑握熟悉第一二个层次中涉及到的内容后，进一步专研并撑握J2EE底层开发，J2EE规范制订、规范实现、Java虚拟机的工作原理、各种常见的J2EE服务器内核工作机制、内存管理、进程机制、源代码等。因为涉及的很多东西都比较抽象，代码也很多，练这一层的武功需要有很好的资质及耐性、并具还得有一定的环境及条件。好比神雕大侠杨过拿起&#8220;玄铁剑&#8221;，并练成&#8220;暗然销魂掌&#8221;的成长过程，需要前面的武功修为作基础，更需那只威力神武神雕的帮助指点及他处处为民、惩奸除恶的侠之心态。 <br />
　　 <br />
　　胡侃了这么多，现在来根据自己情况测算一下自己的份量，结果如下：　　第一层　练到8成； <br />
　　第二层　练到5成； <br />
　　第三层　准备走禅僧线路，当前算是练到1成； <br />
　　 <br />
　　唉，后面的武功提升越来越难，真不知道要到何年何月才能达到10成啊。你的武功练到哪一个层次了，不防亮出来大家切磋切磋。嘿嘿，要是有一天，咱们中国的Java程序员人手一把&#8220;玄铁剑&#8221;、人人会使&#8220;暗然销魂掌&#8221;，那还了得！汗...，写着写着居然做起白日梦了，不好意思，就此打住。 <br />
　　 <br />
　　手中鸡蛋先别扔，还要打个广告：本人刚开始涉足Java开源，目前在EasyJF开源团队中负责EasyJWeb(官网<a onclick="showLinkBubble(this);return false" href="http://www.easyjf.com/" target="_blank" link="http://www.easyjf.com/">www.easyjf.com</a><wbr>)项目，欢迎大家前来指导。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很牛的一个人物啊！
<img src ="http://www.blogjava.net/wuxingjia/aggbug/200756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxingjia/" target="_blank">伍兴佳</a> 2008-05-16 00:47 <a href="http://www.blogjava.net/wuxingjia/archive/2008/05/16/200756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>纯JAVA技术验证码生成器（服务器端servlet实现）（不是javascript哦~）</title><link>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190893.html</link><dc:creator>伍兴佳</dc:creator><author>伍兴佳</author><pubDate>Sat, 05 Apr 2008 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190893.html</guid><wfw:comment>http://www.blogjava.net/wuxingjia/comments/190893.html</wfw:comment><comments>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190893.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxingjia/comments/commentRss/190893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxingjia/services/trackbacks/190893.html</trackback:ping><description><![CDATA[<marquee direction="right" behavior="alternate" align="center"><span class="STYLE1"><font color="#cc3300">java验证码生成器,自认为还算经典</font></span></marquee><span style="color: #ff6600">import java.awt.Color; <br />
import java.awt.Font; <br />
import java.awt.Graphics; <br />
import java.awt.image.BufferedImage; <br />
import java.io.IOException; <br />
import java.util.Random; <br />
import javax.servlet.ServletOutputStream; <br />
import javax.servlet.http.HttpServletRequest; <br />
import javax.servlet.http.HttpServletResponse; <br />
import com.sun.image.codec.jpeg.JPEGCodec; <br />
import com.sun.image.codec.jpeg.JPEGImageEncoder; <br />
</span><span style="color: #808000">/** <br />
* @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM <br />
* <br />
* @author Yuan <br />
* 验证码生成器，使用此类需要将表单里的验证码输入框的name属性设为"verifycode" <br />
*/ <br />
public class VerifyCodeGenerator { <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private static final VerifyCodeGenerator generator = new VerifyCodeGenerator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private final String ATTRIBUTE_NAME = "verifycode"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;//图片的宽度 <br />
&nbsp;&nbsp;&nbsp;&nbsp;private final int WIDTH = 15; <br />
&nbsp;&nbsp;&nbsp;&nbsp;//图片的高度 <br />
&nbsp;&nbsp;&nbsp;&nbsp;private final int HEIGHT = 22; <br />
&nbsp;&nbsp;&nbsp;&nbsp;//字符串长度 <br />
&nbsp;&nbsp;&nbsp;&nbsp;private final int CODE_LENGTH = 4; <br />
&nbsp;&nbsp;&nbsp;&nbsp;//随机字符串范围 <br />
&nbsp;&nbsp;&nbsp;&nbsp;private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "1234567890" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "@#quot;; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private final char[] CHARS = RAND_RANGE.toCharArray(); <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private Random random = new Random(); <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private VerifyCodeGenerator(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;public static VerifyCodeGenerator getInstance(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return generator; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #33cccc">/** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 生成随机字符串 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 随机字符串 <br />
&nbsp;&nbsp;&nbsp;&nbsp; */ <br />
&nbsp;&nbsp;&nbsp;&nbsp;private String getRandString(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; CODE_LENGTH; i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(CHARS[random.nextInt(CHARS.length)]); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;/** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 生成随机颜色 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ll 产生颜色值下限(lower limit) <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ul 产生颜色值上限(upper limit) <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 生成的随机颜色对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp; */ <br />
&nbsp;&nbsp;&nbsp;&nbsp;private Color getRandColor(int ll, int ul){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ll &gt; 255) ll = 255; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ll &lt; 1) ll = 1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ul &gt; 255) ul = 255; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ul &lt; 1) ul = 1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ul == ll) ul = ll + 1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int r = random.nextInt(ul - ll) + ll; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int g = random.nextInt(ul - ll) + ll; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int b = random.nextInt(ul - ll) + ll; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color color = new Color(r,g,b); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return color; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;/** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 生成指定字符串的图像数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param verifyCode 即将被打印的随机字符串 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 生成的图像数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * */ <br />
&nbsp;&nbsp;&nbsp;&nbsp;private BufferedImage getImage(String verifyCode){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取图形上下文 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics graphics = image.getGraphics(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置背景色 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setColor(getRandColor(1,50)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//填充背景色 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.fillRect(0, 0, WIDTH * 4, HEIGHT); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置边框颜色 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setColor(new Color(0,255,0)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//画边框 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;2; i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置随机干扰线条颜色 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setColor(getRandColor(50,100)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//产生50条干扰线条 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;50; i++){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y1 = random.nextInt(HEIGHT - 4) + 2; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y2 = y1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.drawLine(x1, y1, x2, y2); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置字体 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//画字符串 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;this.CODE_LENGTH; i++){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String temp = verifyCode.substring(i, i+1); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setColor(getRandColor(100,255)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.drawString(temp, 13 * i + 6, 16); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #333333">&nbsp;//图像生效 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.dispose(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return image; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;/** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 将验证码的图像输出 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param request 用户的请求对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param response 用户的响应对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * */ <br />
&nbsp;&nbsp;&nbsp;&nbsp;public void printImage(HttpServletRequest request, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将ContentType设为"image/jpeg"，让浏览器识别图像格式。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("image/jpeg"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置页面不缓存 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader("Pragma", "No-cache"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader("Cache-Control", "no-cache"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setDateHeader("Expires", 2000); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得随机验证码 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String verifyCode = this.getRandString(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String str = "ssss"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;10; i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str = str + str; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得验证码的图像数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage bi = this.getImage(verifyCode); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把验证码存入session <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得Servlet输出流 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletOutputStream outStream = response.getOutputStream(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建可用来将图像数据编码为JPEG数据流的编码器 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将图像数据进行编码 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoder.encode(bi); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//强行将缓冲区的内容输入到页面 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.flush(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭输出流 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(IOException ex){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;/** <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 检查输入的验证码是否正确，若用户输入的验证码与生成的验证码相符则返回true，否则返回false。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param request 用户的请求对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 验证结果 <br />
&nbsp;&nbsp;&nbsp;&nbsp; * */ <br />
&nbsp;&nbsp;&nbsp;&nbsp;public boolean check(HttpServletRequest request){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (((String)request.getParameter(ATTRIBUTE_NAME)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().removeAttribute(ATTRIBUTE_NAME); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
}<wbr><a href="http://imgcache.qq.com/qzone_v4/b.gif" target="_blank"><img style="vertical-align: baseline! important" height="1" alt="" src="http://imgcache.qq.com/qzone_v4/b.gif" width="1" border="0" /></a><wbr><img id="paperPicArea1" style="display: none; position: relative" alt="" src="http://imgcache.qq.com/ac/qzone_v4/b.gif" /> <br />
</span>/**此代码为我们群老大深秋小雨<br />
所编写，真的比较实用，来自qq群J道<br />
**/
  <img src ="http://www.blogjava.net/wuxingjia/aggbug/190893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxingjia/" target="_blank">伍兴佳</a> 2008-04-05 12:40 <a href="http://www.blogjava.net/wuxingjia/archive/2008/04/05/190893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个小脚本测试</title><link>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190856.html</link><dc:creator>伍兴佳</dc:creator><author>伍兴佳</author><pubDate>Fri, 04 Apr 2008 17:18:00 GMT</pubDate><guid>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190856.html</guid><wfw:comment>http://www.blogjava.net/wuxingjia/comments/190856.html</wfw:comment><comments>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190856.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxingjia/comments/commentRss/190856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxingjia/services/trackbacks/190856.html</trackback:ping><description><![CDATA[<p><span style="color: #808000">为什么我写的一个显示系统时间的小脚本不能在这里显示出来？<br />
还有就是如何使用DOM的getelementbyid方法显示系统时间？<br />
</span><span style="color: #ffcc99">&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />
&lt;!--<br />
<span style="color: #ff00ff">var timerID = null<br />
var timerRunning = false<br />
function showtime(){<br />
&nbsp; var today,hour,second,minute,year,month,date; <br />
var strDate ; <br />
today=new Date(); <br />
var n_day = today.getDay(); <br />
switch (n_day) <br />
&nbsp;{ <br />
case 0:{ <br />
strDate = "星期日" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 1:{ <br />
strDate = "星期一" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 2:{ <br />
strDate ="星期二" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 3:{ <br />
strDate = "星期三" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 4:{ <br />
strDate = "星期四" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 5:{ <br />
strDate = "星期五" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 6:{ <br />
strDate = "星期六" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
case 7:{ <br />
strDate = "星期日" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }break; <br />
} <br />
year = today.getYear(); <br />
month = today.getMonth()+1; <br />
date = today.getDate(); <br />
hour = today.getHours(); <br />
minute =today.getMinutes(); <br />
second = today.getSeconds(); <br />
if(month&lt;10) month="0"+month; <br />
if(date&lt;10) date="0"+date; <br />
if(hour&lt;10) hour="0"+hour; <br />
if(minute&lt;10) minute="0"+minute; <br />
if(second&lt;10) second="0"+second; <br />
&nbsp;timeValue =year + " 年 " + month + " 月 " + date + " 日 " + strDate +" " + hour + ":" + minute + ":" + second<br />
&nbsp;&nbsp; document.GG.MM.value = timeValue <br />
&nbsp;&nbsp; wuxingjia= setTimeout("showtime()",1000)<br />
&nbsp; <br />
}</span><br />
</span><span style="color: #999999"><span style="color: #339966">//--&gt;<br />
&lt;/SCRIPT&gt;<br />
&lt;/HEAD&gt; &lt;BODY onLoad="showtime()"&gt;<br />
&lt;FORM NAME="GG" onSubmit="0"&gt;<br />
&nbsp;&nbsp; &lt;INPUT TYPE="text" NAME="MM" SIZE=40 &gt;<br />
&lt;/FORM&gt;</span><br />
</span></p>
 <img src ="http://www.blogjava.net/wuxingjia/aggbug/190856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxingjia/" target="_blank">伍兴佳</a> 2008-04-05 01:18 <a href="http://www.blogjava.net/wuxingjia/archive/2008/04/05/190856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver中,sql编程的几个小常识 呵呵，容易出错的~</title><link>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190851.html</link><dc:creator>伍兴佳</dc:creator><author>伍兴佳</author><pubDate>Fri, 04 Apr 2008 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190851.html</guid><wfw:comment>http://www.blogjava.net/wuxingjia/comments/190851.html</wfw:comment><comments>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190851.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxingjia/comments/commentRss/190851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxingjia/services/trackbacks/190851.html</trackback:ping><description><![CDATA[<marquee direction="right" behavior="alternate" align="center"><span class="STYLE1"><font color="#0000ff">sqlserver中,sql编程的几个小常识 </font></span></marquee>
<p>1<span style="color: #ff6600">、取出刚刚插入(删除)的数据SELECT 字段名 FROM INSERTED(DELETED)<br />
2、对于UPDATE实际上是先DELETE然后再INSERT所以如果想得到UPDATE前后的数据值，应该先从DELETED取出，然后从INSERTED取出；<br />
3、IF UPDATE(列名)可以判断更新或插入哪一个字段的值；<br />
4、@@ROWCOUNT可以判断上一行查询操作得到的列数；<br />
5、给变量赋值用SET @ZQB = 13;<br />
</span><span style="color: #00ff00">6、察看是否有符合条件的记录IF EXISTS (SELECT name FROM sysobjects WHERE name = 'reminder' AND type = 'TR');<br />
7、定义游标，如下：<br />
DECLARE c1 CURSOR FOR<br />
SELECT emp_mgr.emp<br />
FROM emp_mgr, inserted<br />
WHERE emp_mgr.emp = inserted.mgr </span></p>
<p><span style="color: #00ff00">OPEN c1<br />
FETCH NEXT FROM c1 INTO @e--从游标中取出数据<br />
</span><span style="color: #ff00ff">WHILE @@fetch_status = 0--判断是否到最后<br />
BEGIN<br />
UPDATE emp_mgr<br />
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Add 1 for newly<br />
WHERE emp_mgr.emp = @e -- added employee.</span></p>
<p><span style="color: #ff00ff">FETCH NEXT FROM c1 INTO @e<br />
END<br />
CLOSE c1<br />
DEALLOCATE c1--删除游标引用 </span></p>
 <img src ="http://www.blogjava.net/wuxingjia/aggbug/190851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxingjia/" target="_blank">伍兴佳</a> 2008-04-05 00:38 <a href="http://www.blogjava.net/wuxingjia/archive/2008/04/05/190851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于隐式挖掘网站用户行为的分析</title><link>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190848.html</link><dc:creator>伍兴佳</dc:creator><author>伍兴佳</author><pubDate>Fri, 04 Apr 2008 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190848.html</guid><wfw:comment>http://www.blogjava.net/wuxingjia/comments/190848.html</wfw:comment><comments>http://www.blogjava.net/wuxingjia/archive/2008/04/05/190848.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxingjia/comments/commentRss/190848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxingjia/services/trackbacks/190848.html</trackback:ping><description><![CDATA[<marquee direction="right" behavior="alternate" align="absmiddle"><span class="STYLE1"><font color="#0000ff">关于隐式挖掘网站用户行为的分析</font></span></marquee><span style="color: #808000">如何了解用户和需求<wbr> <br />
<br />
　　如何了解用户需求？根据用户是否主动参与分为显式与隐式两种挖掘模式，因为显式的动静比较大，有很大局限性，所以为了保证结果准确性以及提高用户接受度，一般都采用隐式。 <br />
<br />
　　用户的日常交互行为会产生四类关键数据：鼠标移动轨迹、链接点击分布、页面浏览流、页面停留时间。通过用户的行为能反映用户的观点，同时利用访问的网页次序可以找出网页之间的隐性关系。 <br />
<br />
　　<strong><wbr>收集数据</strong><wbr> <br />
<br />
　　Web服务器的日志（用户会话记录） <br />
<br />
　　Web trends或类似的第三方共享软件（客户端分析，流量分析，可用性分析） <br />
<br />
　　自己开发的第三方软件/插件（需求自定义）</span> <br />
<br />
　　<span style="color: #ffff00"><span style="color: #ff6600">大型网站通常会把以上三种方法组合应用，大致原理就是给进入网站的用户赋予身份识别，每次产生交互动作就向服务器发回请求，通过时间和页面判断连接各个请求点并且记录下来。（算法不讨论） <br />
<br />
　　<strong><wbr>过滤数据</strong><wbr> <br />
<br />
　　明确目标，定义核心数据。 <br />
<br />
　　界定用户行为，利用多数人的行为来消除个人行为的主观性。 <br />
<br />
　　对用户进行归类，确定数据类别。 <br />
<br />
　　大型网站每天所产生的数据量是惊人的，所以常规需求一般都是定时或定量的分析。另外，额外的数据处理会减慢网站的速度，搜集的数据越多，潜在的负面影响越大。 <br />
<br />
　　<strong><wbr>习惯分析</strong><wbr> <br />
<br />
　　对用户浏览过的页面进行内容分析，根据信息主题对页面进行聚类。 <br />
<br />
　　聚类过程中除了考虑页面内容相近程度，还应该考虑页面路径。 <br />
<br />
　　把用户浏览行为对其兴趣的作用列入聚类结果，得到综合评估模型。 <br />
<br />
　　用户兴趣分偶然和稳定两种情况，其中偶然可以认为是随机变化的，稳定的挖掘又有基于内容和行为两种方式，在内容上表现有重复度、相似度等，在行为上表现有停留时长、点此次数、拉动滚动条次数等。 <br />
<br />
　　<strong><wbr>实际案例</strong><wbr> <br />
<br />
　　类似系统、浏览器、分辨率的客户端分析，常见而且简单，略过。 <br />
<br />
　　关于鼠标轨迹、点击分布的可用性例子： <br />
<br />
　　跟踪用户在进行检索时的鼠标移动轨迹，可以获取用户操作的先后顺序、热点功能、动作曲线等一手数据，这些都是改善或简化表单的重要参考。 <br />
在重要的页面进行详细的点击分布监控统计，主要检查信息呈现的易用性，看看有没有偏离设计初衷，经常更新，找到规律。 <br />
<br />
　　处理特定用户行为、用户群、用户来路的任务流例子： <br />
<br />
　　监控分布式注册流程，能够看到有多少用户填了表单、填完了表单，或者在某个步骤有异常流失。</span> <br />
<br />
</span>　　<span style="color: #00ffff">监控不同模块入口过来的注册用户，能够统计出各模块导入的有效注册量、百分比、成功率，以便合理调配资源。 <br />
<br />
　　监控投放广告过来的注册量、注册成功率、转换付费用户成功率，以便明确广告的投入产出比。 <br />
<br />
　　监控用户的纵深浏览行为，是测试导航可用性很好的办法，也就是说用户会不会在你的网站内迷路。 </span><img src ="http://www.blogjava.net/wuxingjia/aggbug/190848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxingjia/" target="_blank">伍兴佳</a> 2008-04-05 00:06 <a href="http://www.blogjava.net/wuxingjia/archive/2008/04/05/190848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过一个简单的登录过程了解Struts的业务流程(Struts初学的请进)</title><link>http://www.blogjava.net/wuxingjia/archive/2008/04/04/190838.html</link><dc:creator>伍兴佳</dc:creator><author>伍兴佳</author><pubDate>Fri, 04 Apr 2008 15:27:00 GMT</pubDate><guid>http://www.blogjava.net/wuxingjia/archive/2008/04/04/190838.html</guid><wfw:comment>http://www.blogjava.net/wuxingjia/comments/190838.html</wfw:comment><comments>http://www.blogjava.net/wuxingjia/archive/2008/04/04/190838.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxingjia/comments/commentRss/190838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxingjia/services/trackbacks/190838.html</trackback:ping><description><![CDATA[<marquee><span class="STYLE1"><font color="#0000ff">一个简单的登录过程描述了一下Struts的业务流程，感觉挺容易懂的，摘出来大家分享：</font></span></marquee><span style="color: #ff9900">(1)用户的请求以HTTP方式传输到服务器上，接收请求的是ActionServlet。</span><br />
<span style="color: #808000">(2)ActionServlet接收到请求后，会查找struts-config.xml文件来确定服务器上是否有用户请求的操作，此处用户请求的操作应为登录操作。如果没有，则返回一个用户请求无效的出错信息。</span><br />
<span style="color: #008000">(3)当ActionServlet找到用户请求的Action后，首先将用户输入的表单参数打包成一个ActionForm对象，这个ActionForm对象其实也就是一个JavaBean，里面包含两个字段，分别是用户名和密码。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionForm对象中的Validate方法。若Validate方法执行有错，则返回；否则，继续下一步。<br />
</span><span style="color: #99cc00">(4)系统生成一个用户所请求的Action的实例对象，将前面的ActionForm对象传递给它，运行它的execute()方法。这一步其实就是用户登录的控制器，在执行execute()方法时，可以调用后台模型验证登录名和密码是否正确等信息。<br />
</span><span style="color: #00ff00">(5)execute()执行结束前会生成一个ActionForward类型的对象并将之返回给ActionServlet，该对象的作用是告诉ActionServlet下一步应该跳转到哪里，假如后台模型检验用户名和密码正确，则ActionForward就代表跳转到一个登录成功的界面。ActionServlet将对之进行分析，其实就相当于接收到一个新的请求，重复(2)~(5)的过程，直到将某个界面返回用户为止。<br />
</span><span style="color: #cc99ff">以上就是Struts的基本工作流程，可以看出struts-config.xml在整个流程中起到了一个类似站点地图的作用，它记录了所有可能的请求跳转。其实，在Web容器加载Struts应用程序后，struts-config.xml就被首先读入内存成为一个ActionMapping对象，前面所说的查找struts-config.xml文件，实际上是查找ActionMapping对象。对于初学者来说可以不必深究其中的细节&#8230;&#8230;<br />
</span><span style="color: #ccffcc">摘自清华大学出版社出版的《Struts-Web设计与开发大全》</span> </span>   <img src ="http://www.blogjava.net/wuxingjia/aggbug/190838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxingjia/" target="_blank">伍兴佳</a> 2008-04-04 23:27 <a href="http://www.blogjava.net/wuxingjia/archive/2008/04/04/190838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>