??xml version="1.0" encoding="utf-8" standalone="yes"?>在线观看一区二区视频,蜜芽视频在线观看,欧美成人精品一区二区http://www.aygfsteel.com/sitinspring/category/33626.html真正的成熟,应当是独特个性的形成Q真实自我的发现Q精上的结果和丰收?/description>zh-cnFri, 14 Nov 2008 12:07:55 GMTFri, 14 Nov 2008 12:07:55 GMT60Struts Tiles CZhttp://www.aygfsteel.com/sitinspring/archive/2008/11/14/240469.htmlsitinspringsitinspringFri, 14 Nov 2008 02:44:00 GMThttp://www.aygfsteel.com/sitinspring/archive/2008/11/14/240469.htmlhttp://www.aygfsteel.com/sitinspring/comments/240469.htmlhttp://www.aygfsteel.com/sitinspring/archive/2008/11/14/240469.html#Feedback0http://www.aygfsteel.com/sitinspring/comments/commentRss/240469.htmlhttp://www.aygfsteel.com/sitinspring/services/trackbacks/240469.html http://www.aygfsteel.com/Files/sitinspring/StrutsTilesSample20081114103940.rar

截图一Q?br />

截图二:(x)


sitinspring 2008-11-14 10:44 发表评论
]]>
使用模板Ҏ(gu)模式化控制层c(ActionQ的设计http://www.aygfsteel.com/sitinspring/archive/2008/09/01/226045.htmlsitinspringsitinspringMon, 01 Sep 2008 03:51:00 GMThttp://www.aygfsteel.com/sitinspring/archive/2008/09/01/226045.htmlhttp://www.aygfsteel.com/sitinspring/comments/226045.htmlhttp://www.aygfsteel.com/sitinspring/archive/2008/09/01/226045.html#Feedback8http://www.aygfsteel.com/sitinspring/comments/commentRss/226045.htmlhttp://www.aygfsteel.com/sitinspring/services/trackbacks/226045.html
如果我们使用模板Ҏ(gu)模式QTemplate Method PatternQ将业务处理和异常处理分开Q能有效化控制层诸类的代码,借用q种模式Q我们可以把固定的异常处理代码放在基cMQ而让子类来实现具体的业务Q如果执行业务过E中出现异常如数据库无法q接Q用h不到{异常后Q直接将异常抛出让基cL处理Q这样做成功的把业务处理和异常处理分开C(jin)子类和基cMU类中,涉及(qing)具体业务处理的子cM码得C(jin)很大的简化,更方侉K读,修改和管理?

有点疑惑的是Q现在还?sh)确定这样做会(x)有什么消极印象,如安全性或l构斚w的,大家要是觉得有问题请不吝赐教?nbsp; 阅读全文

sitinspring 2008-09-01 11:51 发表评论
]]>
Spring的ID增长器用示例(MySql数据库)(j)http://www.aygfsteel.com/sitinspring/archive/2008/09/01/226040.htmlsitinspringsitinspringMon, 01 Sep 2008 03:30:00 GMThttp://www.aygfsteel.com/sitinspring/archive/2008/09/01/226040.htmlhttp://www.aygfsteel.com/sitinspring/comments/226040.htmlhttp://www.aygfsteel.com/sitinspring/archive/2008/09/01/226040.html#Feedback0http://www.aygfsteel.com/sitinspring/comments/commentRss/226040.htmlhttp://www.aygfsteel.com/sitinspring/services/trackbacks/226040.html
归纳
使用Spring的自增长ID生成器完成以下三步即可:(x)
1Q配|自增长id生成器,它需要一个数据源的支持?
2Q根据配|将自增长id生成器注入DAO各类中?
3Q用nextStringValueQnextIntValue,nextLongValueҎ(gu)得到ID?nbsp; 阅读全文

