??xml version="1.0" encoding="utf-8" standalone="yes"?>91精品国产一区二区三区动漫,免费日韩av,亚洲国产美女http://www.aygfsteel.com/PariScamper/zh-cnSat, 17 May 2025 07:01:31 GMTSat, 17 May 2025 07:01:31 GMT60关于“vsftpd 部分本地用户不能d”的问题解决 http://www.aygfsteel.com/PariScamper/archive/2008/02/27/182568.htmlPariScamperPariScamperWed, 27 Feb 2008 14:45:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2008/02/27/182568.htmlhttp://www.aygfsteel.com/PariScamper/comments/182568.htmlhttp://www.aygfsteel.com/PariScamper/archive/2008/02/27/182568.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/182568.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/182568.html
关于“vsftpd 部分本地用户不能dQ部分可?#8221;的问题,我重新做了一些实验,我把q个问题l合实验的结果再重新描述一下,请各位高人,帮忙看看可能的原因?谢谢了!

pȝ中原来就有的本地帐号都不能登录,我的/etc/vsftpd/vsftpd.conf文g的配|如下:
local_enable=YES
write_enable=YES
chroot_local_user=YES
pam_service_name=vsftpd
/etc/pam.d/vsftpd存在且正常?br />
d旉误信息都是一LQ?br /> 500 OOPS: cannot change directory:/home/xxxx
Login failed.
421 Service not available, remote server has closed connection

他们的home目录都是/home/xxxx?home?home/xxxx的权限都?55?br /> 以上q些帐号都不能ftpdQ这些都是^常经怋用的Q可以用shelld的?br />
我新创徏了一个usr1帐号Q?br /> # useradd -G test -d /tmp/usr1 usr1
能ftpdQ他的home?tmp/usr1,?分区上。?home我是mount?dev/hda9上的?br /> #mount
/dev/hdb1 on / type ext3 (rw)
/dev/hda9 on /home type ext2 (rw)

所以,我猜惻I是否是由?home分区的原因,而造成“ȝ录在/home分区的帐?#8221;都不能登录呢Q?br />
Z验证以上设想Q我试着再创Z一个帐P
useradd -G test -d /home/usr3 usr3
/home, /home/usr3 的权限都?55?br />
usr3 ftpdp|?
500 OOPS: cannot change directory:/home/usr3
Login failed.
421 Service not available, remote server has closed connection

xQ我觉得可以定是由?home分区的原因,而造成“ȝ录在/home分区的帐?#8221;都不能登录?br /> 参考文章:
-----------------------------------------------------------------------------------------
I finished my second upgrade to Fedora Core 4. Not everything is ironed out yet with the build of course. But one thing is for sure a lot has happened to the RedHat I knew before.

I must say of all the changes, for me the nicest addition is the new SELinux extensions. For deep background on the reasons for and theory of SELinux read, The Inevitability of Failure: The Flawed Assumption of Security in Modern Computing Environments

The more I work with SELinux the more I realize I need to know about it, and how exactly it does all its stuff. It certainly changes things relating to users, directories and access. As I am starting to learn it, I'm sure I'm doing things the hard-way. :)

The major difference, so far for me, in Red Hat's SELinux is the way ftp is handled. vsftpd is still the server which is great. However, it seems to be designed to run as a daemon rather than invoked via xinet.d. If you grab a working copy of the xinet.d file for vsftpd you can invoke it via xinet.d wrapper. I did my first server upgrade in this manner. The current one I am trying as a daemon. I certainly think I will miss some of the features that the xinet.d wrapper brings, and may yet return to it.

Of all the issues I saw most notable is if you want to enable chroot directory's outside of the normal /home/xxx vsftpd. These will fail with a

    500 OOPS: cannot change directory: /mnt/xxxxx

I was able to use ftp if I logged in with an account with a directory in /home, but once I set a user account to have a home drive outside of /home (in this case on a mounted secondary disk) vsftpd barfs the above.


I found information at the NSA that indicates you can disable SELinux protection of the ftp daemon.

    setsebool -P ftpd_disable_trans 1

This seems a bit drastic. It certainly works for now though.

I think ultimately the issue resides with policies, but as SELinux policies are new to me, it will take time before it all gets sorted out. As I spend time with the new SELinux extensions in Fedora Core 4 I will keep you updated on my thoughts and configuration lessons.


---------------------------------------------------------------------------------------

解决办法Q?br /> --------------------------------------------------------------------------------------
 # setsebool ftpd_disable_trans 1
  # service vsftpd restart
我用的是FC4Q按照你上一帖子里的Ҏ试了Q马上就解决了。所以,可以定原因在SELinux?br /> ------------------------------------------------------------------------------------



PariScamper 2008-02-27 22:45 发表评论
]]>
Java Clone机制 (zz)http://www.aygfsteel.com/PariScamper/archive/2007/12/12/167233.htmlPariScamperPariScamperWed, 12 Dec 2007 06:49:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/12/12/167233.htmlhttp://www.aygfsteel.com/PariScamper/comments/167233.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/12/12/167233.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/167233.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/167233.html

1          什么是 Clone Q容易实现吗Q?/span>

单地_ Clone 是对于l定的一个对象实?/span> o Q得到另一个对象实?/span> o’ Q?/span> o ?/span> o’ c?/span>

