??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成a人片在线不卡,国产AV无码专区亚洲AVJULIA,久久久久亚洲AV成人片http://m.tkk7.com/ilovebabyfat/category/48843.html垃圾?/description>zh-cnWed, 25 Apr 2012 02:37:28 GMTWed, 25 Apr 2012 02:37:28 GMT60Eclipse插ghttp://m.tkk7.com/ilovebabyfat/archive/2012/02/20/370345.html思无思无Mon, 20 Feb 2012 06:25:00 GMThttp://m.tkk7.com/ilovebabyfat/archive/2012/02/20/370345.htmlhttp://m.tkk7.com/ilovebabyfat/comments/370345.htmlhttp://m.tkk7.com/ilovebabyfat/archive/2012/02/20/370345.html#Feedback0http://m.tkk7.com/ilovebabyfat/comments/commentRss/370345.htmlhttp://m.tkk7.com/ilovebabyfat/services/trackbacks/370345.html1. http://download.eclipse.org/windowbuilder/WB/integration/3.7/
1.http://code.google.com/p/visualswing4eclipse/
2个用于J2SE swing之类的桌面编E?br />
2. doxygen    http://www.stack.nl/~dimitri/doxygen/
能根据项目的源文Ӟ自动生成比较完整的文档,包括cdơ图
3. open explorer   http://blog.samsonis.me/2009/02/open-explorer-plugin-for-eclipse/
可以在eclipse中比较方便的打开本地文g?/div>

思无 2012-02-20 14:25 发表评论
]]>
IE长时间等待服务器响应Q显C页面无法显C的问题http://m.tkk7.com/ilovebabyfat/archive/2011/08/07/355967.html思无思无Sun, 07 Aug 2011 14:12:00 GMThttp://m.tkk7.com/ilovebabyfat/archive/2011/08/07/355967.htmlhttp://m.tkk7.com/ilovebabyfat/comments/355967.htmlhttp://m.tkk7.com/ilovebabyfat/archive/2011/08/07/355967.html#Feedback0http://m.tkk7.com/ilovebabyfat/comments/commentRss/355967.htmlhttp://m.tkk7.com/ilovebabyfat/services/trackbacks/355967.html开始以为是session的超Ӟ于是在页面中d了ajaxd期发送请求给服务器的代码来维持sessionQ?问题无法解决?br />然后以ؓ是页面缓存的问题Q在h中加了随机的数字Q查看每ơ请求回来的响应头状态都?00的,问题仍旧无法解决?br />l箋癑ֺQl谷歌?br />搜烦到microsoft的一文章,如下
http://support.microsoft.com/kb/181050 

Internet Explorer error "connection timed out" when server does not respond
问题得到解决?br />其实可以说问题无法得到解冟뀂我怎么可能让每个用户去修改他们的注册表么?br />
看来只能采取异步的请求方式了?/span>



思无 2011-08-07 22:12 发表评论
]]>
JAVA to JSON 避免循环引用造成d@?/title><link>http://m.tkk7.com/ilovebabyfat/archive/2011/07/20/354719.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Wed, 20 Jul 2011 08:14:00 GMT</pubDate><guid>http://m.tkk7.com/ilovebabyfat/archive/2011/07/20/354719.html</guid><wfw:comment>http://m.tkk7.com/ilovebabyfat/comments/354719.html</wfw:comment><comments>http://m.tkk7.com/ilovebabyfat/archive/2011/07/20/354719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovebabyfat/comments/commentRss/354719.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovebabyfat/services/trackbacks/354719.html</trackback:ping><description><![CDATA[<div> <div style="position: relative; padding: 0px 3px; clear: both;" id="Normalcontent"> <div style="margin-left: 12px;" id="imcontent"><span> <div style="direction: ltr; color: #000000; font-size: 9pt;"> <div>JsonConfig config = new JsonConfig();<br />  config.setJsonPropertyFilter(new PropertyFilter() {<br />   public boolean apply(Object source, String name, Object value) {<br />    if (name.equals("form") || name.equals("formElm")   ) {<br />     return true;<br />    } else {<br />     return false;<br />    }<br />   }<br />  });<br />  <br />  JSONObject jsonObject = JSONObject.fromObject( form, config );</div></div></span></div></div></div><img src ="http://m.tkk7.com/ilovebabyfat/aggbug/354719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovebabyfat/" target="_blank">思无</a> 2011-07-20 16:14 <a href="http://m.tkk7.com/ilovebabyfat/archive/2011/07/20/354719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Actuate使用ȝhttp://m.tkk7.com/ilovebabyfat/archive/2011/06/29/353346.html思无思无Wed, 29 Jun 2011 05:28:00 GMThttp://m.tkk7.com/ilovebabyfat/archive/2011/06/29/353346.htmlhttp://m.tkk7.com/ilovebabyfat/comments/353346.htmlhttp://m.tkk7.com/ilovebabyfat/archive/2011/06/29/353346.html#Feedback0http://m.tkk7.com/ilovebabyfat/comments/commentRss/353346.htmlhttp://m.tkk7.com/ilovebabyfat/services/trackbacks/353346.html

Actuate 单报表的建立q程

1Q?1. 打开 e.report 选择new report


2Q?2.选择I白报表


3Q?3. 建立数据库连接?/span>Toolsà Database Connection


