﻿<?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-javainthinking</title><link>http://www.blogjava.net/javainthinking/</link><description>XL的个性空间和java学习之旅</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:01:16 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:01:16 GMT</pubDate><ttl>60</ttl><item><title>项目</title><link>http://www.blogjava.net/javainthinking/archive/2005/08/12/9978.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Fri, 12 Aug 2005 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/08/12/9978.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/9978.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/08/12/9978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/9978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/9978.html</trackback:ping><description><![CDATA[<P>package park.jsp.reportfill;</P>
<P>import javax.servlet.http.HttpServletRequest;<BR>import java.sql.ResultSet;<BR>import java.sql.Statement;<BR>import java.sql.Connection;<BR>import java.sql.SQLException;<BR>import park.jsp.main.ConnectDB;<BR>import park.jsp.common.TableNewId;<BR>import javax.servlet.http.HttpSession;<BR>import java.util.Date;<BR>import park.jsp.common.DateHandle;</P>
<P>/**<BR>&nbsp;* &lt;p&gt;Title: &lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description:修改和存储登记卡相关信息 &lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2005&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Company: &lt;/p&gt;<BR>&nbsp;* @author 熊炼<BR>&nbsp;* @version 1.0<BR>&nbsp;*/</P>
<P>public class Register_Refer<BR>{<BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 此程序需要在scope中额外获取的参数有：type(对象类型)、message(操作类型)、f_emp_name(用户名)<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 特别:1.操作类型为modify,需要旧的t_bas_*表中所有可更改参数&nbsp;&nbsp; 2.对象类型为动植物,则需要f_k,f_s,f_classno,f_py<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String(操作信息字段)<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static String main(HttpServletRequest request,HttpSession session)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //连接数据库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn=ConnectDB.connect();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt=conn.createStatement();</P>
<P>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String f_name, f_k_classname,f_s_classname,f_s_ldm,f_j_classname,f_xx,f_cd,f_layer,<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_ldm,f_bhc,f_fzcs,f_szxz ,f_ms,f_yt,f_area,f_yy,v_message,v_type,v_tablename;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String f_name, f_k,f_s,f_classno,f_xx,f_cd,f_layer,f_py,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_ldm,f_bhc,f_fzcs,f_szxz ,f_ms,f_yt,f_area,f_yy,v_message,v_type,v_tablename;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_message = request.getParameter("message"); //判断消息字段,modify修改,create创建,delete删除<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_type=(String)request.getAttribute("type");//判断类型(plant植物,animal是动物...)</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //植物不同字段<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_ms=request.getParameter("t_ms");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_yt=request.getParameter("t_yt");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_area=request.getParameter("t_area");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_yy=request.getParameter("t_yy");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行数据库操作<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rrSql="";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int v_flag=0;//v_flag为数据操作是否成功的标志,1为成功,0为失败<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb=null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断对象类型<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if("animal".equals(v_type))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取t_bas_animal表中的所有字段(除f_id)<BR>&nbsp;&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;&nbsp; f_name=request.getParameter("t_name");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_k=(String)request.getAttribute("f_k");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_s=(String)request.getAttribute("f_s");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_classno=(String) request.getAttribute("f_j");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_py=(String)request.getAttribute("f_py");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_ldm = request.getParameter("t_ldm");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_xx = request.getParameter("t_xx");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_cd = request.getParameter("t_cd");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_layer = request.getParameter("t_layer");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从form中获取可以更改的字段,为字段新内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_bhc = request.getParameter("t_bch");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_fzcs = request.getParameter("t_fzcs");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_szxz = request.getParameter("t_szxz");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float animal_f_id=0;</P>
<P>&nbsp;&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;&nbsp; if("create".equals(v_message))<BR>&nbsp;&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;&nbsp;&nbsp;&nbsp; //获取t_rpt_modify报表操作表中的相关字段<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String f_rpt_no,f_rpt_pid,f_emp_name,f_type,f_new_value,f_ref_date;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取表中f_pid字段<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float rpt_f_id=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rpt_f_id = TableNewId.getTableNewId(stmt,1,"t_rpt_modi",<BR>&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; "f_pid");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rpt_f_id==0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "&lt;script language=javascript&gt;window.alert('系统错误,创建失败!');window.close();&lt;/script&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException ex)<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; //其余相关字段<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_emp_name=(String) session.getAttribute("f_emp_name");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_type="0";<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; f_new_value=sb.append(f_name+","+f_k+","+f_s+","+f_classno+","+f_xx+","+f_cd+","+f_layer+","+f_py+","+f_ldm+","+f_bhc+","+f_fzcs+","+f_szxz).toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_ref_date=new DateHandle().getDate();<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; rrSql="";//插入t_rpt_modi表中的sql语句<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_flag=stmt.executeUpdate(rrSql);<BR>&nbsp;&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;&nbsp; else if("modify".equals(v_message))<BR>&nbsp;&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;&nbsp;&nbsp;&nbsp; //获取t_bas_animal中的f_id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; animal_f_id=Integer.parseInt((String)request.getAttribute("animal_f_id"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取t_rpt_modify报表操作表中的相关字段<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String f_rpt_no,f_rpt_pid,f_emp_name,f_type,f_old_value,f_new_value,f_ref_date,f_old_bhc,f_old_fzcs,f_old_szxz;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float rpt_f_id=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rpt_f_id = park.jsp.common.TableNewId.getTableNewId(stmt, 1, "t_rpt_modi",<BR>&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; "f_pid");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rpt_f_id == 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "&lt;script language=javascript&gt;window.alert('系统错误,创建失败!');window.close();&lt;/script&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (SQLException ex) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; f_emp_name=(String) session.getAttribute("f_emp_name");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_type="1";<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; f_new_value=sb.append(animal_f_id+","+f_name+","+f_k+","+f_s+","+f_classno+","+f_xx+","+f_cd+","+f_layer+","+f_py+","+f_ldm+","+f_bhc+","+f_fzcs+","+f_szxz).toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_ref_date=new DateHandle().getDate();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取旧动物对应的t_bas_animal表中对应的所有值,并以逗号分割连接,作为f_old_value字段<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_old_bhc=(String) request.getAttribute("f_bhc");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_old_fzcs=(String)request.getAttribute("f_fzcs");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_old_szxz=(String) request.getAttribute("f_szxz");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f_old_value=sb.append(animal_f_id+","+f_name+","+f_k+","+f_s+","+f_classno+","+f_xx+","+f_cd+","+f_layer+","+f_py+","+f_ldm+","+f_old_bhc+","+f_old_fzcs+","+f_old_szxz).toString();<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; rrSql = ""; //插入t_rpt_modi表中的sql语句<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_flag = stmt.executeUpdate(rrSql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if("plant".equals(v_type))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_flag=stmt.executeUpdate(rrSql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.commit();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(v_flag==1)<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;&nbsp;&nbsp;&nbsp;&nbsp; return "&lt;script language=javascript&gt;window.alert('保存操作成功!');window.close();&lt;/script&gt;";<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; else<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;&nbsp;&nbsp;&nbsp;&nbsp; return<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;script language=javascript&gt;window.alert('保存操作改失败!');window.close();&lt;/script&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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; catch(SQLException ex)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<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;&nbsp;&nbsp;&nbsp;&nbsp; conn.rollback();<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; catch(SQLException ex1)<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;&nbsp; return "&lt;script language=javascript&gt;window.alert('系统错误，不能修改!');&lt;/script&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<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;&nbsp;&nbsp;&nbsp;&nbsp; if(rs != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ignore)<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; try<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;&nbsp;&nbsp;&nbsp;&nbsp; if(stmt != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ignore)<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; try<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;&nbsp;&nbsp;&nbsp;&nbsp; if(conn != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.rollback();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&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; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ignore)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</P><img src ="http://www.blogjava.net/javainthinking/aggbug/9978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-08-12 17:30 <a href="http://www.blogjava.net/javainthinking/archive/2005/08/12/9978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;经典&gt;初学者如何开发出一个高质量的J2EE系统 </title><link>http://www.blogjava.net/javainthinking/archive/2005/08/02/9044.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Tue, 02 Aug 2005 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/08/02/9044.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/9044.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/08/02/9044.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/9044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/9044.html</trackback:ping><description><![CDATA[J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。<BR><BR>　　首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。<BR><BR>　　J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S（Browser浏览器/Server服务器）结构，而J2EE主要是指B/S结构的实现。<BR><BR>　　J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。<BR><BR>　　J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。<BR><BR>　　这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持（除了JDK/J2SE以外）。<BR><BR>　　Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。<BR><BR>　　谈到JavaBeans技术，就涉及到组件构件技术（component），这是Java的核心基础部分，很多软件设计概念（设计模式）都是通过JavaBeans实现的。<BR><BR>　　JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术（也就是Jsp/Servlet）调用，那么JavaBeans就运行在J2EE的Web容器中；如果它被EJB调用，它就运行在EJB容器中。<BR><BR>　　EJB（企业JavaBeans）是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。<BR><BR>　　至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术： EJB 和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个 JavaBeans是你为这个应用程序单独开发创建的。<BR><BR>　　J2EE应用系统开发工具有很多：如JBuilder、Eclipse等，这些 IDE首先是Java开发工具，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要 lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。<BR><BR>　　J2EE容器分为WEB容器和EJB容器，Tomcat/Resin是Web容器；JBoss是EJB容器+Web容器等，其中Web容器直接使用 Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品 Websphere/Weblogic等和JBoss属于同一种性质。<BR><BR>　　J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。<BR><BR>　　如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的 J2EE 应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。<BR><BR>　　衡量J2EE应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。<BR><BR>　　为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。<BR><BR>　　因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层；<BR><BR>　　EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans弱约束，使用Ioc模式实现的（当然EJB 3.0也采取这种方式），在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理之一。<BR><BR>　　由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans（POJO）框架(如Spring、 JdonFramework)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。　但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。<BR><BR>　　这两种架构分歧也曾经诞生一个新名词：完全POJO的系统也称为轻量级系统(lightweight)，其实这个名词本身就没有一个严格定义，更多是一个吸引人的招牌，轻量是指容易学习容易使用吗？按照这个定义，其实轻量Spring等系统并不容易学习；而且EJB 3.0（依然叫EJB）以后的系统是否可称为轻量级了呢？<BR><BR>　　前面谈了服务层框架，使用服务层框架可以将JavaBeans从 Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库（taglib）实现，不同框架有不同自己的标签库，Struts是应用比较广泛的一种表现层框架。<BR><BR>　　这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写JDBC等SQL语句（如iBatis）；使用O/R Mapping技术实现的Hibernate和JDO技术；当然还有EJB中的实体Bean技术。<BR><BR>　　持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。<BR><BR>　　在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌；SUN的产品用起来撞墙；对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。<BR><BR>　　最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。<BR><BR>　　还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。<BR><BR>　　当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当你学会了系统基本单元JavaBean或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。<BR><BR>　　以上理念可以总结为一句话：<BR>J2EE开发三件宝: Domain Model（域建模）、patterns（模式）和framework（框架）。 <img src ="http://www.blogjava.net/javainthinking/aggbug/9044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-08-02 17:07 <a href="http://www.blogjava.net/javainthinking/archive/2005/08/02/9044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异常淹没（注意）</title><link>http://www.blogjava.net/javainthinking/archive/2005/07/28/8621.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Thu, 28 Jul 2005 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/07/28/8621.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/8621.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/07/28/8621.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/8621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/8621.html</trackback:ping><description><![CDATA[<P>异常分为检查型异常和非检查型异常（即继承自runtimeException的异常，如空引用，数组越界等），在捕获检查型异常的时候有可能淹没非检查型异常。例如：<BR>try<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; Class.method();//throws null pointer exception<BR>&nbsp;&nbsp;&nbsp;....................<BR>&nbsp; }<BR>&nbsp; catch(Exception e)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp; }</P>
<P>在这里就会淹没null pointer Exception,编程时一定要注意</P><img src ="http://www.blogjava.net/javainthinking/aggbug/8621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-07-28 13:25 <a href="http://www.blogjava.net/javainthinking/archive/2005/07/28/8621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>File的一些相关操作</title><link>http://www.blogjava.net/javainthinking/archive/2005/07/27/8519.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Wed, 27 Jul 2005 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/07/27/8519.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/8519.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/07/27/8519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/8519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/8519.html</trackback:ping><description><![CDATA[<P>package com.xionglian.common;</P>
<P>import java.io.File;<BR>import java.net.URL;<BR>import java.io.InputStream;<BR>import java.io.IOException;<BR>import java.io.BufferedWriter;<BR>import java.io.FileWriter;</P>
<P>/**<BR>&nbsp;* &lt;p&gt;Title: &lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: &lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2000&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Company: &lt;/p&gt;<BR>&nbsp;* @author 熊炼<BR>&nbsp;* @version 1.0<BR>&nbsp;*/</P>
<P>public class FileHandle<BR>{</P>
<P>&nbsp; public FileHandle()<BR>&nbsp; {<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * filename path和URL之间的转换<BR>&nbsp;&nbsp; */<BR>&nbsp; public void _File_URL()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String path = File.separator + "a";<BR>&nbsp;&nbsp;&nbsp; System.out.println(path);<BR>&nbsp;&nbsp;&nbsp; //coverting Between a filename and a URL<BR>&nbsp;&nbsp;&nbsp; //create a file object<BR>&nbsp;&nbsp;&nbsp; File file = new File("filename");</P>
<P>&nbsp;&nbsp;&nbsp; //covert a file object to a URL<BR>&nbsp;&nbsp;&nbsp; URL url = null;<BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url=file.toURL();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(url);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(Exception&nbsp; e)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; //convert a URL to a file object<BR>&nbsp;&nbsp;&nbsp; file=new File(url.getFile());</P>
<P>&nbsp;&nbsp;&nbsp; //read the file using the URL<BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is=url.openStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //read from the InputStream<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(IOException e)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 从relative path到absolute path之间的转换<BR>&nbsp;&nbsp; */<BR>&nbsp; public void rel_to_abspath()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; File file=new File("filename.txt");//filename.txt doesn't need exist<BR>&nbsp;&nbsp;&nbsp; file=file.getAbsoluteFile();//C:\Documents and Settings\xl\桌面\First\filename</P>
<P>&nbsp;&nbsp;&nbsp; file=new File("test"+File.separator+"filename.txt");<BR>&nbsp;&nbsp;&nbsp; file=file.getAbsoluteFile();//C:\Documents and Settings\xl\桌面\First\test\filename.txt<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 判断两个filename path是否指向同一file<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public boolean isSameFile()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; File file1=new File("filename");<BR>&nbsp;&nbsp;&nbsp; File file2=new File("/filename");<BR>&nbsp;&nbsp;&nbsp; //file1.equals(file2)=false;<BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //利用File.getCanonicalFile()消除多余的symbol links或者"."和".."<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file1.getCanonicalFile();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file2.getCanonicalFile();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(Exception e){}<BR>&nbsp;&nbsp;&nbsp; return file1.equals(file2);//true<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 创建一个临时temporary文件<BR>&nbsp;&nbsp; * @param args<BR>&nbsp;&nbsp; */<BR>&nbsp; public void createTempFile()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create temporary file<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File temp = new File("temp", ".txt");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //推出程序时删除temp文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp.deleteOnExit();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //向temp文件中写content<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedWriter out = new BufferedWriter(new FileWriter(temp));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write("熊炼");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * File、directory更名或File移动到另一个位置<BR>&nbsp;&nbsp; * @param args<BR>&nbsp;&nbsp; */<BR>&nbsp; public void rename_move_File()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; //rename a File or directory<BR>&nbsp;&nbsp;&nbsp; File file1=new File("oldname");<BR>&nbsp;&nbsp;&nbsp; File file2=new File("newname");<BR>&nbsp;&nbsp;&nbsp; file1.renameTo(file2);</P>
<P>&nbsp;&nbsp;&nbsp; //move File<BR>&nbsp;&nbsp;&nbsp; File file=new File("filename");<BR>&nbsp;&nbsp;&nbsp; File dir=new File("directoryname");<BR>&nbsp;&nbsp;&nbsp; file.renameTo(new File(dir,file.getName()));<BR>&nbsp; }</P>
<P>&nbsp; public static void main(String[] args)<BR>&nbsp; {</P>
<P>&nbsp; }</P>
<P>&nbsp;</P>
<P>&nbsp; }</P><img src ="http://www.blogjava.net/javainthinking/aggbug/8519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-07-27 09:07 <a href="http://www.blogjava.net/javainthinking/archive/2005/07/27/8519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAVA操作EXCEL文件（JAVA EXCEL API）</title><link>http://www.blogjava.net/javainthinking/archive/2005/07/18/7906.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Mon, 18 Jul 2005 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/07/18/7906.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/7906.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/07/18/7906.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/7906.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/7906.html</trackback:ping><description><![CDATA[<P>参考文章：<A href="http://www-128.ibm.com/developerworks/cn/java/l-javaExcel/index.html">http://www-128.ibm.com/developerworks/cn/java/l-javaExcel/index.html</A><BR>作了一些相应的扩充(读取图片等)</P>
<P><A name=1><SPAN class=atitle2>JAVA EXCEL API简介</SPAN></A><BR></P>
<P>Java Excel是一开放源码项目，通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的，所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。<BR><BR>提供以下功能：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:dw="http://www.ibm.com/developerworks/">
<LI>从Excel 95、97、2000等格式的文件中读取数据； 
<LI>读取Excel公式（可以读取Excel 97以后的公式）； 
<LI>生成Excel数据表（格式为Excel 97）； 
<LI>支持字体、数字、日期的格式化； 
<LI>支持单元格的阴影操作，以及颜色操作； 
<LI>修改已经存在的数据表； 
<LI>能够读取图表信息</LI></UL>
<P>1.<A name=2><SPAN class=atitle2>应用示例</SPAN></A>：<BR>包括从Excel读取数据,生成新的Excel，以及修改Excel<BR><FONT face="Courier New">package common.util;</FONT></P>
<P><FONT face="Courier New">import jxl.*;<BR>import jxl.format.UnderlineStyle;<BR>import jxl.write.*;<BR>import jxl.write.Number;<BR>import jxl.write.Boolean;</FONT></P>
<P><FONT face="Courier New">import java.io.*;</FONT></P>
<P><FONT face="Courier New">/**<BR>&nbsp;* Created by IntelliJ IDEA.<BR>&nbsp;* User: xl<BR>&nbsp;* Date: 2005-7-17<BR>&nbsp;* Time: 9:33:22<BR>&nbsp;* To change this template use File | Settings | File Templates.<BR>&nbsp;*/<BR>public class ExcelHandle<BR>{<BR>&nbsp;&nbsp;&nbsp; public ExcelHandle()<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 读取Excel<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param filePath<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static void readExcel(String filePath)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = new FileInputStream(filePath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workbook rwb = Workbook.getWorkbook(is);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sheet st = rwb.getSheet("0")这里有两种方法获取sheet表,1为名字，而为下标，从0开始<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sheet st = rwb.getSheet("original");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cell c00 = st.getCell(0,0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通用的获取cell值的方式,返回字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strc00 = c00.getContents();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得cell具体类型值的方式<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(c00.getType() == CellType.LABEL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LabelCell labelc00 = (LabelCell)c00;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strc00 = labelc00.getString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(strc00);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rwb.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 输出Excel<BR>&nbsp;&nbsp;&nbsp;&nbsp; *<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param os<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static void writeExcel(OutputStream os)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 只能通过API提供的工厂方法来创建Workbook，而不能使用WritableWorkbook的构造函数，<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因为类WritableWorkbook的构造函数为protected类型<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * method(1)直接从目标文件中读取WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * method(2)如下实例所示 将WritableWorkbook直接写入到输出流</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableWorkbook wwb = Workbook.createWorkbook(os);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建Excel工作表 指定名称和位置<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableSheet ws = wwb.createSheet("Test Sheet 1",0);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //**************往工作表中添加数据*****************</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //1.添加Label对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label label = new Label(0,0,"this is a label test");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(label);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加带有字型Formatting对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableFont wf = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableCellFormat wcf = new WritableCellFormat(wf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label labelcf = new Label(1,0,"this is a label test",wcf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelcf);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加带有字体颜色的Formatting对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.RED);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableCellFormat wcfFC = new WritableCellFormat(wfc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label labelCF = new Label(1,0,"This is a Label Cell",wcfFC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelCF);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2.添加Number对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number labelN = new Number(0,1,3.1415926);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelN);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加带有formatting的Number对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberFormat nf = new NumberFormat("#.##");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableCellFormat wcfN = new WritableCellFormat(nf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number labelNF = new jxl.write.Number(1,1,3.1415926,wcfN);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelNF);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3.添加Boolean对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean labelB = new jxl.write.Boolean(0,2,false);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelB);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4.添加DateTime对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jxl.write.DateTime labelDT = new jxl.write.DateTime(0,3,new java.util.Date());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelDT);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加带有formatting的DateFormat对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableCellFormat wcfDF = new WritableCellFormat(df);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime labelDTF = new DateTime(1,3,new java.util.Date(),wcfDF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addCell(labelDTF);<BR></FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加图片对象,jxl只支持png格式图片<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File image = new File("f:\\2.png");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableImage wimage = new WritableImage(0,1,2,2,image);//0,1分别代表x,y.2,2代表宽和高占的单元格数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ws.addImage(wimage);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写入工作表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wwb.write();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wwb.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 拷贝后,进行修改,其中file1为被copy对象，file2为修改后创建的对象<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;尽单元格原有的格式化修饰是不能去掉的，我们还是可以将新的单元格修饰加上去，<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;以使单元格的内容以不同的形式表现<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param file1<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param file2<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static void modifyExcel(File file1,File file2)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workbook rwb = Workbook.getWorkbook(file1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableWorkbook wwb = Workbook.createWorkbook(file2,rwb);//copy<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableSheet ws = wwb.getSheet(0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WritableCell wc = ws.getWritableCell(0,0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断单元格的类型,做出相应的转换<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(wc.getType == CellType.LABEL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label label = (Label)wc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.setString("The value has been modified");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wwb.write();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wwb.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rwb.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR></FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;//测试<BR>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读Excel<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelHandle.readExcel("f:/testRead.xls");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出Excel<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fileWrite = new File("f:/testWrite.xls");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileWrite.createNewFile();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream os = new FileOutputStream(fileWrite);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelHandle.writeExcel(os);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//修改Excel<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelHandle.modifyExcel(new file(""),new File(""));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR><BR></FONT><FONT face="Times New Roman">2.在jsp中做相关测试，创建一个writeExcel.jsp<BR>&lt;%<BR><FONT face="Courier New">response.reset();//清除Buffer<BR>response.setContentType("application/vnd.ms-excel");<BR>File fileWrite = new File("f:/testWrite.xls");<BR>fileWrite.createNewFile();<BR>new FileOutputStream(fileWrite);<BR>ExcelHandle.writeExcel(new FileOutputStream(fileWrite));</FONT><BR>%&gt;<BR>在IE中浏览writeExcel.jsp就可以动态生成Excel文档了，其中</FONT><FONT face="Courier New">response.setContentType("application/vnd.ms-excel");语句必须要，才能确保不乱码，在jsp中输入&lt;%@page&nbsp;contentType="application/vnd.ms-excel;charset=GBK"%&gt;</FONT>不行。</P><img src ="http://www.blogjava.net/javainthinking/aggbug/7906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-07-18 10:39 <a href="http://www.blogjava.net/javainthinking/archive/2005/07/18/7906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>近期需要修炼的相关东东如下：</title><link>http://www.blogjava.net/javainthinking/archive/2005/07/16/7812.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Sat, 16 Jul 2005 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/07/16/7812.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/7812.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/07/16/7812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/7812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/7812.html</trackback:ping><description><![CDATA[<P>Log4j系列：<BR><BR><A href="http://www-128.ibm.com/developerworks/cn/webservices/ws-log4j.html">Log4j&nbsp;&nbsp;&nbsp;&nbsp; &lt;1&gt;</A><BR><BR>Java IO系列：<BR><BR><A href="http://www.javaresearch.org/article/showarticle.jsp?column=291&amp;thread=26061"><STRONG>JAVA&nbsp;-&nbsp;IO包的学习引导文章</STRONG><BR></A><SPAN class=atitle><A href="http://www.javaresearch.org/article/showarticle.jsp?column=291&amp;thread=26061">彻底转变流&nbsp;&lt;1&gt;</A><BR></SPAN><SPAN class=atitle><A href="http://www-128.ibm.com/developerworks/cn/java/j-io2/index.html">彻底转变流&nbsp;&lt;2&gt;</A></SPAN><BR></P>
<P>Excel操作系列：<BR><BR><A href="http://www-128.ibm.com/developerworks/cn/java/l-javaExcel/index.html">jxl &lt;1&gt;</A><BR><A href="http://blog.csdn.net/redvalley/archive/2004/12/15/216634.aspx">POI&lt;1&gt;</A><BR><A href="http://www-128.ibm.com/developerworks/cn/java/l-javaExcel/index.html">POI&lt;2&gt;</A><BR><BR>IDEA<BR><A href="http://dev.csdn.net/develop/article/17/17920.shtm">IDEA的使用技巧</A><BR><BR>其它：<BR><A href="http://www.knowsky.com/2955.html"><SPAN class=ccwheading02>JSP+XML构架网站的实例</SPAN> </A><BR><A href="http://www.knowsky.com/3136.html"><SPAN class=ccwheading02>jspSmartUpload上传下载全攻略</SPAN> </A><BR><BR>*********************************<BR>调试&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 部署&nbsp;&nbsp;&nbsp; 数据库SQL操作（旧项目中的SQL借鉴）<BR>**********************************</P><img src ="http://www.blogjava.net/javainthinking/aggbug/7812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-07-16 14:14 <a href="http://www.blogjava.net/javainthinking/archive/2005/07/16/7812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修炼一名程序员的职业水准</title><link>http://www.blogjava.net/javainthinking/archive/2005/07/06/7200.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Wed, 06 Jul 2005 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/07/06/7200.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/7200.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/07/06/7200.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/7200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/7200.html</trackback:ping><description><![CDATA[<P><FONT color=#993300>假设你是一名软件专业毕业的本科学子，如何在工作中修炼成为一名有较高职业水准的程序员呢，本文试图总结作者从事15年软件开发工作的感想，希望对有志成为职业程序员的人有所帮助，并借此机会感谢原昆明工学院计算机系的和智玲老师和张怀宁老师，特别感谢我的硕士导师，南京大学计算机系的博导郑国梁教授。<BR><BR>注：本帖言辞尖刻，乃作者脾气秉性使然，如果你看着有气，就请多多见谅，放下别看了。<BR><BR><BR>程序就是一系列按步骤进行的操作序列，它有好多种级别，比如最低级的微程序、次低级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序，也许我列的不对，但没关系，我要说的是不管是那个级别的程序，其本质都是操作的逻辑序列。大多数系统和应用程序都是建立在高级编程语言上的，比如C、C++、C＃、FORTRAN、BISIC、JAVA等等，就让我们只关注这一级的编程能力吧。因此如果一个程序员的逻辑能力不高，他永远都不能成为一名具有合格职业水准的程序员，我们在下面的讨论有关编程能力的方方面面，最终都是为了最大程度地提高和实现一名程序员的逻辑能力。<BR><BR>一、掌握基础知识：十六年寒窗的持续积累<BR><BR>从7岁读小学起，经过16年的学习，你从软件专业本科毕业后，必须完成以下几门专业课程的学习：计算机组成、操作系统原理、汇编语言、数据结构、编译原理、数据库原理、软件工程、结构性设计语言(PASCAL、C)、面向对象设计语言(C＋＋、C＃)、计算机网络等，你最好还懂一些算法分析、分布式系统、计算机图形学、形式逻辑、人工智能原理、软件设计模式、软件构架/框架等研究生的课程，16年来，你积累的除了知识，更重要的是形成最适合自己的学习方法和工作方法。这些是你具备程序员职业水准的基础能力，不要受什么计算机软件怪杰之类传奇的影响，那不过是小概率事件，而且这些怪杰们就算没有读过软件本科和研究生，也往往自学了大多数专业课程，很可能比在校学习的学生对这些课程的精髓部分理解的更好，还有他们的工作方法和思维方式是特别而高效的，但普遍性差，可以借鉴，不宜模仿。好，所以现在你只需要问问自己，那些课程和知识都学会并掌握了吗？如果是，那就准备好进行实践了。<BR><BR>二、在实践中提高：成为一名高水平的Coder<BR><BR>好了，你毕业了，在校功课都不错，也找了一个专业对口的工作，你想大展鸿图了，可是别急，你的翅膀还不够硬，不信我们说来看看。<BR><BR>通常，你在工作中都会用到某一种单位/公司固定的操作系统和编程语言开发环境，比如Windows、UNIX、LINUX等操作系统，又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等编程语言和开发环境，我们在后面把它们合称为开发环境。就在校学习的有关开发环境的知识而言，大概你距工作需要的差距是不小的，当某个操作系统和编程语言环境成为你的饭碗时，就不应也不能用通过课程/认证考试之类的眼光和要求来评价你的能力，即使你能考100分。你需要深入地学习该操作系统和编程语言环境的各类开发手册的所有内容，你会说大多数你都用不上，其实你既对又不对，对的是单从使用的角度而言，你确实用不上开发手册的大多数内容，比如庞大的VC开发类库和复杂的开发环境，你在实际工作中能用到的不到总数的1/10或1/5，不对的地方在于，你用到的部分不是孤立存在的，它们是整个体系中的一部分，只有对整个体系有了一个较完整的了解，才能得心应手、随心所欲地用好你用到的部分，你才算初步具备在这种开发环境下进行Coding的职业水准(还远不够程序员的职业水准呢)，而这只是刚开始。如何才能真正掌握一种开发环境的全面的知识呢，最原始的办法就是读开发指南/教程、参考手册，一般来讲，学习开发指南/教程时，你如果是一个认真的人，都会完成5/10~7/10左右内容的学习和练习，如果你想成为职业选手，就应该完成9/10以上内容的学习和练习。参考手册不同，大多数所谓的“程序员”们只是用到了才翻翻，这差的太远了，你应该象读开发指南/教程一样，每个环节都要读，比如VC，参考手册中的每个类，类的每个函数，都要读上几遍，它们往往是一小伙一小伙地纠缠在一起使用的，开始时读得你毫无头绪、心烦意乱，不要紧，还有一手呢，如果你开发环境安装的全面，它们往往都有开发商做的demo例子可看，你就进入另一个境界了，开始时你关注demo中的具体技术，后来你发现这些demo的程序写的都还算不错，结构简单但合理，如果你真的用心，就一定能发现一些个别的demo是极品，它所展现的程序逻辑结构是你设计不出来的，你现在有点更关心它的程序设计构架，甚于对你原始目的(某种相关的技术/技巧)的关注，这时的你，开始了从一名Coder向一名Programmer的转变，你会忍不住要看看开发商提供的源程序，比如.h和.cpp，通常你会找到include路径下所有的.h程序，你才知道，哇！好多好多东东在参考手册中都没提到，你要学的太多了，没时间顾及其它的业余爱好了，现在知道为什么程序员是年轻人的职业了吧，你要有足够多的时间才行，即使你的智商有160。如果你走到这一步，在你工作的团队中，已经是经常有人向你请教技术问题，经常有人请求你帮忙debug，你已是公认的“高手”了，别得意，因为你仍然是个Coder，为什么这么说呢，你想想，你已深入了解了这个开发环境中的各种技能，知道一名Coder如何用好这些东西，可是你能设计的出提供给Coder们用的东西吗？唔……，你想了想，可能还不太行。对了，就是这样，你还是一名小我境界的程序员呢，本质是个Coder，当然已是一名高水平的Coder了，然而你需要进一步登堂入室才能成为一名真正的程序员。<BR><BR>让我们继续吧，通常你都是从精通一种编程环境开始的，假设你已经较为精通在Windows下用VC开发软件了，这时在技术和技巧方面你将面临一小一大两个挑战，第一个小挑战是如果公司/单位改换了开发环境，比如用LINUX下的QT交互语言工具进行开发，你不过是把前面掌握VC的过程再来一遍，由于在主观上经历了VC工具的学习过程，在客观上各种开发环境都有太多相似的方面，这回你掌握的应该较快。要小心，在这时第一次诱惑之门打开了，因为你感觉良好，看！这回这么快，我就这么好地掌握了新的开发环境，你开始关注其它暂时还用不到的同类环境，比如VB、Delph、JAVA，如饥似渴地掌握各种开发工具，证明自己的学习能力和价值，但你忘了一点，你仍然是个Coder，只不过是一个在好多开发环境下都能编程的Coder，就像你生活在中国，因而精通了汉语，工作需要你又掌握了英语，然后你就来了劲，把俄语、日语、阿拉伯语、拉丁语，等等等等，都学习个遍，我只能说，有点BT。你忘了自己是个职业人，同一类的东西工作中用得到才需学习，太多太多的Coder们喜欢在一起比较和炫耀自己会掌握了几种开发工具，不信你看看招聘时的求职书就知道了，sigh！他们中绝大多数人永远都只能停留在这个层次上，心浮气躁，一生都再也当不成真正的程序员了。总结一下，其实你在这时需要的是对自己掌握新开发环境的能力的自信，而不是一遍遍地重复来证明自己。第二个大挑战就是你明白了只掌握VC是不够的，你发现自己有点浅薄，有很多东东你会用但你不太懂，很多方面支持VC编程的知识你都没掌握，比如操作系统的源码、网络协议知识、Windows 的注册表、进程和线程的基础知识、硬件驱动方面的知识、ActiveX、Windows 庞大的 API，又是一个等等等等，这些基础知识的学习和掌握可是要花费大量时间的，你再一次深切地感到时间太不够用了，因为这时的你大概有许多俗务缠身了，所以有点沮丧，还不用提IT业每天不知有多少新东西在发布，KAO，永远都跟不上，越拉越远了。哎！别气馁，振作一点，你还是忘记了自己是个职业人，既然好多东东在工作中你永远都没机会用，那么干嘛要学呢？用什么才学什么，最多预测到马上要用什么，先一步学什么好了，要知道没有人是真正的、无所不精的全科大夫，除非你是神，但如果你还在耐着性子看这篇文章，你肯定是个人嘛。<BR><BR>OK，一般工作后三五年，你经历了上述过程，经受了诱惑和考验，终于明白了一个道理：你要的是强劲的学习知识的能力，是对某种软件知识/技能的有深度的精通，一种摸到它的根的深度，而不是已掌握的技能的种类和数量。这时无论谁用他掌握了多少种你不会的技能来吓唬你都没用，你对他的层次只有蔑视。通过几年的学习和工作，要记住最重要的一点，永远最重要：对自己学习IT知识能力的自信，一个程序员一生都要不停地进行高强度的学习，用心问问自己，有没有这个自信？别用虚荣心来骗自己哦，如果没有的话，那就不必花费你宝贵的时间向下看了，作者在此感谢你有耐心看到这里，现在建议你关闭这篇文章，趁着年轻，当机立断转行吧！<BR><BR>三、注重逻辑：成为一名职业程序员<BR><BR>好，再前进一点点，你就要成为一名职业程序员了，让我们继续来完成这个任务吧！我们在前一节提到过，“你发现一些个别的demo是极品，它所展现的程序逻辑结构是你设计不出来的，你现在有点更关心它的程序设计构架，甚于对你原始目的(某种相关的技术/技巧)的关注”，其实你是在关注这个demo程序作者的思维逻辑，所有程序的本质就是逻辑。技术你已经较好地掌握了，但只有完成逻辑能力的提高，你才能成为一名职业程序员。打一个比方吧，你会十八般武艺，刀枪棍棒都很精通，但就是力气不够，所以永远都上不了战场，这个力气对程序员而言就是逻辑能力(其本质是一个人的数学修养，注意，不是数学知识)。逻辑能力也是逐步提高的，开始时你一定是用直观的逻辑能力来编程的，怎么想就怎么编，不对就再改，在改进中提高自己的逻辑能力，从直观逻辑能力提高到抽象逻辑能力，这是很正常的。提前说一句吧，到达逻辑能力的至高境界，其表现是用数学语言来描述问题和问题的解决办法，高度抽象！好，说回来吧，你要提高逻辑能力，最快的办法就是读别人写的结构优秀的程序。优秀的代码是百读不厌的(这句话是我抄来的)，暂时放放对其中某种技术和技巧的关注吧，你要推导和学习的是这些好程序的逻辑结构，它们是被精心设计出来的。你可以先捂住这个demo程序，自己设计一个功能相同的程序结构，然后比较一下demo的程序结构，如果差距较大，那你就不应简单地改进一下，而是要把demo作者设计的过程在心里复原一遍，做到这一点也许有点困难，但这种事干的多了，你就会越干越快，越来越得心应手，你的逻辑能力飞速提升，你能看得上的逻辑结构优秀的程序开始不多了，下一步就是练习。从工作中开始吧，如果你有空闲，你需要做至少两类练习，一类是算法练习，所有的经典算法都是经典的逻辑，题目有的是，像个好学生一样吧，每年的国内国际编程竞赛都有逻辑要求非常高的题，你可以只选一两道难题来做做。当你可以把复杂的单递归程序(只有A调A)变成非递归程序时，已经不错了，如果你能看得懂双递归程序(A调A、A调B、B调A、B调B都有)，我为你鼓掌！你不必往下看了，我有点不好意思啦――班门弄斧，你快滚蛋吧！另一类是把以前和当前你工作中你不满意的程序推倒重新设计一遍，这非常重要，省时省力，因为你熟悉需求，技术上也没问题，目的就是改进程序的逻辑结构，很划算哦，唯一要克服的就是：你对推翻以前工作中那点小小成就的心理障碍，如果你真想优秀，说句粗话：这点心理障碍算个屁，一遍遍反复地推倒已有的成果只能使自己快速进步，放手干吧，没什么好可惜的，马恩早就在《共.产.党宣言》里说过了：在这个过程中，你失去的只有锁链(禁锢你思想的锁链)。<BR><BR>让我们来总结一下，经过自我否定后，再生的你尽管对过去的“业绩”还有一些眷恋，但已是一个初步具备职业水准的程序员了，掌握了相应的技术和技巧，具备了较高的抽象逻辑思维能力，最主要的特征是：能自觉地自我否定，不断地追求更高水平的逻辑能力。<BR><BR>在这个过程中，如果你能注意以下一些小的方面，你前进的步伐也许会快一些。<BR><BR>l 从编译原理的角度来理解你工作中使用的高级语言，如果你做到这一点，至少有两个好处，第一个好处是避免一大堆低水平重复出现的编译错误。一名优秀的Coder平均在一个工作日中应该完成200行以上的源码，其编译错误应该控制在5个以下，要知道这200行源码不是一次完成的，所以大多数情况下你都要追求一次编译通过，而一名职业水准的程序员，应该进一步做到即使用purify这类的工具来检查源码，也不会存在严重的内存泄露。第二个好处是可以提高源码的可读性和效率。规范地编写你的代码使你自己的逻辑清晰，因为你明白多加几个括号和空行、多换行对齐、多注释，编译器是会自动识别的，不影响程序执行的效率，反过来，控制好递归调用和循环内的if语句才是提高程序效率的关键，要全力避免递归，但要深刻理解递归，能通过自己建立堆栈来把递归程序转换成非递归程序，要求还是较高的哦！<BR><BR>l 避免思维陷阱，只要你是人就一定有自己的思维惯性，这一定又会表现在你的程序逻辑中，有时你就是从这个惯性中跳不出来(谁都有这个时候)，但要心里有数才行，所以你需要帮助，如果你有几个水平相若或更高的职业伙伴，太好了，当遇到花30分钟还打不下的bug时，就别浪费时间了，找他们吧，最要紧的是能思路清晰明确地表述你的问题，通常你自己在这个过程中或者伙伴中就有人把问题解决了，又快又好。另外，有几个可以良性竞争的职业伙伴是人生的一件幸事，1+1&gt;2，大家各有所长，你最好做到及时公开你的成果，技不压身嘛，IT发展的这么快，你再优秀，那点东东也没有什么值得隐藏的，所以你可以技术或水平不够高，但千万不可以让真正具有职业水准的选手鄙视你的职业品质和行为。<BR><BR>l 有自己debug的特点，下面的说法作者不敢太肯定，只是经验之谈。即使在VC这种高度完善的开放环境下，你仍然应该要求自己仅凭打印语句就能debug。这也有两点好处，第一个好处是，遇到bug你会认真想问题所在，而不是用debug工具一步步简单地追踪卡在哪儿了，你定位bug范围的方式是从大到小、从粗到精，这是一种自顶向下的思维方式，而用工具追踪，容易形成自底向上的思维方式，这不算好，你应该先看到森林，再看到树木。我反复提及：程序就是逻辑过程，大多数程序从main函数开始，是由数据结构和功能子程序组成的一个树形结构的逻辑过程(要认清即使是面向对象的程序语言也是一样的)，它的执行过程是深度优先的，但你定位bug应该是广度优先的，好好想想这一点，嗯？第二个好处是强迫你思考并记住而不是用工具看到调用过程，你大脑的抽象逻辑思维能力和胳膊上肌肉的力量一样，都是练出来的，如果你的bug是程序结构上的逻辑错误引起的，这一点就非常重要了，顺便说一句，最难打的bug就是程序逻辑结构错误导致的bug。你要是真正明明白白地认识到这儿了，那我就没什么东西可以告诉你了。总之，程序员的职业水准：生产效率和程序质量，主要是取决于源码中bug的数量和debug的速度，而不是取决于编写源码的速度。给你一个我自己定义的考查一个职业程序员的指标：一个合格水准的职业程序员，编程的时间如果算一份的话，其累计debug的时间不能超过一份，真正职业高手累计debug的时间应该控制在0.5份以下，如何？你关上门悄悄问问自己，你花费在编程和debug上的时间比例是多少？如果你把程序员作为自己一生的职业，那么就永远都要牢记一点：追求做一个0 bug的优秀程序员！这是任何一个想成为职业程序员的人的理想，请相信：坚忍不拔地追求实现这个理想将让你出类拔萃！<BR><BR>l 做好程序的单元测试，这是另一项考查你是否是一名具有合格职业水准的程序员的一个必要指标。其实在你拿到需求的时候就要准备单元测试用例了，并且这些用例将直接影响你的详细设计(有关软件设计本来是该放在第四节讲的)。我们还是打比方吧，当你拿到一个需求时，除了分析它静态的功能外，还应明确它动态的操作/执行过程，把这个动态过程明确地用流程图画出来，比如分为A～Z的26步，其中A又可以进一步分解为A1～A5的5步，直到不能再分解为止。又比如说A3步不可分解了，那么你应该把A3步的正常操作和所有五花八门的异常操作都列出来，确保正常的操作肯定正确，异常的操作起码程序不退出才行。这样你就要写好多好多的测试用例，说句老实话，我也从来不写！但我一般会列一个提纲，比如A3步有正常的操作a、b、c、d、e共5项，异常的操作有f、g、h、i、j、k、l、m、n共9项，你在进行单元测试时都应该跑一遍，这样的程序都还不敢说质量如何好，但起码可以说较稳定吧！如果要想在进行单元测试时干得快、效率高，那么在进行详细设计时，你就应该把A3步中对所有正常操作和异常操作的判断都设计好，在编程实现A3步时，使得程序的结构合理高效，对不对？所以，如果你在工作中是割裂地看待软件工程中从需求、分析、设计、编程、测试等各个环节，恐怕水平很有限喔！但如果你在分析需求时就能看到测试的问题，并改进设计和实现，为此做好相应的准备工作，嘿嘿，整个软件开发过程你的效率会高很多，通常你在一个开发团队中就会高度自信的，你已越过当一名偏颇、露骨的高手的境界，成为一个平静的高手，这可是The best in the best！，用周星星的话说：是高手之高高手，因为别人看不出你高在哪儿，没见你有什么高招或特拚命干，但反正你就是干得又快又好、又省力。关于进行单元测试还有很多复杂的方法，在此本文只提到了最基本的一点，目的是让你在工作上考虑周全、安排有序，其它的自己琢磨吧，没有人能替你吃饱饭！<BR><BR>l 如果你是用C＋＋编程，我再简单谈谈有关内层释放的一个小技巧，就是对所有你编写的类，在构造和析构函数中加打印语句，统计每个类在运行程序时构造和析构的地方，如果是配对的，那么起码没有对象类一级的内层在程序运行结束时没有释放，然后你就可以把打印语句删掉了，招数虽土，但管用！<BR><BR>l 还有其它一些好习惯，在这里我随笔写一些，你要是有不同看法也请一笑过之吧。编程时应该对齐缩进，一个缩进用一个tab键，一般是4个空格，严格遵守开发团队的编程规范也是非常重要的。一个子程序不应超过30行(不算空行)，其内多重循环不应超过3层，否则都应该分裂成两个子程序，个别算法程序可以长一些，但也不宜超过200行。通常一个类的所有成员函数总和不宜超过1500行，多了就应该考虑分解成两个类(这个工作最好在设计时就完成)。每完成一小段程序，比如15～30行，就立即编译运行，不要假装高手，先敲它一大堆程序，再编译运行，妄想一次成功，体验一种假爽的、虚荣的快感，或炫耀给别人看，这么做只能证明自己是一个不折不扣的傻瓜，装酷而已。因为只要有一次不成功，你就会花费大量的时间来调程序，别人的进度在这时就远远地超过你了，平常心是道，还是修炼真功夫吧！孙子兵法里关于这一点有明确的阐述，我就不引用了，但建议你真的不要这么干，除非你确实就是这样总是一次就成功的天才，那你还看这篇文章干什么呢？我又不是写给你们这些天才们看的。再就是有学会买好书、读好书，关于计算机和软件方面的书太多了，时间有限，比如有一个叫侯捷的家伙，几乎写的每本书都不错，张国峰的C＋＋编程也不错，这只是我的个人意见啊，好书多着呢，列出来比这篇文章长好多倍，我就不多说了。还有一招，要是你运气好，能搞到一些著名软件系统的源码，好好读读吧，在此我只能告诉你，Linux操作系统的一些源码不错，是开放的，你可以合法地搞到，其它的不要说是我建议你侵犯知识版权啊！<BR><BR>四、天生神力：成为系统分析员<BR><BR>本来就论述如何成为一名职业程序员而言，本文已基本完成任务了，但《菜根谭》有言：竭世机枢，似一滴投于巨壑，穷诸玄辩，若一毫置于太虚。既已乘兴到此，何妨多置一毫于太虚呢，作者不才，干脆尽兴写算了。<BR><BR>你要是运气好，直接进入了一个严格规范生产的软件企业就业，刚开始就应该是按别人做好的软件设计来实现编程，你可以有机会直接学习软件设计，当你积累的足够多了，能够对其中的一些设计提出好的改进建议，而且干得又快又好，就会渐渐地展露头角，我相信你终有一天成为一名软件设计人员(注意，不是软件产品设计人员)，步入系统分析员的行列，但这还需其它的一些条件和自我修炼。如果你在一个不规范的软件企业工作，那也不错，你很可能直接就有机会进行软件设计，然后开发、测试，甚至还不得不自己定义需求，把软件开发过程的各个环节走一个遍，当然这样对你的要求更高，而且你也不容易得到及时有益的指点，在正态分布的情况下，你应该是成长的很慢。但不管就业的单位如何，如果你决心要成为顶尖软件职业选手，通常什么客观困难都阻挡不了你，然而你个人的因素可能会阻止你的前进。下面提出的观点纯属一己之见，伤人自尊之处作者在此提前道歉，并建议你除非对本文有强烈的兴趣，否则就请直接看第五节或放下别看了。丑话已说在前头了，在各种软件开发组织的发展过程中的事实也证明，只有少数程序员能成为系统分析员，我想这一点不是我杜撰的吧，因此你要是在看接下来的部分时感到气愤难当，那也实在没着，纯属活该，因为作者只是在说明自己的观点而已，你最多可以呲之以鼻，表示一下你的轻蔑好了，但没有任何理由可以骂人！<BR><BR>作者自己没有到微软面试过，但身处软件行业，关于微软的许多东东当然还是有耳闻的，据说微软招聘一名程序员要过五个已经成为微软程序员的面试关，而且是一票否决制，又据说大多数面试题并非编程，而是一些有关逻辑和智力的题，作者私下也做过许多流传的微软面试题，并对此做法深以为然。程序的本质就是逻辑，所以几十年前就有人提出编程是一门艺术，而艺术是要靠天份的，这一点少有人反对。一个人的逻辑能力可以不断提高，但其能到达的终极逻辑能力的层次必定为其天生智力所限制，这一点就让人不易接受了。好笑啊！人们可以公开承认自己没有某种或全部的艺术天份，但要说自己逻辑天份不够，换句话说承认自己笨、IQ不够高，往往是要怒发冲冠的，其实这又有什么区别呢？话都说到这儿了，再次建议你如果不够自信，就跳过这一节吧，直接看第五节，好吗？<BR><BR>好了，把话题说回来，你已经成为一门合格的职业程序员了，如果要想成为从事软件系统设计的职业系统分析员，第一件事就是悄悄找一个标准智商测试的网站或其它渠道，严格认真的测一测自己的智商，如果IQ低于130 (正常智商是110)，就请别费劲了，打消掉成为系统分析员的念头吧！好！好！先请你冷静一下，好好想想，其实微软面试时就是在测你的智商和逻辑数学素质呢，这就是本节的标题为“天生神力”的原因，因为设计就是从无到有地进行创造，无论是软件还是其它行业都一样，可以有借鉴的，没有现成的，设计就是创造！如果你IQ在130以上，又决心要当一名职业软件系统分析员，其实你不过是要准备好吃更大的苦而已，有什么好虚荣的呢？<BR><BR>修炼还是从基本功开始的，过程和成为一名职业程序员差不多。必须使用设计工具这一点是不用多说的。在工作中，你基本上遇到的是两类方式的设计，一个是结构化设计，另一个是面向对象设计，就个人经验而言，面向对象的设计更好。如果你工作中不得不采用结构化的设计，你必须熟练地掌握数据流图和控制流图的分析和设计，一般来讲，如果你把一个软件中用到的数据模型设计好了，针对功能化的流程，不难设计出数据流图，但下一步设计控制流图才是挑战，如果你按照需求走不通设计好的控制流图，那么你或别人在按照这个设计编程实现时，必定也走不通，没有奇迹会发生，还是在设计阶段严格要求吧，又有一点需要牢记：返工是最慢的。当你在进行控制流图的设计时，也不要妄想得到需求人员提供给你明确的指点，通常他们要是能够把需求的功能和操作次序写完整的话，你应该就感恩戴德了，从需求中整理出功能、操作的拓扑次序和条件是你作为系统分析员的职责。看看，要是没有一点图论的基础和拓扑学的入门知识，你是当不好一个职业系统分析员的，即使你天赋不错，必要的数学和逻辑素质仍然不可或缺。也不用气馁，永远没有最好的设计，只有更好的设计，反复地进行设计迭代，勇于推翻旧的设计，你将快速进步。如果你在工作中是采用面向对象进行设计的，那就更有利了，有关面向对象设计的书太多了，不用作者在此多费口舌，建议精读一本经典的书，比如北大邵维忠等编译的《面向对象的分析》，有些方法和技巧可能过时，但其逻辑的基本原理是非常正确的，其本质是，你在逻辑上是如何认识这个世界的，你就是如何设计软件体系结构的，然后读读其它书，触类旁通，自己创造机会多实践，成功自然会到来的，总之，不管是结构化设计还是面向对象设计，评价一下自己的软件系统设计方案吧，有好多指标呢，比如是否均匀和平衡？局部独立性强不强？有没有歧异的结构？有没有层次太多或太少？有没有某个层次太大、太广？是不是逻辑结构先复杂了再化简的？还是只会设计简单的，复杂不起来(这一点是笨哦，如果出现多次，请你不要意气用事，转行吧)？最重要的一点，是否容易理解、实现和改进？你自己会得出评价的。如果有机会看到别人的设计，一定不要错过学习的机会，自己推导一遍，认真比较比较，获益会较多。<BR><BR>走到这一步，你就应该关注设计模式了，首先还是学习，这方面的好书有的是，但一般在工作中用到的设计模式较为单一，应该多尝试一下其它的设计模式。其次必须要明白设计模式不是设计思路，也不能代替设计思路，比方你要从A到B修一条路，设计模式只是让你选择，是修水泥的还是柏油的？是高架路还是普通的，但线路必须你自己定，而线路就是设计思路，模式对思路是有影响，但不能代替，所以如果你的智商高达250，我相信你直接用汇编语言也能写出面向对象的程序来。第三在此有一个陷阱，很多系统分析员生搬硬套设计模式，全然不懂如何融会贯通，在你的一项具体工作中，往往是以一种设计模式为主，其它模式为辅的，思维不拘泥于形式才是关键，而且也为你到达更高的软件设计的境界做好准备。<BR><BR>唉！都不知该怎么向下写好了，因为已达到作者水平的极限了，我胡乱说一点，你凑合看吧。软件设计最终的层次是：以无法为有法、以无限为有限，这句话是李小龙说的，不是我说的。再拾人牙慧一把，类比一个故事吧，金大侠在《倚天屠龙记》里讲到张无忌初学太极，学会的标志是把刚学的招数全忘了，记住的是太极的道理和精神，和李小龙有些相似喔，软件设计也一样，忘记所有的设计模式，随心所欲进行设计才是至高境界，所以你能到达多高的软件设计的境界最终将取决于你的哲学素质，这一点实在是不好写啊，你自己领悟吧！作者只有祝福了！<BR><BR>五、职业人的终极目标：全面修炼，成为Leader<BR><BR>这一节更不好写，涉及到太多其它非技术方面的因素，特别是个人人生观和世界观的修炼，如果本帖的点击率超过作者私下期望的一个数值，那我就争取尽力厚着脸皮再补上吧。我只说一句，虽然大家都知道软件开发是一个团队性的工作，但追求参与一个大型软件系统的成功开发，是一名软件人员的本能，就像拿破仑说的不想当元帅的士兵不是好士兵，所以不追求实现大系统的软件人员，也不是一个好的职业软件人员，但你只有成为Leader，领导一个优秀的软件开发团队，才有机会实现这个终极职业目标，对不对？<BR><BR>好吧，不管你现在的感受如何，我都谢谢你能读到这里！我不习惯假歉虚，就不说什么作者水平有限，本文抛砖引玉，欢迎大家批评斧正之类的客套话了，虽然作者水平确实有限。所以我认为你尽管有权砸砖，但实在没必要搞回帖、或回骂、或顶之类的玩意儿，我只是尽兴写一点多年从事软件开发工作的体验，因此接下来我就高挂免战牌，不回复任何回帖了。再次谢谢你能有耐心读到这里！希望本文对你有所裨益，祝你成功！再见！</FONT><BR><BR></P><img src ="http://www.blogjava.net/javainthinking/aggbug/7200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-07-06 15:53 <a href="http://www.blogjava.net/javainthinking/archive/2005/07/06/7200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>心态决定着学习Java的不同历程……</title><link>http://www.blogjava.net/javainthinking/archive/2005/05/30/5325.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Mon, 30 May 2005 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/05/30/5325.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/5325.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/05/30/5325.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/5325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/5325.html</trackback:ping><description><![CDATA[以前一直以非常急进的心态学java.突然却发觉这样往往使自己脱离生活。不能使java学习溶入生活当中，使的心情经常躁意.迷失在生活为了什么当中……<BR>今，醒然。<BR>以开阔和平静的心态去学习，也许会获得更多……（追求的激情永远都不会磨灭），因为不能溶入生活的东西，终究会被生活所累。<BR>今在此胡言乱语，不知所云!<img src ="http://www.blogjava.net/javainthinking/aggbug/5325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-05-30 11:23 <a href="http://www.blogjava.net/javainthinking/archive/2005/05/30/5325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>历史的教训是沉痛的……</title><link>http://www.blogjava.net/javainthinking/archive/2005/05/28/5292.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Sat, 28 May 2005 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/05/28/5292.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/5292.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/05/28/5292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/5292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/5292.html</trackback:ping><description><![CDATA[1.林彪不抽烟不喝酒只活了63岁 <BR>2.周恩来只喝酒不抽烟，活了73岁 <BR>3.毛泽东只抽烟不喝酒，活了83岁<BR>4.邓小平即抽烟又喝酒，活了93岁 <BR>5.而张学良老将军吃喝嫖赌博样样都来，活了103岁 <BR>历史的教训是沉痛的……<img src ="http://www.blogjava.net/javainthinking/aggbug/5292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-05-28 13:57 <a href="http://www.blogjava.net/javainthinking/archive/2005/05/28/5292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts中tiles的使用</title><link>http://www.blogjava.net/javainthinking/archive/2005/05/24/5092.html</link><dc:creator>XL的个性空间和java学习之旅</dc:creator><author>XL的个性空间和java学习之旅</author><pubDate>Tue, 24 May 2005 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/javainthinking/archive/2005/05/24/5092.html</guid><wfw:comment>http://www.blogjava.net/javainthinking/comments/5092.html</wfw:comment><comments>http://www.blogjava.net/javainthinking/archive/2005/05/24/5092.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/javainthinking/comments/commentRss/5092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javainthinking/services/trackbacks/5092.html</trackback:ping><description><![CDATA[<H3 style="MARGIN: auto 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><FONT color=#cc3300><FONT size=3><FONT color=#a52a2a><SPAN class=title1><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">本文以最简单而有效的形式记录</SPAN></SPAN><SPAN class=title1><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 黑体">tiles</SPAN></SPAN><SPAN class=title1><SPAN style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的使用过程，以备以后使用时快速参考。</SPAN></SPAN></FONT></FONT><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 黑体"> 
<P></P></SPAN></FONT></H3>
<P style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-FAMILY: Arial"><FONT size=3>1</FONT></SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">.</SPAN></STRONG><FONT size=3><STRONG><SPAN style="mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><FONT face=宋体>先建一个</FONT></SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-FAMILY: Arial">layout.jsp</SPAN></STRONG><FONT face=宋体><STRONG><SPAN style="mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">布局页面</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Arial"> 
<P></P></SPAN></FONT></FONT>
<P></P>
<P></P>
<P></P>
<P></P>
<P></P><PRE><SPAN lang=EN-US><FONT face=黑体 size=2>******</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体"><FONT size=2>&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN lang=EN-US> &lt;tr&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;td height="113" colspan="2" scope="col"&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;tiles:insert attribute="top"/&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;/td&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;/tr&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;tr&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;td width="21%" height="409" scope="row"&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;tiles:insert attribute="left"/&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;/td&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;td width="79%" height="409" scope="row"&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US>    &lt;tiles:insert attribute="main"/&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;</SPAN></FONT><FONT size=2><SPAN lang=EN-US> &lt;/td&gt;<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体">&nbsp;&nbsp;</SPAN><SPAN lang=EN-US> &lt;/tr&gt;</SPAN></FONT></PRE><PRE><SPAN lang=EN-US><FONT face=黑体 size=2>*******</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体"><FONT size=2>&nbsp;</FONT></SPAN></PRE><PRE><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial">2</SPAN><SPAN lang=EN-US><FONT face=黑体 size=2>.</FONT></SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">新建一个</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"> </SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">tiles-defs.xml</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">文件，并在其中做相应的配置</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">。</SPAN></STRONG></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>*********</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"><A href="http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"><SPAN style="FONT-FAMILY: 'Courier New'">http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd</SPAN></A></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">"&gt;<BR>&lt;tiles-definitions&gt;<BR>&nbsp;&lt;definition name="member-definition" path="/Jsp/layout.jsp"&gt;<BR>&nbsp;&nbsp;&lt;put name="top" value="/mTop.do"/&gt;<BR>&nbsp;&nbsp;&lt;put name="left" value="/mLeft.do"/&gt;<BR>&nbsp;&nbsp;&lt;put name="main" value="/defaultMmain.do"/&gt;<BR>&nbsp;&lt;/definition&gt;<BR>&lt;/tiles-definitions&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>*********</FONT></SPAN></PRE><PRE><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">这样就相当于通过</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">xml</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">文件定义了一个</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">member.jsp.</SPAN></FONT></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体"><FONT size=2>&nbsp;</FONT></SPAN></PRE><PRE><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">3.</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">在</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">web.xml</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">和</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">struts-config.xml</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">和</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">web.xml</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">中做相应配置</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">.</SPAN></STRONG></PRE><PRE><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">在</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">struts-config.xml</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">中配置如下：</SPAN></FONT></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>***********</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&nbsp; &lt;plug-in className="org.apache.struts.tiles.TilesPlugin"&gt;
&nbsp;&nbsp; &lt;set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/&gt;<BR>&nbsp;&nbsp; &lt;set-property property="definitions-parser-validate" value="true"/&gt;<BR>&nbsp;&nbsp; &lt;/plug-in&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>***********</FONT></SPAN></PRE><PRE><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">在</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">web.xml</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">中配置如下：</SPAN></FONT></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>************</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<BR>&nbsp; &nbsp;&nbsp;&lt;param-name&gt;definitions-config&lt;/param-name&gt;<BR>&nbsp; &nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/tiles-defs.xml&lt;/param-value&gt;<BR>&nbsp;&nbsp; &lt;/init-param&gt;</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-ascii-font-family: 黑体"><FONT size=2><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>************</FONT></SPAN></FONT></SPAN></PRE><PRE><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">4.</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">调用</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">Tiles</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">组件</SPAN></STRONG></PRE><PRE><FONT size=2><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">Tiles</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">组件是通过</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">Struts Action</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">来调用的，在</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">struts-config.xml</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">中做如下</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">action</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">配置：</SPAN></FONT></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>*************</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; path="/member"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; parameter="member-definition"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; type="org.apache.struts.actions.ForwardAction"/&gt;</FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=2>**************</FONT></SPAN></PRE><PRE><FONT size=2><FONT face=Arial><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">然后可以通过访问</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">/member.do</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">访问相当于</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">member.jsp</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">Tiles</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">组件</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">.</SPAN></FONT></FONT></PRE><FONT size=2><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><PRE><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt"></SPAN></B></PRE><PRE><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt">II ---------------------tiles</SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt">的高级使用</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt">--------------------------<P></P></SPAN></B></PRE><PRE><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt">&nbsp;<P></P></SPAN></B></PRE><PRE><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt"></SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt"><P><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt">1 .tiles</SPAN><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-bidi-font-size: 10.0pt">组件的嵌套</SPAN></B></P></SPAN></B></PRE><PRE><SPAN style="FONT-FAMILY: 宋体"><FONT face=Arial><SPAN lang=EN-US></SPAN></FONT></SPAN></PRE><PRE><SPAN style="FONT-FAMILY: 宋体"><SPAN lang=EN-US><P><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">然后可以通过访问</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">/member.do</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">访问相当于</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">member.jsp</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">Tiles</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">组件</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Arial; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">.</SPAN></FONT></SPAN></P></SPAN></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体">*************<P></P></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&lt;tiles-definitions&gt;<BR>&nbsp;&lt;definition name="member-definition" path="/Jsp/layout.jsp"&gt;<BR>&nbsp;&nbsp;&lt;put name="top" <U>value="menu-definition" type="definition"</U>/&gt;<BR>&nbsp;&nbsp;&lt;put name="left" value="/mLeft.do"/&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">  </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&lt;put name="main" value="/defaultMmain.do"/&gt;</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&nbsp;&nbsp;</SPAN></PRE><FONT size=2><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&lt;/definition&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">************<P></P></SPAN></PRE>
<P></P><PRE><SPAN style="FONT-FAMILY: 宋体"><FONT size=3>其中<SPAN lang=EN-US>menu-definiton作为一个子tiles组件而单独配置，这样就可以把一个个简单的tiles组件组合成一个复杂的tiles组件。</SPAN></FONT></SPAN></FONT></SPAN></FONT><FONT size=2><SPAN lang=EN-US style="FONT-FAMILY: 宋体">&nbsp;</PRE>
<P></P></SPAN><PRE><SPAN lang=EN-US style="FONT-FAMILY: 宋体">&nbsp;<P></P></SPAN></PRE><PRE><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">2．Tiles组件的扩展<P></P></SPAN></B></PRE><PRE><SPAN lang=EN-US style="FONT-FAMILY: 宋体"><FONT size=3>Tiles组件的扩展，在有很多tiles组件使用相同的模板页面layout.jsp的时候，特别有用处，我们先定义一个通用的tiles组件如base-definition，其中组件中相应的地方value设置为空。<P></P></FONT></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">*************</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&lt;definition name="base-definition" path="/Jsp/layout.jsp"&gt;
&nbsp;&nbsp;&lt;put name="top" value="/mTop.do"/&gt;
&nbsp;&nbsp;&lt;put name="left" value="/mLeft.do"/&gt;<BR> &nbsp;&lt;put name="main" value=" "/&gt;<BR>&nbsp;&lt;/definition&gt;<P>*************</P></SPAN></PRE>
<P></P><PRE><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">其它</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">tiles</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">组件可以通过集成它，并把</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">name="main"</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">中的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">value</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">设置成自己特有的，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"><P></P></SPAN></PRE><PRE><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">如：</SPAN></PRE><PRE><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">**************</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt">&lt;definition name="member-definition" extends="base.definition"&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt"> </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&lt;put name="main" value="/defaultMmain.do "/&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&lt;/definition&gt;</SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">******************</SPAN></PRE></FONT><img src ="http://www.blogjava.net/javainthinking/aggbug/5092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javainthinking/" target="_blank">XL的个性空间和java学习之旅</a> 2005-05-24 09:05 <a href="http://www.blogjava.net/javainthinking/archive/2005/05/24/5092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>