型相同( o.getClass() == o’.getClass() Q,内容相同Q对?/span> o/o’ 中的字段 f Q如?/span> f 是基本数据类型,?/span> o.f == o’.f Q如?/span> f 是对象引用,?/span> o.f == o’.f ?/span> o.f 指向的对象与 o’.f 指向的对象的内容相同Q。通常U?/span> o’ ?/span> o 的克隆或副本?/span>

       直观上看Q似乎很ҎZ个类加上 clone ҎQ?/span>

class A {

       private Type1 field1;

    private Type2 field2;

     …..

    public Object clone() {

              A a = new A();

        a.field1 = a.getField1();

        a.field2 = a.getField2();

        ……

        return a;

    }

}

 

然而,E加推敲Q就会发现这L实现Ҏ有两个问题:

1.         要想某个cL clone 功能Q必d独ؓ其实?/span> clone() 函数Q函数实C码与该类定义密切相关?/span>

2.         即基类 A 已有 clone() 函数Q其子类 ExtendA 若要具备 clone 功能Q则必须 override 其基c?/span> A ?/span> clone() 函数。否则,对类型ؓ ExtendA 的对?/span> ea ?/span> clone() Ҏ的调用,会执行于c?/span> A 中定义的 clone() Ҏ而返回一个类型ؓ A 的对象,它显然不?/span> ea 的克隆?/span>

2          Java ?/span> clone 的支?/span>

万类之初?/span> Object cL clone() ҎQ?/span>

protected native Object clone() throws CloneNotSupportedException;

该方法是 protected 的,昄是留待被子类 override 的。该Ҏ又是 native 的,必然做了

与具体^台相关的底层工作?/span>

事实上,c?/span> Object ?/span> clone() Ҏ首先会检?/span> this.getClass() 是否实现?/span> Cloneable 接口?/span>

Cloneable 只是一个标志接口而已Q用来标志该cL否有克隆功能?/span>

public interface Cloneable {

}

       如果 this.getClass() 没有实现 Cloneable 接口Q?/span> clone() ׃?/span> CloneNotSupportedException q回。否则就会创Z个类型ؓ this.getClass() 的对?/span> other Qƈ?/span> this ?/span> field 的D值给 other 的对?/span> field Q然后返?/span> other ?/span>

       如此一来,我们要定义一个具?/span> Clone 功能的类q当方便:

1.         在类的声明中加入“ implements Cloneable ”Q标志该cL克隆功能Q?/span>

2.         Override c?/span> Object ?/span> clone() ҎQ在该方法中调用 super.clone() Q?/span>

class CloneableClass implements Cloneable {

       ……

public Object clone() {

       try {

              return super.clone(); // 直接?/span> Object.clone() 为我们代劳一?/span>

    } catch (CloneNotSupportedException e) {

              throw new InternalError();

       }

}

}

 

3          Shallow Clone ?/span> Deep Clone

3.1     Shallow ?/span> Deep 从何而来

一个具有克隆功能的c,如果有可变( Mutable Q类cd的字D?/span> field Q如何ؓ其克隆(?/span>

本)对象 o’ 中的 field 赋|

       Ҏ一、如 Object ?/span> clone() Ҏ所实现Q设原始对象?/span> o Q其克隆对象?/span> o’ Q执?/span> o’.field = o.field 。这P o’.field ?/span> o.field 指向同一个可变对?/span> m ?/span> o ?/span> o’ 可能会相互媄响(一个对象的状态可能会随着另一个对象的状态的改变而改变)。这L Clone UCؓ Shallow Clone 。这也是 Object ?/span> clone() Ҏ的实现方式?/span>

       Ҏ二、将 o.field 指向的可变对?/span> m 克隆Q得?/span> m’ Q将 m’ 的引用赋值给 o’.field 。这?/span> o’ ?/span> o 内容相同Q且怺之间无媄响(一个对象状态的改变不会影响另一个对象的状态)。这L Clone UCؓ Deep Clone ?/span>

       Java Collection cd中具体数据结构类Q?/span> ArrayList/LinkedList Q?/span> HashSet/TreeSet Q?/span> HashMap/TreeMap {)都具有克隆功能,且都?/span> Shallow Clone Q这栯计是合理的,因ؓ它们不知道存攑օ中的每个数据对象是否也有克隆功能?/span> System.arrayCopy() 的实现采用的也是 Shallow Clone ?/span>

       Deep Clone 对于实现不可变( Immutable Q类很有帮助。设一个类包含可变c?/span> M cd?/span> field Q如何将其设计ؓ不可变类呢?先ؓ M 实现 Deep Clone 功能Q然后这栯计类 ImmutableClass Q?/span>

class ImmutableClass {

       MutableClass m;

ImmutableClass(MutableClass m) {

       this.m = m.clone(); // 传入的 m ?/span> clone 赋值给内部 m

}

public MutableClass getM() {

    return this.m.clone(); // 内?/span> m ?/span> clone q回l外?/span>

}

}

 

      

3.2     如何实现 Deep Clone

查类有无可变cȝ型的字段。如果无Q返?/span> super.clone() 卛_Q?/span>

如果有,保包含的可变类本n都实C Deep Clone Q?/span>

Object o = super.clone(); // 先执行浅克隆Q确保类型正和基本cd及非可变cȝ型字D内Ҏ?/span>

对于每一个可变类cd的字D?/span> field Q?/span>

       o.field = this.getField().clone();

q回 o ?/span>



PariScamper 2007-12-12 14:49 发表评论
]]>
commons-logging和Log4j 日志理 (zz)http://www.aygfsteel.com/PariScamper/archive/2007/12/12/167232.htmlPariScamperPariScamperWed, 12 Dec 2007 06:48:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/12/12/167232.htmlhttp://www.aygfsteel.com/PariScamper/comments/167232.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/12/12/167232.html#Feedback2http://www.aygfsteel.com/PariScamper/comments/commentRss/167232.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/167232.htmlLogQ?/span>?
q个……׃必说了吧?/span>

Z么不?/span>System.out.println()?
功能太弱Q不易于控制。如果暂时不惌Z怎么办?如果惌出到文g怎么办?如果想部分输出怎么办?……

Z么同时?/span>commons-logging?/span>Log4j?Z么不仅用其中之一Q?br /> Commons-loggin的目的是?#8220;所有的Java日志实现”提供一个统一的接口,它自w的日志功能q_弱(只有一个简单的SimpleLog?Q,所以一般不会单独用它?/span>

Log4j的功能非常全面强大,是目前的首选。我发现几乎所有的Java开源项目都会用?/span>Log4jQ但我同时发玎ͼ所有用?/span>Log4j的项目一般也同时会用?/span>commons-loggin。我惻I大家都不希望自己的项目与Log4jl定的太紧密吧。另外一个我能想到的“同时使用commons-logging?/span>Log4j”的原因是Q简化用和配置?/span>

       一点,“同时使用commons-logging?/span>Log4j”Q与“单独使用Log4j”相比Qƈ不会带来更大的学习、配|和l护成本Q反而更加简化了我们的工作?/span>我想q也是ؓ什?#8220;所有用?/span>Log4j的项目一般也同时会用?/span>commons-loggin”的原因之一吧?/span>

Commons-logging能帮我们做什么?
l         提供一个统一的日志接口,单了操作Q同旉免项目与某个日志实现pȝ紧密a耦合
l         很脓心的帮我们自动选择适当的日志实现系l(q一炚w常好Q)
l         它甚至不需要配|?/span>

q里看一下它怎么“‘很脓心的’帮我?#8216;自动选择’‘适当?#8217;日志实现pȝ”Q?/span>
1)        首先?/span>classpath下寻找自q配置文gcommons-logging.propertiesQ如果找刎ͼ则用其中定义的Log实现c;
2)        如果找不?/span>commons-logging.properties文gQ则在查找是否已定义pȝ环境变量org.apache.commons.logging.LogQ找到则使用其定义的Log实现c;
3)        否则Q查?/span>classpath中是否有Log4j的包Q如果发玎ͼ则自动?/span>Log4j作ؓ日志实现c;
4)        否则Q?/span>JDK自n的日志实现类Q?/span>JDK1.4以后才有日志实现c)Q?/span>
5)        否则Q?/span>commons-logging自己提供的一个简单的日志实现c?/span>SimpleLogQ?/span>
Q以上顺序不保证完全准确Q请参考官Ҏ档)

可见Q?/span>commons-loggingL能找C个日志实现类Qƈ且尽可能扑ֈ一?#8220;最合?#8221;的日志实现类。我说它“很脓?#8221;实际上是因ؓQ?/span>1、可以不需要配|文Ӟ2、自动判断有没有Log4j包,有则自动使用之;3、最悲观的情况下也总能保证提供一个日志实玎ͼSimpleLogQ?/span> 
       可以看到Q?/span>commons-logging对编E者和Log4j都非常友好?/span>

       Z化配|?/span>commons-loggingQ一般不使用commons-logging的配|文Ӟ也不讄?/span>commons-logging相关的系l环境变量,而只需?/span>Log4j?/span>Jar包放|到classpash中就可以了。这样就很简单地完成?/span>commons-logging?/span>Log4j的融合?/span>如果不想?/span>Log4j了怎么办?只需?/span>classpath中的Log4j?/span>Jar包删除即可?br />
p么简单!

代码应该怎么写?

我们在需要输出日志信息的“每一?#8221;cM做如下的三个工作Q?/span>
1、导入所有需?/span>commongs-loggingc:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

如果愿意化的话,q可以两行合Z行:
import org.apache.commons.logging.*;  

2、在自己的类中定义一?/span>org.apache.commons.logging.LogcȝU有静态类成员Q?/span>
private static Log log = LogFactory.getLog(YouClassName.class);

注意q里定义的是static成员Q以避免产生多个实例?/span>

LogFactory.getLog()Ҏ的参C用的是当前类?/span>classQ这是目前被普通认为的最好的方式。ؓ什么不写作LogFactory.getLog(this.getClass())Q因?/span>staticcL员访问不?/span>this指针Q?/span>

3、?/span>org.apache.commons.logging.Logcȝ成员Ҏ输出日志信息Q?/span>
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
log.fatal("555");

q里?/span>logQ就是上面第二步中定义的cL员变量,其类型是org.apache.commons.logging.LogQ通过该类的成员方法,我们可以将不同性质的日志信息输出到目的圎ͼ目的地是哪里Q视配置可定Q可能是stdoutQ也可能是文Ӟq可能是发送到邮gQ甚臛_送短信到手机……详见下文?/span>log4j.properties的介l)Q?/span>
l         debug()   输出“调试”U别的日志信息;
l         info()      输出“信息”U别的日志信息;
l         warn()    输出“警告”U别的日志信息;
l         error()     输出“错误”U别的日志信息;
l         fatal()      输出“致命错误”U别的日志信息;

Ҏ不同的性质Q日志信息通常被分成不同的U别Q从低到高依ơ是Q?#8220;调试Q?/span>DEBUGQ?#8221;“信息Q?/span>INFOQ?#8221;“警告Q?/span>WARNQ?#8221;“错误Q?/span>ERRORQ?#8221;“致命错误Q?/span>FATALQ?#8221;?/span>Z么要把日志信息分成不同的U别呢?q实际上是方便我们更好的控制它。比如,通过Log4j的配|文Ӟ我们可以讄“输出‘调试’及以上别的日志信息”Q即“调试”“信息”“警告”“错误”“致命错误”Q,q对目开发h员可能是有用的;我们q可以设|?#8220;输出“警告”及以上别的日志信息”Q即“警告”“错误”“致命错误”Q,q对目最l用户可能是有用的?/span> 
       仅从字面上理解,也可以大致得出结论:最常用的应该是debug()?/span>info()Q?/span>warn()?/span>error()?/span>fatal()仅在相应事g发生后才使用?/span>  

