<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>雪地白狐 ------> 隐居江南</title>
    <description>毕业于电子科技大学
从事金融支付软件开发</description>
    <link>http://life4j.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>千万不要早上锻炼--养成良好的钦食习惯--此文让您终生受益[转载]</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/197214" style="color:red;">http://life4j.javaeye.com/blog/197214</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          题记：<strong>都说人要活的健康，就得注意那个健康之道，特别当程序员的，更需要了解生活中的保健原理。这对我们正常的生活，学习，工作都至关重要。谨记！</strong><br />原文如下：<br />富 贵病在现代社会有两个冠军，一个是高血压冠军；一个是高血脂冠军，很遗憾。    现在，死亡率最高的是30至50岁的人。年龄不是个宝，血脂高很危险。大家知道国际上有个标准，寿命等于成熟期的5至7倍者为长寿。这么说，人的寿命应该 是100至175岁。为什么都没有达到呢？最主要一个原因是不重视保健，而且不听保健。这个问题在国内非常严重，特别是领导干部。国家保健局一再强调每个人都要重视自己的保健。现在绝大多数是病死的，很少数是老死的。应该绝大多数是老死而少数是病死。这个极端反常的现象要求我们尽快纠正。<br /><br />    最近联合国表扬我们的邻国日本。为什么表扬日本，因为他的寿命是世界冠军。他们女性的平均寿命是87.6岁，我们国家50年代是35岁，60年代是57 岁，现在是67.88岁，距离日本整整差20岁，这是没法原谅的。日本的先进经验是以社区为单位，每一个月讲一次保健课，如果没有来听就必须补课。我国没 这制度，谁爱听就听，不听拉倒。我回国后问了许多人，应该活多久呢？有人告诉我五六十岁就差不多了，这说明我们的标准太低了。他们大部分人根本不知道保健，凑合活着，问题很严重。<br /><br />    联合国提出个口号："千万不要死于无知"。很多人死于无知，这很冤枉呀。我们知识分子平均年龄58.5岁，按这个数字，我想不算学前教育，小学6年，中学 6年，医科大学8年，硕士3年，博士3年，博士后3年，都学完后到点了，根本不能干什么了。很多科学家没超过这个年龄。我在美国斯坦福见到了张学良将军，在纽约参加了他的100岁寿辰。我很受教育，一进门见到他我们就大吃一惊，他眼不花，耳不聋，很多人问他："少帅您怎么活这么久"？他回答很明确："不是 我活得久呀，而是他们活得太短了"。这句话的意思是，你活得短，还嫌我活得长。这情景我一直到现在还记得很清楚。而我们很多人很糊涂，对保健一无所知，这样我们的工作也做不好，因为我们天天处在不健康、亚健康状态。我见过很多人，宋美龄我在长岛见过，他们都活得很长，都是100多岁。他们能活，我们为什么不能活。我就很奇怪，我们很多人凑合活着，这种思想危害极大。<br /><br />    大家知道怎么保健吧？其实国际上在维多利亚开会有个宣言，这个宣言有三个里程碑，第一个叫平衡饮食，第二个叫有氧运动， 第三个叫心理状态。这三个里程碑国际上都知道，而我们很多人不清楚。这三个里程碑的标题不会改变，而内容会随时改变。地球人的平均寿命70多岁，我们是 67.88岁，还没有达到平均寿命。而有很多人已经创造纪录了，据我所知，英国有个叫霍曼卡门今年已经209岁了，经历了12个王朝，如不信我，可以告诉 你个电话号码，还有个罗马尼亚老太太今年104岁，更奇怪的是她92岁时生了个胖娃娃。人家能活，我们凑合活着，你能凑合得了吗？<br /><br /> <br /><br />    平衡饮食<br /><br />    下面我讲第一个问题，平衡饮食。也许有人早就认为保健有什么好听的，还不是早起早睡身体好。我告诉你，唐朝时可以这么说，现在这么说就是极端无知了，很多事情都在变化。所谓平衡饮食，有饮、食二大类。先说饮食的第一个问题，"饮"的问题。我在北大时问学生，什么饮料最好？学生异口同声回答："可口可乐"； 可口可乐美国都不承认，国际上也不承认，它只能解渴，没有任何保健作用。什么叫保健品，大家要知道，它得是能治疗疾病的。到现在我们中国人绝大部分都不知道什么叫保健品。<br /><br />    国际会议上定出了6种保健品：第一绿茶；第二红葡萄酒；第三豆浆；第四酸奶；人家不提牛奶，你注意啦；第五骨头汤；第六蘑菇汤。为什么提蘑菇汤？因为蘑菇能提高免疫功能。一个办公室有人老感冒，有人老不得病，什么原因？就是免疫功能不一样。喝蘑菇汤能提高免疫力，所以是保健品。那为什么提骨头汤呢？骨头汤 里含琬胶，琬胶是延年益寿的，所以现在世界各国都有骨头汤街，而中国没有。我们调查了一下，最近苏州、南京城里有了，北京还是没有。所以不要小看骨头汤，它能延年益寿，因为有琬胶。为什么提酸奶？因为酸奶是维持细菌平衡的。<br /><br />    所谓维持细菌平衡是指有益的细菌生长，有害的细菌消灭，所以吃酸奶可以少得病的。在欧洲酸奶非常广泛，我们许多女孩喜欢吃酸奶，但是她们不了解为什么。我们很奇怪，中国酸奶销量是很低的，而牛奶销量很大。牛奶本身我们不否定它的作用，但跟酸奶比起来差得很远。还有豆浆，后面再说。<br /><br />    我下面讲为什么喝绿茶。现在很多人喝茶，但年轻人不喝。很多人喝红茶。红茶加面包在欧洲流行过，但现在不喝了。大家知道，红茶加面包没有一点保健作用。绿茶为什么有保健作用呢？原来绿茶里面含有茶坨酚，而茶坨酚是抗癌的。还有人喝茉莉花茶，我问他为什么喝茉莉花茶？他的答复很简单："它很香"。我说你要是 为了香，我建议你喝香油。我们不是为了香，而是怕得癌症。日本普查搞得特别好。他们普查完了说40岁以上的人没有一个体内没有癌细胞的。为什么有人得癌 症，有人不得，就是跟喝绿茶有关系。如果你每天喝4杯绿茶，癌细胞就不分裂，而且即使分裂也要推迟9年以上。所以在日本小学生每天一上学就喝一杯绿茶，咱们没有。我给老师讲，老师都不知道，我们的下一代有问题呀。绿茶里含茶坨酚，它是抗癌的，在所有的饮料里绿茶是第一的。我今天来晚了，很多人已经把茉莉花 茶喝得差不多了。赶快改，茉莉花茶没有一点保健作用，只是香而已。<br /><br />    第二请注意，绿茶里含有氟。这个氟有什么作用呢？古代很早就知道，曹雪芹写红楼梦时说贾府的人吃完饭拿茶漱口，而苏东坡也有记载，他每次吃完饭拿中下等茶漱口，目的是坚固牙齿。他不知道是氟的作用，日本人现在搞清楚了，它不仅能坚固牙齿，还能消灭虫牙，消灭菌斑。饭后3分钟，牙齿的菌斑就要出现。现在我们很多人牙齿不好，不但不拿茶水漱口，连白水都不漱，问题在哪里不知道。现在有人30岁就开始掉牙，50岁牙就全掉了。医院里牙科最忙，牙科里镶牙室最忙。 我们到欧洲一看，人人牙齿都很好。你想，如果牙齿好，你当然长寿啦。我们很多人忽略了，其实你不费事，你拿茶水漱口就把菌斑消灭了，而且坚固牙齿。到了老年，你牙齿坚固，不得虫牙。这很小的一件事，应该坚持做。<br /><br /> <br /><br />    第三个，绿茶本身含茶甘宁，茶甘宁是提高血管韧性的，使血管不容易破裂。很多人脑血管意外来北京治疗，医院每死4个人就有1个是脑出血，这很危险。脑出血 没法治，就怕生气，一生气一拍桌子一瞪眼，脑血管崩了。这个我见得太多了，那天他们开玩笑说梅兰芳被儿子气死了，我说他没喝绿茶，他要是喝绿茶就不至于死。我现在改了，早就喝上绿茶了。各位，你们这岁数早点喝吧，到时候你拍几下桌子瞪几下眼都不怕。绿茶第一抗癌，第二能坚固牙齿，第三脑血管不易破裂，干 嘛不喝呀。如果你不知道怎么喝茶，请马上纠正，因为国际潮流已经是喝绿茶了。还有人跟我抬杠：喝完茶睡不着觉怎么办？谁让你睡觉前喝茶了。<br /><br />    饮料中第二个是红葡萄酒。为什么提红葡萄酒，很多中国人不知道，欧洲早就知道了，他们天天男女老少都喝一点红葡萄酒，什么原因？原来红葡萄的皮上有种东西，叫"逆转醇"。这逆转醇干什么的你们不知道，它整个是抗衰老的，一说抗衰老人们就爱喝了。它还是抗氧化剂，常喝红葡萄酒的人不得心脏病。 第二它可以帮助防止心脏的突然停搏，我们叫猝停。大家知道，什么情况下心脏可以停搏，第一原来有心脏病的，第二有高血压的，第三跟食物有关系。什么食物呢？过大、过硬、过粘、过热的食物可以使心脏停搏，血脂高可以使心脏停搏。前几天我到师范大学会诊，35岁的一个博士后，早晨还活蹦乱跳的，中午就没了。为什么？血脂太高了。现在我把北京市普查结果告诉大家，在职干部每两个人就有一个人血脂高，二分之一。血脂高的危险在哪里呢？心脏会突然停搏。有一个20 岁的小伙子，他抽出来的血是泥状的，非常危险。我们问他，他说吃得太好了。不是你吃得太好，而是吃得太不合理了。我们有个病例，一个人在街上买了个大年糕，又硬、又粘、又热，跑回家一进门就让老太太快点吃，别凉了，老太太刚吃几口就咽气了。他背着老太太往医院跑，到医院我们问他怎么回事，他说刚给老太太 年糕吃的。这不属于无知是什么！没抢救过来。老太太在家呆得好好的，没事吃什么年糕呀，吃完年糕心脏停搏了。现在国际上一再强调，过大、过硬、过粘、过热就会使心脏停搏。红葡萄酒还有个作用是能降血压、降血脂。红葡萄酒有以上几大作用，所以在国外卖得很好。我不是来推销红葡萄酒的，我是来传达国际会议精神 的。很多人提出来，不是不让喝酒吗？世界卫生组织说的是"戒烟限酒"，没说不让喝酒，而且酒的限量也说了：葡萄酒每天不超过50～100毫升，白酒每天不 超过5～10毫升，啤酒每天不超过300毫升。如果你超过这个量是错误的，不超过这个量是好的。有的女同志提出来：我不会喝酒怎么办？你不会喝酒，难道不会吃葡萄吗？吃葡萄难道不会不吐葡萄皮吗？"吃葡萄不吐葡萄皮"是相声里说的一句话，但我告诉你，白葡萄没有逆转醇，所以你不听课就不会买葡萄。白葡萄没有逆转醇，你是白吃了。现在欧洲已经出现红葡萄糕点了。我实验过，把红葡萄洗干净吃，一咽皮挺舒服的，没事。所以有钱的喝红葡萄酒，没钱的吃葡萄不吐葡萄 皮一样保健。还有人跟我抬杠：我没钱怎么办？我告诉大家，国际会议上已经调查完了，全世界的长寿地区都在无钱地区，第一是巴基斯坦的埃尔汗，第二是苏联的阿塞拜疆，还有厄瓜多尔的卡拉汗，这些都是无钱地区。你说奇怪不，有钱的天天泡在宴席里，鸡鸭鱼肉，上下一般粗，将军肚。我调查了，这样的人极少活过65 岁的。<br /><br /> <br /><br />关于早上锻炼的问题，在中国很多人就不清楚。我从国外回来，看到很多老头、老太太早上5、6点背着宝剑就出来了。到了晚上，中国老 头、老太太都看不到了，都在家看电视呢。为什么两个国家差别怎么大？这是他们不明白，不能怨老人，没人跟他们讲。早上锻炼很危险，早上起来，人的生物钟规律是体温高、血压高，而且肾上腺素比晚上高出4倍，如果你激烈运动，就很容易出事，容易出现心脏停搏。98年开展长跑运动，北京市有据可查的已经跑死4个 老头了，如果再跑就坏了。有的党委组织老头老太太爬香山，而且一清早就去，上鬼见愁，说："谁爬得快谁长寿"。这不知是谁的主意，我现在也闹不明白。我告诉大家，如果这样下去的话要犯错误，因为从领导开始就不了解保健。千万不要组织这种活动，这是医学上最忌讳的。我们不反对早上散步、做体操、打太极拳、练 气功。这是无可非议的。但是如果中老年人早上激烈运动，搞长跑，爬香山，有百害无一利，而且死亡率是很高的。你不长跑可能死不了，不爬山可能死不了，这叫死于无知，结果是自己害了自己。<br /><br />    人体需要弱碱。什么是弱碱？蔬菜、水果。凡是发达国家，凡是健康国家都是蔬菜、水果消耗最大。你不会保健，就会点菜，没用。有人开玩笑，这些贪污犯不用枪毙，吃就把他吃死了，我看一点也不夸大。还有人跟我抬杠说：我还没解决温饱怎么办？没解决温饱，你饿死了跟这有什么关系！大家都知道钱和权都重要，有人跟 我提到"有权才成"。我们知道，最有权的是中国 皇帝，远的不说，就说清朝，有13个皇帝，同治19岁死的，顺治23岁，咸丰31，光绪38，但有个乾隆活了89岁，他特别会保健，皇帝里他是冠军。我们查了他的档案，第一，他特别好运动，第二他吃蒸发糕，粗细粮搭配，第三这人好旅游，最有名的就是三下江南，所以他活了89岁。我们调查了818个和尚， 30%以上的和尚有90岁以上，最小的一个65岁。和尚有什么权？饮食值得我们注意哑！所以，钱、权都不是主要的，主要是保健。如果你不会保健，有钱有权 都没有保证，所以联合国才说，千万不要死于无知。<br /><br />    再说饮食的第二个问题，"食"的问题。大家知道，亚洲金字塔最好。什么叫金字塔？谷类、豆类、菜类。这谷、豆、菜非常好，在旧金山开会时好多外国医生提出来了，说，不对呀，中国人已经不吃谷、豆、菜了，已经吃起我们的汉堡包来了。我回国后去了趟麦当劳，硬把我挤出来了，你说厉害吧，这在国外是很少见的事。 咱们年轻人过生日，举行宴会都是麦当劳。我很佩服麦当劳，人家一年拿走我们20多个亿，人家很会做生意。据我掌握的情况，人家为什么叫它垃圾食品，就是因 为它是一种偏激食品，后果是上下一般粗，跟行李卷一样。人家不吃，因为吃了还要去减肥。咱们不知道，天天麦当劳，尤其第二代简直没有麦当劳就活不了啦。我们应该知道它是偏激食品，不符合我们的饮食习惯。<br /><br />    "谷"，人家在国际会议上从来不提大米、白面，也不提麦当劳。谷类里第一提的是老玉米，说是"黄金作物"。老玉米的来历，美国医学会作了个普查，发现原始的美国人、印第安人没一个高血压，没一个动脉硬化。原来是吃老玉米吃的。后来发现老玉米里含有大量的卵磷脂、亚油酸、谷物醇、VE，所以不发生高血压和动脉硬化。从此以后，美国就改了，美洲、非洲、欧洲、日本、香港、中国的广州，早上都吃玉米羹了。现在许多人吃卵磷脂干嘛？就是希望不得动脉硬化。但是他不 知道老玉米里含得最多，不用多花钱。我在美国调查了一下，一个老玉米2.5美元，而在中国一个老玉米1块钱，相差16倍。但是我们很多人不知道，也不吃。 这次普查以后，我马上改正了，在美国我坚持6年了，每天喝玉米粥。我今年快进入中年，体力充沛、精神饱满，嗓音洪亮、底气十足，而且脸上没有皱纹。什么原因？喝玉米粥喝的，信不信由你。你喝你的牛奶，我喝我的玉米粥，咱们看谁活得长。<br /><br />    "谷"的第二是荞麦。为什么提荞麦？现在人都"三高"，即高血压、高血脂、高血糖。荞麦是"三降"，它降血压、降血脂、降血糖。我问北大学生，什么叫荞 麦？说不知道，就知道汉堡包。荞麦里含有18%的纤维素，吃荞麦的人不得胃肠道癌症，直肠癌、结肠癌都不得。我们坐办公室的人，得病有20%是直肠癌、结肠癌。<br /><br />    "谷"的第三是薯类，白薯、红薯、山药、土豆。这类东西是在国际会议上提出来的。为什么？原来它"三吸收"：吸收水份，吸收脂肪、糖类，吸收毒素。吸收水份，润滑肠道，不得直肠癌、结肠癌。吸收脂肪、糖类，不得糖尿病。吸收毒素，不发生胃肠道炎症。我在美国也调查了，美国吃薯类是把它做成各种糕点，也不少 吃的。希望大家多吃薯类，主食中搭配薯类。<br /><br />    "谷"里面还有燕麦，国外早就知道，中国很多人不知道。你要是血压高，一定要吃燕麦，燕麦粥、燕麦片。它能降血脂、降血压。能降甘油三脂，使你的血脂降下来。<br /><br />    "谷"最后一个是小米！我们是小米加步枪打胜仗的啊！我回国后就问："为什么咱们不吃小米了呢"？很多人跟我说什么："那玩意不是坐月子吃的吗"？你说糟 糕不糟糕。实际上本草纲目已经说明白了，小米能除湿、健脾、镇静。安眠，有这么大好处你不吃！现在很多坐办公室的人睡不着觉，得抑郁症、神经官能症，吃安定2片、4片、6片，已经有人吃8片还睡不着。我劝大家别吃了。有两个有名的医学教授吃了安定以后，头脑昏昏沉沉撞到暖气包上了。所以北京日报头版登出来 "安定并不一定安定"，别吃了。我做保健工作他们让我开药，我就劝他们别吃安定了，我说你吃点小米粥吧。结果怎么样，他喝了一碗小米粥就来找我了，说怎么还睡不着觉！谁让你只喝一碗了，吗啡都没有那么快。我在农村普查过，那些老头老太太们不知道什么叫失眠， 躺在床上就呼呼睡。我仔细观察了，人家是喝小米粥喝的。所以现在我已经改了，早上一碗玉米粥，精神焕发，晚上一碗小米粥，呼呼大睡，你说多好呀！你要明白，食疗重于药疗，这是李时珍说的，所有李时珍写的本草纲目全部都是食物。我们为什么不拿食物解决问题，非得吃药！十药九毒，没听说拿药能保健的，秦始皇 没办到，汉武帝没办到，你也办不到。但是我要声明：我不是反对吃药，反对吃药的是李洪志。我反对乱吃药，我主张吃药"短、平、快"。短时间吃药，吃平安 药，快速停药。<br /><br /> <br /><br />下面讲"谷、豆、菜"中的"豆"。我们普查结果出来是整个中国老百姓缺乏优质蛋白。所以我们小球老胜，大球就不胜。为什么？球场上一踢一撞就一跟头。我们现在的药费比美国高十倍，但我们的身体不如人家。中国人的优质蛋白不够怎么办？现在卫生部已经提出来"大豆行动计划"， 内容是"一把蔬菜一把豆，一个鸡蛋加点肉"。我讲之后北大学生就说成了"半斤鸡蛋二两肉，加点蔬菜加点豆"。他说你讲的没有量，我给你加点量。谁让你加量的！一个鸡蛋300毫克胆固醇正合适，为什么吃半斤，还编出来二两肉？没有这个。一两大豆的蛋白等于二两瘦肉，等于三两鸡蛋，等于四两大米，你说应该吃什么好？现在国际上都知道了。美国把每年的8月15日定为全国的"豆腐节"，我们没有豆腐节。他们不缺优质蛋白，他们认为大豆是营养之花，豆中之王。大豆中起码有5种抗癌物质，特别是饴黄酮，它能预防、治疗乳腺癌，但只在大豆中才有。我们北京和天津隔这么近，北京的乳腺癌特别多，而天津很少。你知道为什么？天津的早点是豆浆、豆腐脑。北京的早点问题不少，现在北京要研究早 点了。北京高血压、高血脂这么多，早点五花八门，但很不科学。牛奶好还是豆浆好？联合国国际会议上说，牛奶里含的是乳糖，而全世界有三分之二的人不吸收乳糖，在亚洲黄种人中有70%不吸收乳糖，我们是黄种人。有人牛奶是喝了，但并没有吸收多少。对牛奶吸收量最大的是白种人。北京市调查的结果是40%的人不 吸收乳糖。全国普查的结果，吸收最好的是广东。豆浆有什么优点？豆浆里含的是寡糖，它100%吸收。而且豆浆里还含有钾、钙、镁等，钙比牛奶含量多。牛奶 里没有抗癌物质，而豆浆里有5种抗癌物质。其中特别是饴黄酮专门预防、治疗乳腺癌、直肠癌、结肠癌。所以对我们黄种人来说最合适的是豆浆。我不反对大家喝 牛奶，但为了防癌一定要喝点豆浆。有人停牛奶改喝豆浆了，这方法也不一定好。牛奶可以接着喝，适当加点豆浆。<br /><br />    下面谈"谷、豆、菜"中的"菜"。国际会议上第一个提的菜是胡萝卜。为什么提胡萝卜？我国本草纲目里写的是养眼蔬菜。晚上看不到东西，特别是夜盲症，吃了就好。它保护粘膜的，长期吃胡萝卜不容易得感冒。美国人认为胡萝卜是美容菜，养头发、养皮肤、养粘膜。常吃胡萝卜的人确实从里往外美容。这美容概念应该是 内外和谐，我们好多女孩子上当了，她抹了化妆品还好看点，一卸装比原来还难看。美国很注意这个，他们老吃胡萝卜。在乌鲁木齐时他们请我吃饺子，是胡萝卜馅的，他们起名叫俄罗斯饺子，我吃完后觉得很美。第一，它养粘膜，不容易感冒；第二，它健美；第三，它有点抗癌作用，而且对眼睛特别好。欧洲已经有胡萝卜糕 点了。胡萝卜还不怕高温，多高温度营养也不受损失。<br /><br /> <br /><br />    "菜"中第二提的是南瓜。为什么提南瓜呢？它刺激维生素细胞，产生胰岛素。所以常吃南瓜的人不得糖尿病。"菜"中应该提的还有苦瓜。它虽苦，但分泌胰岛素物质，常吃苦瓜的人也不得糖尿病。南瓜、苦瓜，我们这个年龄的人一定要常吃。<br /><br />国 际会议上还提到蕃茄，就是西红柿。在美国，几乎每个家庭都种蕃茄、吃蕃茄，目的是不得癌症。这是刚刚5、6年前才知道的。吃西红柿不得癌症，你知道吗？不 得子宫癌、卵巢癌、胰腺癌、膀胱癌、前列腺癌。这这西红柿不是随便吃的，我问大家，西红柿怎么吃？有人说，那还不简单，洗洗就生吃呗。还有人切片放白糖，再喝点啤酒。如果是这么吃的，我告诉你，白吃了！不抗癌。西红柿里面有个东西叫蕃茄素，它和蛋白质结合在一块，周围有纤维素包裹，很难出来。所以必须加 温，加温到一定程度才出来。我告诉大家，西红柿炒鸡蛋最值钱了。还有蕃茄汤，或西红柿鸡蛋汤也是好的。生吃西红柿不抗癌，请大家注意。<br /><br />    还有大蒜。大蒜是抗癌之王。我刚一说大蒜怎么吃，有人就说：那玩意得加温吃。你咋什么都加温？我告诉大家，大蒜加温等于零！山东人、东北人最爱吃，一瓣瓣地吃，还说吃大蒜不得癌，但没几天他先得癌症了。什么原因？现在世界上都知道怎么吃大蒜，只有我们不知道。告诉大家，原来是必须先把它切成片，一片一片的 薄片放在空气里15分钟，它跟氧气结合以后产生大蒜素。大蒜本身不抗癌，大蒜素才抗癌，而且是抗癌之王。我那天见人吃大蒜，他拿过一碗面，然后很快就把大蒜剥出来了，一瓣一瓣地吃，还不到5秒钟就吃进去了。连5秒钟都没有，这大蒜有什么用呀？一点也没有。如果不按我的方法，那是白吃了。大蒜有味不用怕，吃点山楂，嚼点花生米，再吃点好茶叶就没味了。国外每礼拜都吃的，我们为什么不吃呀！<br /><br />下面讲黑木耳。黑木耳有什么作用？现在一到过年时心肌梗死一个 挨一个，年龄越来越小，已经到30岁了。为什么过年时多？两个原因，一个是高凝体质血稠，就是脂肪高。大家记住，血稠的人叫高凝体质。高凝体质的人加上高 凝食物，所以过年时心肌梗死的人特别多，年龄不限。心肌梗死虽然无法治，但完全可以预防。有的大夫告诉你吃阿司匹林，为什么？可以使血不粘稠，不得心肌梗死。但后果是什么，吃阿司匹林的后果是眼底出血，现在很多人眼底出血。我劝大家不要吃阿司匹林了。现在欧洲已经不吃阿司匹林了，吃什么？吃黑木耳。黑木耳 有两个作用，其中一个是使血不粘稠。黑木耳的作用是美国心脏病专家发现的，他得了诺贝尔奖。他发现以后，所有欧洲人、有钱有地位的人都吃黑木耳，而不吃阿司匹林了。什么样的人是高凝体质？答案是矮、粗、胖的人，特别是更年期的女同胞。而且血型AB的人更容易高凝血稠。还有脖子越短越容易高凝血稠。第一过年时不要胡吃海塞；第二多喝点好茶，活血化瘀；第三千万不要生气，一生气血就稠。喝白酒也容易血稠，要喝就喝红葡萄酒，不超过100毫升。如果给你吃花生米，千万不要吃，实在要吃，把皮剥了吃。你看咱中国的花生米，五香花生米、炒花生米、炸花生米全都带皮。你到欧洲去看看，所有花生米没有带皮的，人家知道 不要吃皮。有人说："这皮不是有营养吗"？谁说的，我告诉大家，花生皮没有营养，它只能治血凝片，提高血小板，止血用的。我们中老年人千万不要吃了。还有看电视要注意，好电视就看会儿，不好的电视不看。为什么？长时间坐在那儿，血凝度会升高。我特别担心的是什么？他本来短粗胖，没脖子，还在更年期，又是 AB血型，胡吃海塞，然后一生气，又喝白酒，完了吃花生米不剥皮，他要不得心肌梗死我这大夫不当了。<br /><br />    下面谈谈花粉。里根总统曾经一次被枪伤，还得了一次恶性肿瘤，他那么大岁数，现在还活着，只是得了老年性痴呆症。是花粉在他身上起了很大作用。现在欧洲、美洲都流行起花粉来了。我回国后一查历史，原来我们很早就有。武则天就吃花粉，慈禧太后也吃花粉。大家知道，花粉是植物的精子，它孕育着生命，营养最丰 富，在植物里是最好的东西。古代就有了，但我们忽略了它。大家不要在街上买花粉，街上卖的花粉有硬壳，没有破壁。破壁要有高科技处理。第二，花粉是野生的，容易污染，要消毒。第三，它是蛋白质，必须脱敏。花粉必须具备这三条才能用：处理、消毒、脱敏。花粉在日本用得最厉害，不管多大年纪的人都用它美容。 法国的模特没一人不用它。有一回，我一个月时间每天晚上起夜三次，我一看不好，就吃花粉，一个月就恢复正常了。文献记载，花粉治愈率97%。如用花粉治不 好，药也解决不了，最后肾功能衰竭，尿血，然后肾肿瘤。所以要早点治而不要等到肾功能衰竭。还有一个胃肠道紊乱，女同胞多，习惯性便秘。很多人吃泻药而很容易得直肠癌、结肠癌。花粉有个名字叫肠道警察，吃了花粉以后，警察可以维持肠道秩序。第三它健美，维持体型。花粉的三大作用不可忽略。植物问题就谈这么 多。<br /><br />    下面谈谈动物问题。广播电台说吃四条腿的不如吃两条腿的，而吃两条腿的不如吃多条腿的。这个概念在欧洲不一样，你如果参加宴会，要注意，假如有牛肉，又有猪肉，应该吃猪肉。牛肉的问题太多，第一有疯牛病，第二有口蹄疫，第三有不良胆固醇。现在美国有三万妇女得了淋巴肿瘤，吃汉堡包吃出来的。所以他们争论很 大，已经杀了几万头牛，我们应该慎重吃。如果有猪肉又有羊肉，吃羊肉；有羊肉又有鸡肉，吃鸡肉；有鸡有鱼，吃鱼；有鱼有虾，那吃虾呀。这不是客气，动物越小蛋白越好。朴素的大众营养学就看动物大小，拿来分子式谁也看不懂。我还没说老鼠呢。国际会议上说跳蚤的蛋白最好。跳蚤别看它那么小，它可以跳1米多高， 你信不信。如果把它放大到人体那么大，它可以跳到月球上去。所以有几个美国医生在琢磨怎么吃跳蚤呢。现在联合国WHO建议大家多吃点鸡和鱼，那为什么不提 虾呢？不是不提，而是虾太贵了，不容易普及。如果有虾，还是吃虾好。我现在掌握这么个原则：要是虾来了我就吃两口虾，这两口比你一肚子牛肉的蛋白都要多。鱼容易普及，鱼肉蛋白1个小时就能吸收，吸收率为100%，而牛肉蛋白3小时才吸收。鱼对老年人尤其是身体虚弱的人特别合适。当然虾比鱼还好。国际上调查 了，全世界最有名的长寿地区在日本，日本的长寿地区在海边，而海边寿命最长的是吃鱼的地方。特别要吃小鱼、小虾，特别要吃全鱼（连头带尾），因为有活性物质，而且活性物质在小鱼、小虾的头部和腹部。看你会不会买鱼，要买就买小鱼小虾，而且吃全鱼全虾，这有大学问，不是买鱼越大越好。<br /><br />    还有个吃的原则，吃东西要掌握量，不是越多越好。国际上有规定的，要吃7成饱，一辈子不得胃病，吃8成饱最多了，若吃10成饱，那2成没有用，是废物。所 以国际上建议大家0.618黄金分割：副食6主食4；粗粮6细粮4；植物6动物4。现在人类吃的动物太多，而且粗细粮不平衡。我的一个病人吃了6个大包 子，20岁得了胃扩张，诊断结果一是等死，二是胃切除。结果切除了大半个胃。老年人特别要只吃7成饱。<br /><br />    物质平衡有个规律，我简单介绍一下。初生到5个月婴儿吃母乳最好，超过5个月母乳也不行了，需要42种以上的食品。人到老年就更难了。幸亏有法国一个医生 叫科里门特，他到非洲去旅游时看到非洲大泽湖地人比我们健康长寿。他们吃什么？吃海藻，把它晒干了包包子吃，然后喝海藻汤。医生拿到巴黎一实验，原来是海藻，而且是螺旋状的，起名叫螺旋藻。这螺旋藻是1962年发现的，这一发现轰动了全世界。为什么？它1克等于1000克各种蔬菜的综合。当时只有皇帝皇 后、奥林匹克冠军吃，别人吃不着。很多年后发现这东西特别好，营养特别丰富，最全面，营养分布最平衡，而且是碱性食品。我告诉大家，日本为什么是长寿世界冠军，他们一年消耗500吨螺旋藻，他们到中国旅游每人都带它。我们问他们，为什么带螺旋藻？他们说，8克螺旋藻就可以维持生命40天。现在的太空食品， 没有带包子大饼的，全都是螺旋藻。螺旋藻在世界上很驰名了，所以你如果营养不好，别忘了这东西，它能平衡饮食的。它对几个病特别重要，第一是心脑血管病，它能降血压、降血脂；第二是糖尿病，这病是缺少蛋白、维生素，很难治愈，螺旋藻能补充维生素，而且螺旋藻的最大优点是使糖尿病人不得合并症，能跟正常人饮 食一样。糖尿病人缺少能量，又不能吃糖，螺旋藻是干糖，摄入干糖后就有能量了。糖尿病人血糖不稳定，用螺旋藻后可以逐渐停药，然后逐渐停螺旋藻，最后拿饮食控制。欧洲快要战胜糖尿病了，我们也是完全可以的，但必须配合治疗。第三是胃炎、胃溃疡，螺旋藻有叶绿素，对胃粘膜有恢复作用。第四是肝炎，国际上没有 肝炎，为什么？人家分餐了。上海医学院做了调查，家里有一个人转胺酶高，其他人转胺酶也高。我们拿筷子捅在一个碗里。所以呼吁每个家庭要注意，最好分餐。注意，很多人看起来是健康的，你看不出他是带菌者。螺旋藻能使病毒不复制，而且大量氨基酸能使肝细胞恢复。它有胆碱，能使肝功能恢复，提高免疫功能。螺旋 藻还有防辐射作用。苏联核电站爆炸时，日本专家去抢救，拿的就是螺旋藻，它抗辐射作用很强。现在很多女性做IT工作，在电脑前工作的怀孕女子有的4个月后 流产，有的生出来的婴儿象青蛙一样，北京市妇产医院的报告还有带尾巴的。辐射带给人的影响很大。最近报纸登载，哈尔滨去年一年发现了1500例白血病， 10月份又发现36例。初步判定原因是房屋装修，而且是甲醛。房屋装修危险很大，国际上规定，装修后的房屋一定要半年后才能入住。哈尔滨的报告中多是 4～5岁的儿童。房屋装修对老年人、孕妇、儿童危害最大。各位不要低估辐射。螺旋藻提纯后，很纯很小一点叫藻复康，它能抗辐射。它经过医科大学、军事医学院鉴定，卫生部批准，现在已经出口了。唯一抗辐射的就是藻复康。所以在电脑前工作的人，可以滴一点藻复康抹上，也可以吃藻复康。它抗辐射、抗肿瘤、抗病 毒、抗氧化，而且提高免疫功能。<br /><br />    我再总结一下，辐射对我们影响很大，但有几个方法可以预防：第一喝绿茶，第二吃青菜、萝卜，第三吃螺旋藻，第四吃藻复康。藻复康是最好的。根据自己的经济条件选择一种，实在不行就吃青菜萝卜。辐射是每个人都会接触到的。国际上提出了警告：千万不要把电器放在卧室内。尤其是微波炉对我们危害最大，它7米内对 我们都有辐射。而且各种电器不要同时开着。又有电视，又有冰箱，又有微波炉，你就在旁边做菜，得了癌症很冤枉啊。<br /><br />    有氧运动<br /><br />    有一个很原则的经验，千万不要早上锻炼。建议大家傍晚锻炼。国际上规定了，饭后45分钟再运动。而且老年人的运动散步就可以了，20分钟。要想减肥不用这 方法，饭前半小时到一小时吃2粒到4粒螺旋藻，然后食欲就减退了，而且营养不缺。欧洲人减肥全用螺旋藻，国内的少吃多拉不是办法。第二是早上起床的时间，国际上规定6点，供你参考。开窗时间国际上规定9点至11点，下午2点至4点。为什么？因为9点以后污染空气下沉了，污染物质减少了，没有反流现象。各位 注意，早上起来开窗户，不要在那里大喘气，因为致癌物质、反流物质都跑到你肺里了，容易得肺癌。国际上警告说，早上6点至9点是致癌最危险的时候。早起早 睡身体好，不能一概而论。你夜里在家吸了一肚子二氧化碳，呼吸道里的毒素有100多种，又跑到小树林里，树林里早上又全是二氧化碳。早上锻炼，基础血压 高，基础体温高，肾上腺素比傍晚高4倍，有心脏病的人很容易出问题。树林里必须到太阳出来，日光跟叶绿素起反应才能产生氧气。树林里全是二氧化碳的时候， 容易中毒，容易得癌症。黄帝内经里说"没太阳不锻炼"。我建议大家夏天早睡早起，冬天不要早上出去锻炼，而改为晚上锻炼。也不是说什么样的人都早睡早起身体好，岁数大的人不要猛起。有的人腾的就起来，一下子心肌梗死了。国际上是这么说的，70岁以上的人，慢慢起，先动动胳膊动动腿，再按摩按摩心脏，坐一两分钟再起来。这样没一个得心脏病的。所以不同年龄、不同季节要不同对待。<br /><br />    下面提到午睡问题。国际上规定了，午睡不午睡不用争论了。过去日本人不主张午睡，但我们主张若头一天晚上没有睡好就应该午睡。午睡时间是午饭后半小时，而且最好睡一个小时，睡的太长对身体没有好处。不要盖大被子。晚上什么时间睡觉？我们从来不提倡早睡早起。早睡早起的概念要清楚，如果7点就睡，12点就起 来瞎折腾，那没有用。我们主张10点到10:30睡觉，因为国际会议上定的，一小时到一个半小时进入深睡眠是最科学的，这就是12点到3点，这3小时雷打 不动，什么也别干。这3小时是深睡眠。如果这3小时谁好了，第二天起来一定精神焕发。如果你4点以后睡觉，那是浅睡眠。会睡和不会睡不一样。我们主张12 点至凌晨3点雷打不动，而且睡前洗个热水澡，水温40～50度，这会使睡眠质量高。你们打牌我不反对，但反对12点至凌晨3点打牌。深圳夜里打牌打死4个年轻人，报纸已经报道了。<br /><br />心理状态<br /><br /> <br /><br />    保健的第三个里程碑是心理状态问题。如果心理状态不好，那你白吃白锻炼了，这是很重要的。气质和血液，你要是一生气血流得久慢，得肿瘤还不知道什么原因。生气容易得肿瘤，全世界都知道。斯坦福大学做了个很有名的实验，拿鼻管搁在鼻子上让你喘气，然后再拿鼻管放在雪地里十分钟。如果冰雪不改变颜色，说明你心 平气和；如果冰雪变白了，说明你很内疚；如果冰雪变紫了，说明你很生气。把那紫色的冰雪抽出1～2毫升给小老鼠打上，1～2分钟后小老鼠就死了。而且紫色 冰雪的成分都研究出来了。所以生气容易得肿瘤，这是个很严重的问题。"谁在人前不讲人，谁人背后无人讲"。我劝你们，谁让你生气，你别生气。如果你憋不住，我告诉大家，你看一下表，别超过5分钟，超过5分钟要坏事，血变紫了。这个实验已经得了诺贝尔奖了。人家心理学会提出了5个避免生气的方法：一是躲 避；二是转移，人家骂你，你去下棋、钓鱼，没听见；三是释放，但要注意，人家骂你，你再去骂别人不叫释放，是找知心朋友谈谈，释放出来，要不然搁在心里要得病的；四是升华，就是人家越说你，你越好好干；五是控制，这是最主要的一个方法，就是你怎么骂我不怕。这一点很重要，我们小平同志做得最好，三起三落永 不要求平反。非洲一位总统问小平同志有什么好经验，他就说一句话："忍耐"。忍一时风平浪静，退一步海阔天空。忍耐不是目的，是策略。但一般人做不到，刚说一句就暴跳如雷。小不忍则乱大谋呀。欧洲有个博学经典：难能之理宜停，难处之人宜厚，难处之事宜缓，难成之功宜智。四句中第一句的意思是，很难的道理先 不要讲。哲理很深，很有用。三国演义里诸葛亮三气周瑜，楞把周瑜气死了。你说赖周瑜还是赖诸葛亮？结论是赖周瑜，他气量太小。生气对人危害很大。<br /><br />    现在国际上有个最新说法，所有动物都没有笑的功能，只有人类有这个功能。但人类还不好好利用它。有人说猴子会笑，大象会笑，你们见过吗？但真见到会哭的，宰牛时牛会流眼泪。古代说：笑一笑，十年少。不是指年龄，是指心态。笑口常开，健康常在。笑的作用非常大，我们每个人都有这本能，为什么不笑呢？我们东方 民族很严肃，而且跟级别有关系，科长、处长还会笑，一到局长就不会笑了，跟外宾打交道绷着个脸。现在中央领导都改变了，你看胡主席笑得多好。美国成立了微笑俱乐部，笑成了健康的标志。哈哈一笑，皱纹没了。笑使很多病都不得。第一不得偏头痛，第二不得后背痛，因为笑的时候微循环旺盛。通则不痛，不通则痛。得 了偏头痛别着急，哈哈一笑就好了，不信你可以实验。而且性功能不减弱，生殖功能不减弱。你看人家罗马尼亚老太太92岁还生胖娃娃，人家天天笑啊。我们现在 30多岁就不生孩子了，天天绷着个脸当然不能生了。还有，经常笑对呼吸道、消化道特别好。可以做实验，你摸着肚子开始笑，每天大笑三次，肚子咕噜三次，不便秘，不得胃肠道癌症。你锻炼上肢，锻炼下肢，什么时候锻炼肠胃呀？没机会，只有笑才能锻炼肠胃。笑在国际上已经成为一个健康的标准，我调查多次了，笑的 第二个诺贝尔奖已经发布了。笑促进脑下垂体，产生脑内胚，它是天然麻醉剂。你要是得了关节炎别着急，冲着关节哈哈一笑，一会儿就不痛了。笑有那么多好处，我们为什么不笑呢？<br /><br />最近北京市普查完了，人的寿命你知道是老头长还是老太太长？我告诉大家，老太太比老头长，平均比老头多活6年半。偶尔碰上一个 老头，我问，你怎么一个人锻炼呀？他说我配不上对呀，老太太都一块儿练，一堆一堆地在街头锻炼。很多老太太的最大优点就是从年轻时就喜欢笑，到老了还笑。我每次讲课时都注意到了，笑的都是女同胞，男同胞还是不笑。都差了6年半了，你什么时候笑呀？所以现在每个人都快点笑吧。今天来的人，你们笑几下可以多活几年。有的人怎么说也不笑。级别越高越不笑，我有什么办法呢？不但不笑，还有个逻辑："男儿有泪不轻弹"。正常人的眼泪是咸的，糖尿病人的眼泪是甜的，悲 伤的眼泪是苦的，里面有肽、荷尔蒙。长时间不"弹"出来会得肿瘤、癌症的。就是不得肿瘤也会得溃疡病、慢性结肠炎的。所以，各位如果悲伤，眼泪必须"弹" 出来，留着没有任何好处。<br /><br />    国际会议上已经给我们提出警告了，让我们喝绿茶，吃大豆，睡好觉，常运动，不要忘记常欢笑。希望每个人都要注意平衡饮食、有氧运动，而且注意你的心理状态，该哭时哭，该笑时笑。我相信我们一定能越过73岁，闯过84岁，90、100岁一定会健在。
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/197214#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 22:04:34 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/197214</link>
        <guid>http://life4j.javaeye.com/blog/197214</guid>
      </item>
      <item>
        <title>【翻译】JRE的三类缓冲区溢出</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/187092" style="color:red;">http://life4j.javaeye.com/blog/187092</a>&nbsp;
          发表时间: 2008年04月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有些人认为，用java写代码是一个银弹，可以预防执行出现的缺陷，如缓冲区溢出。真理有点小明朗。当然，在纯jva代码中并没有提供溢出的例子，除了在数组的最后进行读写操作。下面是一段代码示例：<br /><pre name="code" class="java">