sitinspring 2008-09-01 11:30 发表评论
]]>
使用Spring提供的MailSender异步发送文本邮?/title><link>http://www.aygfsteel.com/sitinspring/archive/2008/08/08/220880.html</link><dc:creator>sitinspring</dc:creator><author>sitinspring</author><pubDate>Fri, 08 Aug 2008 04:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/sitinspring/archive/2008/08/08/220880.html</guid><wfw:comment>http://www.aygfsteel.com/sitinspring/comments/220880.html</wfw:comment><comments>http://www.aygfsteel.com/sitinspring/archive/2008/08/08/220880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sitinspring/comments/commentRss/220880.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sitinspring/services/trackbacks/220880.html</trackback:ping><description><![CDATA[     摘要: 在工E中l常有发送邮件的d,如果使用JavaMail来发送邮Ӟ用到的代码较多,q程和细节也相对复杂Q而用Spring的MailSender能相对简单方便些Q这样ɽE序员能更快L(fng)完成邮g发送Q务。下面请看示例代码:(x)   注意在执行代码前Q请认已经activation.jarQcommons-logging-1.0.4.jarQmail.jar和spring.jar载入工程?..  <a href='http://www.aygfsteel.com/sitinspring/archive/2008/08/08/220880.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sitinspring/aggbug/220880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sitinspring/" target="_blank">sitinspring</a> 2008-08-08 12:55 <a href="http://www.aygfsteel.com/sitinspring/archive/2008/08/08/220880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从模板方法模式到反射再到Spring的IoChttp://www.aygfsteel.com/sitinspring/archive/2008/08/08/220881.htmlsitinspringsitinspringFri, 08 Aug 2008 04:55:00 GMThttp://www.aygfsteel.com/sitinspring/archive/2008/08/08/220881.htmlhttp://www.aygfsteel.com/sitinspring/comments/220881.htmlhttp://www.aygfsteel.com/sitinspring/archive/2008/08/08/220881.html#Feedback0http://www.aygfsteel.com/sitinspring/comments/commentRss/220881.htmlhttp://www.aygfsteel.com/sitinspring/services/trackbacks/220881.html软g开发过E中Q唯一不变的就是变化。这是一句老生常谈Q也是说Y件开发中永恒的主题就是变化。当你把代码都写好了(jin)Q测试也完成?jin),准备交付的时候客户忽然要求你在指定时间做出变化,q种情况在外包行业中很常见;而对一些银行金融项目,边调研边开发边试屡见不鲜Q对于一些Web目Q从来就只有永远的Beta版,Ҏ(gu)改去的事更是家常侉K。对此,E序员(sh)定要求清晰的认识Q抱怨只能是嘴上痛快Q不解决实际问题。真要解军_际问题,非要动一番脑{不可,如果合理使用?jin)设计模式,反射或是Spring的IoCQ便能变?sh)改噩梦Zơ有的智慧之旅?/p>

 

首先我们看原始要求:(x)客户要求一扚w员名单存入到CSV和XML两种文g中去Q以后还有可能增加别的文件格式,比如PDFQXLS{,虽然q是下一期的内容Q但q一期应该考虑到变化,客户要求扩展性一定要好?/p>

没问题,有了(jin)设计模式响应变化不难。这时我们可以用到模板方法模式:(x)

定义一个操作中的算法的骨架Q而将一些步骤gq到子类?/strong>?/p>

 

先请看骨架抽象类Q?/p>

  1. public abstract class FileMaker {
  2.   /**
  3.    * 雇员集合
  4.    */
  5.   private List<Employee> employees;
  6.   /**
  7.    * 生成雇员列表文gQ公开接口Q供外界调用
  8.    * 定义成final是不惌子类改写Q因用的步骤在父cM可以确定,子类只需实现makeFile函数
  9.    * @param employees
  10.    * @param fileName
  11.    */
  12.   public final void makeFile(List<Employee> employees,String fileName){
  13.     setEmployees(employees);
  14.     makeFile(fileName);
  15.   }
  16.   
  17.   /**
  18.    * 生成具体的雇员列表文Ӟ此函数留待子cd?/span>
  19.    * @param fileName
  20.    */
  21.   protected abstract void makeFile(String fileName);  
  22.   
  23.   public final void setEmployees(List<Employee> employees) {
  24.     this.employees = employees;
  25.   }
  26.   public List<Employee> getEmployees() {
  27.     return employees;
  28.   }   
  29. }

很好Q固定的函数和步骤都在抽象基cM写定?jin),再看两个具体实现c,它们要实现的是makeFile函数而已?/p>

  1. public class CSVFileMaker extends FileMaker{
  2.   protected void makeFile(String fileName){
  3.     try {
  4.           BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
  5.           
  6.           for(Employee emp:getEmployees()){
  7.             String line="";
  8.             line+=emp.getName()+",";
  9.             line+=(emp.isMale()?"?:"?)+",";
  10.             line+=emp.getAge()+",";
  11.             
  12.             out.write(line+"\r\n");
  13.           }
  14.           
  15.           out.close();
  16.       } catch (Exception e) {
  17.         e.printStackTrace();
  18.       }
  19.   }
  20. }
  1. public class XMLFileMaker extends FileMaker{
  2.   protected void makeFile(String fileName){
  3.     try {
  4.       Document document = DocumentHelper.createDocument();
  5.             Element root = document.addElement("employees");
  6.             
  7.             for(Employee emp:getEmployees()){
  8.             Element empElm=root.addElement("employee");
  9.             
  10.             Element nameElm=empElm.addElement("name");
  11.             nameElm.setText(emp.getName());
  12.             
  13.             Element sexElm=empElm.addElement("sex");
  14.             sexElm.setText(emp.isMale()?"?:"?);
  15.             
  16.             Element ageElm=empElm.addElement("age");
  17.             ageElm.setText(String.valueOf(emp.getAge()));
  18.           }
  19.             
  20.             OutputFormat format = OutputFormat.createPrettyPrint();
  21.             format.setEncoding("GBK");    // 指定XML~码        
  22.             XMLWriter writer = new XMLWriter(new FileWriter(fileName),format);
  23.             
  24.             writer.write(document);
  25.             writer.close();
  26.       } catch (Exception e) {
  27.         e.printStackTrace();
  28.       }
  29.   }
  30. }