从上面三个步骤可以看出,使用commons-logging的日志接口非常的单,不需要记忆太多东西:仅仅用到了两个类Log, LogFactoryQƈ且两个类的方法都非常(后者只用到一个方法,前者经常用到的也只是上面第三步中列出的几个Q,同时参数又非常简单?/span>

上面所介绍的方法是目前被普通应用的Q可以说是被标准化了的方法,几乎所有的人都是这么用。如果不信,或想认一下,去下蝲几个知名?/span>Java开源项目源代码看一下吧?/span>  

下面l出一个完整的Javacȝ代码Q?/span> 
package liigo.testlog; 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 

public class TestLog
    private static Log log = LogFactory.getLog(TestLog.class); 
    public void test()    
        log.debug("111"); 
        log.info("222"); 
        log.warn("333"); 
        log.error("444"); 
        log.fatal("555"); 
     

    public static void main(String[] args)    
        TestLog testLog = new TestLog(); 
        testLog.test(); 
    }
 

只要保证commons-logging?/span>jar包在classpath中,上述代码肯定可以很顺利的~译通过。那它的执行l果是怎么L呢?恐怕会有很大的不同Q请l箋往下看?/span>  

Log4j在哪里呢Q它发挥作用了吗Q?/span>

应该注意刎ͼ我们上面l出的源代码Q完全没有涉及到Log4j——这正是我们所希望的,q也正是commons-logging所要达到的目标之一?/span>

可是Q怎么才能?/span>Log4j发挥它的作用呢?{案很简单,只需满“classpath中有Log4j?/span>jar?#8221;。前面已l说q了Q?/span>commons-logging会自动发现ƈ应用Log4j。所以只要它存在Q它发挥作用。(它不存在呢?自然׃发挥作用Q?/span>commons-logging会另行选择其它的日志实现类。)

注意Q配|文?/span>log4j.properties?/span>Log4j来说是必ȝ。如?/span>classpath中没有该配置文gQ或者配|不对,会引发q行时异常?/span>

       q样Q要正确地应?/span>Log4j输出日志信息Q?/span>log4j.properties的作用就很重要了。好在该文g有通用的模板,复制一份(E加修改Q就可以使用。几乎每一?/span>Java目目录内都会有一?/span>log4j.properties文gQ可下蝲几个Java开源项目源代码查看。本文最后也附一个模板性质?/span>log4j.properties文gQ直接复制过d可以用,或者根据自q需要稍加修攏V后文将?/span>log4j.properties文g适当作一些介l?/span>

关于Log4j比较全面的配|?/h5>

LOG4J的配|之单它遍及于来多的应用中了:Log4J配置文g实现了输出到控制台、文件?/span>

回滚文g、发送日志邮件、输出到数据库日志表、自定义标签{全套功能。择其一二用就够用?/span>

log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true 
 

# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

#应用于文?/font>
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis


# 应用于文件回?/font>
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 发送日志给邮g
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


# 用于数据?/font>
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1545873



PariScamper 2007-12-12 14:48 发表评论
]]>java web开发,bean数据攑֜request、responseq是servletcontext中?(zz)http://www.aygfsteel.com/PariScamper/archive/2007/11/19/161582.htmlPariScamperPariScamperMon, 19 Nov 2007 05:18:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/11/19/161582.htmlhttp://www.aygfsteel.com/PariScamper/comments/161582.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/11/19/161582.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/161582.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/161582.htmlservlet规范本nQ数据可以放?个地方:request、session、servletContext.

requestQ?/strong>
好处Q用完就仍,不会D资源占用的无限增ѝ?
弊处Q每ơ要用都从数据库中抓Q多做操作,自然会对性能有一些媄响?

sessionQ?/strong>
好处Q不用每ơ都L据库抓,做操作?
弊处Q每个客户都有一个sessionQ只能自׃用,不同session可能保存大量重复数据Q?
可能耗费大量服务器内存;
另外session构徏在cookie和url重写的基上,所以用session实现会话跟踪Q会用掉一点点服务器带宽和客户端保持联l,
当然session多Q耗费的带宽越多,理论上也会对性能造成影响?
集群的session同步会是个问题?

servletContextQ?/strong>
好处Q不用每ơ都L据库抓,做操作?
存储的数据所有客户都可以用?
可减重复在内存中存储数据造成的开销?
弊处Q很多时候相同的数据可能不多(相当于cache的命中率很低Q?


其实以上3中方法都有利有弊Q各自的好处在某U条件下Q也都会转变为弊处。所以不妨综合用,相当于一?#8220;W三方用?#8221;Q只讲一下思\Q否则太q繁琐,涉及到的相关技术点请参考有x术资料)Q?

request不说了,重点说说session和servletContextQ?

--session的可控应?/strong>
session的最大问题是资源回收Q两cd收方?
d回收Q浏览器被关闭,而ؓ提交触发清理动作的请求时Q该Ҏ失效Q而且很常见?
时回收Q设|session的setMaxInactiveInterval属性或在web.xml中配|超时时_然后交给jvm的垃圑֤理器处理?
不过不要报太大希望,jvm的垃圾收集器q不灵光?
可以用另一U替代方法缓解该问题Q比如限制session的数量,可以用HttpSessionListener实现Q这样可以缓解session带来的吃内存问题Q当然这U做法每ơ都需要判断session数量Q当session辑ֈ限定数量时还必须用其他方法处理了Q这些细节繁琐,而且要}慎处理?

--servletContext
如果说session是一?#8220;局部缓?#8221;Q那servletContext是一?#8220;全局~存”了,不妨把它当作cacheQ这里不讲究用词的严谨性,仅ؓ了更好说明问题)。cache的大是当前应用可用的最大内存。cache的最大问题是提高命中率,命中率高Q内存占用少Q效率高Q命中率低,则内存占用多而且效率低。这U应用的技术实现比“session的可I应?#8221;要简单,适用于相同数据多的地方,q个要事先有所判断Q如果用不好则有弊无利?

如果仅用servlet规范l出?U机ӞM一U都达不到好处兼收的效果Q所以要发挥3U方法的好处、摒弃弊处,必须l合q用Q做一些技术框架的构徏工作Q而且有些地方q比较繁琐(q好框架是可重用的)?/span> 

有时候寻求或实现“q”Q或者说取其利而摒其害Q,要付出很大代PҎ不同的情况,q些代h或是值得Q或是不值得。也可以“两害相权取其?#8221;Q或许是最便捷的方法?/span>



PariScamper 2007-11-19 13:18 发表评论
]]>
使用hibernate像oracle插入数据出现java.sql.BatchUpdateException: ORA-01400: 无法?NULL 插入 的解军_?/title><link>http://www.aygfsteel.com/PariScamper/archive/2007/10/23/155306.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Tue, 23 Oct 2007 07:29:00 GMT</pubDate><guid>http://www.aygfsteel.com/PariScamper/archive/2007/10/23/155306.html</guid><wfw:comment>http://www.aygfsteel.com/PariScamper/comments/155306.html</wfw:comment><comments>http://www.aygfsteel.com/PariScamper/archive/2007/10/23/155306.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/PariScamper/comments/commentRss/155306.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/PariScamper/services/trackbacks/155306.html</trackback:ping><description><![CDATA[<p>注意如果该字D在Oracle中设定非I性ؓYESQ则即是插入String a=""或者String a=new String()也是相对于空倹{?/p> <img src ="http://www.aygfsteel.com/PariScamper/aggbug/155306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/PariScamper/" target="_blank">PariScamper</a> 2007-10-23 15:29 <a href="http://www.aygfsteel.com/PariScamper/archive/2007/10/23/155306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一不错的讲解Java异常的文?转蝲Q?---感觉很不错,M以后很有启发 http://www.aygfsteel.com/PariScamper/archive/2007/10/15/152961.htmlPariScamperPariScamperMon, 15 Oct 2007 05:09:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/10/15/152961.htmlhttp://www.aygfsteel.com/PariScamper/comments/152961.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/10/15/152961.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/152961.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/152961.html六种异常处理的陋?/span>