public class overflow{ 
public static void main(String args[]) {  
char buf[] = new char[10];  
String src=http://anonymouse.org/cgi-bin/anon-www.cgi/http://heasman.blogspot.com/2007/01/args[0];  
for (int i = 0; i &lt; src.length(); i++)  {    
      buf[i] = src.charAt(i);  
     }    
System.out.println("buf is " + new String(buf)); 
  }
}
</pre><br /><div class="quote_title">引用</div><div class="quote_div"><br />C:\dev>java overflow foobar1234<br />buf is foobar1234<br /><br />C:\dev>java overflow foobar12345<br />Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10        <br />at overflow.main(overflow.java:10)<br /></div><br /><br />    但真正的代码，虽然它可能100 ％用Java 写，但在很大程度上取决于该运行时间环境（ JRE环境）和JRE包含的用整洁的C写的方法。当C与它的朋友（buddies）挂起了：固定大小缓冲区， strcpy和用户输入，大家都会知道发生什么事。<br />     因此，你怎么甚至开始去评估着攻击JRE的表层？或许，在未来某时，我们会进行更详细的讨论。但现在，简单说，如果我们舍弃JRE合理的逻辑，以至让你摆脱沙盒效应（sandbox）（如企图措施，接触到这些，实在是很难）以及唯一地集中在机器码（native code）部分。<br /><br />•确定机器码内部的JRE数量<br /><br />1、下载<a href="http://www.sun.com/software/opensource/java/index.jsp" target="_blank">Java源代码</a>和搜索<a href="https://java.sun.com/docs/books/jni/html/types.html#46915" target="_blank">JNIEXPORT 和 JNICALL</a>等宏检测本地方法，如：<br /><a href="http://anonymouse.org/cgi-bin/anon-www.cgi/https://openjdk.dev.java.net/source/browse/openjdk/jdk/trunk/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c?rev=257&view=markup" target="_blank">src/share/native/sun/awt/image/gif/gifdecoder.c:</a><br /><pre name="code" class="java">
JNIEXPORT jboolean JNICALL 
Java_sun_awt_image_GifImageDecoder_parseImage(JNIEnv *env, 
jobject this, 
jint relx, jint rely, 
jint width, jint height, 
jint interlace, 
jint initCodeSize, 
jbyteArray blockh, 
jbyteArray raslineh, 
jobject cmh)
{
...
</pre><br /><br />2、又或者转储出口的DLL内部的JRE bin目录，如：<br /><div class="quote_title">引用</div><div class="quote_div"><br />C:\dev> dumpbin /exports jpeg.dll | findstr /c:"_Java_"<br /></div><br /><pre name="code" class="java">
_Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_abortRead@16
_Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_disposeReader@16
_Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_initJPEGImageReader@8
_Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_initReaderIDs@20
_Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImage@80
</pre><br />3、或者在运行时间和累计那些标识为<a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#1513" target="_blank">本地</a>（native）中的所有类中的所有方法。这是可以做到在一个几行代码中使用字节码工程库[<a href="http://jakarta.apache.org/bcel/" target="_blank">the Byte Code Engineering Library </a>(BCEL)], 一个伟大工程的低水平操作和建设的类（classes）。<br /><br />•以一份本地方法执行静态分析，以评价每种方法应包含多少代码（包括在所有函数调用中的所有代码），以及在此过程数据可能不受信任等等。<br /><br />·现在跟踪（trace）或执行静态分析你的应用程序，小应用程序（Applet），Servlet等，以确定你要用哪个方法。<br /><br />但我偏题了，这篇最主要的一点是要突出三类存在于JRE的缓冲区溢出，因此，介绍如下：<br /><strong>1、在文件格式解析器中的缓冲区溢出</strong><br /><br />通常，无论是速度，还是因为代码源于其他地方，大部分的JRE文件格式解析代码是落实在机器码。这包括BMP, GIF, JPEG, ICC, TTF，和<a href="http://java.sun.com/products/java-media/sound/soundbanks.html" target="_blank">Soundbank</a>，以及几个我已经大概忘记了。<br /><br />顺便提一句，当运行一个Java应用程序（它会发生<a href="http://www.portswigger.net/proxy/" target="_blank">Burp Proxy</a>，认真！）开始崩溃，离开熟悉的hs_err.log文件的后。记录表明，我触发了违规存取fontmanager.dll，<br />据此，我跟踪到了曾在我字体（Fonts）文件夹中的一个损坏的TrueType字型（TrueType的解析很难，他由一个16和32位字段，长度，偏移并限定的混合体，提供的一个虚拟机）。<br />Chris Evans在bugs的发现方面做了伟大的工作，他发现JRE的解析器的文章如下：<br /><a href="http://scary.beasts.org/security/CESA-2005-008.txt" target="_blank">http://scary.beasts.org/security/CESA-2005-008.txt</a><br />以及<a href="http://anonymouse.org/cgi-bin/anon-www.cgi/http://scary.beasts.org/security/CESA-2006-004.html" target="_blank">http://anonymouse.org/cgi-bin/anon-www.cgi/http://scary.beasts.org/security/CESA-2006-004.html</a><br /><br /><strong>2、在API平台包装代码中的缓冲区溢出</strong><br /><br />除了文件格式解析器，方法与操作系统互动也最终落实在机器码，因为他们需要调用适当的平台API 。这些方法通常需要转换为Java的数据类型，如一个<a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html" target="_blank">字符串</a>转到一个C数据类型，如一个宽字符数组。听起来像一个有潜在危险的行动？我的同事，他们工作于 NGS, Wade Alcorn ("<a href="http://www.bindshell.net/tools/beef/" target="_blank">The King of BeEf</a>") and Marcus Pinto（<a href="http://as.wiley.com/WileyCDA/WileyTitle/productCd-0470170778.html" target="_blank">Web应用黑客的手册</a>），他们在使用BEA的 <a href="http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/products/weblogic/jrockit/" target="_blank">JRockit</a> JVM时发现了这样的一个bug。这里提供了NGS的<a href="http://www.ngssoftware.com/advisories/high-risk-vulnerability-in-jrockit-java-virtual-machine/" target="_blank">建议</a>。这个问题可能引发的是远端作为一个未经允许的用户对<a href="http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/products/weblogic/server/" target="_blank">WebLogic Server</a>请求一个长的URL （ ！ ），这个将作为路径触发缓冲区溢出。<br /><br /><strong>3、在底层平台API上的缓冲区溢出</strong><br /><br />前类别在提交到平台API之前来自于不安全的预处理数据。让我们考虑相反的情况，在一个平台API上，做任何处理和揭露bug。这一类的一个显着例子是NGS工作的另一个同事Peter Winter-Smith发现的一个重要弱点。他发现了可能通过65536个字节串触发对<a href="http://msdn2.microsoft.com/en-us/library/ms738524.aspx" target="_blank">gethostbyname</a>的溢出，由<a href="http://msdn2.microsoft.com/en-us/library/ms740673(VS.85).aspx" target="_blank">ws2_32.dll</a>输口。这问题固定在<a href="http://www.microsoft.com/technet/security/Bulletin/MS06-041.mspx" target="_blank">MS06-041 </a>。它是琐细的引起Java代码击中这个bug。<br />现在，您可能会以为这不是真的公平，声称这是一个Java的问题，因为这显然是操作系统第三方库的bug。也许是不公平的： ）。有趣的是，在JRE的某些地方，在平台API的顶层设计如此薄弱，以至出现了这类bug（当测试Java应用程序，我认为Peter实际上发现了gethostbyname的bug了）时，并注意这会更进一步使攻击表面分析复杂化：(<br /><br />结束语关于这些影响Java应用程序的不同的类型。例子(2)在可以用于妥协服务器的Java运行时间给了，是缓冲溢出的一个清晰例子。例子(1)和(3)则不如此。其可行性是Java企业应用程序可能会由用户解析上载的文件，但是它明显地取决于servlet的目的。另一方面，在JRE中，一个恶意附属程序试图通过一个文件格式bug利用浏览器是一定可以想像的。<br />至于移动Java ，其运行时的实现通常不会与桌面的JRE共享机器码组件 ，所以作为一个征服了所有的跨设备跨架构跨Java实现的脆弱性的机会是相当渺茫的（尽管<a href="http://www.zdnetasia.com/news/security/0,39044215,62028389,00.htm" target="_blank">消息</a>相反） 。虽然我将几乎说不可能：)<br /><br />注：此blog由John Heasman 写的<br /><a href="http://anonymouse.org/cgi-bin/anon-www.cgi/http://heasman.blogspot.com/2007/01/three-categories-of-buffer-overflow-in.html" target="_blank">Three Categories of Buffer Overflow in the JRE</a>
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/187092#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 Apr 2008 15:39:21 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/187092</link>
        <guid>http://life4j.javaeye.com/blog/187092</guid>
      </item>
      <item>
        <title>open session and Hibernate事务处理机制</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/186068" style="color:red;">http://life4j.javaeye.com/blog/186068</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在没有使用Spring提供的Open Session In View情况下，因需要在service(or Dao)层里把session关闭，所以lazy loading 为true的话，要在应用层内把关系集合都初始化，如 company.getEmployees()，否则Hibernate抛session already closed Exception;    Open Session In View提供了一种简便的方法，较好地解决了lazy loading问题.     <br />    它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide)，功能相同，只是一个在web.xml配置，另一个在application.xml配置而已。     <br />     Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态，使session在request的整个期间都可以使用，如在View层里PO也可以lazy loading数据，如 ${ company.employees }。当View 层逻辑完成后，才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。 <br />     OpenSessionInViewInterceptor配置<br /><pre name="code" class="xml">  
&lt;beans> 
&lt;bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
&lt;property name="sessionFactory"> 
&lt;ref bean="sessionFactory"/> 
&lt;/property> 
&lt;/bean> 
&lt;bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
&lt;property name="interceptors"> 
&lt;list> 
&lt;ref bean="openSessionInViewInterceptor"/> 
&lt;/list> 
&lt;/property> 
&lt;property name="mappings"> 
... 
&lt;/property> 
&lt;/bean> ... &lt;/beans> 
</pre><br />OpenSessionInViewFilter配置<br /><pre name="code" class="xml"> 
&lt;web-app> 
... 
&lt;filter> 
&lt;filter-name>hibernateFilter&lt;/filter-name> 
&lt;filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter &lt;/filter-class> 
&lt;!-- singleSession默认为true,若设为false则等于没用OpenSessionInView --> 
&lt;init-param> 
&lt;param-name>singleSession&lt;/param-name> 
&lt;param-value>true&lt;/param-value> 
&lt;/init-param> 
&lt;/filter> ... &lt;filter-mapping> 
&lt;filter-name>hibernateFilter&lt;/filter-name> 
&lt;url-pattern>*.do&lt;/url-pattern> 
&lt;/filter-mapping> ... &lt;/web-app> 
</pre><br />    很多人在使用OpenSessionInView过程中提及一个错误：<br />org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition <br />    看看OpenSessionInViewFilter里的几个方法 <br /><pre name="code" class="java">  

protected void doFilterInternal(HttpServletRequest request, 
		HttpServletResponse response,
		FilterChain filterChain) throws ServletException, IOException {　
	    SessionFactory sessionFactory = lookupSessionFactory();　
		logger.debug("Opening Hibernate Session in OpenSessionInViewFilter");　
		Session session = getSession(sessionFactory);　
		TransactionSynchronizationManager.bindResource(　　
				sessionFactory, new SessionHolder(session));　
		try {　　
			filterChain.doFilter(request, response);　
			}　
		finally {　
			TransactionSynchronizationManager.unbindResource(sessionFactory);　
		logger.debug("Closing Hibernate Session in OpenSessionInViewFilter");　
		closeSession(session, sessionFactory);　
		}
} 
protected Session getSession(SessionFactory sessionFactory)
                   throws DataAccessResourceFailureException {　
		Session session = SessionFactoryUtils.getSession(sessionFactory, true);　
		session.setFlushMode(FlushMode.NEVER);　
		return session;
}
protected void closeSession(Session session, 
		SessionFactory sessionFactory)throws CleanupFailureDataAccessException {　
	SessionFactoryUtils.closeSessionIfNecessary(session, sessionFactory);
}
</pre><br />     关于绑定session的方式，通过看spring里TransactionSynchronizationManager的实现，发现：它维护一个 <span style="color: red">java.lang.ThreadLocal类型</span>的resources，resources负责持有线程局部变量，这里resources持有的是一个 HashMap，通过TransactionSynchronizationManager.bindResource()方法在map里绑定和线程相关的所有变量到他们的标识上，包括如上所述的绑定在sessionFactory上的线程局部session。sessionHolder只不过是存放可以 hold一个session并可以和transtaction同步的容器。可以看到 OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到 TransactionSynchronizationManager，使request的整个过程都使用同一个session，在请求过后再接除该 sessionFactory的绑定，最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。绑定以后，就可以防止每次不会新开一个Session呢？看看HibernateDaoSupport的情况：<br /><pre name="code" class="java">  
 public final void setSessionFactory(SessionFactory sessionFactory) { 
 this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
 }  
protected final HibernateTemplate getHibernateTemplate() {
 return hibernateTemplate;  
}         
</pre><br />     我们的DAO将使用这个template进行操作. <br /><pre name="code" class="java">   
public abstract class BaseHibernateObjectDao 
                extends HibernateDaoSupportimplements BaseObjectDao {     
protected BaseEntityObject getByClassId(final long id) {                
BaseEntityObject obj =(BaseEntityObject)getHibernateTemplate().execute(new HibernateCallback() {                        
public Object doInHibernate(Session session) 
         throws HibernateException{                                    
 return session.get(getPersistentClass(),new Long(id));                
       }                
    }
);                
return obj;      
}     
public void save(BaseEntityObject entity) {                  
       getHibernateTemplate().saveOrUpdate(entity);     
}     
public void remove(BaseEntityObject entity) {              
try {                     
       getHibernateTemplate().delete(entity);              
} catch (Exception e) {                      
       throw new FlexEnterpriseDataAccessException(e);             
       }      
}       
public void refresh(final BaseEntityObject entity) {               
       getHibernateTemplate().execute(new HibernateCallback(){                          
            public Object doInHibernate(Session session) 
           throws HibernateException   {                                
                 session.refresh(entity);                                      
                 return null;                          
            }               
       }
    );      
}      
public void replicate(final Object entity) {                
       getHibernateTemplate().execute(new HibernateCallback(){                          
             public Object doInHibernate(Session session)
                           throws HibernateException{                                      
                  session.replicate(entity,ReplicationMode.OVERWRITE);                 
                  eturn null;               
             }                
      });      
   }
}           
</pre>    <br />   而HibernateTemplate试图每次在execute之前去获得Session，执行完就力争关闭Session <br /><pre name="code" class="java">  
public Object execute(HibernateCallback action) throws DataAccessException {  
       Session session = (!this.allowCreate)SessionFactoryUtils.getSession(getSessionFactory(),
                         false);     
       SessionFactoryUtils.getSession(getSessionFactory(),
                                      getEntityInterceptor(), 
                                      getJdbcExceptionTranslator()));     
       boolean existingTransaction = TransactionSynchronizationManager.hasResource(
                                       getSessionFactory());   
       if (!existingTransaction && getFlushMode() == FLUSH_NEVER) {   
            session.setFlushMode(FlushMode.NEVER);  
}      
try {          
     Object result = action.doInHibernate(session);           
     flushIfNecessary(session, existingTransaction);           
     return result;    
}    
catch (HibernateException ex) {          
throw convertHibernateAccessException(ex);     
}     
finally {     
    SessionFactoryUtils.closeSessionIfNecessary(  
    session, getSessionFactory());     
    } 
}       
</pre><br />   而这个SessionFactoryUtils能否得到当前的session以及closeSessionIfNecessary是否真正关闭 session，取决于这个session是否用sessionHolder和这个sessionFactory在我们最开始提到的 TransactionSynchronizationManager绑定。      <br /><pre name="code" class="java">  
public static void closeSessionIfNecessary(Session session, 
                                           SessionFactory sessionFactory) 
                throws CleanupFailureDataAccessException { 
   if (session == null || TransactionSynchronizationManager.hasResource(sessionFactory)) { 
               return; 
} 
        logger.debug("Closing Hibernate session"); 
try { 
        session.close(); 
} catch (JDBCException ex) { // SQLException underneath
    throw new CleanupFailureDataAccessException("Could not close Hibernate session", 
                                             ex.getSQLException()); 
} catch (HibernateException ex) { 
    throw new CleanupFailureDataAccessException("Could not close Hibernate session", 
              ex); 
       } 
}     
</pre><br />     在这个过程中，若HibernateTemplate 发现自当前session有不是readOnly的transaction，就会获取到FlushMode.AUTO Session，使方法拥有<span style="color: red">写</span>权限。也即是，如果有不是readOnly的transaction就可以由Flush.NEVER转为 Flush.AUTO,拥有insert,update,delete操作权限，如果没有transaction，并且没有另外人为地设flush model的话，则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限，没受保护的则没有。 <br />     可能的解決方式有：<br />1、将singleSession设为false，这样只要改web.xml，缺点是Hibernate Session的Instance可能会大增，使用的JDBC Connection量也会大增，如果Connection Pool的maxPoolSize设得太小，很容易就出问题。<br />2、在控制器中自行管理Session的FlushMode，麻烦的是每个有Modify的Method都要多几行程式。      <br />session.setFlushMode(FlushMode.AUTO);       <br />session.update(user);       <br />session.flush(); <br />3、Extend OpenSessionInViewFilter，Override protected Session getSession(SessionFactory sessionFactory)，将FlushMode直接改为Auto。<br />4、让方法受Spring的事务控制。这就是常使用的方法： 采用spring的事务声明,使方法受transaction控制  <br /><pre name="code" class="xml">   
&lt;bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"           
abstract="true">         
&lt;property name="transactionManager" ref="transactionManager"/>         
&lt;property name="proxyTargetClass" value="true"/>         
&lt;property name="transactionAttributes">             
&lt;props>                 
&lt;prop key="get*">PROPAGATION_REQUIRED,readOnly&lt;/prop>                 
&lt;prop key="find*">PROPAGATION_REQUIRED,readOnly&lt;/prop>                 
&lt;prop key="load*">PROPAGATION_REQUIRED,readOnly&lt;/prop>                 
&lt;prop key="save*">PROPAGATION_REQUIRED&lt;/prop>                 
&lt;prop key="add*">PROPAGATION_REQUIRED&lt;/prop>                 
&lt;prop key="update*">PROPAGATION_REQUIRED&lt;/prop>                 
&lt;prop key="remove*">PROPAGATION_REQUIRED&lt;/prop>             
&lt;/props>         
&lt;/property>     
&lt;/bean>     
&lt;bean id="userService" parent="baseTransaction">         
&lt;property name="target">             
&lt;bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>         
&lt;/property>     
&lt;/bean> 
</pre><br />    对于上例，则以save,add,update,remove开头的方法拥有可写的事务，如果当前有某个方法，如命名为importExcel()，则因没有transaction而没有写权限，这时若方法内有insert,update,delete操作的话，则需要手动设置flush model为Flush.AUTO,如 session.setFlushMode(FlushMode.AUTO); session.save(user); session.flush();       <br />    尽管Open Session In View看起来还不错，其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码，这个方法实际上是被父类的doFilter调用的，因此，我们可以大约了解的OpenSessionInViewFilter调用流程: request(请求)->open session并开始transaction->controller->View(Jsp)->结束transaction并 close session.      <br />    一切看起来很正确，尤其是在本地开发测试的时候没出现问题，但试想下如果流程中的某一步被阻塞的话，那在这期间connection就一直被占用而不释放。最有可能被阻塞的就是在写Jsp这步，一方面可能是页面内容大，response.write的时间长，另一方面可能是网速慢，服务器与用户间传输时间久。当大量这样的情况出现时，就有连接池连接不足，造成页面假死现象。 Open Session In View是个双刃剑，放在公网上内容多流量大的网站请慎用。   <span style="color: red">另外：这样会产生一点危险性，毕竟把数据库访问的环境放到了表现层。（：用VO） </span>                  <br />      Hibernate是对JDBC的轻量级对象封装，Hibernate本身是不具备Transaction处理功能的，Hibernate的 Transaction实际上是底层的JDBC Transaction的封装，或者是JTA Transaction的封装，下面我们详细的分析： 　　<br />      Hibernate可以配置为JDBCTransaction或者是JTATransaction，这取决于你在hibernate.properties中的配置: <br /><div class="quote_title">引用</div><div class="quote_div"> <br />#hibernate.transaction.factory_classnet.sf.hibernate.transaction.JTATransactionFactory #hibernate.transaction.factory_classnet.sf.hibernate.transaction.JDBCTransactionFactory<br /></div> 　　<br />     如果你什么都不配置，默认情况下使用JDBCTransaction，如果你配置为： <br /><div class="quote_title">引用</div><div class="quote_div">  <br />hibernate.transaction.factory_classnet.sf.hibernate.transaction.JTATransactionFactory <br /></div><br />     将使用JTATransaction，不管你准备让Hibernate使用JDBCTransaction，还是JTATransaction，我的忠告就是<span style="color: red">什么都不配</span>，将让它保持默认状态，如下： <br /><div class="quote_title">引用</div><div class="quote_div">   <br />#hibernate.transaction.factory_classnet.sf.hibernate.transaction.JTATransactionFactory #hibernate.transaction.factory_classnet.sf.hibernate.transaction.JDBCTransactionFactory 　　<br /></div><br />     在下面的分析中我会给出原因。 　　<br /><strong>一、JDBC Transaction </strong>　　<br />     看看使用JDBC Transaction的时候我们的代码例子： <br /><pre name="code" class="java">  
Session session = sf.openSession(); 
Transaction tx = session.beginTransactioin(); 
... session.flush(); 
tx.commit(); 
session.close(); 　　
</pre><br />     这是默认的情况，当你在代码中使用Hibernate的Transaction的时候实际上就是JDBCTransaction。那么JDBCTransaction究竟是什么东西呢？来看看源代码就清楚了： 　　Hibernate2.0.3源代码中的类net.sf.hibernate.transaction.JDBCTransaction: <br /><pre name="code" class="java">  
public void begin() throws HibernateException { 
... 
if (toggleAutoCommit) session.connection().setAutoCommit(false); 
... 
}　　
</pre><br />     这是启动Transaction的方法，看到 connection().setAutoCommit(false) 了吗？是不是很熟悉？ 　　<br />     再来看 <br /><pre name="code" class="java">   
public void commit() throws HibernateException { 
... 
try { 
 if ( 
 session.getFlushMode()!=FlushMode.NEVER ) 
session.flush(); 
try { 
session.connection().commit(); 
committed = true; 
} 
... 
toggleAutoCommit(); 
} 　　
</pre><br />     这是提交方法，看到connection().commit() 了吗？下面就不用我多说了，这个类代码非常简单易懂，通过阅读使我们明白Hibernate的Transaction都在干了些什么？我现在把用 Hibernate写的例子翻译成JDBC，大家就一目了然了： <br /><pre name="code" class="java">   
Connection conn = ...;               
&lt;--- session = sf.openSession(); 
conn.setAutoCommit(false);   
&lt;--- tx = session.beginTransactioin(); 
... 
&lt;--- ... conn.commit();                           
&lt;--- tx.commit(); 
(对应左边的两句) conn.setAutoCommit(true); 
conn.close();                              
&lt;--- session.close(); 　　
</pre><br />   看明白了吧，Hibernate的JDBCTransaction根本就是conn.commit而已，根本毫无神秘可言，只不过在Hibernate 中，Session打开的时候，就会自动conn.setAutoCommit(false)，不像一般的JDBC，默认都是true，所以你最后不写 commit也没有关系，由于Hibernate已经把AutoCommit给关掉了，所以用Hibernate的时候，你在程序中不写 Transaction的话，数据库根本就没有反应。  <br /><strong>二、JTATransaction </strong><br />     如果你在EJB中使用Hibernate，或者准备用JTA来管理跨Session的长事务，那么就需要使用JTATransaction，先看一个例子： <br /><pre name="code" class="java">  
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction"); 
Session s1 = sf.openSession(); 
... 
s1.flush(); 
s1.close(); 
... 
Session s2 = sf.openSession(); 
...
s2.flush(); 
s2.close();
tx.commit(); 
</pre><br />    这是标准的使用JTA的代码片断，Transaction是跨Session的，它的生命周期比Session要长。如果你在EJB中使用 Hibernate，那么是最简单不过的了，你什么Transaction代码统统都不要写了，直接在EJB的部署描述符上配置某某方法是否使用事务就可以了。 现在我们来分析一下JTATransaction的源代码， <br />net.sf.hibernate.transaction.JTATransaction: <br /><pre name="code" class="java">   
public void begin(InitialContext context, 
... 
... 
ut = (UserTransaction) context.lookup(utName); 
... 
</pre><br />    看清楚了吗？ 和我上面写的代码 “tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); ”是不是完全一样？ <br /><pre name="code" class="java">  
public void commit() 
... 
... 
if (newTransaction) 
ut.commit();
 ... 
</pre><br />    JTATransaction的控制稍微复杂，不过仍然可以很清楚的看出来Hibernate是如何封装JTA的Transaction代码的。 但是你现在是否看到了什么问题？ 仔细想一下，Hibernate Transaction是从Session中获得的，tx = session.beginTransaction()，最后要先提交tx，然后再session.close，这完全符合JDBC的 Transaction的操作顺序，但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的！！！ JTA是先启动Transaction，然后启动Session，关闭Session，最后提交Transaction，因此当你使用JTA的 Transaction的时候，那么就千万不要使用Hibernate的Transaction，而是应该像我上面的JTA的代码片断那样使用才行。 <br />    <strong> 总结： </strong><br />1、在JDBC上使用Hibernate 必须写上Hibernate Transaction代码，否则数据库没有反应。此时Hibernate的Transaction就是Connection.commit而已; <br />2、在JTA上使用Hibernate 写JTA的Transaction代码，不要写Hibernate的Transaction代码，否则程序会报错;<br />3、在EJB上使用Hibernate 什么Transactioin代码都不要写，在EJB的部署描述符里面配置 <br />|---CMT(Container Managed Transaction) | <br />|---BMT(Bean Managed Transaction) | <br />|----JDBC Transaction | <br />|----JTA Transaction         <br />    <strong>关于session</strong>： <br />1.  servlet的session机制基于cookies,关闭浏览器的cookies则session失效即不能用网站的登录功能。<br />2.  Hibernate Session.       <br />       1>. session 清理缓存时，按照以下顺序执行SQL语句：             <br />session.save()的实体insert      <br />               实体的update             <br />               对集合的delete        <br />               集合元素的delete，update，insert             <br />               集合的insert             <br />session.delete()的先后，执行实体的delete        <br />       2>. 默认时，session在以下时间点清理缓存：               net.sf.hibernate.Transaction.commit():先清理缓存，再向数据库提交事务Session.find()或iterate()时，若缓存中持久化对象的属性发生了变化，就会先清缓存，以保证查询结果正确          <br />        3>.  Session的commit()和flush()的区别：<br />flush()只执行SQL语句，不提交事务；commit()先调用flush()，再提交事务        <br />        4>.  Session.setFlushMode()用于设定清理缓存的时间点： <br />清理缓存的模式 Session的查询方法 Session.commit() Session.flush() FlushMode.AUTO 清理清理清理 FlushMode.COMMIT 不清理清理清理 FlushMode.NEVER 不清理不清理清
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/186068#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 21:19:19 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/186068</link>
        <guid>http://life4j.javaeye.com/blog/186068</guid>
      </item>
      <item>
        <title>在Struts中使用PlugIn扩展Hibernate</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/185534" style="color:red;">http://life4j.javaeye.com/blog/185534</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>（1）创建HibernateSessionFactory.java</strong><br />代码如下： <br /><pre name="code" class="java">  
package zy.pro.td.util;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.cfg.Configuration;
/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution.　Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html}.
*/
public class HibernateSessionFactory {
/**
* Location of Hibernate.cfg.xml file.
* NOTICE: Location should be on the classpath as Hibernate uses
* #resourceAsStream style lookup for its configuration file. That
* is place the config file in a Java package - the default location
* is the default Java package.
* Examples: 
* CONFIG_FILE_LOCATION = 
"/hibernate.conf.xml".
* CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
/** Holds a single instance of Session */
private final ThreadLocal threadLocal = new ThreadLocal();
/** The single instance of Hibernate configuration */
private final Configuration cfg = new Configuration();
/** The single instance of Hibernate SessionFactory */
private net.sf.hibernate.SessionFactory sessionFactory;
/**
* Returns the ThreadLocal Session instance.　Lazy initialize
* the SessionFactory if needed.**　@return Session
*　@throws HibernateException
*/
public Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null) {
if (sessionFactory == null) {
try {cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
}catch (Exception e) {
system.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
/**
*　Close the single Hibernate session instance.*
*　@throws HibernateException
*/
public void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {session.close();}
}
/**
* Default constructor.
*/
public HibernateSessionFactory() {}
}
 </pre><br /><br /><br />（2）创建HibernatePlugIn.java，代码如下：<br /><pre name="code" class="java">   
package zy.pro.td.plugin;
/** Created on Oct 4, 2004*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
import javax.naming.Context;
import javax.naming.InitialContext;
import zy.pro.td.util.HibernateSessionFactory;
/**
* @author sunil*
*This class will initialize Hibernate and bind SessionFactory in JNDI *at the*time of application and startup and unbind it from JNDI at *the time of application
*　shutdown
*/
public class HibernatePluginimplements PlugIn {
private static final String jndi_hibernate = "jndi_hibernate_factory";
private　 HibernateSessionFactory　hsf;
private String name;
public HibernatePlugin() {
hsf=new HibernateSessionFactory();
}// This method will be called at the time of application shutdownpublic void destroy() {
system.out.println("Entering HibernatePlugIn.destroy()");
//Put Hibernate cleanup code here
system.out.println("Exiting HibernatePlugIn.destroy()");}
//This method will be called at the time of application startuppublic void init(ActionServlet actionServlet, ModuleConfig config) throwsServletException {
system.out.println("Entering HibernatePlugIn.init()");
system.out.println("Value of init parameter " + getName());
//Uncomment next two lines if you want to throw UnavailableException from your servlet
//if(true)
//throw new ServletException("Error configuring HibernatePlugIn");
system.out.println("Exiting HibernatePlugIn.init()");
bindFactoryToJNDI();
}
private void bindFactoryToJNDI() {
try {Context ctx = new InitialContext();
ctx.bind(this.jndi_hibernate,hsf);
system.out.println("bindind　the　Hibernate　factory　to　JNDI　successfully");
}catch (Exception e) {e.printStackTrace();}}public String getName() {
return name;
}
public void setName(String string) {
name = string;
}
}
 