4Q?4. 填写参数


5Q?5. 双击datasource , 填写查询参数


6Q?6. 选中Content, Tool--?span style="font-family: Wingdings;"> Grouping, 讄整个报表?/span>groupQ?/span>1?/span>or n层?/span>


7Q?7. 单击grouping option,group的显C,是否需?/span>befer,after{,每个group需要单独设|?/span>


8Q?nbsp; 8. 讄各种面的控?/span>


9Q?9. 讄参数Q这些参数可以用在报表控制上或是查询的参?/span>Tools -- Parameters


修改后的查询字段

select fund_id,fund_name,fund_abbreviation,fund_mode,rule_id from te_fund where fund_mode=:fundmode

参数10. 用来控制面昄

?/span>labelZ子,重写OnRowҎ

   

Sub OnRow( row As AcDataRow )
    Super::OnRow( row )
    
if fundmode="M" then
         me.Text 
= "Manual Fund Name"
    
else
         me.Text 
= "Auto Fund Name"
    
end if
End Sub

11. ?/span>datasource中的数据控制面

Sub OnRow( row As AcDataRow )
 Super::OnRow( row )
    
If row.GetValue("DR_SHORT_FLAG"=0 Then
     me.Text 
= "BUY BACK"
    
ElseIf row.GetValue("DR_SHORT_FLAG"=1 Then
     me.Text 
= "Sell to Open"
    
End if
End Sub

 



思无 2011-06-29 13:28 发表评论
]]>
(?J2EE目异常处理http://m.tkk7.com/ilovebabyfat/archive/2011/06/27/353073.html思无思无Mon, 27 Jun 2011 08:02:00 GMThttp://m.tkk7.com/ilovebabyfat/archive/2011/06/27/353073.htmlhttp://m.tkk7.com/ilovebabyfat/comments/353073.htmlhttp://m.tkk7.com/ilovebabyfat/archive/2011/06/27/353073.html#Feedback0http://m.tkk7.com/ilovebabyfat/comments/commentRss/353073.htmlhttp://m.tkk7.com/ilovebabyfat/services/trackbacks/353073.htmlhttp://www.iteye.com/topic/72170
关于j2ee目中异常的理和设计。之前一直困惑于异常的处理,Z么异常分为checked和uncheckQ应该遵循怎样的规则自定义异常。在j2ee目中,处理异常需要注意什么地斏V?br />[原文]
Z么要在J2EE目中谈异常处理呢?可能许多java初学者都惌Q?#8220;异常处理不就是try….catch…finally吗?q谁都会 啊!”。笔者在初学java时也是这栯为的。如何在一个多层的j2ee目中定义相应的异常c?在项目中的每一层如何进行异常处理?异常何时被抛出??怽时被记录Q异常该怎么记录Q何旉要把checked Exception转化成unchecked Exception Q何旉要把unChecked Exception转化成checked Exception?异常是否应该呈现到前端页面?如何设计一个异常框Ӟ本文就q些问题q行探讨?
1Q?nbsp;JAVA异常处理
在面向过E式的编E语a中,我们可以通过q回值来定Ҏ是否正常执行。比如在一个c语言~写的程序中Q如果方法正的执行则返?.错误则返?。在vb或delphi开发的应用E序中,出现错误Ӟ我们弹Z个消息框l用戗?/div>
通过Ҏ的返回值我们ƈ不能获得错误的详l信息。可能因为方法由不同的程序员~写Q当同一c错误在不同的方法出现时Q返回的l果和错误信息ƈ不一致?/div>
所以java语言采取了一个统一的异常处理机制?/div>
什么是异常Q运行时发生的可被捕获和处理的错误?/div>
在java语言中,Exception是所有异常的父类。Q何异帔R?展于ExceptioncRExceptionq当于一个错误类型。如果要定义一个新的错误类型就扩展一个新的Exception子类。采用异常的好处 q在于可以精的定位到导致程序出错的源代码位|?q获得详l的错误信息?/div>
Java异常处理通过五个关键字来?玎ͼtry,catch,throw ,throws, finally。具体的异常处理l构由try….catch….finally块来实现。try块存攑֏能出现异常的java语句Qcatch用来捕获?生的异常Qƈ对异常进行处理。Finally块用来清除程序中未释攄资源。不理try块的代码如何q回Qfinally块都L被执行?/div>
一个典型的异常处理代码
java 代码
  1.   
  2. public String getPassword(String userId)throws DataAccessException{   
  3. String sql = “select password from userinfo where userid=’”+userId +”’”;   
  4. String password = null;   
  5. Connection con = null;   
  6. Statement s = null;   
  7. ResultSet rs = null;   
  8. try{   
  9.  con = getConnection();//获得数据q接   
  10.  s = con.createStatement();   
  11.  rs = s.executeQuery(sql);   
  12.  while(rs.next()){   
  13.     password = rs.getString(1);   
  14.  }   
  15.  rs.close();   
  16.  s.close();   
  17.      
  18. }   
  19. Catch(SqlException ex){   
  20.  throw new DataAccessException(ex);   
  21. }   
  22. finally{   
  23.  try{   
  24.       if(con != null){   
  25.         con.close();   
  26.       }   
  27.  }   
  28.    Catch(SQLException sqlEx){   
  29.      throw new DataAccessException(“关闭q接p|!”,sqlEx);   
  30.    }   
  31. }   
  32. return password;   
  33. }   
  34.    
可以看出Java的异常处理机制具有的优势Q?/div>
l错误进行了l一的分c,通过扩展ExceptioncL其子cL实现。从而避免了相同的错误可能在不同的方法中h不同的错误信息。在不同的方法中出现相同的错误时Q只需要throw 相同的异常对象即可?/div>
获得更ؓ详细的错误信息。通过异常c,可以l异常更l,对用h为有用的错误信息。以便于用户q行跟踪和调试程序?/div>
把正的q回l果与错误信息分R降低了E序的复杂度。调用者无需要对q回l果q行更多的了解?/div>
强制调用者进行异常处理,提高E序的质量。当一个方法声明需要抛Z个异常时Q那么调用者必M用try….catch块对异常q行处理。当然调用者也可以让异常l往上一层抛出?/div>
 
2Q?nbsp;Checked 异常 q是 unChecked 异常Q?/div>
Java异常分ؓ两大c?checked 异常和unChecked 异常。所有承java.lang.Exception 的异帔R属于checked异常。所有承java.lang.RuntimeException的异帔R属于unChecked异常?/strong>
当一个方法去调用一个可能抛出checked异常的方法,必须通过try…catch块对异常q行捕获q行处理或者重新抛出?/div>
我们看看Connection接口的createStatement()Ҏ的声明?/div>
public Statement createStatement() throws SQLException;
      
   SQLException是checked异常。当调用createStatementҎӞjava强制调用者必dSQLExceptionq行捕获处理?/div>
java 代码
  1.        public String getPassword(String userId){   
  2.        try{   
  3.        ……   
  4.               Statement s = con.createStatement();   
  5.               ……   
  6.        Catch(SQLException sqlEx){   
  7.               ……   
  8.    }   
  9. ……   
  10. }   
或?/div>
java 代码
  1. public String getPassword(String userId)throws SQLException{   
  2.    Statement s = con.createStatement();   
  3. }  
(当然Q像Connection,Satementq些资源是需要及时关闭的Q这里仅是ؓ了说明checked 异常必须强制调用者进行捕hl箋抛出)
 
unChecked异常也称行时异常Q通常 RuntimeException都表C用h法恢复的异常Q如无法获得数据库连接,不能打开文g{。虽然用户也可以像处理checked异常一h?unChecked异常。但是如果调用者ƈ没有L获unChecked异常Ӟ~译器ƈ不会强制你那么做?/strong>
 
比如一个把字符转换为整型数值的代码如下Q?/div>
 
java 代码
  1. String str = “123”;   
  2. int value = Integer.parseInt(str);  
 
parseInt的方法签名ؓQ?/div>
java 代码
  1. public static int parseInt(String s) throws NumberFormatException  
 
当传入的参数不能转换成相应的整数Ӟ会抛出NumberFormatException。因为NumberFormatException扩展于RuntimeExceptionQ是unChecked异常。所以调用parseIntҎ时无需要try…catch
 
因ؓjava不强制调用者对unChecked异常q行捕获或往上抛 出。所以程序员L喜欢抛出unChecked异常。或者当需要一个新的异常类ӞL习惯的从RuntimeException扩展。当你去调用它些?法时Q如果没有相应的catch块,~译器也L让你通过,同时你也Ҏ无需要去了解q个Ҏ倒底会抛Z么异常。看hq似乎倒是一个很好的办法Q但?q样做却是远Mjava异常处理的真实意图。ƈ且对调用你这个类的程序员带来误导Q因用者根本不知道需要在什么情况下处理异常。而checked?常可以明的告诉调用者,调用q个c需要处理什么异常。如果调用者不d理,~译器都会提Cƈ且是无法~译通过的。当然怎么处理是由调用者自己去军_的?/div>
 
       所以Java推荐Z在应用代码中应该使用checked异常。就像我们在上节提到q用异常的好外在于可以强制调用者必d会产生的异常进行处理。包括在《java Tutorial》等java官方文档中都把checked异常作ؓ标准用法?/div>
       使用checked异常Q应意味着有许多的try…catch在你的代码中。当在编写和处理来多的try…catch块之后,许多人终于开始怀疑checked异常倒底是否应该作ؓ标准用法了?/div>
甚至q大名鼎鼎的《thinking in java》的作者Bruce Eckel也改变了他曾l的x。Bruce Eckel甚至d把unChecked异常作ؓ标准用法。ƈ发表文章Q以试验checked异常是否应该从java中去掉。Bruce Eckel语:“当少量代码时Qchecked异常无疑是十分优雅的构思,q有助于避免了许多潜在的错误。但是经验表明,对大量代码来说结果正好相?#8221;
关于checked异常和unChecked异常的详l讨论可以参?/div>
 
使用checked异常会带来许多的问题?/div>
       checked异常D了太多的try…catch 代码
              可能有很多checked异常对开发h员来说是无法合理地进行处理的Q比?SQLException。而开发h员却不得不去q行try…catch。当开发h员对一个checked异常无法正确的处理时Q通常是简单的把异常打?出来或者是q脆什么也不干。特别是对于新手来说Q过多的checked异常让他感到无所适从?/div>
java 代码
  1.        try{   
  2.        ……   
  3.               Statement s = con.createStatement();   
  4.               ……   
  5.        Catch(SQLException sqlEx){   
  6.               sqlEx.PrintStackTrace();   
  7.    }   
  8.    或?  
  9.        try{   
  10.        ……   
  11.               Statement s = con.createStatement();   
  12.               ……   
  13.        Catch(SQLException sqlEx){   
  14.           //什么也不干   
  15. }   
 
checked异常D了许多难以理解的代码产生
        当开发h员必d捕获一个自己无法正处理的checked异常Q通常的是重新装成一个新的异常后再抛出。这样做q没有ؓE序带来M好处。反而代码晚难以理解?/div>
像我们使用JDBC代码那样Q需要处理非常多的try…catch.Q真正有用的代码被包含在try…catch之内。得理解这个方法变理困难v?/div>
checked异常D异常被不断的装成另一个类异常后再抛出
java 代码
  1.         public void methodA()throws ExceptionA{   
  2.          …..          
  3.           throw new ExceptionA();        
  4. }   
  5.           
  6. public void methodB()throws ExceptionB{   
  7.    try{   
  8.       methodA();   
  9.       ……   
  10.    }catch(ExceptionA ex){   
  11.    throw new ExceptionB(ex);   
  12.    }   
  13. }   
  14.            
  15.         Public void methodC()throws ExceptinC{   
  16.        try{   
  17.          methodB();   
  18.          …   
  19.        }   
  20.        catch(ExceptionB ex){   
  21.           throw new ExceptionC(ex);   
  22.         }   
  23.     }   
我们看到异常p样一层层无休止的被封装和重新抛出?/div>
 
checked异常D破坏接口Ҏ
   一个接口上的一个方法已被多个类使用Q当个方法额外添加一个checked异常Ӟ那么所有调用此Ҏ的代码都需要修攏V?/div>
 
可见上面q些问题都是因ؓ调用者无法正的处理checked异常时而被q去捕获和处理,被迫装后再重新抛出。这样十分不方便Qƈ不能带来M好处。在q种情况下通常使用unChecked异常?/div>
chekced异常q不是无一是处Qchecked异常比传l编E的错误q回D好用得多。通过~译器来保正确的处理异常比通过q回值判断要好得多?/div>
如果一个异常是致命的,不可恢复的。或者调用者去捕获它没有Q何益处,使用unChecked异常?/strong>
如果一个异常是可以恢复的,可以被调用者正处理的Q用checked异常?/div>
在用unChecked异常Ӟ必须在在Ҏ声明中详l的说明该方法可能会抛出的unChekced异常。由调用者自己去军_是否捕获unChecked异常
 
倒底什么时候用checked异常Q什么时候用unChecked异常Qƈ没有一个绝对的标准。但是笔者可以给Z些徏?/div>
当所有调用者必d理这个异常,可以让调用者进行重试操作;或者该异常相当于该Ҏ的第二个q回倹{用checked异常?/div>
q个异常仅是数比较高的调用者才能处理,一般的调用者不能正的处理。用unchecked异常。有能力处理的调用者可以进行高U处理,一般调用者干脆就不处理?/div>
q个异常是一个非怸重的错误Q如数据库连接错误,文g无法打开{。或者这些异常是与外部环境相关的。不是重试可以解决的。用unchecked异常。因U异怸旦出玎ͼ调用者根本无法处理?/div>
如果不能定Ӟ使用unchecked异常。ƈ详细描述可能会抛出的异常,以让调用者决定是否进行处理?/div>
 
3Q?span style="font-family: 'Times New Roman';"> 设计一个新的异常类
在设计一个新的异常类Ӟ首先看看是否真正的需要这个异常类。一般情况下量不要去设计新的异常类Q而是量使用java中已l存在的异常cR?/div>
?div>java 代码
  1. IllegalArgumentException, UnsupportedOperationException  
 
不管是新的异常是chekced异常q是unChecked异常。我们都必须考虑异常的嵌套问题?/div>
java 代码
  1. public void methodA()throws ExceptionA{   
  2.          …..          
  3.           throw new ExceptionA();        
  4. }   
 
ҎmethodA声明会抛出ExceptionA.
 
public void methodB()throws ExceptionB
methodB声明会抛出ExceptionB,当在methodB?法中调用methodAӞExceptionA是无法处理的,所以ExceptionA应该l箋往上抛出。一个办法是把methodB声明会抛?ExceptionA.但这样已l改变了MethodB的方法签名。一旦改变,则所有调用methodB的方法都要进行改变?/div>
另一个办法是把ExceptionA装成ExceptionBQ然后再抛出。如果我们不把ExceptionA装在ExceptionB中,׃׃根异怿息,使得无法跟踪异常的原始出处?/div>
java 代码
  1. public void methodB()throws ExceptionB{   
  2.    try{   
  3.       methodA();   
  4.       ……   
  5.    }catch(ExceptionA ex){   
  6.      throw new ExceptionB(ex);   
  7.    }   
  8. }  
 
   如上面的代码中,ExceptionB嵌套一个ExceptionA.我们暂且把ExceptionAUCؓ“起因异常”,因ؓExceptionAD了ExceptionB的生。这h不异常信息丢失?/div>
所以我们在定义一个新的异常类Ӟ必须提供q样一个可以包含嵌套异常的构造函数。ƈ有一个私有成员来保存q个“起因异常”?/div>
java 代码
  1. public Class ExceptionB extends Exception{   
  2. private Throwable cause;   
  3.     
  4. public ExceptionB(String msg, Throwable ex){   
  5.  super(msg);   
  6.  this.cause = ex;   
  7. }   
  8.     
  9. public ExceptionB(String msg){   
  10.  super(msg);   
  11. }   
  12.     
  13. public ExceptionB(Throwable ex){   
  14.  this.cause = ex;   
  15. }   
  16. }   
当然Q我们在调用printStackTraceҎӞ需要把所有的“起因异常”的信息也同时打印出来。所以我们需要覆写printStackTraceҎ来显C全部的异常栈跟t。包括嵌套异常的栈跟t?/div>
java 代码
  1. public void printStackTrace(PrintStrean ps){   
  2. if(cause == null){   
  3.  super.printStackTrace(ps);   
  4. }else{   
  5.  ps.println(this);   
  6.  cause.printStackTrace(ps);   
  7. }   
  8. }   
 
一个完整的支持嵌套的checked异常cL码如下。我们在q里暂且把它叫做NestedException
 
java 代码
  1. public NestedException extends Exception{   
  2. private Throwable cause;   
  3. public NestedException (String msg){   
  4.  super(msg);   
  5. }   
  6.     
  7. public NestedException(String msg, Throwable ex){   
  8.  super(msg);   
  9.  This.cause = ex;   
  10. }   
  11.     
  12. public Throwable getCause(){   
  13.  return (this.cause == null ? this :this.cause);   
  14. }   
  15.     
  16. public getMessage(){   
  17.  String message = super.getMessage();   
  18.  Throwable cause = getCause();   
  19.    if(cause != null){   
  20.      message = message + “;nested Exception is ” + cause;   
  21.    }   
  22.  return message;   
  23. }   
  24. public void printStackTrace(PrintStream ps){   
  25.  if(getCause == null){   
  26.     super.printStackTrace(ps);   
  27.        
  28.  }else{   
  29.  ps.println(this);   
  30.  getCause().printStackTrace(ps);   
  31.  }   
  32. }   
  33.     
  34. public void printStackTrace(PrintWrite pw){   
  35.  if(getCause() == null){   
  36.     super.printStackTrace(pw);   
  37.  }   
  38.  else{   
  39.     pw.println(this);   
  40.     getCause().printStackTrace(pw);   
  41.  }   
  42. }   
  43. public void printStackTrace(){   
  44.  printStackTrace(System.error);   
  45. }   
  46. }   
  47.     
同样要设计一个unChecked异常cM与上面一栗只是需要承RuntimeException?/div>
 
 
4Q?span style="font-family: 'Times New Roman';"> 如何记录异常
作ؓ一个大型的应用pȝ都需要用日志文g来记录系l的q行Q以便于跟踪和记录系l的q行情况。系l发生的异常理所当然的需要记录在日志pȝ中?/div>
java 代码
  1. public String getPassword(String userId)throws NoSuchUserException{   
  2. UserInfo user = userDao.queryUserById(userId);   
  3. If(user == null){   
  4.  Logger.info(“找不到该用户信息,userId=”+userId);   
  5.  throw new NoSuchUserException(“找不到该用户信息,userId=”+userId);   
  6. }   
  7. else{   
  8.  return user.getPassword();   
  9. }   
  10. }   
  11.     
  12. public void sendUserPassword(String userId)throws Exception {   
  13. UserInfo user = null;   
  14. try{   
  15.   user = getPassword(userId);   
  16.    //……..   
  17.  sendMail();   
  18.  //   
  19. }catch(NoSuchUserException ex)(   
  20.    logger.error(“找不到该用户信息:”+userId+ex);   
  21.    throw new Exception(ex);   
  22. }   
 
我们注意刎ͼ一个错误被记录了两?在错误的h位置我们仅是以infoU别q行记录。而在sendUserPasswordҎ中,我们q把整个异常信息都记录了?/div>
W者曾看到很多目是这栯录异常的Q不三七二一Q只有遇到异常就把整个异常全部记录下。如果一个异常被不断的封装抛出多ơ,那么p记录了多ơ。那么异常倒底该在什么地方被记录Q?/div>
异常应该在最初生的位置记录Q?/div>
 
如果必须捕获一个无法正处理的异常Q仅仅是把它装成另外一U异常往上抛出。不必再ơ把已经被记录过的异常再ơ记录?/div>
 
如果捕获C个异常,但是q个异常是可以处理的。则无需要记录异?/strong>
 
java 代码
  1. public Date getDate(String str){   
  2.  Date applyDate = null;   
  3. SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);   
  4. try{   
  5.  applyDate = format.parse(applyDateStr);   
  6. }   
  7. catch(ParseException ex){   
  8.  //乎略Q当格式错误Ӟq回null   
  9. }   
  10. return applyDate;   
  11. }   
 
捕获C个未记录q的异常或外部系l异常时Q应该记录异常的详细信息
java 代码
  1. try{   
  2.        ……   
  3.         String sql=”select * from userinfo”;   
  4.               Statement s = con.createStatement();   
  5.               ……   
  6.        Catch(SQLException sqlEx){   
  7.           Logger.error(“sql执行错误”+sql+sqlEx);   
  8. }   
      
   I竟在哪里记录异怿息,及怎么记录异常信息Q可能是见仁见智的问题了。甚x些系l让异常cM记录异常。当产生一个新异常对象Ӟ异常信息p自动记录?/div>
java 代码
  1.   public class BusinessException extends Exception {   
  2.       private void logTrace() {   
  3.           StringBuffer buffer=new StringBuffer();   
  4.           buffer.append("Business Error in Class: ");   
  5.           buffer.append(getClassName());   
  6.           buffer.append(",method: ");   
  7.           buffer.append(getMethodName());   
  8.           buffer.append(",messsage: ");   
  9.           buffer.append(this.getMessage());   
  10.           logger.error(buffer.toString());   
  11.              
  12. }   
  13. public BusinessException(String s) {   
  14.          super(s);   
  15. race();   
  16. }   
q似乎看h是十分美妙的Q其实必然导致了异常被重复记录。同时违反了“cȝ职责分配原则”Q是一U不好的设计。记录异怸属于异常cȝ行ؓQ记录异常应 该由专门的日志系l去做。ƈ且异常的记录信息是不断变化的。我们在记录异常同应该给更丰富些的信息。以利于我们能够Ҏ异常信息扑ֈ问题的根源,以解决问 题?/div>
虽然我们对记录异常讨Z很多Q过多的q些反而开发h员更为疑惑,一U好的方式是为系l提供一个异常处理框架。由框架来决定是否记录异常和怎么记录异常。而不是由普通程序员d定。但是了解些q是有益的?/div>
5Q?nbsp;J2EE目中的异常处理
目前,J2ee目一般都会从逻辑上分为多层。比较经典的分ؓ三层Q表C层Q业务层Q集成层(包括数据库访问和外部pȝ的访??/div>
J2ee目有着其复杂性,J2ee目的异常处理需要特别注意几个问题?/div>
在分布式应用Ӟ我们会遇到许多checked异常。所有RMI调用 Q包括EJBq程接口调用Q都会抛出java.rmi.RemoteException;同时RemoteException是checked异常Q当?们在业务pȝ中进行远E调用时Q我们都需要编写大量的代码来处理这些checked异常。而一旦发生RemoteExceptionq些checked?常对pȝ是非怸重的Q几乎没有Q何进行重试的可能。也是_当出现RemoteExceptionq些可怕的checked异常Q我们没有Q何重试的 必要性,却必要~写大量的try…catch代码d理它。一般我们都是在最底层q行RMI调用Q只要有一个RMI调用Q所有上层的接口都会要求抛出 RemoteException异常。因为我们处理RemoteException的方式就是把它l往上抛。这样一来就破坏了我们业务接口?RemoteExceptionq些J2EEpȝU的异常严重的媄响了我们的业务接口。我们对pȝq行分层的目的就是减系l之间的依赖Q每一层的技术改 变不至于影响到其它层?/div>
 
java 代码
  1. //   
  2. public class UserSoaImpl implements UserSoa{   
  3.    public UserInfo getUserInfo(String userId)throws RemoteException{   
  4.       //……   
  5. q程Ҏ调用.   
  6.       //……   
  7.    }   
  8. }   
  9. public interface UserManager{   
  10.    public UserInfo getUserInfo(Stirng userId)throws RemoteException;   
  11. }   
 
同样JDBC讉K都会抛出SQLException的checked异常?/div>
 
Z避免pȝU的checked异常对业务系l的深度侵入Q我们可以ؓ 业务Ҏ定义一个业务系l自q异常。针对像SQLException,RemoteExceptionq些非常严重的异常,我们可以新定义一?unChecked的异常,然后把SQLExceptionQRemoteException装成unChecked异常后抛出?/div>
如果q个pȝU的异常是要交由上一U调用者处理的Q可以新定义一个checked的业务异常,然后把系l的异常封存装成业务的异常后再抛出?/div>
一般地Q我们需要定义一个unChecked异常Q让集成层接口的所有方法都声明抛出qunChecked异常?/span>
java 代码
  1. public DataAccessException extends RuntimeException{   
  2.  ……   
  3. }   
  4. public interface UserDao{   
  5.  public String getPassword(String userId)throws DataAccessException;   
  6. }   
  7.     
  8. public class UserDaoImpl implements UserDAO{   
  9. public String getPassword(String userId)throws DataAccessException{   
  10.  String sql = “select password from userInfo where userId= ‘”+userId+”’”;   
  11. try{   
  12.     …   
  13.      //JDBC调用   
  14.      s.executeQuery(sql);   
  15.     …   
  16.    }catch(SQLException ex){   
  17.       throw new DataAccessException(“数据库查询失?#8221;+sql,ex);   
  18.    }   
  19. }   
  20. }   
 
定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出Checked异常.
 
java 代码
  1. public class BusinessException extends Exception{   
  2.  …..   
  3. }   
  4.     
  5. public interface UserManager{   
  6.    public Userinfo copyUserInfo(Userinfo user)throws BusinessException{   
  7.       Userinfo newUser = null;   
  8.       try{   
  9.         newUser = (Userinfo)user.clone();   
  10. }catch(CloneNotSupportedException ex){   
  11.  throw new BusinessException(“不支持cloneҎ:”+Userinfo.class.getName(),ex);   
  12. }   
  13.  }   
  14. }  
 
J2ee表示层应该是一个很薄的层,主要的功能ؓQ获得页面请求,把页 面的参数l装成POJO对象Q调用相应的业务ҎQ然后进行页面{发,把相应的业务数据呈现l页面。表C层需要注意一个问题,表示层需要对数据的合法性进 行校验,比如某些录入域不能ؓI,字符长度校验{?/div>
J2ee从页面所有传l后台的参数都是字符型的Q如果要求输入数值或日期cd的参数时Q必L字符D{换ؓ相应的数值或日期倹{?/div>
如果表示层代码校验参C合法Ӟ应该q回到原始页面,让用户重新录入数据,q提C相关的错误信息?/div>
 
通常把一个从面传来的参数{换ؓ数|我们可以看到q样的代?/div>
java 代码
  1. ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{   
  2.    String ageStr = request.getParameter(“age”);   
  3.    int age = Integer.parse(ageStr);   
  4.    …………   
  5.     
  6.  String birthDayStr = request.getParameter(“birthDay”);   
  7. SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);   
  8. Date birthDay = format.parse(birthDayStr);   
  9.     
  10. }   
 
上面的代码应该经常见刎ͼ但是当用户从面录入一个不能{换ؓ整型的字W或一个错误的日期倹{?/div>
Integer.parse()Ҏ被抛Z?NumberFormatException的unChecked异常。但是这个异常绝对不是一个致命的异常,一般当用户在页面的录入域录入的g合法 Ӟ我们应该提示用户q行重新录入。但是一旦抛出unchecked异常Q就没有重试的机会了。像q样的代码造成大量的异怿息显C到面。我们的系l?看v来非常的脆弱?/div>
同样QSimpleDateFormat.parse()Ҏ也会抛出ParseException的unChecked异常?/div>
q种情况我们都应该捕莯些unChecked异常Qƈl提C用户重新录入?/div>
java 代码
  1. ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{   
  2.    String ageStr = request.getParameter(“age”);   
  3. String birthDayStr = request.getParameter(“birthDay”);   
  4.    int age = 0;   
  5.  Date birthDay = null;   
  6. try{   
  7. age=Integer.parse(ageStr);   
  8.    }catch(NumberFormatException ex){   
  9.      error.reject(“age”,”不是合法的整数?#8221;);   
  10.    }   
  11.    …………   
  12.     
  13.  try{   
  14. SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);   
  15.  birthDay = format.parse(birthDayStr);   
  16. }catch(ParseException ex){   
  17.  error.reject(“birthDay”,”不是合法的日期,请录?#8217;MM/dd/yyy’格式的日?#8221;);   
  18. }   
  19.     
  20. }  
在表C层一定要弄清楚调用方法的是否会抛出unChecked异常Q什么情况下会抛些异常,q作出正的处理?/strong>
在表C层调用pȝ的业务方法,一般情况下是无需要捕获异常的。如果调用的业务Ҏ抛出的异常相当于W二个返回值时Q在q种情况下是需要捕?/strong>


思无 2011-06-27 16:02 发表评论
]]>RMI 初探http://m.tkk7.com/ilovebabyfat/archive/2011/06/13/352190.html思无思无Mon, 13 Jun 2011 07:18:00 GMThttp://m.tkk7.com/ilovebabyfat/archive/2011/06/13/352190.htmlhttp://m.tkk7.com/ilovebabyfat/comments/352190.htmlhttp://m.tkk7.com/ilovebabyfat/archive/2011/06/13/352190.html#Feedback0http://m.tkk7.com/ilovebabyfat/comments/commentRss/352190.htmlhttp://m.tkk7.com/ilovebabyfat/services/trackbacks/352190.htmlpackage hello;
public interface Hello extends java.rmi.Remote{
    String sayHello() throws java.rmi.RemoteException;
}

package hello;
import java.rmi.
*;
public class HelloClient {
    
public static void main(String args[]){
        System.setSecurityManager(new RMISecurityManager());
        try{
            Hello obj 
= (Hello)Naming.lookup("HelloServer");
            String message
=obj.sayHello();
            System.out.println(message);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

package hello;
import java.rmi.
*;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements Hello{
    private String name;
    
public HelloImpl(String s) throws java.rmi.RemoteException{
        super();
        name
=s;
    }
    
public String sayHello()throws RemoteException{
        
return "hello world";
    }
    
public static void main(String args[]){
        System.setSecurityManager(new RMISecurityManager());
        try{
            HelloImpl obj 
= new HelloImpl("HelloServer");
            LocateRegistry.createRegistry(
1099); 
            Naming.rebind("HelloServer", obj);
            System.out.println("HelloImpl created 
and bound in the registry to the name HelloServer");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

安全{略文g
grant {
    permission java.security.AllPermission;
    };

q行脚本:
Set CLASSPATH=%CLASSPATH%;c:\         没有I格
javac -d .. *.java                                  在hello目录?/span>
rmic -d . hello.HelloImpl                           在hello的父目录?/span>
java -Djava.security.policy=file:C:/java.policy hello.HelloImpl        注意安全{略文g
java -Djava.security.policy=file:/C:/java.policy hello.HelloClient     注意安全{略文g

相关资料Q?br />
http://blog.csdn.net/coolriver/archive/2004/09/10/100702.aspx
http://topic.csdn.net/t/20020310/12/566253.html
http://topic.csdn.net/u/20070426/08/b852e323-08c6-4f80-b87a-937e24af237d.html



思无 2011-06-13 15:18 发表评论
]]>JavaBean和BeanUtilshttp://m.tkk7.com/ilovebabyfat/archive/2011/06/13/352181.html思无思无Mon, 13 Jun 2011 04:38:00 GMThttp://m.tkk7.com/ilovebabyfat/archive/2011/06/13/352181.htmlhttp://m.tkk7.com/ilovebabyfat/comments/352181.htmlhttp://m.tkk7.com/ilovebabyfat/archive/2011/06/13/352181.html#Feedback0http://m.tkk7.com/ilovebabyfat/comments/commentRss/352181.htmlhttp://m.tkk7.com/ilovebabyfat/services/trackbacks/352181.html/**
 * 改类掩饰了如何通过java.bean的类去获知bean中的属性ƈ调用相应的set getҎ
 
*/
import java.beans.*;
import java.lang.reflect.Method;
public class JavaBeanInvoke {
    
public static void main(String args[])throws Exception{
        test1();
    }
    
    
public static void test1()throws Exception{
        Person person 
= Person.class.newInstance();
        
        BeanInfo beaninfo 
= Introspector.getBeanInfo(Person.class);
        PropertyDescriptor[] porpertydescriptors 
= beaninfo.getPropertyDescriptors();
        
for(PropertyDescriptor pd:porpertydescriptors){
            System.out.println(pd.getName());
            
if(pd.getName().endsWith("name")){
                Method setMethod
=pd.getWriteMethod();
                Method getMethod
=pd.getReadMethod();
                setMethod.invoke(person,
"ShenZiping");
                System.out.println(getMethod.invoke(person));
                
break;
            }
        }
    }
    
    
public static void test2() throws Exception{
        Person person 
= Person.class.newInstance();
        PropertyDescriptor pd 
= new PropertyDescriptor("age",Person.class);
        Method setMethod 
= pd.getWriteMethod();
        Method getMethod 
= pd.getReadMethod();
        setMethod.invoke(person, 
56);
        System.out.println(getMethod.invoke(person));
    }
}

/**
 * 代码举例了beanUtil包的普遍用法Q需要apache的logging包和beanUtils?br /> 
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.*;
public class BeanUtilsInvoke {
    
public static void main(String args[])throws Exception{
        test1();
        test2();
        test3();
        test4();
        myConvertTest();
    }
    
public static void test1()throws Exception{
        Person person 
= new Person();
        BeanUtils.copyProperty(person, 
"name""ShenZiping");
        System.out.println(
"test1"+person.getName());
    }
    
public static void test2() throws Exception{
        Person person 
= new Person();
        Map
<String, String> map = new HashMap<String, String>();
        map.put(
"name""ShenZiping");
        map.put(
"age""65");
        BeanUtils.populate(person, map);
        System.out.println(
"test2"+person.getAge());
        System.out.println(
"test2"+person.getName());
    }
    
    
public static void test3() throws Exception{
        Person p1 
= new Person();
        Person p2 
= new Person();
        p1.setAge(
98);
        p1.setName(
"ShenZiping");
        BeanUtils.copyProperties(p2, p1);
        System.out.println(
"test3"+p2.getAge());
        System.out.println(
"test3"+p2.getName());
    }
    
    
public static void test4() throws Exception{
        Person person 
= new Person();
        Man man 
= new Man();
        person.setName(
"ShenZiping");
        BeanUtils.copyProperties(man, person);
        System.out.println(
"test4"+man.getName());
    }
    
    
public static void myConvertTest(){
        ConvertUtils.register(
new Converter(){
            
public Object convert(Class clazz, Object value){
                
if(clazz==Date.class){
                    SimpleDateFormat dateFormat 
= new SimpleDateFormat("yyyy-MM-dd");
                    
try{
                        
return dateFormat.parse((String)value);
                    }
catch(ParseException e){
                        
throw new RuntimeException("invalid format");
                    }
                }
                
return null;
            }
        }, Date.
class);
        Date date 
= (Date)ConvertUtils.convert("2010-01-15",Date.class);
        System.out.println(
"myConvertTest"+date);
    }
}


思无 2011-06-13 12:38 发表评论
]]> վ֩ģ壺 ޸߹ۿ| ޾Ʒ޿һ| ߲| aɫëƬƵ| ޾Ʒþһ| WWWƵ| ޾ƷҺ| һƬaѲſ| avҹƬƷվ| Ƶ߹ۿƵ| ޹þ| ҰƵ| ˵þþþƷ| ҹɫƵվ| պɫƵһ| ĻóӰԺ| ֻˬʹƬҹ| ۺɫ| ߹ۿƬAVվ| ޹˾þ| wwwƵ| ˹վvƬѹۿ| Ʒ޳| ˾ƷƵ| ޾Ʒ㶮| 4338ȫɫվ| ɫҹƵ| 777޾Ʒþþþþ| ߹ۿѸƵ | ޵һƷۿ| ˿wwwƵ| ޻ɫַȫ| Ƶѹۿ97 | ѲĻ| ߿Ƭ˳Ƶ| ŮƵַ| ĻӰӾƷվ| ѳ˸Ƶ| ޾ƷŮþ7777777| ԰߹ۿ޻ɫһƬ| 18ŮվɫƬѹۿ|