q样昨完以后感觉很好Q因为我们成功的把变化和不变分离开来,不变的部分放在了(jin)抽象基类中,而容易变化的部分攑֜?jin)两个具体的子类中,q样如果再增加一U新文g格式Q从抽象基类再扩展出一个子cd可。很好,q样׃怕变化了(jin)。客户对此也没有异议?/p>

 

调用CZ如下Q?/p>

  1. List<Employee> emps=new ArrayList<Employee>();
  2. emps.add(new Employee("Andy",true,21));
  3. emps.add(new Employee("Bill",false,23));
  4. emps.add(new Employee("Cindy",true,25));
  5. emps.add(new Employee("Douglas",false,28));
  6. FileMaker fileMaker=new CSVFileMaker();
  7. fileMaker.makeFile(emps, "1.csv");
  8. fileMaker=new XMLFileMaker();
  9. fileMaker.makeFile(emps, "2.xml");

客户看到?jin)我们的调用的例子,觉得应该更灵zM些,他说存成各种不同的文件是通过点击按钮来实现的Q如果每个按钮的事g处理函数都要生成具体子类岂不是太L?jin)吗Q这样做每个文g下蝲按钮的事件处理代码不是都不一P

 

有点道理Q如今理解到q一层的客户实在是不多见?jin)。不q很Ҏ(gu)满他的需求,我们可以引入反射的方法:(x)

  1. public static void main(String[] args) {
  2.   List<Employee> emps=new ArrayList<Employee>();
  3.   emps.add(new Employee("Andy",true,21));
  4.   emps.add(new Employee("Bill",false,23));
  5.   emps.add(new Employee("Cindy",true,25));
  6.   emps.add(new Employee("Douglas",false,28));
  7.   
  8.   callByReflect("csv",emps,"1.csv");
  9.   callByReflect("xml",emps,"2.xml");
  10. }
  11. public static void callByReflect(String type,List<Employee> emps,String fileName){
  12.   try{
  13.     Class cls=Class.forName("com.heyang."+type.toUpperCase()+"FileMaker");
  14.     FileMaker fileMaker=(FileMaker)cls.newInstance();
  15.     fileMaker.makeFile(emps, fileName);
  16.   }
  17.   catch(Exception ex){
  18.     ex.printStackTrace();
  19.   }
  20. }

因ؓ(f)按钮上的文字和类名是有关的,如下载CSV的按钮上有CSV的文字,q可以通过正则表达式取道,再组合一下不是cd?jin)吗Q?/span>csv到com.heyang.CSVFileMaker,xml到com.heyang.XMLFileMakerQ其实变化就是三个字母而已。如果增加按钮,取出按钮中的三个字母再调用callByReflect函数卛_Q这个过E简直可以固化?/span>

 

客户看到反射Ҏ(gu)以后很是满意Q没有意见了(jin)。待客户走后Q项目经理把你拉C边,_(d)(x)

“你刚才的Ҏ(gu)不错Q确实很强,但看得懂反射q能灉|掌握的h水^要够一q经验才行,l护的活让一q经验的人去q太可惜?jin),最好改改,最好达到让新手也能掌握q修改的E度?#8221;?/span>

 

没办法,领导L领导的考虑Q他q么说也很合理,成本问题我可以不考虑Q但如果把程序搞得复杂貌似NBQ能让一些学Z_Z生云山雾|的感觉Q有时还能被人尊UC?#8220;大侠”Q但谁也不比谁傻多少Q这声大侠不是白叫的Q但是出?jin)问题或是有了(jin)变化别是要找你Q到头来q是l自己添乱,q些都是义务力_Q何苦来呢?q是应该改得Ҏ(gu)些,让大安能修改,我可不愿意半夜三更被人叫h问问题?/span>

 