</pre><br /><br /><br />（3）配置Struts-config.xml，如下： <br /><pre name="code" class="xml">  
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
&lt;struts-config>
&lt;form-beans>
&lt;form-bean name="userActionForm" type="zy.pro.td.controller.UserActionForm" />
&lt;/form-beans>
&lt;action-mappings>
&lt;action name="userActionForm" 
         path="/act/log/login" scope="request"                       type="zy.pro.td.controller.LoginAction" />
&lt;/action-mappings>
&lt;plug-in className="org.apache.struts.tiles.TilesPlugin">
&lt;set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
&lt;/plug-in>
&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn">
&lt;set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
&lt;/plug-in>
&lt;plug-in className="zy.pro.td.plugin.HibernatePlugin" />
&lt;plug-in className="zy.pro.td.plugin.HibernateSessionFactoryPlugIn" />
&lt;/struts-config>这一部分就是你的嵌入代码
 </pre><br /><br /><br />（4）创建ActionForm，代码如下： <br /><pre name="code" class="java">   
package zy.pro.td.controller;
import org.apache.struts.action.*;
import javax.servlet.http.*;
public class UserActionForm extends ActionForm {
private String password;private String username;
public String getPassword() {
return password;
}
public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}
public void setUsername(String username) {this.username = username;}public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
/**@todo: finish this method, this is just the skeleton.*/
return null;
}
public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {}
}
 </pre><br /> <br />（5）创建Action <br /><pre name="code" class="java">   