你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机Ӟ在下面这D代码中Q你能够q速找出异常处理的六个问题吗?

1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try { // ?
4  Statement stat = conn.createStatement();
5  ResultSet rs = stat.executeQuery(
6   "select uid, name from user");
7  while (rs.next())
8  {
9   out.println("IDQ? + rs.getString("uid") // ?
10    "Q姓名:" + rs.getString("name"));
11  }
12  conn.close(); // ?
13  out.close();
14 }
15 catch(Exception ex) // ?
16 {
17  ex.printStackTrace(); //_?
18 }


  作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文?

  本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”Qanti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题?

  反例之一Q丢弃异?

  代码Q?5?18行?

  q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一个恶名远播的问题相提q论??不检查缓冲区是否已满。如果你看到了这U丢弃(而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)?

  q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace不?#8220;处理异常”。不错,调用printStackTrace对调试程序有帮助Q但E序调试阶段l束之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了?

  丢弃异常的情形非常普遍。打开JDK的ThreadDeathcȝ文档Q可以看C面这D说明:“特别圎ͼ虽然出现ThreadDeath是一U?#8216;正常的情?#8217;Q但ThreadDeathcLError而不是Exception的子c,因ؓ许多应用会捕h有的Exception然后丢弃它不再理睬?#8221;q段话的意思是Q虽然ThreadDeath代表的是一U普通的问题Q但鉴于许多应用会试图捕h有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子c,因ؓErrorcM表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常q一坏习惯是如此常见Q它甚至已经影响CJava本n的设计?

  那么Q应该怎样Ҏ呢?主要有四个选择Q?

  1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l?#8220;处理好了异常”?

  2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择?

  3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q?

  4、不要捕获异常?

  l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬?

  反例之二Q不指定具体的异?

  代码Q?5行?

  许多时候h们会被这样一U?#8220;妙?#8221;x吸引Q用一个catch语句捕获所有的异常。最常见的情形就是用catch(Exception ex)语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?

  要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就是告诉Java~译器我们想要处理的是哪一U异常。由于绝大多数异帔R直接或间接从java.lang.ExceptionzQcatch(Exception ex)q当于说我们想要处理几乎所有的异常?

  再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可能的异常是IOExceptionQ因为它要操作OutputStreamWriter。显Ӟ在同一个catch块中处理q两U截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类型,而不应该指定늛范围太广的ExceptioncR?

  另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办?{案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的Z??直至最后由JVM处理?

  l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch。不要试囑֤理所有可能出现的异常?

  反例之三Q占用资源不释放

  代码Q??14行?

  异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally?

  finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally?

  当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??q是执行清理d的最后机会,量不要再有难以处理的错误?

  l论三:保证所有资源都被正释放。充分运用finally关键词?/span>

反例之四Q不说明异常的详l信?

  代码Q??18行?

  仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?

  printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?

  因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?

  l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?

  反例之五Q过于庞大的try?

  代码Q??14行?

  l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易?

  一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception?

  l论五:量减小try块的体积?

  反例之六Q输出数据不完整

  代码Q??11行?

  不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行??p些,再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?

  较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?

  l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?

  改写后的代码

  Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点?嗦,但是它有了比较完备的异常处理机制?

OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
 Statement stat = conn.createStatement();
 ResultSet rs = stat.executeQuery(
  "select uid, name from user");
 while (rs.next())
 {
  out.println("IDQ? + rs.getString("uid") + "Q姓? " + rs.getString("name"));
 }
}
catch(SQLException sqlex)
{
 out.println("警告Q数据不完整");
 throw new ApplicationException("d数据时出现SQL错误", sqlex);
}
catch(IOException ioex)
{
 throw new ApplicationException("写入数据时出现IO错误", ioex);
}
finally
{
 if (conn != null) {
  try {
   conn.close();
  }
  catch(SQLException sqlex2)
  {
   System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连? " + sqlex2.toString());
  }
 }

 if (out != null) {
  try {
   out.close();
  }
  catch(IOException ioex2)
  {
   System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文g" + ioex2.toString());
  }
 }
}

  本文的结Z是放之四L准的教条Q有时常识和l验才是最好的老师。如果你对自q做法没有癑ֈ之百的信心,务必加上详细、全面的注释?

  另一斚wQ不要笑话这些错误,不妨问问你自己是否真地彻底摆׃q些坏习惯。即使最有经验的E序员偶也会误入歧途,原因很简单,因ؓ它们确实实带来?#8220;方便”。所有这些反例都可以看作Java~程世界的恶,它们丽动hQ无孔不入,时刻诱惑着你。也许有Z认ؓq些都属于鸡皮蒜毛的事Q不x齿,但请CQ勿以恶而ؓ之,勿以善小而不为?br />




------------------------------------------------------------------下面是一些java异常?------------------------------------------------------------------------------------------


术异常c:ArithmeticExecption

I指针异常类QNullPointerException

cd强制转换异常QClassCastException

数组负下标异常:NegativeArrayException

数组下标界异常QArrayIndexOutOfBoundsException

q背安全原则异常QSecturityException

文g已结束异常:EOFException

文g未找到异常:FileNotFoundException

字符串{换ؓ数字异常QNumberFormatException


操作数据库异常:SQLException


输入输出异常QIOException


Ҏ未找到异常:NoSuchMethodException

java.lang.AbstractMethodError

抽象Ҏ错误。当应用试图调用抽象Ҏ时抛出?/span>

java.lang.AssertionError

断言错。用来指CZ个断ap|的情c?/span>

java.lang.ClassCircularityError

cd@环依赖错误。在初始化一个类Ӟ若检到cM间@环依赖则抛出该异常?/span>

java.lang.ClassFormatError

cL式错误。当Java虚拟图从一个文件中dJavac,而检到该文件的内容不符合类的有效格式时抛出?/span>

java.lang.Error

错误。是所有错误的基类Q用于标识严重的E序q行问题。这些问题通常描述一些不应被应用E序捕获的反常情c?/span>

java.lang.ExceptionInInitializerError

初始化程序错误。当执行一个类的静态初始化E序的过E中Q发生了异常时抛出。静态初始化E序是指直接包含于类中的static语句Dc?/span>

java.lang.IllegalAccessError

q法讉K错误。当一个应用试图访问、修Ҏ个类的域QFieldQ或者调用其ҎQ但是又q反域或Ҏ的可见性声明,则抛异常?/span>

java.lang.IncompatibleClassChangeError

不兼容的cd化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时Q抛异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新~译而直接运行的情况下,Ҏ引发该错误?/span>

java.lang.InstantiationError

实例化错误。当一个应用试N过Java的new操作W构造一个抽象类或者接口时抛出该异?

java.lang.InternalError

内部错误。用于指CJava虚拟机发生了内部错误?/span>

java.lang.LinkageError

链接错误。该错误及其所有子cLC某个类依赖于另外一些类Q在该类~译之后Q被依赖的类改变了其cd义而没有重新编译所有的c,q而引发错误的情况?/span>

java.lang.NoClassDefFoundError

未找到类定义错误。当Java虚拟机或者类装蝲器试囑֮例化某个c,而找不到该类的定义时抛出该错误?/span>

java.lang.NoSuchFieldError

域不存在错误。当应用试图讉K或者修Ҏcȝ某个域,而该cȝ定义中没有该域的定义时抛错误?/span>

java.lang.NoSuchMethodError

Ҏ不存在错误。当应用试图调用某类的某个方法,而该cȝ定义中没有该Ҏ的定义时抛出该错误?/span>

java.lang.OutOfMemoryError

内存不错误。当可用内存不以让Java虚拟机分配给一个对象时抛出该错误?/span>

java.lang.StackOverflowError

堆栈溢出错误。当一个应用递归调用的层ơ太p导致堆栈溢出时抛出该错误?/span>

java.lang.ThreadDeath

U程l束。当调用ThreadcȝstopҎ时抛错误Q用于指C线E结束?/span>

java.lang.UnknownError

未知错误。用于指CJava虚拟机发生了未知严重错误的情c?/span>

java.lang.UnsatisfiedLinkError

未满的链接错误。当Java虚拟机未扑ֈ某个cȝ声明为nativeҎ的本a定义时抛出?/span>

java.lang.UnsupportedClassVersionError

不支持的cȝ本错误。当Java虚拟图从d某个cLӞ但是发现该文件的丅R次版本号不被当前Java虚拟机支持的时候,抛出该错误?/span>

java.lang.VerifyError

验证错误。当验证器检到某个cL件中存在内部不兼Ҏ者安全问题时抛出该错误?/span>

java.lang.VirtualMachineError

虚拟机错误。用于指C拟机被破坏或者l执行操作所需的资源不的情况?/span>


java.lang.ArithmeticException

术条g异常。譬如:整数除零{?/span>

java.lang.ArrayIndexOutOfBoundsException

数组索引界异常。当Ҏl的索引gؓ负数或大于等于数l大时抛出?/span>

java.lang.ArrayStoreException

数组存储异常。当向数l中存放非数l声明类型对象时抛出?/span>

java.lang.ClassCastException

c造型异常。假设有cA和BQA不是B的父cL子类Q,O是A的实例,那么当强制将O构造ؓcB的实例时抛出该异常。该异常l常被称为强制类型{换异常?/span>

java.lang.ClassNotFoundException

找不到类异常。当应用试图Ҏ字符串Ş式的cd构造类Q而在遍历CLASSPAH之后找不到对应名U的class文gӞ抛出该异常?/span>

java.lang.CloneNotSupportedException

不支持克隆异常。当没有实现Cloneable接口或者不支持克隆Ҏ?调用其clone()Ҏ则抛异常?/span>

java.lang.EnumConstantNotPresentException

枚D帔R不存在异常。当应用试图通过名称和枚丄型访问一个枚丑֯象,但该枚D对象q不包含帔RӞ抛出该异常?/span>

java.lang.Exception

根异常。用以描q应用程序希望捕L情况?/span>

java.lang.IllegalAccessException

q法的访问异常。当应用试图通过反射方式创徏某个cȝ实例、访问该cd性、调用该cL法,而当时又无法讉Kcȝ、属性的、方法的或构造方法的定义时抛异常?/span>

java.lang.IllegalMonitorStateException

q法的监控状态异常。当某个U程试图{待一个自己ƈ不拥有的对象QOQ的监控器或者通知其他U程{待该对象(OQ的监控器时Q抛异常?/span>

java.lang.IllegalStateException

q法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时Q抛异常?/span>

java.lang.IllegalThreadStateException

q法的线E状态异常。当县城未处于某个Ҏ的合法调用状态,而调用了该方法时Q抛出异常?/span>

java.lang.IndexOutOfBoundsException

索引界异常。当讉K某个序列的烦引值小?或大于等于序列大时Q抛异常?/span>

java.lang.InstantiationException

实例化异常。当试图通过newInstance()Ҏ创徏某个cȝ实例Q而该cL一个抽象类或接口时Q抛异常?/span>

java.lang.InterruptedException

被中止异常。当某个U程处于长时间的{待、休眠或其他暂停状态,而此时其他的U程通过Thread的interruptҎl止该线E时抛出该异常?/span>

java.lang.NegativeArraySizeException

数组大小值异常。当使用负数大小值创建数l时抛出该异常?/span>

java.lang.NoSuchFieldException

属性不存在异常。当讉K某个cȝ不存在的属性时抛出该异常?/span>

java.lang.NoSuchMethodException

Ҏ不存在异常。当讉K某个cȝ不存在的Ҏ时抛异常?/span>

java.lang.NullPointerException

I指针异常。当应用试图在要求用对象的地方使用了nullӞ抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计null对象的长度、用throw语句抛出null{等?/span>

java.lang.NumberFormatException

数字格式异常。当试图一个String转换为指定的数字cdQ而该字符串确不满x字类型要求的格式Ӟ抛出该异常?/span>

java.lang.RuntimeException

q行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类?/span>

java.lang.SecurityException

安全异常。由安全理器抛出,用于指示q反安全情况的异常?/span>

java.lang.StringIndexOutOfBoundsException

字符串烦引越界异常。当使用索引D问某个字W串中的字符Q而该索引值小?或大于等于序列大时Q抛异常?/span>

java.lang.TypeNotPresentException

cd不存在异常。当应用试图以某个类型名U的字符串表达方式访问该cdQ但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是uncheckedQ不被检查)异常Q而ClassNotFoundException是checkedQ被查)异常?/span>

java.lang.UnsupportedOperationException

不支持的Ҏ异常。指明请求的Ҏ不被支持情况的异常?/span>

异常
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login Q?Login是你的action名字Q?nbsp; 

可能原因
action没有再struts-config.xml 中定义,或没有找到匹配的actionQ例如在JSP文g中?<html:form action="Login.do".表单提交给Login.do处理Q如果出Cq异常,h看struts-config.xml中的定义部分Q有时可能是打错了字W或者是某些不符合规则,可以使用strutsconsole工具来检查?br /> -----------------------------------------------------------------------------------------------------------------
异常
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null

可能原因     
      
q个异常是因为StrutsҎstruts-config.xml中的mapping没有扑ֈaction期望的form bean。大部分的情况可能是因ؓ在form-bean中设|的name属性和action中设|的name属性不匚w所致。换句话_action和form都应该各自有一个name属性,q且要精匹配,包括大小写。这个错误当没有name属性和action兌时也会发生,如果没有在action中指定name属性,那么没有name属性和action相关联。当然当action制作某些控制Ӟ譬如Ҏ参数D转到相应的jsp面Q而不是处理表单数据,q是׃用name属性,q也是action的用方法之一?br /> -----------------------------------------------------------------------------------------------------------------
异常
No action instance for path /xxxx could be created

可能原因
特别提示Q因为有很多中情况会Dq个错误的发生,所以推荐大家调高你的web服务器的日志/调试U别Q这样可以从更多的信息中看到潜在的、在试图创徏actioncL发生的错误,q个actioncM已经在struts-config.xml中设|了兌Q即d?lt;action>标签Q?/span>

在struts-config.xml中通过action标签的class属性指定的actioncM能被扑ֈ有很多种原因Q例如:定位~译后的.class文gp|。Failure to place compiled .class file for the action in the classpath (在web开发中Qclass的的位置在r WEB-INF/classesQ所以你的action class必须要在q个目录下。例如你的actioncM于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设|action的属性type时就是action.Login).
拼写错误Q这个也时有发生Qƈ且不易找刎ͼ特别注意W一个字母的大小写和包的名称?
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN

可能原因
没有位form bean中的某个变量定义getter Ҏ

q个错误主要发生在表单提交的FormBean中,用struts标记<html:text property=”username”>Ӟ在FormBean中必L一个getUsername()Ҏ。注意字?#8220;U”?br /> -----------------------------------------------------------------------------------------------------------------
异常
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm

可能原因
q个错误主要发生在在classpath中找不到相应的Java .class文g。如果这个错误发生在web应用E序的运行时Q主要是因ؓ指定的class文g不在web server的classpath中(/WEB-INF/classes ?/WEB-INF/libQ。在上面的错误中Q原因是找不到ActionFormcR?br /> -----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}

可能原因
Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.

Not associating an ActionForm-descended class with an action can also lead to this error.
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection

可能原因
不是标识Struts actionServlet?lt;servlet>标记是映射.do扩展名的<sevlet-mapping>标记或者两者都没有在web.xml中声明?/span>

在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺一个标记的关闭W号/>。最好用struts console工具查一下?/span>

另外Qload-on-startup必须在web.xml中声明,q要么是一个空标记Q要么指定一个数|q个数值用来表servletq行的优先Q数D大优先񔭑低?/span>

q有一个和使用load-on-startup有关的是使用Struts预编译JSP文g时也可能Dq个异常?br /> -----------------------------------------------------------------------------------------------------------------
异常
java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)

可能原因
在struts-config.xml中的forward元素~少path属性。例如应该是如下形式Q?br /> <forward name="userhome" path="/user/userhome.jsp"/>
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope


 

Probable Causes
试图在Struts的form标记外用form的子元素。这常常发生在你?lt;/html:form>后面使用Struts的html标记。另外要注意可能你不l意使用的无M的标讎ͼ?lt;html:form … />Q这样web 服务器解析时当作一个无M的标讎ͼ随后使用的所?lt;html>标记都被认ؓ是在q个标记之外的,如又使用?lt;html:text property=”id”>q有是在用taglib引入HTML标记库时Q你使用的prefix的g是html?br /> -----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Missing message for key xx.xx.xx

Probable Causes
q个key的值对没有在资源文件ApplicationResources.properties中定义。如果你使用eclipse时经常碰到这L情况Q当目重新~译Ӟeclipse会自动将classes目录下的资源文g删除?/span>

资源文gApplicationResources.properties 不在classpath中应资源文件放?WEB-INF/classes 目录下,当然要在struts-config.xml中定?
-----------------------------------------------------------------------------------------------------------------
异常
Cannot find message resources under key org.apache.struts.action.MESSAGE

可能原因
很显Ӟq个错误是发生在使用资源文gӞ而Struts没有扑ֈ资源文g?/span>

Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body -- this assumes options are specified in ApplicationResources.properties file)

XML parser issues -- too many, too few, incorrect/incompatible versions
-----------------------------------------------------------------------------------------------------------------
异常
Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.

可能原因
混和使用Struts的html:form标记和标准的HTML标记不正?/span>

使用的编码样式在本页中不支持?br /> -----------------------------------------------------------------------------------------------------------------
异常
"Document contained no data" in Netscape

No data rendered (completely empty) page in Microsoft Internet Explorer

可能原因
使用一个Action的派生类而没有实现perform()Ҏ或execute()Ҏ。在Struts1.0中实现的是perform()ҎQ在Struts1.1中实现的是execute()ҎQ但Struts1.1向后兼容perform()Ҏ。但你用Struts1.1创徏一个Action的派生类Qƈ且实Cexecute()ҎQ而你在Struts1.0中运行的话,׃得到"Document contained nodata" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的错误信息?/span>

---------------------------------------------------------------------------------------------------------------------------
异常
ServletException: BeanUtils.populate
解决Ҏ
在用Struts上传文g?遇到了javax.servlet.ServletException: BeanUtils.populate异常?br /> 我的ActionServletq没有用到BeanUtilsq些工具cR后来仔l检查代码发现是在jsp文g里的form忘了加enctype=&quot;multipart/form-data&quot; 了。所以写E序遇到错误或异常应该从多方面考虑问题存在的可能性,惛_pȝ提示信息以外的东ѝ?br /> ----------------------------------------------------------------------------------------------------------------------------
1. 定义Action? 如果指定了name, 那么必须要定义一个与它同名的FormBean才能q行form映射.2. 如果定义Action? 提交面时出?"No input attribute for mapping path..." 错误, 则需要在其input属性中定义转向的页?3. 如果插入新的数据时出?"Batch update row count wrong:..." 错误, 则说明XXX.hbm.xml中指定的key的类型ؓ原始cd(int, long),因ؓq种cd会自动分配? 而这个值往往会让pȝ认ؓ已经存在该记? 正确的方法是使用java.lang.Integer或java.lang.Long对象.4. 如果插入数据时出?"argument type mismatch" 错误, 可能是你使用了Date{特D对? 因ؓstruts不能自动从String型{换成Date?所? 你需要在Action中手动把String型{换成Date?5. Hibernate? Query的iterator()比list()Ҏ快很?6. 如果出现 "equal symbol expected" 错误, 说明你的strtus标签中包含另一个标{或者变? 例如:
<html:select property="test" onchange="<%=test%>"/>
或?br /> <html:hidden property="test" value="<bean:write name="t" property="p"/>"/>
q样的情?..
---------------------------------------------------------------------------------------------------------------------------
错误QException in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update原因与解冻I      因ؓHibernate ToolsQ或者Eclipse本n的Database ExplorerQ生?.hbn.xml工具中包含有catalog="***"Q?表示数据库名Uͼq样的属?该属性删除就可以?br /> ---------------------------------------------------------------------------------------------------------------------------
错误Qorg.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)
原因与解冻I
Ҏ1 删除Set方的cascade
Ҏ2 解决兌关系后,再删?br /> Ҏ3 在many-to-one方增加cascade 但g能是none
最后一招:
查一下hashCode equals是否使用了id作ؓ唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了nativeQ就不行了,怎么办?删除啊!
----------------------------------------------------------------------------------------------------------------------------
问题Q今天用Tomcat 5.5.12Q发现原来很好用的系l不能用了,反复试发现面中不能包?taglibQ否则会出现以下提示QHTTP Status 500 -type Exception reportMessage description The server encountered an internal error () that prevented it from fulfilling this request.exceptionorg.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file"file:*****/WEB-INF/lib/struts.jar":原因Q更C工程用的lib文g夹下的jarQ发布时也发布了servlet.jar和jsp-api.jar。解冻I把jsp-api.jar删除p册个问题了?----------------------------------------------------------------------------------------------------------------------------
错误Q?java.lang.NullPointerException
原因Q?发现 dao 实例?manage 实例{需要注入的东西没有被注入(俗称I指针异常)解决Q这个时候,你应该查看日志文Ӟ默认是应用服务器?log 文gQ比?Tomcat 是 [Tomcat 安装目录 ]/logs Q你会发现提CZQ可能是Qorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContextresource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xmlorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml……………………….Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined inServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not foundorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found然后你就知道原因是因为配|文件的解析Z错误Q这个通过 Web 面是看不出来的。更多的是持久化影射文g出的错误Q导致了没有被解析;当然你需要的功能无法用了?br /> ----------------------------------------------------------------------------------------------------------------------------
错误QStandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage
或者:      type Status report      message Servlet action is not available      description The requested resource (Servlet action is not available) is not available.
原因Q???br /> ----------------------------------------------------------------------------------------------------------------------------
错误StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei界面错误具体描述Q?br /> org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
      原因与解冻I    <Ҏ一>你的“html:”开头的标签没有攑֜一?lt;html:form>?nbsp;      <Ҏ?gt;重新启动你的应用服务器,自动没有这个问?br />



PariScamper 2007-10-15 13:09 发表评论
]]>
使用Hibernate像Oracle插入数据出现ORA-01747: invalid user.table.column, table.column, or column specification的解x?/title><link>http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152478.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Fri, 12 Oct 2007 15:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152478.html</guid><wfw:comment>http://www.aygfsteel.com/PariScamper/comments/152478.html</wfw:comment><comments>http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/PariScamper/comments/commentRss/152478.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/PariScamper/services/trackbacks/152478.html</trackback:ping><description><![CDATA[<p>|上说是数据库的列名与oracle的保留字重名Q的如此?br /> 比如我的有一列叫user是Q另外我验证叫level也是?br /> |上有的说叫start和end也不行,但经我试验,是可以的Q也是start和end不是保留字?br /> 另外Q这个错误只在用hibernate才出玎ͼ使用jdbc也可能出玎ͼ没试q)?br /> 直接用oracle的客LEnterprise Manager Console却没有这个问题,是列名叫user和levelQ照样可以插入数据?/p> <img src ="http://www.aygfsteel.com/PariScamper/aggbug/152478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/PariScamper/" target="_blank">PariScamper</a> 2007-10-12 23:05 <a href="http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用oracle的sequence像表中插入数?/title><link>http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152447.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Fri, 12 Oct 2007 11:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152447.html</guid><wfw:comment>http://www.aygfsteel.com/PariScamper/comments/152447.html</wfw:comment><comments>http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152447.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/PariScamper/comments/commentRss/152447.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/PariScamper/services/trackbacks/152447.html</trackback:ping><description><![CDATA[<p>SQL语句?br /> insert into room(id,bid,name) values(room_seq.nextval,12,'1346S')Q?br /> room_seq.nextval为取得room_seq的下一值后Q取完值后会自动增?br /> select room_seq.nextval from dual则选出room_seq的nextval|取值后也会自动增长<br /> select room_seq.currval from dual则选出room_seq的当前|取值后不会自动增长<br /> 另外QOracle不像其他数据库,NVARCHAR2的数据类型的取值居然是'abcd'Q单引号Q,既不是双引号Q也不是无引受?/p> <img src ="http://www.aygfsteel.com/PariScamper/aggbug/152447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/PariScamper/" target="_blank">PariScamper</a> 2007-10-12 19:33 <a href="http://www.aygfsteel.com/PariScamper/archive/2007/10/12/152447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Log4jQ?/title><link>http://www.aygfsteel.com/PariScamper/archive/2007/10/11/152147.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Thu, 11 Oct 2007 13:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/PariScamper/archive/2007/10/11/152147.html</guid><wfw:comment>http://www.aygfsteel.com/PariScamper/comments/152147.html</wfw:comment><comments>http://www.aygfsteel.com/PariScamper/archive/2007/10/11/152147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/PariScamper/comments/commentRss/152147.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/PariScamper/services/trackbacks/152147.html</trackback:ping><description><![CDATA[<font size="2"><strong>1?Log4j是什么?<br /> </strong>  Log4j可以帮助调试Q有时候debug是发挥不了作 用的Q和分析Q要下蝲和了解更详细的内容,q是讉K其官方网站吧Q?/font> <a ><font size="2">http://jakarta.apache.org/log4j</font> </a><font size="2">?br /> <br /> <strong>2、Log4j的概?/strong><br />   <!--startfragment --> Log4j中有三个主要的组Ӟ它们分别?/font> <font size="2">Logger、Appender和LayoutQL<!--startfragment -->og4j 允许开发h员定义多个LoggerQ每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关pR有一个LoggerUCؓRootQ它永远存在Q且不能通过名字索或引用Q可以通过Logger.getRootLogger()Ҏ获得Q其它Logger通过 Logger.getLogger(String name)Ҏ?br />    Appender则是用来指明所有的log信息存放C么地方,Log4j中支持多UappenderQ如<!--startfragment --></font> <font size="3"></font><font size="2">console、files、GUI components、NT Event Loggers{,一个Logger可以拥有多个AppenderQ也是你既可以Log信息输出到屏q,同时存储C个文件中?br />    Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息?br />    Log4j中将要输出的Log信息定义?U别,依次为DEBUG、INFO、WARN、ERROR和FATALQ当输出Ӟ只有U别高过配置中规定的U别的信息才能真正的输出Q这样就很方便的来配|不同情况下要输出的内容Q而不需要更改代码,q点实在是方便啊?br /> <br /> <strong>3、Log4j的配|文?/strong><br />   虽然可以不用配置文gQ而在E序中实现配|,但这U方法在如今的系l开发中昄是不可取的,能采用配|文件的地方一定一定要用配|文件。Log4j支持两种格式的配|文ӞXML格式和Java的property格式Q本人更喜欢后者,首先看一个简单的例子吧,如下Q?br /> <br /> </font><font color="#614db3"><font size="2">  log4j.rootLogger=debug, <strong>stdout, R</strong><br />   log4j.appender.<strong>stdout</strong>=org.apache.log4j.ConsoleAppender<br />   log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /> <br />   # Pattern to output the caller's file name and line number.<br />   log4j.appender.stdout.layout.ConversionPattern=%5p [%t] <strong>(%F:%L)</strong> - %m%n<br /> <br />   log4j.appender.<strong>R</strong>=org.apache.log4j.RollingFileAppender<br />   log4j.appender.R.File=example.log<br />   log4j.appender.R.MaxFileSize=</font> <font size="2"><strong>100KB<br /> </strong><br />   # Keep one backup file<br />   log4j.appender.R.MaxBackupIndex=1<br /> <br />   log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />   log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n         <br /> <br /> </font><font color="#000000"><font size="2">  首先Q是讄rootQ格式ؓ<!--startfragment --> log4j.rootLogger=[level],appenderName, ...Q其中level是讄需要输Z息的U别Q后面是appender的输出的目的圎ͼ<!--startfragment -->appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?/font> <font size="2">配置日志信息输出目的地AppenderQ其语法?br /> </font><font size="2">  log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />   log4j.appender.appenderName.option1 = value1<br />   ...<br />   log4j.appender.appenderName.option = valueN</font> <br /> <font size="2">Log4j提供的appender有以下几U:<br />   org.apache.log4j.ConsoleAppenderQ控制台Q?br />   org.apache.log4j.FileAppenderQ文Ӟ<br />   org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ<br />   org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生新文gQ?br />   org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)<br /> </font></font></font><font color="#614db3"><font color="#000000"><font size="2">配置日志信息的格式(布局Q,其语法ؓQ?br /> </font><font size="2">  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />   log4j.appender.appenderName.layout.option1 = value1<br />   ....<br />   log4j.appender.appenderName.layout.option = valueN</font> <br /> <font size="2">Log4j提供的layout有以下几U:<br />   org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,<br />   org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,<br />   org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,<br />   org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息) <br /> <br /> </font></font></font><font color="#000000"><span style="font-size: 10.5pt"><font size="2"><span lang="EN-US">Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下: %m 输出代码中指定的消息<O:P></O:P></span> </font></span></font> <p><font color="#000000"><span style="font-size: 10.5pt"><font size="2">  </font> <span lang="EN-US"><font size="2">%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL <br />   %r 输出自应用启动到输出该log信息耗费的毫U数 <br />   %c 输出所属的cȝQ通常是所在类的全?<br />   %t 输出产生该日志事件的U程?<br />   %n 输出一个回车换行符QWindowsq_?#8220;\r\n”QUnixq_?#8220;\n” <br />   %d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|</font> </span></span><ST1:CHSDATE isrocdate="False" islunardate="False" day="18" month="10" year="2002"><span lang="EN-US" style="font-size: 10.5pt"><font size="2">2002q?0?8?/font> </span></ST1:CHSDATE><span lang="EN-US" style="font-size: 10.5pt"><font size="2">22Q?0Q?8Q?21 <br />   %l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)</font> </span></font></p> <br /> <font color="#614db3"><font color="#000000"><font size="2"><br /> <strong>4、Log4j在程序中的?/strong> </font></font></font><font color="#614db3"><font color="#000000"><br /> </font><font color="#a0a0a0"><font color="#090909" size="2">  要在自己的程序中使用Log4jQ首先需要将commons-logging.jar和logging-log4j-1.2.9.jar导入到构\径中。然后再log4j.properties攑ֈsrc根目录下。这样就可以在程序中使用log4j了。在cM使用log4jQ?/font> </font></font><font color="#614db3"><font color="#a0a0a0"><font color="#090909" size="2">首先声明一个静态变?/font> </font></font><font color="#614db3"><font color="#a0a0a0"><font color="#090909" size="2">Logger logger=Logger.getLog("classname")Q现在就可以使用了,用法如下Qlogger.debug("debug message")或者logger.info("info message")Q看下面一个小例子Q?/font> </font></font><font color="#614db3"><font color="#a0a0a0"><br /> </font><br /> <font size="2">  import com.foo.Bar;<br />   import org.apache.log4j.Logger;<br />   import org.apache.log4j.PropertyConfigurator;<br />   public class MyApp {<br />     static Logger logger = Logger.getLogger(MyApp.class.getName());<br />     public static void main(String[] args) {<br />       // BasicConfigurator replaced with PropertyConfigurator.<br />       PropertyConfigurator.configure(args[0]);<br />       logger.info("Entering application.");<br />       Bar bar = new Bar();<br />       bar.doIt();<br />       logger.info("Exiting application.");<br />     }<br />   }<br /> </font></font> <img src ="http://www.aygfsteel.com/PariScamper/aggbug/152147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/PariScamper/" target="_blank">PariScamper</a> 2007-10-11 21:06 <a href="http://www.aygfsteel.com/PariScamper/archive/2007/10/11/152147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java~程规范http://www.aygfsteel.com/PariScamper/archive/2007/10/11/152052.htmlPariScamperPariScamperThu, 11 Oct 2007 07:24:00 GMThttp://www.aygfsteel.com/PariScamper/archive/2007/10/11/152052.htmlhttp://www.aygfsteel.com/PariScamper/comments/152052.htmlhttp://www.aygfsteel.com/PariScamper/archive/2007/10/11/152052.html#Feedback0http://www.aygfsteel.com/PariScamper/comments/commentRss/152052.htmlhttp://www.aygfsteel.com/PariScamper/services/trackbacks/152052.html (2) Z常规用途而创Z个类Ӟ请采?l典形式"Qƈ包含对下q元素的定义Q?equals()
hashCode()
toString()
clone()Qimplement CloneableQ?br /> implement Serializable
(3) 对于自己创徏的每一个类Q都考虑|入一个main()Q其中包含了用于试那个cȝ代码。ؓ使用一个项目中的类Q我们没必要删除试代码。若q行了Q何Ş式的改动Q可方便地返回测试。这些代码也可作为如何用类的一个示例用?
(4) 应将Ҏ设计成简要的、功能性单元,用它描述和实C个不q箋的类接口部分。理x况下Q方法应明扼要。若长度很大Q可考虑通过某种方式其分割成较短的几个Ҏ。这样做也便于类内代码的重复使用Q有些时候,Ҏ必须非常大,但它们仍应只做同L一件事情)?
(5) 设计一个类Ӟ误w处Cؓ客户E序员考虑一下(cȝ使用Ҏ应该是非常明的Q。然后,再设w处Cؓ理代码的h考虑一下(预计有可能进行哪些Ş式的修改Q想想用什么方法可把它们变得更单)?
(6) 使类可能短精悍,而且只解决一个特定的问题。下面是对类设计的一些徏议:
■一个复杂的开兌句:考虑采用"多Ş"机制
■数量众多的Ҏ涉及到类型差别极大的操作Q考虑用几个类来分别实?
■许多成员变量在特征上有很大的差别:考虑使用几个c?
(7) 让一切东襉K可能地"U有"--private。可使库的某一部分"公共?Q一个方法、类或者一个字D늭{)Q就永远不能把它拿出。若拿出Q就可能破坏其他人现有的代码Q他们不得不重新编写和设计。若只公布自己必d布的Q就可放心大胆地改变其他M东西。在多线E环境中Q隐U是特别重要的一个因?-只有private字段才能在非同步使用的情况下受到保护?
(8) 谨惕"巨大对象l合?。对一些习惯于序~程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的E序Q再把它嵌入一个或两个巨大的对象里。根据编E原理,对象表达的应该是应用E序的概念,而非应用E序本n?
(9) 若不得已q行一些不太雅观的~程Q至应该把那些代码|于一个类的内部?
(10) M时候只要发现类与类之间l合得非常紧密,需要考虑是否采用内部c,从而改善编码及l护工作Q参见第14?4.1.2节?用内部类改进代码"Q?
(11) 可能细致地加上注释Qƈ用javadoc注释文档语法生成自己的程序文档?
(12) 避免使用"术数字"Q这些数字很难与代码很好地配合。如以后需要修改它Q无疑会成ؓ一场噩梦,因ؓҎ不知?100"到底是指"数组大小"q是"其他全然不同的东?。所以,我们应创Z个常敎ͼqؓ其用具有说服力的描q性名Uͼq在整个E序中都采用常数标识W。这样可使程序更易理解以及更易维护?
(13) 涉及构徏器和异常的时候,通常希望重新丢弃在构建器中捕LM异常--如果它造成了那个对象的创徏p|。这样一来,调用者就不会以ؓ那个对象已正地创徏Q从而盲目地l箋?
(14) 当客L序员用完对象以后Q若你的c要求进行Q何清除工作,可考虑清除代码置于一个良好定义的Ҏ里,采用cM于cleanup()q样的名字,明确表明自己的用途。除此以外,可在cd攄一个booleanQ布)标记Q指出对象是否已被清除。在cȝfinalize()Ҏ里,L定对象已被清除,q已丢弃了从RuntimeExceptionl承的一个类Q如果还没有的话Q,从而指Z个编E错误。在采取象这LҎ之前Q请定finalize()能够在自qpȝ中工作(可能需要调用System.runFinalizersonExit(true)Q从而确保这一行ؓQ?
(15) 在一个特定的作用域内Q若一个对象必L除(非由垃圾攉机制处理Q,请采用下q方法:初始化对象;若成功,则立卌入一个含有finally从句的try块,开始清除工作?
(16) 若在初始化过E中需要覆盖(取消Qfinalize()Q请C调用super.finalize()Q若Object属于我们的直接超c,则无此必要)。在对finalize()q行覆盖的过E中Q对super.finalize()的调用应属于最后一个行动,而不应是W一个行动,q样可确保在需要基cȝ件的时候它们依然有效?
(17) 创徏大小固定的对象集合时Q请它们传输至一个数l(若准备从一个方法里q回q个集合Q更应如此操作)。这样一来,我们可享受到数l在~译期进行类型检查的好处。此外,Z用它们,数组的接收者也许ƈ不需要将对象"造型"到数l里?
(18) 量使用interfacesQ不要用abstractcR若已知某样东西准备成ؓ一个基c,那么W一个选择应是其变成一个interfaceQ接口)。只有在不得不用方法定义或者成员变量的时候,才需要将其变成一个abstractQ抽象)cR接口主要描qC客户希望做什么事情,而一个类则致力于Q或允许Q具体的实施l节?
(19) 在构建器内部Q只q行那些对象设为正状态所需的工作。尽可能地避免调用其他方法,因ؓ那些Ҏ可能被其他h覆盖或取消,从而在构徏q程中生不可预知的l果Q参见第7章的详细说明Q?
(20) 对象不应只是单地容纳一些数据;它们的行Z应得到良好的定义?
(21) 在现成类的基上创建新cLQ请首先选择"新徏"?创作"。只有自q设计要求必须l承Ӟ才应考虑q方面的问题。若在本来允许新建的场合使用了承,则整个设计会变得没有必要地复杂?
(22) 用承及Ҏ覆盖来表C为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的承来表示颜色Q这是绝对应该避免的Q应直接使用一?颜色"字段?
(23) 为避免编E时遇到ȝQ请保证在自q路径指到的Q何地方,每个名字都仅对应一个类。否则,~译器可能先扑ֈ同名的另一个类Qƈ报告出错消息。若怀疑自qCc\径问题,误试在c\径的每一个v点,搜烦一下同名的.class文g?
(24) 在Java 1.1 AWT中用事?适配?Ӟ特别Ҏ到一个陷阱。若覆盖了某个适配器方法,同时拼写Ҏ没有特别讲究Q最后的l果是新添加一个方法,而不是覆盖现成方法。然而,׃q样做是完全合法的,所以不会从~译器或q行期系l获得Q何出错提C?-只不q代码的工作变得不正常了?
(25) 用合理的设计Ҏ消除"伪功?。也是_假若只需要创建类的一个对象,׃要提前限制自׃用应用程序,q加上一?只生成其中一?注释。请考虑其装成一?独生?的Ş式。若在主E序里有大量散ؕ的代码,用于创徏自己的对象,误虑采纳一U创造性的ҎQ将些代码封装v来?
(26) 警惕"分析瘫痪"。请CQ无论如何都要提前了解整个项目的状况Q再去考察其中的细节。由于把握了全局Q可快速认识自己未知的一些因素,防止在考察l节的时候陷?死逻辑"中?
(27) 警惕"q早优化"。首先让它运行v来,再考虑变得更快--但只有在自己必须q样做、而且l证实在某部分代码中的确存在一个性能瓉的时候,才应q行优化。除非用专门的工具分析瓶颈,否则很有可能是在费自己的时间。性能提升的隐含代h自己的代码变得难于理解,而且难于l护?
(28) 误住,阅读代码的时间比写代码的旉多得多。思\清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往h不可估量的h倹{无论对你自己,q是对后来的人,它们都是相当重要的。如Ҏ仍有怀疑,那么误惌p图从联机Java文档里找出有用信息时到的挫折,q样或许能将你说服?
(29) 如认己已q行了良好的分析、设计或者实施,那么L微更换一下思维角度。试试邀请一些外来h?-q不一定是专家Q但可以是来自本公司其他部门的h。请他们用完全新鲜的眼光考察你的工作Q看看是否能扑և你一度熟视无睹的问题。采取这U方式,往往能在最适合修改的阶D|Z些关键性的问题Q避免品发行后再解决问题而造成的金钱及_֊斚w的损失?
(30) 良好的设计能带来最大的回报。简a之,对于一个特定的问题Q通常会花较长的时间才能找CU最恰当的解x案。但一旦找C正确的方法,以后的工作就L多了Q再也不用经历数时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报Q甚x可估量)。而且׃自己倾注了大量心血Q最l获得一个出色的设计ҎQ成功的快感也是令h心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失?

PariScamper 2007-10-11 15:24 发表评论
]]>
վ֩ģ壺 ˫| | | ɽ| | ƽ| Դ| | ƽԶ| | | | | | | γ| | | | | | ų| ԰| | ͷ| ȫ| ־| | | | | | | ƽ| | | ¡| ˮ| | | |