用Spring的IoC可以解决问题,写一个新cdƈ配置到XML文g中对新手来说问题?sh)大Q这下可以让领导攑ֿ(j)?jin),自己更攑ֿ?j)?jin)?/span>

 

IoCҎ(gu)代码如下Q?/span>

  1. public class Main {
  2.   public static void main(String[] args) {
  3.     List<Employee> emps=new ArrayList<Employee>();
  4.     emps.add(new Employee("Andy",true,21));
  5.     emps.add(new Employee("Bill",false,23));
  6.     emps.add(new Employee("Cindy",true,25));
  7.     emps.add(new Employee("Douglas",false,28));
  8.     
  9.     callByIoc("csv",emps,"1.csv");
  10.     callByIoc("xml",emps,"2.xml");
  11.   }
  12.   
  13.   public static void callByIoc(String type,List<Employee> emps,String fileName){
  14.     try{
  15.       ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
  16.       FileMaker fileMaker=(FileMaker)ctx.getBean(type);
  17.       fileMaker.makeFile(emps, fileName);
  18.     }
  19.     catch(Exception ex){
  20.       ex.printStackTrace();
  21.     }
  22.   }
  23. }

Bean。xml文g内容很简单吧Q?/span>

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4. <bean id="csv" class="com.heyang.CSVFileMaker"/>
  5. <bean id="xml" class="com.heyang.XMLFileMaker"/>
  6. </beans> 

好了(jin)。到q里问题彻底结束了(jin)Q终于满了(jin)客户和上U的要求Q可以回家睡个好觉了(jin)Q不用担?j)别人打搅?jin)?/span>

 

态度改变?sh)切,变化来了(jin)人L要多做一些,?j)理当然是不愿意的,但抱怨或是消极抵刉不是解决问题?sh)道Q如果把它看做一个挑(xi)战的契机Q凡事多思考一些,不但能解决问题,自己也会(x)有所提高Q这是U极的态度带来的好处?/span>



sitinspring 2008-08-08 12:55 发表评论
]]>
动态代理机制初?/title><link>http://www.aygfsteel.com/sitinspring/archive/2008/05/28/203359.html</link><dc:creator>sitinspring</dc:creator><author>sitinspring</author><pubDate>Tue, 27 May 2008 16:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/sitinspring/archive/2008/05/28/203359.html</guid><wfw:comment>http://www.aygfsteel.com/sitinspring/comments/203359.html</wfw:comment><comments>http://www.aygfsteel.com/sitinspring/archive/2008/05/28/203359.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sitinspring/comments/commentRss/203359.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sitinspring/services/trackbacks/203359.html</trackback:ping><description><![CDATA[     摘要: Spring的AOP支持可以被用于从pȝ核心(j)逻辑中分M叉业务(cross-businessQ如日志Q事务管理和安全{,使用AOPQ你可以用各U功能层来覆盖核?j)业务层Q这些功能层可以灉|的应用到你的pȝ中,甚至核心(j)业务层都不知道它们的存在Q这是一个强大的概念?<br>AOPQaspect-oriented programmingQ的核心(j)?yu)是动态代理,掌握它对于理解AOPؓ(f)重要Q犹如反对理解IoC一栗?<br>  <a href='http://www.aygfsteel.com/sitinspring/archive/2008/05/28/203359.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sitinspring/aggbug/203359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sitinspring/" target="_blank">sitinspring</a> 2008-05-28 00:06 <a href="http://www.aygfsteel.com/sitinspring/archive/2008/05/28/203359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts的ActionServlet模拟实现http://www.aygfsteel.com/sitinspring/archive/2008/03/29/189385.htmlsitinspringsitinspringFri, 28 Mar 2008 16:31:00 GMThttp://www.aygfsteel.com/sitinspring/archive/2008/03/29/189385.htmlhttp://www.aygfsteel.com/sitinspring/comments/189385.htmlhttp://www.aygfsteel.com/sitinspring/archive/2008/03/29/189385.html#Feedback1http://www.aygfsteel.com/sitinspring/comments/commentRss/189385.htmlhttp://www.aygfsteel.com/sitinspring/services/trackbacks/189385.html阅读全文

sitinspring 2008-03-29 00:31 发表评论
]]>
վ֩ģ壺 Ӫ| Ϫ| ״| | | | | ƽ| | ƽɽ| ˶| | Ҫ| ˮ| | | ׯ| ʳ| ̫ԭ| | | ܿ| °Ͷ| | ָ| | °| Ӷ| ʤ| | | | | ˮ| | | ٳ| ؼ| | ˫| Զ|