package zy.pro.td.controller;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate
 
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/185534#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 16:50:02 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/185534</link>
        <guid>http://life4j.javaeye.com/blog/185534</guid>
      </item>
      <item>
        <title>Spring+Hibernate+Struts 整和</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/185524" style="color:red;">http://life4j.javaeye.com/blog/185524</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          spring加载log4j<br />   web.xml<br /><pre name="code" class="xml">  
   &lt; context - param > 
     &lt; param - name > log4jConfigLocation &lt;/ param - name > 
     &lt; param - value >/ WEB - INF / classes / log4j.properties &lt;/ param - value > 
   &lt;/ context - param > 
   &lt; listener > 
     &lt; listener - class > org.springframework.web.util.Log4jConfigListener &lt;/ listener - class > 
   &lt;/ listener > 
</pre><br />一.spring+struts<br />1.加载springContext<br />      通过struts-config.xml中增加plug-in插件来加载springContext<br /><pre name="code" class="xml">
   &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
     &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
   &lt;/plug-in>
</pre>    <br />applicationContext.xml为spring的配置文件<br /><br />2.将strutsAction交给Spring容器进行管理<br />      修改struts-config.xml中的action属性,action的type值不指定具体的实现类,统一修改成代理类<br /><pre name="code" class="xml">
    &lt;action input="/login.jsp" 
         name="loginActionForm"
         path="/loginAction" 
         scope="request"   
         type="org.springframework.web.struts.DelegatingActionProxy" 
         validate="false">
      &lt;forward name="success" path="/success.jsp" />
      &lt;forward name="failure" path="/failure.jsp" />
    &lt;/action>
</pre><br />3.在applicationContext.xml中的bean name值设定与struts-config.xml中action path值相对应,以使代理类DelegatingActionProxy能够根据传入的path在springContext中找到相应的bean,并将实例返回给struts.<br /><pre name="code" class="xml"> 
&lt;bean name="/loginAction" class="com.derek.action.LoginAction" singleton="false">
  &lt;property name="login">
    &lt;ref bean="loginBOProxy" />
  &lt;/property>
&lt;/bean>
</pre><br />二.spring+hibernate<br />   1.dateSource<br />      在springContext中设置dateSource Bean<br /><pre name="code" class="xml"> 
     &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        &lt;property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">&lt;/property>
        &lt;property name="url" value="jdbc:jtds:sqlserver://192.168.56.32:1433/testDB">&lt;/property>
        &lt;property name="username" value="it">&lt;/property>
        &lt;property name="password" value="it">&lt;/property>
     &lt;/bean>
</pre>    <br />     2.sessionFactory<br />       在springContext中设置sessionFactory Bean<br /><pre name="code" class="xml">
  &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    &lt;property name="dataSource" ref="dataSource">&lt;/property>
    &lt;property name="mappingResources">
        &lt;list>
          &lt;value>hbm\OvertimeRecord.hbm.xml&lt;/value>&lt;!--hbm映射文件-->
          &lt;value>hbm\OvertimePermit.hbm.xml&lt;/value>
        &lt;/list>
    &lt;/property>
    &lt;property name="hibernateProperties">
        &lt;props>
           &lt;prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect&lt;/prop>
           &lt;prop key="hibernate.show_sql">true&lt;/prop>
           &lt;prop key="hibernate.jdbc.fetch_size">50&lt;/prop>
           &lt;prop key="hibernate.jdbc.batch_size">20&lt;/prop>
        &lt;/props>
    &lt;/property>
  &lt;/bean>
</pre>  <br />  3.transactionManager<br />   在springContext中设置transactionManager Bean<br /><pre name="code" class="xml"> 
   &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
     &lt;property name="sessionFactory">
       &lt;ref local="sessionFactory" />
     &lt;/property>
   &lt;/bean>
</pre><br />   4.DAO bean<br /><pre name="code" class="xml"> 
      &lt;bean id="Ilogin" class="com.derek.business.Login">
          &lt;property name="sessionFactory">
              &lt;ref local="sessionFactory"/>
          &lt;/property>
      &lt;/bean>
</pre>      <br />       public class Login extends HibernateDaoSupport implements LoginInterface<br />      DAO 继承HibernateDaoSupport<br />      HibernateSupport实现了HibernateTemplate和SessionFactory实例的关联, HibernateTemplate对Hibernate Session操作进行了封装，HibernateTemplate.execute方法则是一封装机制的核心. 借助HibernateTemplate我们可以脱离每次数据操作必须首先获得Session实例、启动事务、提交/回滚事务以及烦杂的try/catch/finally的繁琐操作.<br />        Spring中的事务管理实际上是基于动态AOP机制实现，为了实现动态AOP，Spring在默认情况下会使用Java DynamicProxy，但是，Dynamic Proxy要求其代理的对象必须实现一个接口，该接口定义了准备进行代理的方法。而对于没有实现任何接口的Java Class，需要采用其他方式，Spring通过CGLib实现这一功能。<br /><br />   5.DAOProxy 代理bean<br />        通过代理,将上面的DAO bean 纳入到spring容器的事务管理中,并在其中设置对哪些方法进行事务管理<br /><pre name="code" class="xml"> 
     &lt;bean id="loginBOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
           &lt;property name="transactionManager">
                &lt;ref bean="transactionManager" />
           &lt;/property>
           &lt;property name="target">
                &lt;ref local="Ilogin" /> &lt;!--所代理的bean-->
           &lt;/property>
           &lt;property name="transactionAttributes">
                &lt;props>
                     &lt;prop key="insert*">PROPAGATION_REQUIRED&lt;/prop> &lt;!--以insert开头的方法加入事务管理-->
                     &lt;prop key="get*">PROPAGATION_REQUIRED,readOnly&lt;/prop> &lt;!--以get开头的方法只读-->
                &lt;/props>
           &lt;/property>
      &lt;/bean>
 </pre>    <br />    6.action bean<br /><pre name="code" class="xml"> 
      &lt;bean name="/loginAction" class="com.derek.action.LoginAction" singleton="false">
         &lt;property name="login">
            &lt;ref bean="loginBOProxy" /> &lt;!--要将其使用的DAO bean加入事务管理,就必须ref他的代理bean,且在LoginAction中该属性须由其接口强制类型转换-->
         &lt;/property>
      &lt;/bean>

</pre><br />示例代码:<br />  struts-conifg.xml<br /><pre name="code" class="xml"> 
&lt;? xml version = " 1.0 "  encoding = " UTF-8 " ?> 
&lt;! DOCTYPE struts - config PUBLIC  " -//Apache Software Foundation//DTD Struts Configuration 1.1//EN "   " http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd " > 
&lt; struts - config > 

   &lt; form - beans > 
     &lt; form - bean name = " loginActionForm "  type = " com.derek.form.LoginActionForm "   /> 
   &lt;/ form - beans > 
   &lt; action - mappings > 
     &lt; action input = " /login.jsp "  name = " loginActionForm "  path = " /loginAction "  scope = " request "  type = " org.springframework.web.struts.DelegatingActionProxy "  validate = " false " > 
       &lt; forward name = " success "  path = " /success.jsp "   /> 
       &lt; forward name = " failure "  path = " /failure.jsp "   /> 
     &lt;/ action > 
   &lt;/ action - mappings > 
   &lt; plug - in className = " org.springframework.web.struts.ContextLoaderPlugIn " > 
     &lt; set - property property = " contextConfigLocation "  value = " /WEB-INF/applicationContext.xml "   /> 
   &lt;/ plug - in > 
&lt;/ struts - config > 
</pre><br />  applicationContext.xml<br /><pre name="code" class="xml"> 
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE beans SYSTEM "D:\JAVA\MyWork\SpringDemo\SpringWeb\WEB-INF\spring-beans.dtd">
&lt;!--DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"-->

&lt;!--
  - Root application context for the Countries application.
  - Web-specific beans are defined in "countries-servlet.xml".
  -->
&lt;beans>

&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 &lt;property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">&lt;/property>
 &lt;property name="url" value="jdbc:jtds:sqlserver://192.168.56.32:1433/testDB">&lt;/property>
 &lt;property name="username" value="it">&lt;/property>
 &lt;property name="password" value="itservice">&lt;/property>
&lt;/bean>

&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 &lt;property name="dataSource" ref="dataSource">&lt;/property>
 &lt;property name="mappingResources">
  &lt;list>
    &lt;value>hbm\OvertimeRecord.hbm.xml&lt;/value>
    &lt;value>hbm\OvertimePermit.hbm.xml&lt;/value>
  &lt;/list>
 &lt;/property>
 &lt;property name="hibernateProperties">
  &lt;props>
     &lt;prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect&lt;/prop>
     &lt;prop key="hibernate.show_sql">true&lt;/prop>
     &lt;prop key="hibernate.jdbc.fetch_size">50&lt;/prop>
     &lt;prop key="hibernate.jdbc.batch_size">20&lt;/prop>
  &lt;/props>
 &lt;/property>
&lt;/bean>

&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   &lt;property name="sessionFactory">
       &lt;ref local="sessionFactory" />
   &lt;/property>
&lt;/bean>


&lt;!---------------使用JNDI数据源----------------
bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
&lt;property name="jndiName">
  &lt;value>jdbc/cqccms&lt;/value>
&lt;/property>
&lt;property name="jndiEnvironment"> 
     &lt;props> 
        &lt;prop key="java.naming.factory.initial"> 
          weblogic.jndi.WLInitialContextFactory 
        &lt;/prop> 
        &lt;prop key="java.naming.provider.url">t3://172.16.101.42:7001&lt;/prop> 
        &lt;prop key="java.naming.security.principal">weblogic&lt;/prop> 
        &lt;prop key="java.naming.security.credentials">weblogic&lt;/prop> 
     &lt;/props>    
   &lt;/property> 
&lt;/bean>

&lt;bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate" singleton="true"
  lazy-init="default" autowire="default" dependency-check="default">
  &lt;property name="environment"> 
     &lt;props> 
        &lt;prop key="java.naming.factory.initial"> 
          weblogic.jndi.WLInitialContextFactory 
        &lt;/prop> 
        &lt;prop key="java.naming.provider.url">t3://172.16.101.42:7001&lt;/prop> 
        &lt;prop key="java.naming.security.principal">weblogic&lt;/prop> 
        &lt;prop key="java.naming.security.credentials">weblogic&lt;/prop> 
     &lt;/props>    
   &lt;/property> 
&lt;/bean>

&lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" singleton="true"
  lazy-init="default" autowire="default" dependency-check="default">
  &lt;property name="jndiTemplate">
   &lt;ref local="jndiTemplate" />
  &lt;/property>
  &lt;property name="userTransactionName">
   &lt;value>weblogic/transaction/UserTransaction&lt;/value>
  &lt;/property>
&lt;/bean>

--------------------------------->


&lt;bean id="RecordDao" class="com.derek.business.RecordDao">
  &lt;property name="sessionFactory">
    &lt;ref local="sessionFactory"/>
  &lt;/property>
&lt;/bean>

&lt;bean id="RecordDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  &lt;property name="transactionManager">
    &lt;ref bean="transactionManager" />
  &lt;/property>
  &lt;property name="target">
    &lt;ref local="RecordDao" />
  &lt;/property>
  &lt;property name="transactionAttributes">
    &lt;props>
      &lt;prop key="insert*">PROPAGATION_REQUIRED&lt;/prop>
      &lt;prop key="get*">PROPAGATION_REQUIRED,readOnly&lt;/prop>
    &lt;/props>
  &lt;/property>
&lt;/bean>

&lt;bean id="Ilogin" class="com.derek.business.Login">
  &lt;property name="sessionFactory">
    &lt;ref local="sessionFactory"/>
  &lt;/property>
&lt;/bean>

&lt;bean id="loginBOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  &lt;property name="transactionManager">
    &lt;ref bean="transactionManager" />
  &lt;/property>
  &lt;property name="target">
    &lt;ref local="Ilogin" />
  &lt;/property>
  &lt;property name="transactionAttributes">
    &lt;props>
      &lt;prop key="insert*">PROPAGATION_REQUIRED&lt;/prop>
      &lt;prop key="get*">PROPAGATION_REQUIRED,readOnly&lt;/prop>
    &lt;/props>
  &lt;/property>
&lt;/bean>

&lt;bean name="/loginAction" class="com.derek.action.LoginAction" singleton="false">
  &lt;property name="login">
    &lt;ref bean="loginBOProxy" />
  &lt;/property>
&lt;/bean>
&lt;/beans>
 </pre><br />LoginInterface<br /><pre name="code" class="java">   
package com.derek.myinterface;

public interface LoginInterface {
    public boolean check(String name,String pwd);
}
</pre><br />Login<br /><pre name="code" class="java">  
package com.derek.business;

import com.derek.myinterface.LoginInterface;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;

public class Login extends HibernateDaoSupport implements LoginInterface{
    private SessionFactory sessionFactory;
    private String hsql = "from OvertimePermit where account=? and password=?";
    public Login() {}
    public boolean check(String name,String pwd){
        String condition[] = {name, pwd};//查询条件
        /**
         * 借助HibernateTemplate我们可以脱离每次数据操作必须首先
         * 获得Session实例 、启动事务、提交/回滚事务以及烦杂的try/catch/finally的繁琐操作
         */       
        List l = this.getHibernateTemplate().find(hsql, condition);
        
        if (l.size() > 0) return true;
          else return false;
    }
}
</pre><br />RecordDaoInterface<br /><pre name="code" class="java"> 
package com.derek.myinterface;

import java.util.List;
import hbm.OvertimeRecord;

public interface IRecordDao {
    public List findAll(String hsql);
    public void insert(OvertimeRecord or);
}
 </pre><br />RecordDao<br /><pre name="code" class="java">  
package com.derek.business;

import com.derek.myinterface.IRecordDao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.hibernate.SessionFactory;
import hbm.OvertimeRecord;

public class RecordDao extends HibernateDaoSupport implements IRecordDao{
    private SessionFactory sessionFactory;
    public RecordDao() {
    }

    public List findAll(String hsql) {
       return this.getHibernateTemplate().find(hsql);
    }

    public void insert(OvertimeRecord or) {
        this.getHibernateTemplate().saveOrUpdate(or);
    }
}
</pre><br />LoginAction通过容器注入的Login实例完成业务操作(必须由接口强制类型转化)<br /><pre name="code" class="java">   
package com.derek.action;

import javax.servlet.http.*;
import com.derek.form.*;
import org.apache.struts.action.*;
import org.apache.log4j.Logger;
import com.derek.myinterface.LoginInterface;

public class LoginAction extends Action {
    private LoginInterface login;
    public ActionForward execute(ActionMapping actionMapping,
                                 ActionForm actionForm,
                                 HttpServletRequest servletRequest,
                                 HttpServletResponse servletResponse) {
        Logger log = Logger.getLogger(this.getClass().getName());
        LoginActionForm loginActionForm = (LoginActionForm) actionForm;
        String name = loginActionForm.getName();
        String pwd = loginActionForm.getPwd();
        boolean TF = login.check(name,pwd);
        if(TF){ log.warn("LoginSuccess------------");;return actionMapping.findForward("success");}
          else{ log.warn("LoginFailure------------");;return actionMapping.findForward("failure");}
    }
    public void setLogin(LoginInterface Ilogin) {this.login = Ilogin;}
    public LoginInterface getLogin() {return login;}
}

</pre><br />类中直接通过Context获得bean实例(必须通过代理类获得实例且由其接口强制类型转化)<br /><pre name="code" class="java">   
package com.derek.pub;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.derek.myinterface.IRecordDao;
import java.util.List;
import hbm.OvertimeRecord;

public class Untitled1 {
    public Untitled1() {
    ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
    IRecordDao recordDao = (IRecordDao)ctx.getBean("RecordDaoProxy");
    OvertimeRecord newor = new OvertimeRecord("004104","dada","100120","it","2006/04/02","2006/04/02","001145","david","001145","david","00","00","1","1","1","1");
    newor.setMark("0");
    recordDao.insert(newor);
    List l = recordDao.findAll("from OvertimeRecord");
    for(int i=0;i&lt;l.size();i++){
    OvertimeRecord or = (OvertimeRecord)l.get(i);
    System.out.println(or.getId());
    }
    }
    public static void main(String[] a){
    Untitled1 u = new Untitled1();
    }
}
</pre><br />      一个Spring application context的定义能够被很多种不同的上下文实现所读取， 比如FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext以及XmlWebApplicationContext。 默认的情况下，一个web应用程序会从”WEB-INF/applicationContext.xml”中得到root context。 在所有的Spring应用中，XML文件中定义的application context会把所有相关的application beans连接起来， 包括Hibernate session factory以及数据访问和业务对象（就像上面定义的那些bean）。 它们中的大部分都不会意识到被Spring容器所管理，甚至在同其他bean合作的时候， 因为它们仅仅遵循JavaBeans的规范。一个bean属性及可以表示值参数，也可以是其他的合作bean。 下面的bean定义能够作为Spring web MVC context的一部分，在最基础的 application context中访问business beans。 <br /><pre name="code" class="java">   
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
ProductService productService = (ProductService) context.getBean("myProductService");
ApplicationContext context =
    new FileSystemXmlApplicationContext("C:/myContext.xml");
ProductService productService =
    (ProductService) context.getBean("myProductService");
ApplicationContext context =
    new ClassPathXmlApplicationContext("myContext.xml");
ProductService productService =
    (ProductService) context.getBean("myProductService");
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/185524#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 16:33:21 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/185524</link>
        <guid>http://life4j.javaeye.com/blog/185524</guid>
      </item>
      <item>
        <title>hibernate的缓存和CRUD</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/185517" style="color:red;">http://life4j.javaeye.com/blog/185517</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate作为一种现在比较流行的轻量级的ORM框架，2003年开始在国内流行，到目前来说在做持久层上还是占有统治地位的。虽然说丰富灵活的HQL和面对对象的Criteria查询，把程序员从复杂繁琐的JDBC中解放了出来，但作为持久层的框架，它的性能才是最重要的核心问题。而性能的核心在于缓存，由于最近在学习这些，所以就把自己的学到的一点东西拿来与大家分享，希望能起到抛砖引玉的效果。 <br />    在说这些之前的先说说hibernate实体对象的三种状态：<br /><br />    1.Transient：所谓Transient就是说实体对象在内存中自有存在，与数据库中的记录无关。<br /><br />    2.Persient：Persient对象对应数据库中的一条记录，也可以这样理解，如果一个实体对象与某个session发生关联，并处于对应session的有效期内，那它就处于Persient状态。<br /><br />    3.Detached：所谓的Detached就是处于Persient状态的对象对应的session关闭之后的状态。<br /><br />    我们平时所说的PO（持久化对象）指的就是位于Persient状态的对象，而VO（值对象）就是指Transient和Detached状态的对象。<br /><br />    下面开始说CRUD保存：hibernate中保存的方法很多我主要说说下面几个：<br /><br />    1.save（）方法，调用save方法时，首先会在session缓存中查找保存对象如果实体对象已经处于Persient状态，直接返回，否在实行sql操作，并将保存的实体对象加入session缓存（save方法不会把实体加入二级缓存的），最后对存在的级联关系进行递归处理。<br /><br />    2.saveOrUpdate（）方法：和save方法一样首先在session缓存中查找，判断对象是否为为保存状态，如果对象处于Persient，不执行操作，处于Transient执行save操作，处于Detached调用save将对象与session重新关联。<br /><br />    这里要注意的是批量操作时要适时对session进行flush操作避免OutOfMenoryError.删除：删除我主要说批量删除，hibernate在进行批量删除前，首先必须将所有符合条件的数据加载到内存中（这是所有ORM框架必须面对的问题，这样主要是为了对目前的内部缓存和二级缓存中数据进行整理，以保存和数据库的一致性）这样就面对这如果操作数据量过大，也会出现OutOfMenoryError，所以推荐使用迭代删除。<br /><br />    修改：修改主要谈谈update方法，update和前面的save一样首先还是要进行在内部缓存中查找，要注意两点，1.Persient状态的实体对象调用update没有任何作用，update的SQL将在session.flush（）方法中执行。<br /><br />    查询：查询是受缓存影响最大的，主要谈一下以下几种查询1.load和get：这两者的区别主要是load会在二级缓存中查找，而get在内部缓存中查找不到将跳过二级缓存直接进行sql操作。<br /><br />    2.createQuery（）的list（）和iterate（）方法，list（）实际上无法使用缓存的，他对缓存只写不读，而ierate则是首先查找所有符合条件的数据id（首先在本地缓存中查找）在执行相应的select获得对应记录，iterate方法的使用最好是查找的实体对象在缓存已经存在，否则查询性能较低，易产生N+1现象。<br /><br />    其实还有Query Cache但怕篇幅太长，让人烦所以就就此停笔，其实缓存是一个很深问题，也很值得研究。
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/185517#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 16:19:31 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/185517</link>
        <guid>http://life4j.javaeye.com/blog/185517</guid>
      </item>
      <item>
        <title>Xml解析校验引起的依赖问题 </title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/185515" style="color:red;">http://life4j.javaeye.com/blog/185515</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          假期结束，开始收心回来继续工作。晚上有一个项目要发布，公司的同事突然打手机给我，说ASF的文件解析又出了上次的问题，希望尽快解决。<br /> <br />问题描述：<br /> <br />上一次问题：<br />多台机器运行同一个分支的应用，但是有些机器正常，有一台机器始终在启动的时候报文件解析错误，从提示看来，主要是因为解析配置文件的时候校验dtd失效，这台机器无法连接外网。最后降低了我们内部的核心解析包，问题解决（或者让这台机器连接到外网）。（当时由于自己手头工作比较多，也没有在意，既然解决了就随之过去了）<br /> <br />此次问题：<br />       问题的提示和上次的类似，不过这次的机器时连接外网的。<br /> <br />问题查找：<br />       解析出错的文件是ASF（SCA的服务框架）的组件配置文件（composite文件），格式为xml的格式，解析方式是通过StAX标准来实现的。<br />       按照上一次的解决方法，我将内部的tuscany0.998降级到tuscany0.997，解析正常。看了一下我对于这两个版本升级作的修改，主要是支持了SCA框架中的Spring配置文件能够使用import的标签，内签多个标准的spring文件。<br />       跟踪代码内部发现，果然是在解析某几个spring的配置文件时出现了问题，比较了一下ASF的Spring（正常解析）和标准的Spring配置文件，差别主要是在关于Xml的校验申明的区别。ASF的Spring配置文件是由ASF Spring插件来自己解析的（采用Schema申明（固定的Target namingspace），因此早先所有的ASF的Spring我都要求大家采用Schema的校验申明），而对于原来不是ASF的spring都是采用dtd的校验方式申明（互相拷贝导致都是这样）。下面就是两种申明：<br /> <br />Schema：<br /><pre name="code" class="xml">
&lt;beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:sca="http://www.springframework.org/schema/sca"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/sca http://www.springframework.org/schema/sca/spring-sca.xsd">
 
</pre><br />Dtd：<br /><pre name="code" class="xml"> 
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 
</pre> <br />     早先由于在0.997版本中没有支持import，因此也就不会去解析那些不是ASF的Spring文件，而现在因为需求支持了import所以需要解析那些原来不属于ASF的Spring的配置文件。因此降低版本不是解决问题的办法。<br />       进一步跟进问题，发现是在解析Dtd的申明时候出现问题，抛出异常说连接超时。通过IE访问了一下dtd的地址，的却也是有问题，无法连接。看来是Spring的dtd的服务器出现了问题，导致了我们解析文件时候校验无法正常，最终无法正常启动。<br /> <br />问题解决：<br />       这里先说一下最后解决的几个方案，后面会有一些详细的解释和说明。<br /> <br />1． 升级ASF的Spring插件包，去除对于Xml的格式校验。<br /><pre name="code" class="java">
XMLInputFactory xmlFactory = XMLInputFactory.newInstance();           
//add by wenchu.cenwc cancel support dtd check
xmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, "false");
</pre><br />2． 将Dtd的校验申明修改成为Schema的校验申明。<br />3． 建立公司的Xml校验服务器，控制管理dtd或者schema，将所有的xml Schema或者dtd申明指向该服务器。<br /> <br />问题延伸开来的思考：<br />就问题的解决方案来看这个问题的一些值得注意和思考的地方。<br /> <br />方案1：<br />当前对于XML解析来说，各种框架都已经统一的实现了StAX的标准，同时在jdk6得rt.jar中都已经将StAX API作为基础框架API纳入其内。而通常情况下，如果不配置是否校验Xml，那么都将默认会主动校验Xml，此时就会出现上面我所遇到的问题，如果当你依赖的Xml DTD 或者 Schema服务器出现问题，就会导致你本地应用可能受到影响。在Dtd的申明说明中，&lt;!DOCTYPE rootElement <span style="color: red">PUBLIC "PublicIdentifier" "URIreference"</span>>红色部分说可以在网络出现问题或者网络速度很慢的时候被部分xml解析器替代URIreference使用，不过我这边没有成功过。我通过自己屏蔽网络连接来模拟环境的情况，都是无法通过的。（Schema比较奇怪，就算无法连接网络还是可以正常的，这个后续需要继续研究看看，或者有朋友对这个问题有了解请告知一下）<br /> <br />方案2：<br />       其实早在2002年就已经有将dtd替换成为schema的趋势了，两者的区别和优劣网上的文章介绍了很多了，这儿不再罗列，其实最更本一点就是schema就是用xml来校验xml，而dtd却采用了另一套规则来校验xml，其本身也是xml，扩展性，可读性，学习曲线等等都次与schema。除了遗留系统，我个人看不出还有什么必要去使用老的dtd来校验xml的格式。Spring的dtd服务的出现问题，也说明了其实对于dtd这种方式的校验，spring也已经不会保证几个9的稳定性。<br />       Xml常常会被作为数据承载中介，使双方能够在跨平台跨语言的情况下松耦合的交互信息，也是现在的SOA的实施基础。那么双方势必需要有协议和数据格式规范来约束，schema作为dtd的新一代替代者已经广为使用。另一方面，xsd也早已独立于wsdl作为数据描述和可重用的数据描述说明被采用到各种互联网应用。<br />       看看国外的Facebook,亚马逊,ebay等公司的REST风格的API，就可以清楚地了解到xsd十分适合作为轻量级的数据交互协议。在后续ASF中融入REST配置的实现中，也需要采用XSD这种Schema描述来实现数据交互解析。<br />       因此替换掉Dtd的配置是迟早要做的一件事情，所以迟作不如早作，更避免拷贝引起的问题放大效果（不过这个问题由于要考虑QA和业务组的项目经理的顾虑，因此我只能做到的是建议）。<br /> <br />方案3：<br />       看看Maven这些年这么火，其实在我们自己公司内部的antx同样都是在做一件事情，就是对于第三方的依赖包的版本控制。对于开源项目依赖的管理其实很重要，作的好项目能够很好的利用已有的成果，管理的不好就会被一些不太稳定的开源项目搞得头破血流。<br />       记得在上次三亚的聚会上谈到了对于Tuscany的依赖，其实对于这个项目来说，如果要作为成熟的产品来说，那么势必要获取一个版本然后就作为稳定的依赖，而不是一味的升级更新，由于我们产品的特殊性以及早期的Tuscany的不成熟，因此我们仅仅只是使用了Tuscany的最核心解析文件框架部分，其他的插件都采取自己设计或者在原有设计上优化和更新的做法。当然这不是说对于所有的第三方依赖都是采取这样的策略，其实如果不是基础框架设计，仅仅只是应用级别的使用，只需要拿来主义就完全可以了。<br />       回过头来看，大家现在对于类库的管理已经都很重视了，但是对于配置性的或者数据格式类的文件还没有引起足够的重视，不过看到很多朋友已经在本地作了这样的工作，不过就我来看，如果能够对dtd,schema作版本控制和服务器搭建，在长远来看还是有一定的好处的，只是说根据各自的需求来做这样的工作。<br /> <br /> <br />后续<br />       问题出现的当天，我其实晚上就一直比较担心，因为如果问题不解决，那么将会影响到很多项目组（框架被使用的越广泛，自己所要承担的责任越重大）。其实也是由于自己上次对于这个问题的不上心，导致了问题的再次出现。刨根问底是件好事，做我们这行的还是需要多问一些为什么，这样就会少不少危急时刻的怎么办了。<br />       很多时候为什么程序员自己喜欢什么都自己做，因为掌握在自己手中的事情总是能够解决，但是现在项目中对于第三方的依赖越来越多，在选择和控制上必须慎之又慎，有时候依赖也是双刃剑。
          <br/>
          <span style="color:red;">
            <a href="http://life4j.javaeye.com/blog/185515#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 16:12:54 +0800</pubDate>
        <link>http://life4j.javaeye.com/blog/185515</link>
        <guid>http://life4j.javaeye.com/blog/185515</guid>
      </item>
      <item>
        <title>【转】Spring 学习笔记--强烈推荐</title>
        <author>ivorytower</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://life4j.javaeye.com">ivorytower</a>&nbsp;
          链接：<a href="http://life4j.javaeye.com/blog/183421" style="color:red;">http://life4j.javaeye.com/blog/183421</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          **<br /> * 阅前说明:<br /> * 此文件为笔者在学习Spring时所写的一些笔记&lt;br><br /> * 希望能抛砖引玉来促进大家以各种方式交流学习心得&lt;br><br /> * 如有转载,为了尊重笔者的劳动成果，请保留此段说明&lt;br><br /> * @author    贺小佼 HeXiaojiao&lt;br><br /> * Email        ld_hxj1@yahoo.com.cn &lt;br><br /> * QQ     88137099&lt;br><br /> * Time         2008-04-14 16:43:43 &lt;br><br /> * Blog    http://blog.csdn.net/hexiaojiao<br /> */<br />Day-01<br /><span style="color: green">问题提出：</span><br /><span style="color: blue">框架的主要优势是什么？<br />请简要描述Spring?<br />Spring框架分为哪几个模块，请详述？<br />Spring有哪些注入方式，请详细描述？<br /><br />1.在Setter注入方式中,在beans包下的ProductBean中只加入一个带参数的构造<br /><br />方法会如何？<br />2.在config.xml中少加一property项会如何？<br />3.Spring中有哪些集合注入,如何注入？<br />4.问:如何设置单例模式?有什么作用和特殊效果?<br />5.问:什么叫混合注入模式,请举例说明?<br />6.问: Spring中如何进行类型数据的设置 <br />7.问:Spring支不支持数据类型自动转换?构造器复杂情况有哪些？<br />8.问:如果为嵌套属性(其属性为一个类)时如果配置?(Bean的引用如果配置)<br />9.问:Bean初始化方案有哪几种,请详述?<br />10.问:在bean类中(1)初始化接口方案、(2)构造方法与(3)初始化方法方案中各<br /> </span><br />方法的执行顺序如何？<br />//=======================================================<br />问题解决:<br />//-------------------------------------------------------------------<br /><br />----------   <br />框架的主要优势是什么？<br /><br />请简要描述Spring?<br /><br /><span style="color: red">Spring框架分为哪几个模块，请详述？</span><br />    答：Spring框架可分为七个模块,分别如下:<br />     1.核心容器：核心容器提供 Spring 框架的基本功能。核心容器的主要组<br /><br />件是 BeanFactory，它是工厂模式的实现。BeanFactory 使用控制反转 （IOC） <br /><br />模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 <br />      2.Spring 上下文：Spring 上下文是一个配置文件，向 Spring 框架提供<br /><br />上下文信息。Spring 上下文包括企业服务，例如 JNDI、EJB、电子邮件、国际<br /><br />化、校验和调度功能。 <br />      3.Spring AOP：通过配置管理特性，Spring AOP 模块直接将面向方面的<br /><br />编程功能集成到了 Spring 框架中。所以，可以很容易地使 Spring 框架管理的<br /><br />任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供<br /><br />了事务管理服务。通过使用 Spring AOP，不用依赖 EJB 组件，就可以将声明性<br /><br />事务管理集成到应用程序中。 <br />      4.Spring DAO：JDBC DAO 抽象层提供了有意义的异常层次结构，可用该<br /><br />结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了<br /><br />错误处理，并且极大地降低了需要编写的异常代码数量（例如打开和关闭连接）<br /><br />。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 <br />      5.Spring ORM：Spring 框架插入了若干个 ORM 框架，从而提供了 ORM <br /><br />的对象关系工具，其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都<br /><br />遵从 Spring 的通用事务和 DAO 异常层次结构。 <br />      6.Spring Web 模块：Web 上下文模块建立在应用程序上下文模块之上，<br /><br />为基于 Web 的应用程序提供了上下文。所以，Spring 框架支持与 Jakarta <br /><br />Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对<br /><br />象的工作。 <br />      7.Spring MVC 框架：MVC 框架是一个全功能的构建 Web 应用程序的 MVC <br /><br />实现。通过策略接口，MVC 框架变成为高度可配置的，MVC 容纳了大量视图技术<br /><br />，其中包括 JSP、Velocity、Tiles、iText 和 POI。 <br />//-------------------------------------------------------------------<br /><br />---------- <br /><span style="color: red">Spring有哪些注入方式，请详细描述？</span><br />    答: 通过注入方式，使程序解耦合<br /><span style="color: brown"><strong>一。通过构造器(构造方法)注入</strong></span><br />构造器注入操作步骤:<br />   1.引入Spring架包，建包ioc.common 在这包下建立三个包<br />   ioc.common.beans,ioc.common.config,ioc.common.logic<br />   2.在beans包下建立UserBean类,代码如下:<br />   <pre name="code" class="java">  
//UserBean.java
   package ioc.common.beans;
public class UserBean {
        private String userName;
        private String userPassword;

        public UserBean() {
        }

        public UserBean(String userName, String userPassword) {
          this.userName = userName;
          this.userPassword = userPassword;
        }

        public String getUserName() {
          return userName;
        }

        public void setUserName(String userName) {
          this.userName = userName;
        }

        public String getUserPassword() {
          return userPassword;
        }

        public void setUserPassword(String userPassword) {
          this.userPassword = userPassword;
        }

        @Override
        public String toString() {
          return userName + "-" + userPassword;
        }
}
</pre><br />    3.在config包下建立config.xml文件,内容如下:<br /><pre name="code" class="xml">  
    &lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 

"http://www.springframework.org/dtd/spring-beans.dtd">
&lt;beans>
        &lt;bean id="userBean" class="ioc.common.beans.UserBean">
          &lt;constructor-arg index="0">
            &lt;value>Janet &lt;/value>
          &lt;/constructor-arg>
          &lt;constructor-arg index="1">
            &lt;value>88888888&lt;/value>
          &lt;/constructor-arg>
        &lt;/bean>
&lt;/beans> 
</pre><br />    4.在logic包下建立Run.java,内容如下:<br /><pre name="code" class="java">   
package ioc.common.logic;
import ioc.common.beans.UserBean;
import org.springframework.context.ApplicationContext;
import 

org.springframework.context.support.FileSystemXmlApplicationContext;

public class Run {
        public static void main(String[] args) {
          String fileName = "./src/ioc/common/config/co