关于作者

用户名:fanyingjie
笔名:清水白菜
地区: 浙江-杭州
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



※→ 【JAVA 帮助文档】

※→ 【友情链接】

※→ 【著名网站】

※→ 【语言学习网站】

※→ 【在线服务网站】

※→ 【JAVA 国际网站】

访问统计:
文章个数:225
评论个数:23
留言条数:17




Powered by BlogDriver 2.1

JAVA——咖啡馆

 

    欢迎访问IT木头的博客,有空常来《JAVA——咖啡馆》坐坐,坐下来喝杯浓香的咖啡,彼此探讨一下JAVA技术,交流工作经验,分享JAVA带来的快乐!本网站大部分是转载文章,如果有版权问题请与我联系。【※ 联系方式:QQ:578893110 或 MSN:yingjie-fan@hotmail.com ※】〖String--->int〗 【int i=Integer.parseInt(String)】〖int---->String〗 【String Str=Integer.toString(int)】

文章

博客搬迁【http://www.blogjava.net/fanyingjie】  (作者置顶)

博客搬迁,新地址:http://www.blogjava.net/fanyingjie/

- 作者: 清水白菜 2008年01月4日, 星期五 16:40  回复(0) |  引用(0) 加入博采

eclipse 插件集锦  (作者置顶)

XML Schema Infoset Model (XSD)

功能:XML Schema Infoset Model 是个参考库提供用于测试,创建或者修改 W3C XML Schema 的 API。
主页:http://www.eclipse.org/xsd/

Graphical Editing Framework

功能:这个插件允许开发者快速开发图形编辑器。
主页:http://www.eclipse.org/gef/

Eclipse Modeling Framework (EMF)

功能:EMF是一个建模框架和基于结构化数据模型的代码生成工具。它能够将按照约定所进行描述的XML和其它EMF工具产生或运行时支持一套JAVA类模型、一套用于查看和处理模型操作的接口类。这套模型可以用包含注释的JAVA代码、XML文档或者用ROSE之类的建模工具所制作的模型导成EMF。最重要的是,EMF提供其它基于EMF的工具及应用程序的基础协作平台。
主页:http://www.eclipse.org/emf/

Eclipse Web Tools Platform (WTP)

版本:1.0
支持的 Eclipse 版本: 2.1 & 3.0
使用证书: Free
开发状况: Beta
公司: eclipse.org
功能:包含了 HTML , javascript , CSS , JSP , SQL , DTD , XSD & WSDL 编辑器,提供图形化的 XSD & WSDL 编辑器,J2EE 工程构建,建模,发布。Web service 向导数据库访问和查询工具,五星级插件!强烈推荐。
主页:http://www.eclipse.org/webtools/index.html

Lomboz

版本:Build-20050526
开发状况: 5 - Production/Stable
使用协议:GNU Lesser General Public License (LGPL)
功能:Lomaz 是著名的 eclipse 的 J2EE 开发插件,它使用了以下开源技术:Jasper,Xdoclet,Axis 和 Ant,完全支持编码,发布,测试和调试的开发环节。
主页:http://forge.objectweb.org/projects/lomboz

Myeclipse

版本:3.8.4
支持的 Eclipse 版本: 2.1 & 3.0
使用证书:commerce
开发状况:stable
公司: Genuitec, LLC
功能:

要钱的东西,不过是最强悍的 J2EE 开发插件。
可视化的 JSF 和 Struts 开发,XML 编辑器,Hibernate 支持,UML建模,应用服务器连接,支持 EJB 开发,同步发布 JSP (不必发布整个应用程序)……
非常强大的工具,使用一下就能体会到了 : )

Sysdeo Eclipse Tomcat Launcher plugin

版本:3.1 Beta
支持的 Eclipse 版本: 2.1 & 3.0
使用证书: Free
发状况: Beta
公司: Sysdeo
功能:

在Elipse中启动停止重启Tomcat
注册 Tomcat 进程到 Eclipse 调试器
创建 WAR 文件
把 Java 工程添加到 Tomcat Classpath 中
设置 Tomcat JVM 参数,Classpath 和 bootclasspath
把 Tomcat 工程导出为 WAR 文件
选择 Tomcat 配置文件

插件主页:http://www.eclipse-plugins.info/eclipse/index.jsp

JavaScript Editor

版本:0.0.9b
支持的 Eclipse 版本: 2.1 & 3.0
使用证书: Free CPL
开发状况: Beta
公司: N/A
功能:Javascript 编辑,提供了代码高亮,自动完成和内容纲要的功能。
插件主页:http://jseditor.sourceforge.net/

CSSEditor

版本:0.0.4
支持的 Eclipse 版本: 2.1 & 3.0
使用证书: Free CPL
开发状况: Beta
公司: N/A
功能:代码高亮,内容提示,纲要栏显示 CSS 规则,输入时显示错误。
主页:http://csseditor.sourceforge.net/

Exadel Studio

版本:2.5
支持的 Eclipse 版本: 3.0
使用证书: Free CPL
开发状况: Beta
公司: N/A
功能:支持 JSF,Struts,JSP 编辑(支持2.0),Spring Framework,Hibernate,数据库浏览,图形化的属性编辑器,CSS 编辑器,JavaScript 编辑器,图像浏览,XSD 编辑,支持 XML Schema,支持超过 20 种应用服务器的发布……功能非常强大。

Struts Console

版本:4.8
支持的 Eclipse 版本: ALL
使用证书: Free
开发状况: stable
公司: N/A
功能:支持 *.tld文件,Struts 1.0 - 1.2 配置文件, Tiles配置文件, Validator 1.0 和 1.1配置文件,支持主流的 Java IDEs。
主页:http://www.jamesholmes.com/struts/console/

Faces Console

版本:1.7
支持的 Eclipse 版本: ALL
使用证书: Free
开发状况: stable
公司: N/A
功能:完全支持 JSF 配置文件,支持 JSP Tag Library 文件,支持主流的 Java IDEs。
主页:http://www.jamesholmes.com/JavaServerFaces/console/

HTML Tidy Eclipse Plug-in

版本:1.2.1
支持的 Eclipse 版本: 2.1 & 3.0
使用证书: Free CPL
开发状况: Beta
公司: N/A
功能:格式化和校验 (X)HTML 和 XML 代码。本身并不提供编辑器。
主页:http://eclipsetidy.sourceforge.net/

Eclipse HTML Editor Plugin

版本:N/A
支持的 Eclipse 版本: 2.1 & 3.0
使用证书: Free CPL
开发状况: Beta
公司: N/A
功能:

Eclipse HTML Editor 是 HTML/JSP/XML 编辑插件。
HTML/JSP/XML/CSS 高亮。
HTML/JSP 预览
JSP/XML 校验
Contents 帮助(HTML Tags/Attributes, XML based on DTD and JSP taglib and more)
创建 HTML/JSP/XML 文件向导
代码折叠
图片浏览
CSS 代码完成

主页:http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=EclipseHTMLEditor

PHPeclipse(PHP Development Toolkit )

版本:N/A
支持的 Eclipse 版本: 3.0
使用证书: Free CPL
开发状况: Beta
公司: N/A
功能:eclipse 的 PHP 开发环境,支持代码高亮和代码自动完成,预览 PHP 页面。可以在eclipse中控制 apache,mysql 的启动,停止和重启。功能强大!
主页:http://www.phpeclipse.de/tiki-view_articles.php

XMLBuddy

版本:N/A
支持的 Eclipse 版本: 3.0
使用证书: Free & commerce
开发状况: stable
公司: N/A
功能:这是个免费版本,很好用,试试就知道了。
主页:http://www.xmlbuddy.com/

Doclipse

版本:N/A
支持的 Eclipse 版本: 3.0
使用证书: Free
开发状况: stable
公司: N/A
功能:看名字就知道了,在 eclipse 中使用 javadoc 标签的辅助工具。
主页:http://www.beust.com/doclipse/

jadclipse

版本:2.06
支持的 Eclipse 版本: 所有
使用证书: Free
开发状况: stable
公司: N/A
功能:很棒的工具,可以在 eclipse 中直接反编译 class 文件!
主页:

- 作者: 清水白菜 2007年06月11日, 星期一 10:02  回复(0) |  引用(0) 加入博采

揭开正则表达式的神秘面纱  (作者置顶)

揭开正则表达式的神秘面纱

[原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref.htm]

引言

    正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。

    正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。

   正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。

    文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。


1. 正则表达式规则

1.1 普通字符

    字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

    举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)

    举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。


1.2 简单的转义字符

    一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

表达式

可匹配

\r, \n

代表回车和换行符

\t

制表符

\\

代表 "\" 本身

    还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。

表达式

可匹配

\^

匹配 ^ 符号本身

\$

匹配 $ 符号本身

\.

匹配小数点(.)本身

    这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。

    举例1:表达式 "\$d",在匹配字符串 "abc$de" 时,匹配结果是:成功;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。


1.3 能够与 '多种字符' 匹配的表达式

    正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

表达式

可匹配

\d

任意一个数字,0~9 中的任意一个

\w

任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

\s

包括空格、制表符、换页符等空白字符的其中任意一个

.

小数点可以匹配除了换行符(\n)以外的任意一个字符

    举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。

    举例2:表达式 "a.\d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。


1.4 自定义能够匹配 '多种字符' 的表达式

    使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

表达式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意一个字符

[f-k]

匹配 "f"~"k" 之间的任意一个字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意一个字符

    举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。

    举例2:表达式 "[^abc]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。


1.5 修饰匹配次数的特殊符号

    前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

    使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

表达式

作用

{n}

表达式重复n次,比如:"\w{2}" 相当于 "\w\w""a{5}" 相当于 "aaaaa"

{m,n}

表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表达式至少重复m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...

?

匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

+

表达式至少出现1次,相当于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...

*

表达式不出现或出现任意次,相当于 {0,},比如:"\^*b"可以匹配 "b","^^^b"...

    举例1:表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时,匹配的结果是:成功;匹配到的内容是:"12.5";匹配到的位置是:开始于10,结束于14。

    举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。


1.6 其他一些代表抽象意义的特殊符号

    一些符号在表达式中代表抽象的特殊意义:

表达式

作用

^

与字符串开始的地方匹配,不匹配任何字符

$

与字符串结束的地方匹配,不匹配任何字符

\b

匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

    进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

    举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"

    举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"

    举例3:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
    进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

    举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

    一些符号可以影响表达式内部的子表达式之间的关系:

表达式

作用

|

左右两边表达式之间 "或" 关系,匹配左边或者右边

( )

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    举例5:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。

    举例6:表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。

    举例7:表达式 "(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。


2. 正则表达式中的一些高级规则

2.1 匹配次数中的贪婪与非贪婪

    在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

表达式

匹配结果

(d)(\w+)

"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(\w+)(d)

"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后个 "d"

    由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

    非贪婪模式:

    在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

表达式

匹配结果

(d)(\w+?)

"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

(d)(\w+?)(d)

为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

    更多的情况,举例如下:

    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。


2.2 反向引用 \1, \2...

    表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。

    其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

    举例如下:

    举例1:表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。

    举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别

    举例3:表达式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。


2.3 预搜索,不匹配;反向预搜索,不匹配

    前面的章节中,我讲到了几个代表抽象意义的特殊符号:&uot;^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。

    正向预搜索:"(?=xxxxx)","(?!xxxxx)"

    格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

    举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。

    举例2:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。

    格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。

    举例3:表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。

    举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。

    反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"

    这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

    举例5:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简单易用的 DEELX 正则引擎


3. 其他通用规则

    还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。

3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)

形式

字符范围

\xXX

编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示

\uXXXX

任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D"

3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义

表达式

可匹配

\S

匹配所有非空白字符("\s" 可匹配各个空白字符)

\D

匹配所有的非数字字符

\W

匹配所有的字母、数字、下划线以外的字符

\B

匹配非单词边界,即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙

3.3 在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总

字符

说明

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"

( )

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"

[ ]

用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"

{ }

修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."

?

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"

+

修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"

|

左右两边表达式之间 "或" 关系。匹配 "|" 身,请使用 "\|"

3.4 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式

    举例1:表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。

3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global

表达式属性

说明

Ignorecase

默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

Singleline

默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline

默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:

①xxxxxxxxx②\n
③xxxxxxxxx④

配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global

主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。


4. 其他提示

4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站 DEELX 正则引擎的说明文档

4.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。

4.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字

4.4 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:"\d+\.?\d*|\.\d+"

4.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。

4.6 合理选择贪婪模式与非贪婪模式,参见话题讨论

4.7 或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。


- 作者: 清水白菜 2007年05月22日, 星期二 15:26  回复(0) |  引用(0) 加入博采

DynamicOptionList连动菜单  (作者置顶)
    使用前请看一下说明,不会耽误你多少时间,明白以后有助你快速实现这个小功能,实际上非常简单,与你使用的开发语言也没有什么关系:


1. <option selected value="all">==查看所有==</option>
 这个下拉项可以保留或忽略,内容如“==查看所有==”可替换为自己需要的内容,value="all" 属性可以获得一个附加的全过滤显示功能,建议保留:)


2.下拉菜单数据格式,(实际开发可以由后台程序生成一个数据格式字符串,这个数据串格式和你查询的表结构应该是一样的,传到模板上取得这个数据格式串即可,所有下拉菜单数据是一次传到页面上的,并且与你使用的语言开发实现没有什么关系,只要你想办法得到这个字符串格式就行了)如下:

a.第一级连动菜单的下拉选项,格式为 (下拉选项option内容,下拉选项option值;......)

"上海,01;江西,02";

b. 第二级连动菜单的下拉选项,(子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;......)

"01,徐汇区,001;01,嘉定区,002;01,黄浦区,003;02,南昌市,004;02,九江市,005;02,上饶市,006";

c. 第三级连动菜单的下拉选项,(子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;......)

"001,徐汇1区,0001;002,嘉定1区,0002;003,黄浦1区,0003;004,南昌1市,0004;005,九江1市,0005;006,上饶1市,0006";
.
.
.
第 N 级连动菜单的拉选项,(子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;......)

除了第一级没有子下拉选项option过滤值这一项外,其他子集都有子下拉选项option过滤值


3.实际可实现N级连动菜单,只要由当前菜单驱动它的子菜单即可,类似与责任链模式;

4.实际开发将<head> ...</head> 中的3个方法放至在一个单独的脚本文件里面,并引入它,只要在页面调用方法即可,这样就会发现实现这个功能很简洁,调用的方法也很自然;

5.下文举了4个例子,实际都一样,只是名字和样式不一样而已,名称后缀('_'下划线作为后缀的分隔符)不是必要的;


 

<html>
<head>
<title>List</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script LANGUAGE="javascript">
<!--
//测试用的一组数据

//第1级下拉菜单数据
var opt = "上海,01;江西,02";

//第2级下拉菜单数据
var subopt = "01,徐汇区,001;01,嘉定区,002;01,黄浦区,003;02,南昌市,004;02,九江市,005;02,上饶市,006";

//第3级下拉菜单数据
var subsubopt = "001,徐汇1区,0001;002,嘉定1区,0002;003,黄浦1区,0003;004,南昌1市,0004;005,九江1市,0005;006,上饶1市,0006";

/**
 * get Element By Id or name.
 * 根据一个dom对象的名称返回这个对象,省略了你
 * 直接操作document.getElementById的过程.
 *
 * 例如: $('默认文本框的名称').value
 *       就可以取得它的value
 */
function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}

/*
 * 自动填充一个下拉列表,一般用于填充连动菜单的第一项
 *
 * selname :: 当前下拉选项(this)
 *            后缀是为了区分由程序动态生成的如果有多个相同的下拉选项而设
 *            置的一个辅助名称后缀('_'下划线作为后缀的分隔符),如果没有这
 *            个需要可以忽略 “_后缀”,只要设置一个普通的名称即可.
 *
 * seldata :: 数据源,菜单的数据项(子下拉选项名称,子下拉选项值,子下拉选项过滤值)
 * filter  :: 下拉选项的过滤条件
 *
 */
function fillselect(selname,seldata,filters) {
 var sel = $(selname);
 var data = seldata.split(";");
 var filtersdata = filters.split(";");

 var index = "";
 var selkey = "";
 var selvalue = "";

 if(data.length > 0) {

  //过滤条件为'all',显示全部,用于连动菜单
  if(filtersdata[0] == 'all') {
   sel.options[0] = new Option('==查看所有==','all');

   for(i=0; i < data.length; i++) {
    selkey = data[i].split(",")[1];
    selvalue = data[i].split(",")[2];
    sel.options[sel.length] = new Option(selkey,selvalue);
   }
   
   return;
  }

  sel.options[0] = new Option('==查看所有==','all');
  for(i=0;i < data.length; i++) {
   
   //有过滤条件的下拉项(连动菜单数据格式)
   if (data[i].split(",").length == 3) {
    for(j=0; j < filtersdata.length; j++){
     if( (data[i].split(",")[0] == filtersdata[j]) ) {
      selkey = data[i].split(",")[1];
      selvalue = data[i].split(",")[2];
      sel.options[sel.length] = new Option(selkey,selvalue);
     }
    }
   }

   //无过滤条件的下拉项(非连动菜单数据格式)
   if (data[i].split(",").length == 2) {
    selkey = data[i].split(",")[0];
    selvalue = data[i].split(",")[1];
    sel.options[sel.length] = new Option(selkey,selvalue);
   }

  }
  
  if (sel.length == 1) {
   sel.options[0] = new Option('==没有选项==','');
  }else{
   
  }
 }   
}

/*
 * 连动下拉列表的驱动函数
 *
 * selname_src    :: 当前下拉选项(this)
 *
 * subselname_src :: 所要驱动的子下拉选项的名称(名称结构为: 名称_后缀 或 名称)
 *                   后缀是为了区分由程序动态生成的如果有多个相同的下拉选项而设
 *                   置的一个辅助名称后缀('_'下划线作为后缀的分隔符),如果没有这
 *                   个需要可以忽略 “_后缀”,只要设置一个普通的名称即可.
 *
 * subseldata_src :: 数据源,被驱动菜单的数据项.
 *                   数据源格式 : (子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;......)
 *
 */
function driverselect(selname_src,subselname_src,subseldata_src) {

 var index = "", selkey = "", selvalue = "";

 var selName="", selSuffix="";
 var subselName="", subselSuffix="";
 
 if(selname_src.name.split("_").length==2) {
  selName=selname_src.name.split("_")[0];
  selSuffix="_" + selname_src.name.split("_")[1];
 }else{
  selName=selname_src.name;
 }

 if(subselname_src.split("_").length==2) {
  subselName=subselname_src.split("_")[0];
  subselSuffix="_" + subselname_src.split("_")[1];
 }else{
  subselName=subselname_src;
 }

 var source = $(selName+selSuffix);
 var target = $(subselName+subselSuffix); 
 target.length=1;

 var filters = "";
 for(j=0; j < source.length; j++) {
  if(source[j].selected){
   filters = filters + source[j].value + ';';
  }
 }

 fillselect(target,subseldata_src,filters);
}   

//-->
</script>
</head>
<body>
<form name="myform" method="post">

sample1:

    <select name="sel_1" onChange="driverselect(this,'subsel_1',subopt)">
  <option selected value="all">==查看所有==</option>
 &bsp;  </select>
    <select name="subsel_1" onChange="driverselect(this,'subsubsel_1',subsubopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsubsel_1">
  <option selected value="all">==查看所有==</option>
    </select>

 <br><br>


sample2:

    <select name="sel_2" onChange="driverselect(this,'subsel_2',subopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsel_2" onChange="driverselect(this,'subsubsel_2',subsubopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsubsel_2">
  <option selected value="all">==查看所有==</option>
    </select>

 <br><br>

 sample3:

    <select name="selM_1" MULTIPLE size="5" onChange="driverselect(this,'subselM_1',subopt)" >
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subselM_1" MULTIPLE size="5" onChange="driverselect(this,'subsubselM_1',subsubopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsubselM_1" MULTIPLE size="5">
  <option selected value="all">==查看所有==</option>
    </select>

 <br><br>

sample4:

    <select name="selM_2" MULTIPLE size="5" onChange="driverselect(this,'subselM_2',subopt)">
  <option selected value="">==查看所有==</option>
    </select>
    <select name="subselM_2" MULTIPLE size="5" onChange="driverselect(this,'subsubselM_2',subsubopt)">
  <option selected value="">==查看所有==</option>
    </select>
    <select name="subsubselM_2" MULTIPLE size="5">
  <option selected value="">==查看所有==</option>
    </select>

 <br><br>

</form>

<SCRIPT LANGUAGE="JavaScript">
<!--
//初始化sample1:第一个下拉菜单项
fillselect('sel_1',opt,'');

//初始化sample2:第一个下拉菜单项
fillselect('sel_2',opt,'');

//初始化sample3:第一个下拉菜单项
fillselect('selM_1',opt,'');

//初始化sample4:第一个下拉菜单项
fillselect('selM_2',opt,'');
//-->
</SCRIPT>
</body>
</html>

 点击测试上述代码演示:

<html>
<head>
<title>List</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script LANGUAGE="javascript">
<!--
//测试用的一组数据

//第1级下拉菜单数据
var opt = "上海,01;江西,02";

//第2级下拉菜单数据
var subopt = "01,徐汇区,001;01,嘉定区,002;01,黄浦区,003;02,南昌市,004;02,九江市,005;02,上饶市,006";

//第3级下拉菜单数据
var subsubopt = "001,徐汇1区,0001;002,嘉定1区,0002;003,黄浦1区,0003;004,南昌1市,0004;005,九江1市,0005;006,上饶1市,0006";

/**
 * get Element By Id or name.
 * 根据一个dom对象的名称返回这个对象,省略了你
 * 直接操作document.getElementById的过程.
 *
 * 例如: $('默认文本框的名称').value
 *       就可以取得它的value
 */
function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}

/*
 * 自动填充一个下拉列表,一般用于填充连动菜单的第一项
 *
 * selname :: 当前下拉选项(this)
 *            后缀是为了区分由程序动态生成的如果有多个相同的下拉选项而设
 *            置的一个辅助名称后缀('_'下划线作为后缀的分隔符),如果没有这
 *            个需要可以忽略 “_后缀”,只要设置一个普通的名称即可.
 *
 * seldata :: 数据源,菜单的数据项(子下拉选项名称,子下拉选项值,子下拉选项过滤值)
 * filter  :: 下拉选项的过滤条件
 *
 */
function fillselect(selname,seldata,filters) {
 var sel = $(selname);
 var data = seldata.split(";");
 var filtersdata = filters.split(";");

 var index = "";
 var selkey = "";
 var selvalue = "";

 if(data.length > 0) {

  //过滤条件为'all',显示全部,用于连动菜单
  if(filtersdata[0] == 'all') {
   sel.options[0] = new Option('==查看所有==','all');

   for(i=0; i < data.length; i++) {
    selkey = data[i].split(",")[1];
    selvalue = data[i].split(",")[2];
    sel.options[sel.length] = new Option(selkey,selvalue);
   }
  
   return;
  }

  sel.options[0] = new Option('==查看所有==','all');
  for(i=0;i < data.length; i++) {
  
   //有过滤条件的下拉项(连动菜单数据格式)
   if (data[i].split(",").length == 3) {
    for(j=0; j < filtersdata.length; j++){
     if( (data[i].split(",")[0] == filtersdata[j]) ) {
      selkey = data[i].split(",")[1];
      selvalue = data[i].split(",")[2];
      sel.options[sel.length] = new Option(selkey,selvalue);
     }
    }
   }

   //无过滤条件的下拉项(非连动菜单数据格式)
   if (data[i].split(",").length == 2) {
    selkey = data[i].split(",")[0];
    selvalue = data[i].split(",")[1];
    sel.options[sel.length] = new Option(selkey,selvalue);
   }

  }
 
  if (sel.length == 1) {
   sel.options[0] = new Option('==没有选项==','');
  }else{
  
  }
 }   
}

/*
 * 连动下拉列表的驱动函数
 *
 * selname_src    :: 当前下拉选项(this)
&bsp;*
 * subselname_src :: 所要驱动的子下拉选项的名称(名称结构为: 名称_后缀 或 名称)
 *                   后缀是为了区分由程序动态生成的如果有多个相同的下拉选项而设
 *                   置的一个辅助名称后缀('_'下划线作为后缀的分隔符),如果没有这
 *                   个需要可以忽略 “_后缀”,只要设置一个普通的名称即可.
 *
 * subseldata_src :: 数据源,被驱动菜单的数据项.
 *                   数据源格式 : (子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;......)
 *
 */
function driverselect(selname_src,subselname_src,subseldata_src) {

 var index = "", selkey = "", selvalue = "";

 var selName="", selSuffix="";
 var subselName="", subselSuffix="";
 
 if(selname_src.name.split("_").length==2) {
  selName=selname_src.name.split("_")[0];
  selSuffix="_" + selname_src.name.split("_")[1];
 }else{
  selName=selname_src.name;
 }

 if(subselname_src.split("_").length==2) {
  subselName=subselname_src.split("_")[0];
  subselSuffix="_" + subselname_src.split("_")[1];
 }else{
  subselName=subselname_src;
 }

 var source = $(selName+selSuffix);
 var target = $(subselName+subselSuffix);
 target.length=1;

 var filters = "";
 for(j=0; j < source.length; j++) {
  if(source[j].selected){
   filters = filters + source[j].value + ';';
  }
 }

 fillselect(target,subseldata_src,filters);
}   

//-->
</script>
</head>
<body>
<form name="myform" method="post">

sample1:

    <select name="sel_1" onChange="driverselect(this,'subsel_1',subopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsel_1" onChange="driverselect(this,'subsubsel_1',subsubopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsubsel_1">
  <option selected value="all">==查看所有==</option>
    </select>

 <br><br>


sample2:

    <select name="sel_2" onChange="driverselect(this,'subsel_2',subopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsel_2" onChange="driverselect(this,'subsubsel_2',subsubopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsubsel_2">
  <option selected value="all">==查看所有==</option>
    </select>

 <br><br>

 sample3:

    <select name="selM_1" MULTIPLE size="5" onChange="driverselect(this,'subselM_1',subopt)" >
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subselM_1" MULTIPLE size="5" onChange="driverselect(this,'subsubselM_1',subsubopt)">
  <option selected value="all">==查看所有==</option>
    </select>
    <select name="subsubselM_1" MULTIPLE size="5">
  <option selected value="all">==查看所有==</option>
    </select>

 <br><br>


sample4:

    <select name="selM_2" MULTIPLE size="5" onChange="driverselect(this,'subselM_2',subopt)">
  <option selected value="">==查看所有==</option>
    </select>
    <select name="subselM_2" MULTIPLE size="5" onChange="driverselect(this,'subsubselM_2',subsubopt)">
  <option selected value="">==查看所有==</option>
    </select>
    <select name="subsubselM_2" MULTIPLE size="5">
  <option selected value="">==查看所有==</option>
    </select>

 <br><br>

</form>

<SCRIPT LANGUAGE="JavaScript">
<!--
//初始化sample1:第一个下拉菜单项
fillselect('sel_1',opt,'');

//初始化sample2:第一个下拉菜单项
fillselect('sel_2',opt,'');

//初始化sample3:第一个下拉菜单项
fillselect('selM_1',opt,'');

//初始化sample4:第一个下拉菜单项
fillselect('selM_2',opt,'');
//-->
</SCRIPT>
</body>
</html>


- 作者: 清水白菜 2007年05月9日, 星期三 12:14  回复(0) |  引用(0) 加入博采

健康身体,运动之道[健身大全]  (作者置顶)
锻炼图解...新手获益就是大斌最大的心愿

三角肌前部

前平举
起始姿势 两腿直立,挺胸收腹。两手正握哑玲或杠铃,两臂下垂于腿前。 
动作过程 直臂持铃向上举起,至稍高于肩。静止一秒钟,再直臂徐徐放下,还原至腿前。如用哑铃,可左右手各一次,连续交替做。 
呼吸方法 上举时吸气,下落时呼气。 
注意要点 上举和下落时全身保持直立,两臂保持直伸,意念集中在三角肌。 
三角肌中部

侧平举
起始姿势 两脚自然开立,两手握哑铃,下垂于身体两侧。 
动作过程 收缩三角肌,直臂向侧上方举起,直到略高于肩,静止一秒钟,再让两臂徐徐放下到下垂位置。 
呼吸方法 上举时吸气,静止时呼气。下降时吸气,完全落下时呼气。 
注意要点 上举和下落时,全身保持直立,不要摇摆弯曲,臂部保持直伸。 
单臂侧平拉

单臂侧平拉
起始姿势 全身直立,一脚踩套住拉力器的一个握柄或胶皮条的一端。另一手插按在腰间。 
动作过程 收缩三角肌,一手将拉力器或胶皮条向侧上方拉到与肩齐高。另一手用力插按腰间以保持平衡。上拉到最高点后,静止一秒钟,然后,在三角肌继续用力控制下,让拉簧或胶皮条徐徐松缩到开始位置。重复练一肩已无力上拉后,换练另一肩。 
呼吸方法 上拉时吸气,到达顶点后呼气。下落时吸气,落到底点后呼气。 
注意要点 上拉时,身体不要摇摆借劲。这一动作也可用哑铃,侧卧来做。  
三角肌后部

俯身侧平举
起始姿势 两足开立,向前屈体90度,两手握哑铃,两臂直垂肩下。 
动作过程 收缩三角肌后部,直臂从两侧平举起哑铃,直到与地面平行。静止一秒钟,再让两臂徐徐放下。 
呼吸方法 上举时吸气,下落时呼气。 
注意要点 上举和下放哑铃时,全身保持稳定,不要摇摆。意念集中在三角肌后部。上举前,要彻底放松,到达最高点时,要彻底收缩。这一动作也可俯卧在长条凳上做。

直立推举
起始姿势 把杠铃从地面上拉到胸上,全身直立。 
动作过程 两臂向上直推至完全伸直,静止一秒钟,让杠铃慢慢下落到胸上。 
呼吸方法 上举时吸气,下落时呼气。 
注意要点 上举和下放杠铃时,身体不要摆动。该动作对上臂三头肌也有较大锻炼作用。如将杠铃下落到颈后肩上,则对三角肌后部有更大的锻炼作用,称为颈后推举。胸前和颈后的推举,也可坐在凳上做。还可用哑铃,左右两臂同时作交替的上推和下落,如此做,则可在上推和下落时吸气,静止时呼气。
胸大肌

平卧举
起始姿势 仰卧长凳 将杠铃放在乳头上方 
动作过程 将杠铃垂直上举至两臂完全伸直,胸肌彻底收缩,静止一秒钟,慢慢下落。 
呼吸方法 上举时吸气,下落时呼气。 
注意要点 上举时背部、臀部要平贴凳面,两脚用劲下踏 

上斜卧举
起始姿势 头朝上斜卧长凳30-45度 , 两手正握杠铃置于胸部上方 
动作过程 把杠铃垂直上举至两臂完全伸直,静止一秒钟,慢慢下落徐徐至原位 
呼吸方法 上举时吸气,静止时呼气。徐徐下落时吸气,落到原位时呼气。 

下斜卧举
起始姿势 头朝下斜卧长凳, 两手正握杠铃置于胸部下方 
动作过程 把杠铃垂直上举至两臂完全伸直,静止一秒钟,慢慢下落徐徐至原位 
呼吸方法 上举时吸气,静止时呼气。徐徐下落时吸气,落到原位时呼气。 

仰卧飞鸟
起始姿势 仰卧长凳上,两手拳心相对,持哑铃;两臂向上直伸与地面垂直,两脚平踏地面。 
动作过程 两手向两侧分开下落,两肘微屈,直到不能更低时止。静止一秒钟,让胸大肌完全伸展,然后将两臂从两侧向上,回合到开始位置。 
呼吸方法 两臂拉开时吸气,回复时呼气。 
注意要点 两手不要紧握。分臂时,背部肌肉要收紧。意念集中在胸大肌的收缩和伸展上。 

卧式两臂上拉
起始姿势 仰卧长凳上 , 两手正握哑铃或杠铃,两臂直伸,与地面平行。两脚平踏在地面或长凳上。 
动作过程 两臂保持平伸,将把哑铃或杠铃向上向后拉,并下落到可能的最低点。静止一秒钟,让胸大肌尽量拉伸。然后,收缩胸大肌,把两臂拉向上,拉向前,直至下落到腿侧开始位置。 
呼吸方法 向上向后拉时吸气,向上向前回复时呼气。 
注意要点 后拉时,让两臂充分向后直伸,前拉时,让两臂充分向前直伸。该动作也可两手并握一较重的哑铃来做,因两手握距较狭,重量集中在杠中央,对发展胸大肌靠人体中线的边沿部分有较大作用。
股四头肌

后蹲
该动作不仅锻炼股四头肌和臀大肌,还可使下半身得到全面锻炼。  
起始姿势 站在深蹲架前,屈膝,两手握住深蹲架上的杠铃并担负在颈后肩上。向前走两步,两脚开立,略宽于肩,足趾稍向外撇,身体伸直 
动作过程 屈膝下蹲到大腿上面和地面平行或稍低,静止一秒钟,大腿和臀部用力使两脚蹬地,使身体回复到直立。按规定次数和组数重复再做。完成后,退回几步,把杠铃放回深蹲架上。 
呼吸方法 下蹲时呼气,起立时吸气。 
注意要点 在做整个动作的过程中,背部要平直,上体勿前倾,臀部不要后突,后腰要下塌,动作要稳定。腿部快伸直时,用力挺直膝关节。 

前蹲
起始姿势 站在深蹲架前,屈膝,两手握住深蹲架上的杠铃托在胸前肩上。向前走两步,两脚开立,略宽于肩,足趾稍向外撇,身体伸直 
动作过程 屈膝下蹲到大腿上面和地面平行或稍低,静止一秒钟,大腿和臀部用力使两脚蹬地,使身体回复到直立。按规定次数和组数重复再做。完成后,退回几步,把杠铃放回深蹲架上。 
呼吸方法 下蹲时呼气,起立时吸气。 
注意要点 在做整个动作的过程中,背部要平直,上体勿前倾,臀部不要后突,后腰要下塌,动作要稳定。腿部快伸直时,用力挺直膝关节。 

腿举
起始姿势 仰卧在“腿举架”的底板上,蜷缩双腿让整个脚底顶住加重板的底面。 
动作过程 两腿用力向上蹬板,到两腿完全伸直,同时尽力收缩股四头肌。静止一秒钟,屈膝,让加重板慢慢下降到先卡定的高度。重复再做。 
呼吸方法 用力蹬板时吸气,回降时呼气。 
注意要点 仰卧时,臀部正对加重板的中心下方。蹬板时,整个脚底平贴住板底。 
股二头肌 

坐式腿屈伸
起始姿势 坐在专制长凳上,在滚轴的另一边加上所要重量的杠铃片,两脚勾住滚轴,小腿与大腿成90度角。 
动作过程 两腿用力收缩股四头肌,伸直膝关节,使小腿向上挺直。静止一秒钟,垂下小腿,重复再做。 
呼吸方法 用力蹬板时吸气,回降时呼气。 

立式腿弯举
起始姿势 站在一高木块或矮凳上,一脚系一哑铃,自然直悬在木块外,另一腿支撑体重,一手或两手扶墙或木条。 
动作过程 屈膝,把小腿用力尽量向后弯起,静止一秒钟,同时尽力收缩二头肌。自然垂下小腿到原来位置,重复再做。 
呼吸方法 弯起小腿时吸气,下垂时呼气。 
注意要点 弯起小腿时,不要让大腿前后摆动。 
小腿肌肉群

俯卧腿弯举
起始姿势 俯卧在专用长凳上,两脚踝伸钩在滚轴下面,滚轴另一面加上所要重量的杠铃片。 
动作过程 屈膝,把小腿向后弯起,到最高点时尽力收缩二头肌。静止一秒钟,伸直下小腿到原来位置,重复再做。 
呼吸方法 弯起小腿时吸气,放下时呼气。 
注意要点 弯起小腿时,大腿平贴凳面。如没有专用的腿弯举凳,可俯卧在普通的长凳上,脚系哑铃、杠铃片做。 

站立提踵
起始姿势 将杠铃放在颈后肩上,两脚开立,脚尖稍向里扣或外撇,脚掌站在垫木上,脚跟露在垫木外。 
动作过程 收缩小腿肌肉群,使脚跟尽量提高,使腓肠肌彻底收紧。静止一秒钟,放下脚跟,还原。重复再做。 
呼吸法 提起脚跟时吸气,放下时呼气。 
注意要点 脚跟上提和下降时要注意保持重心稳定,身体踮高时,前额要领先上提。下降时,要让脚跟低于垫木面。
腹直肌 

仰卧起腿
起始姿势 仰卧平垫上或头朝上仰卧斜板上。两手握住头后方的固定物件,全身伸直。 
动作过程 收缩腹肌,将保持伸直的两腿向上弯起,直到可能的最大程度。保持一秒钟,再让两腿徐徐回落。 
呼吸方法 向上弯起两腿时吸气,回落时呼气。 
注意要点 下落两腿时,仍要控制腹肌,勿使下落过快。 

仰卧抬腿卷缩上体
起始姿势 平卧床上或地上。两膝弯屈,抬起小腿,勿使下降,两手抱头。 
动作过程 在保持小腿不下放的姿势中,尽力把上体向前卷缩,身体实际上不会上抬很高。 
呼吸方法 向前卷缩时吸气,回落时呼气。 
注意要点 向前卷缩时,腰要下沉贴床或地面,腹肌尽量收缩。  

悬杠屈膝缩腿
起始姿势 两手正握单杠,全身直垂杠下。 
动作过程 屈膝,把小腿尽力向上缩起,到最高点时,彻底收缩腹直肌一秒钟。然后徐徐下垂小腿,直到完全伸直。 
呼吸方法 缩起小腿时吸气,降落时呼气。 
注意要点 缩起小腿时要尽力把两膝向上提升。 

坐式缩腿
起始姿势 坐在凳边,两手向后撑在凳上。两腿向前直伸。 
动作过程 屈膝缩起小腿到可能的最高点。彻底收缩腹直肌一秒钟,然后徐徐降落小腿,直到完全伸直。 
呼吸方法 缩起小腿时吸气,降落时呼气。 
注意要点 本动作较简易,其作用大小全在膝部上提的高低和动作的快慢上。愈高愈慢愈大,反之愈小。
上臂三头肌

臂屈伸
起始姿势 两手正握或反握杠铃或两手合握一个哑铃。将其高举过顶后,屈肘,让前臂向后下垂。全身直立或坐在凳上。 
动作过程 两上臂贴近两耳,保持竖直,不摇动。收缩三头肌,逐渐伸展肘关节,把前臂向上挺伸,直到臂部完全伸直,三头肌彻底收紧。静止一秒钟,再屈肘,让前臂徐徐下垂到开始位置,使三头肌尽量伸展。 
呼吸方法 挺伸前臂时吸气,屈降时呼气。 
注意要点 挺伸前臂时切勿摆动上臂。  

俯身臂屈伸
起始姿势 向前屈体,单手握哑铃,另一手撑开或一手扶膝后腿上,让握铃的上臂贴靠身侧,与上体平行。屈肘,让前臂自然下垂。 
动作过程 上体和上臂保持不动,收缩三头肌,把前臂向后上方挺伸,直到臂部完全伸直,同时彻底收缩三头肌。静止一秒钟,再屈肘,让前臂徐徐下垂到开始位置。 
呼吸方法 挺伸前臂时吸气,下垂时呼气。 
注意要点 挺伸前臂时尽可能勿使上臂上下摆动,臂部完全挺直后,还要把手腕往上抬,使三头肌收缩更彻底。  

卧式臂屈伸
起始姿势 平卧长凳上,两手反握或正握杠铃,向上举起,两臂和地面垂直后,屈肘下垂前臂。 
动作过程 保持上臂不摆动,收缩三头肌,把前臂向上挺伸,直到臂部完全伸直,。静止一秒钟,彻底收缩三头肌,然后屈肘有控制地让前臂徐徐下垂到开始位置,充分伸展三头肌。 
呼吸方法 挺伸前臂时吸气,下垂时呼气。 
注意要点 挺伸和下垂前臂时,上臂要保持原位不摆动。  

直臂后抬
起始姿势 身体直立,两手反握或正握杠铃,置于身后。 
动作过程 保持两臂伸直,将杠铃尽量向后上方抬起。最后,向上屈转手腕,并尽力收缩三头肌,静止一秒钟,下降杠铃到原位。放松三头肌。 
呼吸方法 臂部后抬时吸气,回降时呼气。 
注意要点 抬臂时,身体不可晃动,抬到可能的最高点屈转手腕,才能使三头肌彻底收缩。 

双臂胸前屈伸
起始姿势 两手在胸前握一根连接拉力条的弯把,握距与肩同宽或稍窄或合紧。上臂贴靠两肋。屈肘,弯起前臂。 
动作过程 保持上臂不动,收缩三头肌和前臂的肌肉,将弯把用力下压到臂部完全伸直。静止一秒钟,尽力收缩三头肌,屈肘,让弯把徐徐回到原位。 
呼吸方法 弯把下压时吸气,缩回时呼气。 
注意要点 弯把下压时,务必低到两臂完全伸直。上臂要固定不动。虽然前臂也需用力,但意念要注意三头肌的伸缩。  
上臂二头肌

两臂弯举
起始姿势 全身直立,两手仰握杠铃,两臂下垂。 
动作过程 上臂尽量保持不摆动,屈肘,弯起前臂到可能的最高点,同时收缩二头肌,静止一秒钟。松展肘关节,让前臂徐徐下落到两臂完全伸直。 
呼吸方法 弯起前臂时吸气,回落时呼气。 
注意要点 要依靠二头肌的力量使前臂向上弯起,在前臂弯起到最高点时,彻底收缩二头肌一秒钟,而不是立即放松它。不要在弯起前臂时让两肘随之向前上方摆动来使前臂上弯得更高。 

单臂蹲坐弯举
起始姿势 蹲在地上或坐在凳上,一手握哑铃,让上臂贴在大腿内侧,前臂向下直垂。另一只手扶压在另一大腿上。 
动作过程 收缩握铃一臂的二头肌将前臂向上弯起,到可能的最高点时,彻底收缩二头肌一秒钟,然后伸展肘关节,让哑铃徐徐下落到开始位置。练完一侧,换练另一侧。 
呼吸方法 弯起前臂时吸气,下垂时呼气。 
注意要点 让上臂贴靠大腿是为了确保不在弯起前臂时移动肘部。 

两臂斜板弯举
起始姿势 立在斜板后,两手握杠铃,手心向上,将整个臂部或是上臂平贴在斜板上。 
动作过程 收缩二头肌,将前臂向上弯起,直到可能的最高点时,彻底收缩二头肌一秒钟,然后慢慢松展肘关节,让杠铃徐徐回落到板上。 
呼吸方法 弯起前臂时吸气,落下时呼气。 
注意要点 平贴在斜板上的臂,先要尽量向下伸直。上弯前臂时,肩部丝毫不可上缩。 


前臂 

腕弯举
起始姿势 两手反握杠铃,蹲坐下来。将前臂贴放在大腿上,把手腕向前伸出,垂于膝盖前,两手也可正握杠。反握主练前臂内侧肌肉。正握主练前臂外侧肌肉。也可把上臂贴靠在平板或斜板上做或用哑铃左右轮流做。 
动作过程 前臂平贴大腿,只把手腕尽力向上、向内屈转(收缩屈指肌),直到不能再屈转时,静止一秒钟。放松前臂肌肉,让手腕向前回落。 
呼吸方法 屈转手腕时吸气,回落时呼气。 
注意要点 屈转到最后时,一定要尽力收缩前臂肌肉(屈指肌)一秒钟,再逐渐放松。
上背部

立式耸肩
起始姿势 身体直立,两手用正(俯)握法握杠铃或哑铃,握距稍宽于肩。 
动作过程 先让肩部尽量下倾,两臂完全不使劲,然后耸起两肩(主要是收缩斜方肌),静止一秒钟,松下肩,重复再做。 
呼吸方法 耸起肩部时吸气,松下时呼气。 
注意要点 耸起肩部把杠铃稍稍上提要完全靠收缩斜方肌所产生的力量,两肘不能丝毫弯曲。 

直立划船
起始姿势 两脚自然开立,两手握杠,用上握法握距比肩狭(可窄到两拳在杠中央相接)。 
动作过程 把杠铃徐徐向上拉起,直到横杠几乎触及颏部。静止一秒钟,让杠铃徐徐下垂到两臂完全伸直,重复再做。 
呼吸方法 杠铃上拉时吸气,下垂时呼气。 
注意要点 上拉时要让横杠尽量贴近身体。如握把较宽,杠铃上提时让两肘尖向上上拉时身体不要摆动。下垂杠铃要徐徐而行,最后要让杠铃尽量下垂到可能的最低点。 
中背部

引体向上
起始姿势 两手用宽握距正握(掌心向前)单杠,两脚离地,两臂身体自然下垂伸直。 
动作过程 用背阔肌的收缩力量将身体往上拉起,直到单杠触及或接近胸部。静止一秒钟,使背阔肌彻底收缩。然后逐渐放松背阔肌,让身体徐徐下降,直到回复完全下垂,重复再做。 
呼吸方法 将身体往上拉时吸气,下垂时呼气。 
注意要点 上拉时意念集中在背阔肌,把身体尽可能的拉高,上拉时不要让身体摆动。下垂时脚不能触及地面。可在腰上钩挂杠铃片来加重。  

坐式下拉吊棍
起始姿势 坐在凳上,两手用宽握距向上伸直,正握(掌心向前)吊棍。 
动作过程 收缩背阔肌,将吊棍尽力往下拉,直到触及颈后肩背部或是触及前胸。然后慢慢放松背阔肌,让吊棍缩回到两臂伸直拉住的高度。 
呼吸方法 将吊棍下拉时吸气,松回时呼气。 
注意要点 应将意念集中在背阔肌收缩和放松的控制上。若坐着的高度不合适,可立着做或跪着做。  


俯身划船
该动作是锻炼背阔肌的基本动作之一,可用杠铃、哑铃等来做。用杠铃时,握距宽时,并上拉到触及腹部时,对背阔肌下端有较大锻炼作用。握距窄,并直接上拉到触及胸部时,对背阔肌上部影响较大。若用哑铃,可左右手交替做或用单个先练一边,再练另一边。  
起始姿势 屈膝,上体前倾,两臂直垂握杠,应使杠铃稍离地面。头不要低垂。 
动作过程 收缩背阔肌,将上臂上拉,把杠铃尽量拉高,静止一秒钟,让杠铃徐徐下降到两臂完全伸直下垂。 
呼吸方法 上拉杠铃时吸气,放下时呼气。 
注意要点 上拉时要想着让主要力量来自背阔肌的收缩,而不是臀部。上拉时,腰要收紧,上体尽量不摇动,腿部用力,臀部后移,以保持平衡。如做单臂划船,另一手可撑扶在膝上或凳上。 
下背部

直腿硬拉
起始姿势 两脚开立,比肩稍狭。向前屈体,不要屈膝。两手用正、反握握杠,握距稍宽于肩。勿低头。 
动作过程 收缩下背部肌肉,把上体向上向后挺起,两肩尽量后移。最后,尽力收缩骶棘肌,静止一秒钟,再慢慢屈体向前,直到杠铃片几乎触及地面。如欲加大后背部的屈伸幅度来加大锻炼效果,两脚放在垫木上,杠铃放在地上。 
呼吸方法 上拉时吸气,放下时呼气。 
注意要点 两腿始终直立,膝部勿弯曲。意念要始终在后背部。动作平稳,用大重量,但又切勿过重。切勿突然用大重量。也可屈腿做这个动作,称为“屈腿硬拉”,对下背部的锻炼作用稍小,但有助于锻炼股四头肌。 

负重躬身
起始姿势 颈后肩负杠铃,两手用宽握距握杠,全身直立。 
动作过程 慢慢向前屈体躬身,直到上体与地面平行,静止一秒钟,身体向上挺起,直到回复全身直立。 
呼吸方法 向前屈体时吸气,挺起时呼气。 
注意要点 屈伸上体时,应始终保持挺胸收腹紧腰和两脚伸直。两手紧握横杠,勿使在颈椎上滑动。挺起时有意识的彻底收缩骶脊肌。  

超度挺身
起始姿势 俯伏在长凳上,让上身前滑,直到小腹贴在凳边。向前屈体,让上体直向下垂。让一同伴压住或坐在小腿上。两手交叉放在胸前。若要增大抗力,还可抱一杠铃片在胸前。 
动作过程 上体尽量向上挺,到最高点时,静止一秒钟。然后慢慢回复。 
呼吸方法 上体挺起时吸气,前屈时呼气。 
注意要点 向上挺伸时应尽力收缩骶脊肌,动作不要过快。

健美知识大全


一、健美运动的概念

    健美运动是一项通过徒手和各种器械,运用专门的动作方式和方法进行锻炼,以发达肌肉、增长体力,改善形体和陶冶情操为目的的运动项目。它是举重运动的一个分支,也是一个独立的竞赛项目.

    健美运动可以采用各种徒手练习,如各种徒手健美操、韵律操、形体操以及各种自抗力动作。也可采用各色各样轻重不同的运动器械来进行练习,如杠铃、哑铃、壶铃等举重器械,单杠、双杠等体操器械,以及弹簧拉力器、滑轮拉力器、橡筋带和各种特制的综合力量练习器等。

    健美运动的动作方式也是多种多样,既有成套的各种徒手健美体操,也有球、棒等轻器械体操,这些主要用于女子健美训练,借以减肥和改善体形体态,提高韵律感。更有许多能发达身体各部位肌肉的举重练习动作和其它动作,这些动作主要用于男女竞技健美训练。

    为了达到健美的目的,这就需要有专门的训练方法。例如。采用举重等器械做各种动作时,在器械的轻重,动作的做法、次数、组数、速度等方面,就都有特殊的要求和安排。

    健美运动作为一个运动项目,除了具有一般体育活动所共有的能锻炼身体、增进健康、增强体质的作用外,还特别能发达全身各部位的肌肉,增长体力,改善体形体态,以及陶冶美好的情操。它不仅强调"健",而且强调"美",把体育和美育融为一体。

    健美运动是举重运动的一个分支。在长期的发展过程中,广义的举重运动已经一分为三,发展成为三个相对独立的运动项目。即竞技举重,又称奥林匹克举重,通称举重;健美运动,又称健身运动;力量举重。其中健美运动也是一个独立的竞赛项目,它有自己的竞赛动作, 世界锦标赛和国际组织。

1:竞技举重

    a:竞赛项目:抓举、挺举
    b:国际举重联合会(IWF),1920年成立。

2:健美运动

    a:竞赛项目:规定动作、自选动作
    b:国际健身联合会(IFBB)1949年成立。

3:力量举重

    a:竞赛项目:后深蹲、卧推、硬拉。
    b:国示力量举重联合会(IPF)1972年成立。

    健美运动不仅包括以比赛为目的的竞技健美,也包括以减肥或改善体形体态为目的的群众性健美操活动.

二、人体健美的标准 

    从古至今人们都执著地追求人体美,但是,由于人们所处的时代不同,文化程度、社会经历、职业、性别、年龄、民族等的差异,对什么是人体美却都有着各不相同的看法。

    我国体育美学研究人员胡小明根据中国的实际情况提出了如下人体美的标准:“骨骼发育正常,关节不显粗大突出;肌肉均匀发达,皮下脂肪适当;五官端正,与头部配合协调;双肩对称,三角肌宽大且圆;脊柱正视垂直,侧看弯度正常;胸廓隆起,正背面略呈V形,女性胸廓丰满而有明显曲线;腰细而结实呈圆柱形;腹部扁平,男子有腹肌垒块隐现;臀部圆满适度;腿修长,大腿线条柔和,小腿腓部稍突出,足弓高。”

    人体美是健、力、美三者的结合与统一,它包含了生长发育健康而又完善的机体,发达有力的肌肉,优美的人体外形和健康向上的精神气质。

男性健美的标准

1.肌肉发达,体魄健壮

    肌肉是人体力量的源泉,同时也是力的象征,因此,健美的体型、健壮的体魄是和发达的肌肉密切相关的。在艺术家、人类学家和体育家的眼里,发达的肌肉和健壮的体魄是人体美的重要因素。

    有了发达的颈肌能使人颈部挺直,强壮有力;发达的胸肌(胸大肌、胸小肌)能使人的胸部变得坚实而挺拔:

    发达的肱二头肌、肱三头肌及前臂肌群,可使手臂线条、鲜明,粗壮有力;

    覆盖在肩部的三角肌可使肩部增宽,加上发达的背阔肌,就会使躯干呈美丽的V形;
        
    有力的骶棘肌能固定脊柱,使上体挺直,不致弓腰驼背;

    发达的腹肌能增强腹压,保护内脏,有利于缩小腰围,增强美感;

    发达的臀部肌肉和有力的下肢肌肉,能固定下肢,支持全身,给人以坚定有力之感。

    总之,发达而有弹性的肌肉是力量的源泉,也是健美的象征。

2.体型匀称,线条鲜明

    体型主要反映人体的外部形象,无疑是构成人体健美的重要因素之一。

    从研究人体美的角度来看,以脂肪所占的比例,肌肉的发达程度,并参照肩宽和臀围的比例,作为划分体型的条件比较合适,这样可将体型分胖型、肌型(或运动型)和瘦型三类。

(l)胖型:其特点是上(肩宽)下(臀围)一般粗,躯干象个圆水桶,腰围很大。腹壁的脂肪很厚,在腰两侧下垂,腹部松软,肚脐很深。胸部的脂肪多而下坠,有些女性化。一般都短粗颈、双下巴。体重往往超过标志体重(身高-100)约30-50‰

(2)瘦型;其特点和胖型相反,腰围很小,一躯干上小下大,肩窄,胸乎。四肢细长,肌肉不丰满,线条不明显。颈部细长,无双下巴。体重小于标准体重25一 35%。

(3) 肌型(运动型):其特点是肩宽、臀小,背阔肌大,上体呈倒三角形。腰围较细,腹部肌肉的显。四肢匀称,肌肉发达。颈部强壮有力,无双下巴。体重少于或超过标准体重5%左右。

    经常从事各项体育活动的人,特别是运动员,多为肌型(运动型)。他们身材匀称,肌肉发达,线条鲜明。

    知道了体型分类,就可通过健美锻炼来改善自己的体型,身体肥胖的通过锻炼来减肥,身体瘦弱的也可以通过健美锻炼来增加体重,力求使体格强健而匀称,肌肉发达而柔和。

3.精神饱满,坚韧不拔.

    精神饱满其外在的表现是皮肤健美、姿态端正、动作潇洒,其内在的表现则是富有朝气、勇敢顽强、坚韧不拔;

(1)皮肤健美。这是人体美的重要表征。苏联著名诗人马雅科夫斯基称颂结实的肌肉和古铜色的皮肤是世界上最美丽的衣裳。的确,皮肤是健康状况的镜子,红光满面气色好的人才有精神;相反,脸色发灰精神疲惫的人,往往是身体衰弱多愁善感的病人。红润光泽的肌肤和经常锻炼、适当的营养、正常的生活制度以及乐观的情绪等因素有关。我们应注意经常锻炼身体,保护好皮肤。

(2)姿态端正,动作潇洒。中华民族有着悠久的文明历史,历来重视人的一言一行、一举一动。

    优美的坐姿应该是抬头、挺胸、直腰、收腹。切忌含胸弓背,因为这是造成脊柱弯曲、腰背疼痛的病因,而这样的坐姿也必然会使人显得精神萎靡不振。

    优美的站姿应该"三挺一睁",即挺颈、挺胸、挺腿,两眼圆睁。要目视前方,头颈、躯干和脚在一条垂线上,两臂自然下垂。切忌弓腰挺腹,过分偏移重心至一腿的站姿。长期这样会造成脊柱变形、一肩低垂等毛病。

    优美的走姿不是一摇三晃,也不是八字横行,而应该保持身体在直、挺胸宜腰、微收小腹的姿态,膝和足尖始终正对前方行进,两臂自然摆动,步伐稳健而均匀。

    总之,优美的姿态和潇洒的动作。既符合人体解剖学和生理学的规律,又能给人以健美的印象。

(3)勇敢坚定,坚韧不拔:中华民族历来重视人的精神气质,在赞美英雄的形象和力量的同时,总要更突出地称颂英雄的宏伟气魄。人是一个有机的统一的整体,同样,人体美也同外部表现的形体美和内在体现出的精神气质美的和谐统一,两者有机结合才能称得上真正的健美。因此,必须具有勇敢无畏的精神,坚韧不拔的顽强意志。刚毅果断的性格和良好的品德修养。这种美发自心灵深处,却又能通过人举一动、一言一行而在外部表现出来,并使得别人能够境受得到。这就要求在进行健美锻炼的同时,必须注意加强思想作风、意志品质、精神气质的锻炼和修养。

    总之,男性应该具有发达的肌肉、健壮的体魄、匀称的体型、魁梧的身材、端正的姿态、潇洒的风度,以及发自心灵深处的勇敢无畏、刚毅果断、坚韧顽强的精神气质的阳刚之美。

三、健美运动的作用 

    长期进行健美锻炼,能够发达肌肉、增长力量;增进健康、增强体质;改善体形体态、矫正畸形;调节心理活动,陶冶美好情操;提高神经系统机能,培养顽意志品质。

(一)发达肌肉,增长力量

    健美运动的一个突出作用是可以有效地发达全身肌肉,增长力量。在人体中,由肌肉、骨骼、关节和韧带等共同组成了运动器官,使有机体得以进行各种各样复杂精细的运动,而一切运动的原动力就是那些大大小小的肌肉。由于健美比赛中评分的主要标准之一是肌肉的发达程度,所以,健美训练中要经常采用各种各样的杠铃、哑铃等负重动作,对全身各部位肌肉进行锻炼,特别是每次练习几乎都是极限练习,因此能够使肌肉得到强烈的刺激,从而使肌纤维增粗,肌肉中的毛细血管网增多,肌肉的生理横断面增大,肌肉变得丰满结实而发达,也就是通常所说的肌肉块头增大了。此外由于中枢神经系统调节机能的改善,特别是神经过程的强度和集中能力的提高;在力量训练的影响下,肌细胞内的肌动蛋白和肌球蛋白等收缩物质含量的增加;脂肪的减少,从而使肌肉的粘滞性减小。所有这些变化的结果,导致了肌肉力量的很大增长。特别是某些局部肌肉群的力量,能达到相当高的水平。例如,某些最轻级别健美运动员的卧推成绩竟能达到100千克以上,个别健美运动员甚至能用90千克伪杠铃做弯举和颈后臂屈伸动作,由此可见其惊人的臂力。

(二)增进健康,增强体质

    经常从事健美锻炼,能对心血管系统、呼吸系统和消化系统等各内脏器官的功能产生良好的影响。

    健美锻炼可使心肌增强。心脏容量增大,血管弹性增强,从而提高心脏的收缩力和血管的舒张能力,使心搏有力,心输出量增加。心跳次数也可减少到约 60次/分钟,这样心脏休息的时间就增多了,出现了节省化的现象。由于心脏的工作能力和储备能力都提高了,这就能承受更大的负担最。健美锻炼还能使血液中的红血球、白血球和血红蛋自增加,从而提高身体的营养水平、代谢能力和对疾病的抵抗能力。

    健美锻炼对呼吸系统的机能也有良好的影响,它能提高呼吸深度。增加每次呼吸时的气体交换量,这既有利于呼吸肌的休息,又可提高呼吸系统的功能储备,从而保证在激烈运动时满足气体交换的需要,提高机能水平。健美锻炼还能提高消化系统的机能,因为肌肉活动时要消耗大量的营养物质(尤其是能源物质〕.这就需要及时的补充,同时,肌肉的活动可促使胃肠的蠕动增强,消化液分泌增多,使消化和吸收能力得到提高,食欲增加。综上可见,健美运动能有效地增进人体的健康水平,增强体质。

(三)改善体形体态。

  矫正畸形体形主要是指全身各部位的比例是否匀称、协调、平衡和谐,以及主要肌肉群是否具有优美的线条。体态主要是指整个身体及各主要部位的姿态是否端正优美。我国自古以来就很重视体态,强调一个人要站有站相,坐有坐相,俗话说“站如松、生如钟”。如果长时间不注意体态端正,就可能影响某些骨骼的正常生长和发育,如脊柱的侧屈以及含胸驼背等,影响体态美。健美运动的各种动作能给予身体某些部位的生长发育以巨大的影响,促使骨骼的生长和肌肉的发展。科学的训练还可减少肌肉中的脂肪含量。达到消脂减肥的目的。这些变化都能够有效地改善人的体形体态。如三角肌发达了,肩部就显得宽阔;背阔肌增大了。能使身体是美丽的倒三角形。腹肌发达了,就会使腹部扁平、坚实,使男子变得体格魁梧、肌肉发达、英姿勃勃、风度翩翩;女子变得体态丰满、线条优美、明朗多姿、秀丽动人。

    正因为健美运动的各种动作能给子身体某些相应的部位以巨大的影响,所以,当一个人的体态已经出现某些缺陷的时候,就可以针对性地选择某些适当的动作来进行锻炼以达到矫正畸形的作用。如四肢不成比例者,可以采用先练差的一侧的办法使之发达起来,以达到匀称协调;含胸驼背者。可多练些卧推举和扩胸动作,经过半年左右的锻炼,胸廓自然就会挺拔,肌肉也会发达充实起来。由于健美运动的这一作用,某些动作已被进一步用于医疗体育方面,以期恢复肢体的某些功能。
        
(四)调节心理活动,陶冶美好情操

    人的心理活动,其本质乃是大脑对外界客观事物的反映。现代生活的紧张节奏,会使人产生紧迫感、压抑感,而紧张的体力劳动和脑力劳动又会使人产生疲劳感。出现以上情况,可以通过休息、睡眠、沐浴、放松按摩等恢复措施使疲劳得以消除。但神经的疲劳是产生深度疲劳的主要因素,因此,除采用上述方法外,还可采用一些调节心理活动的积极措施,而健美运动则能起到这方面的作用。通过卓有成效的锻炼效果来吸引人的注意力,如通过一段时间锻炼后,肌肉增长了,多余的脂肪减掉了,体形健美了,人在心理上就会产生一种满足用通过优美明快的音乐,节奏鲜明而又活泼愉快的形体练习,来调节人的心理活动,松弛一下紧张的神经,转移和消除人的疲劳感、压抑感,使大脑得到积极的休息。健美运动还可以陶冶人的美好情操。爱美之心人皆有之,如果一个人执著地追求健与美,追求生活中真、善、美的东西,他就能自觉地抵制假、恶、丑的现象,感到生活很充实。因而在工作和学习中就会精神振奋、精力充沛、注意集中、充满信心。健美训练所带来的形体美、姿态美的良好变化.他也使人变得活泼开朗、朝气蓬勃。所以,健美运动是一种青春常在的运动,它可以调节人的心理活动,陶冶人的美好情操。

(五)提高神经系统机能,培养顽强意志品质中枢神经系统由脑和脊髓构成,而共最高指挥机关则是大脑皮层。它一方面担负着管理和调节人体内部各器官系统的活动,保持人体内部环境的平衡,另一方面则维持人体与外部环境的平衡。健美运动是在中枢神经系统的支配调节下进行的。反过来,进行健美锻炼也能提高中枢神经系统的机能水平。它能够提高神经过程的强度和集中能力,提高均衡性和灵活性,从而提高有机体对内外环境的适应能力。经常坚持健美锻炼的人,一般能睡得熟、睡得深,很少息神经衰弱症。

    健美训练中,肌肉经常要工作到极限,运动员要经常克服由于大运动量训练所带来的肌肉酸疼等疲劳感觉和各种困难,长期的刻苦训练,持以恒,坚持不懈,就可以培养顽强的毅力,培养不怕苦、不怕累、不怕疼痛、不怕枯燥的顽强意志品质。

四、健美运动的特点 

     健美运动是一项有着自己特点的体育活动,这些特点概括起来主要有以下四点:

(一)既可锻炼身体,增进健康,又可陶冶情操。

   美化身心,将体育和美育融为一体。一般的体育活动主要增进健康,增强体质,而健美运动则不完全相同,其名称本身就规定了它既要求 “健”,又要求“美”。它的练习动作和手段,教学训练的内容和方法,以至比赛的内容和评分标准等,都体现了这一点。所以,在练习中不应该单纯地追求把某些局部肌肉练得大一些,而且也要注意改善自己的体形体态,使其匀称、协调、优美;不仅要注意体形体态的仪表美,而且要自觉陶冶自己美好的情操,加强思想修养,注意语言美、行为美、心灵美。真正把体育和美育,外在美和内在美很好地融合在一起。

(二)能最有效地发达肌肉。

  健美训练的主要目的之一是发达身体各部位肌肉,健美比赛也是以全身肌肉发达程度为主要条件之一进行评分的。为此,健美训练中应经常采用各种各样的动作方式,进行反复多次的负重练习,每次练习的次数几乎都要接近或达到极限,给肌肉以强烈的刺激,从而促进新陈代谢活动,加强超量恢复过程,使全身各部位的肌肉得到最大程度的发展。

(三)设备简单,易于开展。

  健美运动可以徒手或依靠自抗力进行练习,也可利用各种简单的轻重器械进行练习,还可采用一些自制的土器械乃至简单的家具进行锻炼,总的来说,设备器材比较简单。对场地的要求则更低,只要有几平方米的地方就可以,因而比较容易开展。

(四)练习方式方法灵活、机动、多样,男女老少皆宜。

  健美的练习运作多种多样,有徒手和自抗力动作,有利用轻重器械做的各种动作,即使是重器械,也可根据需要自由调节重量、次数、组数,自由调节运动量。所以,它能够充分满足男女老少以及不同健康状况的人各不相同的需要,从而受到广大群众的喜爱。

五、国际健美运动发展简况 

     不同时代对美的追求是不一样的,古代的,健美观念以古希腊比较具有代表性。公元前8—6世纪,氏族社会解体以后的古希腊,形成了数以百计的城邦国家,他们把战争作为攫取财富的重要途径,为了战胜敌人。就需要强壮、矫健和耐久的斗士。于是身体结实、身手矫健的人物,就成了人们崇拜的对象。因此也就形成了他们特殊的健美观念。古希腊人认为:健美的人体是呼吸宽畅的胸部,灵活而强壮的脖子,虎背熊腰的躯于和块块隆起的肌肉。著名的古希腊哲学家苏格拉底(公元前469—399)认为,人的一切活动不能脱离身体,身体必须保持高效率的工作,力量与肌肉的美只有通过身体才能得到。衰弱是耻辱。他这样说也这样做,一生都坚持运动。另一位希腊哲学家苏格拉底的学生柏拉图(公元前427—347)也提出,要为保卫城乡而练就体魄刚健的战士,为造就完美和发展的人而献身。柏拉图的学生著名哲学家亚里士多德(公元前384—322)更提出: 要养成健美的体格而不是野蛮的兽性的性格。古希腊人主要是通过体育运动来塑造和培养健美人物的,四年一届的古代奥林匹克运动会等场所,就是炫耀力量和人体健美的场合。运动会桂冠获得者将受到英雄般的欢迎。国家出资修建健身场,青年人在那里练习跳跃、拳击、奔跑、投枪、掷铁饼,系统地锻炼机体和各部肌肉,把身体练得强壮、轻灵和健美。古希腊人还风行裸体艺术,在运动场上从事裸体运动,喜欢欣赏裸体人力量、健康、活泼的形态和姿势;在艺术上如绘画和雕塑。则塑造健、力、美三结合的人体。著名的《掷铁饼者》雕塑,就是这一时期的健美代表作,那灵活跳动的肌肉,充满了生命的活力。

     公元130—200年,古罗马有位著名的医生盖伦著书立,倡导健身运动。他将运动分为臂部、躯干和腿部运动,列举一些运动项目,如搬动和高举重物、爬绳、鹤嘴锄挖掘等。到了18世纪,德国著名体育活动家艾泽伦(公元1792—— 1846),开设了培训体育师资的课程,创造了哑铃、环等运动。这些形式的锻炼,既是现代竞技举重的起源,也是现代健美运动和力量举的起源。那时从事锻炼的人们,主要追求力量的增长,而在体形上并无特殊的要求,这些大力士们力大无比、肩宽腰粗,肌肉非常发达。

     从19世纪起,大力士们的体形逐渐有了改变。生于1868年的山道(Sandow)是健美运动的创始人,集健、力、美精华于一生。他既是体育家,又是表演家、艺术家。山道幼时体弱多病,后为古代角力士雕像的雄健体魄所吸引,每天锻炼身体,并从实践中摸索出一整套锻炼肌肉的方法,终于练就了一身赫格尔斯型的功夫,到22岁时。他的全身肌肉已非常发达。此后,他到英国、澳大利亚、新西兰和南美洲等地表演各种健美技艺和力的技巧,演毕即显露其全身发达的肌肉,并塑造各种姿势的人体形象,受到广泛的赞誉。山道还开设体育学校,宣传健美运动,创立健身函授班,向世界各地的健美爱好者传授健身训练方法。并著有《体力养成法》等著作。山道于1901年组织了世界首次健美大力士的比赛,晚年创办了世界第所健美运动学校。山道为创建和发展现代健美运动作出了卓越的贡献.

     20世纪初期,健美运动在英美等国得到了广泛的开展,《肌肉发达法》和《力之秘诀》等专著,以及《体育》、《力》、《大力士》、《健与力》、《超人》等健身杂志相继出版,英国《体育》健身杂志主编麦克法登著有健身著作50余本,对健美运动的开展作出了巨大贡献。

     1946年,加拿大人本·韦特和其弟弟健美大师裘·韦特一道发起创建国际健美协会,制订了健美比赛的国际规则,并开始举行正式的国际业余健美锦标赛。该组织目前已举行了43届健美锦标赛,拥有133个会员国(含地区)。由于本· 韦特的卓越贡献,他被推为该组织的终身主席。

     女子健美是在本世纪 40年代才兴起的运动项目。开始主要比身段、体姿和容貌。着游泳衣进行“选美”比赛,获得冠军给以“ X X 小姐”或“ X X皇后”的称号。 40年代中期,美国著名女体育家阿勃依·斯托克登经常在《力与健》杂志上发表关于女子应进行力量训练发达肌肉的文章,引起了各国的重视。50年代在男子健美比赛后,往往安排一些女子健美表演,女子进行肌肉训练已被越来越多的人所承认。到了60年代,美国一些大学中已把女子健美作为体育选修课内容之一。70 年代,已有了正式的女子健美比赛,1977 年10月在美国俄亥俄州举行了世界上第一次穿“比基尼”三点装的比赛。1980年国际健美协会正式成立了妇女委员会。国标健美协会的竞赛规则规定,女子健美比赛是按身材比例,体型、体态的匀称性、平衡性,肌肉发达程度,皮肤和容貌以及造型表演的艺术性等六个方面作为综合评分的标准。

     80年代初期,健美运动的又一枝奇葩健美操波及全球,这是以形体练习(包括发达肌肉的练习)为基础,并以舞蹈、体操动作配以迪斯科音乐节奏为主要内容的综合运动项目,由于它的健美价值而成为风靡世界的最受欢迎伪体育运动项目之一。美国在1985年开始举办一年一度的阿洛别克(Aerodic)健美操锦标赛。我国在1987年4月也正式举行了首届健美操邀请赛。

六、安全健身之道

    慢跑、快走、爬山、游泳、划船、骑自行车、跳健美援筹,都属于有氧的健身运动。它的好处是安全性高。虽然有氧运动是安全的,但若不遵守原则仍然会受伤。因此,为安全健身,应掌握和了解一些健身前、后及健身中应该注意的问题。

(一)、确保有氧

     无论是跑步、游泳、划船、登山还是做有氧健身操,一定要确保有氧(即心率在最高心率的65%一80%之间)。因为只有当运动时肌肉始终在有氧状态下才能更好地进行代谢、产生能量和分解脂肪,而不是运动量越大,时间越长就越好。在运动中,当你感到喘不过来气时,就表明机体已处在无氧状态下,这时候就应该及时调整运动量,将运动心率始终保持在有氧区内。另外,有氧运动的时间最好在30分钟以上,体力较好者可达1个小时。

(二)、健身时的正确着装

    有些人并不注意运动着装,随随便便,甚至有的人还脱去了鞋,认为光着脚更轻松。这都是不科学的。

    健身时应要穿着宽松、有弹性的衣服,以动作不受束缚为好。健身时一定要穿一双合脚的、弹性较好的鞋,这一点非常重要。因为人体在运动时,尤其是在跑跳时,地面对人体的反作用力通过脚上的鞋向上传导,对踝关节、膝关节、脊柱、大脑及内脏等都不同程度的冲击,时间一长就会造成关节的劳损和其它不良反应,如头晕、恶心等。而质量较好的鞋,以缓冲地面的反作用力,减少受伤的发生。

    追求时尚的女土和先生们在健身中心锻炼身体,如果穿上合体的健身服,会使你的形体清楚地呈现在镜子里,督促你不断加油。当形体向好的方向发展变化时,你会产生良好的心理感觉,增强你的自信心,令你更加努力。另外有弹性的健身服对松弛的肌肉有托扶的作用,会令你看上去不那么松懈,运动更加灵活自如。

(三)、注意运动卫生

    在进行锻炼时,应注意对关节的保护,避免关节过度屈伸;膝、踝关节要有缓冲等。运动后应注意身体的保温,有些人运动后马上洗冷水澡、吹电扇、冬天运动后到室外吹风去凉快等,这些都会对关节造成伤害。因为运动后全身的毛细血管都是张开的,经常受冷刺激,会导致关节炎的发生。

    运动中大量出汗,会消耗体内的水分,从而影响心脏的输出能力。所以在运动前1—2小时和运动中都要喝些水,但在运动中饮水不要过,运动后还要有计划地饮用些液体,不要等到口渴才想起补充。

七、初学健美应注意的事项

   1.最好在开始锻炼之前向内科医生咨询,特别当你有高血压,心脏病史,体重过重,或长期不参加运动。 

   2.你最开始的目标只是对健美锻炼有一个认识,不要用太重的重量,先选择容易学和安全的动作,不要期望太多太快。 

   3.一周锻炼3天(星期一、星期三、星期五或星期二、星期四、星期六),如你时间较少,也可每周锻炼2天。 

   4.每次锻炼不超过60-90分钟。

   5.只达到你所能承受的最大强度的70-80%。

   6.把注意力集中在大肌肉组的锻炼上。 

   7.缓慢有控制的进行每一动作,注意力集中在所锻炼的肌肉上。 

   8.在锻炼中用口和鼻呼吸,以吸取充足的氧气。 

   9.在每组动作之间休息1-2分钟。 

八、健美锻炼十问 

    (一) 健美锻炼是否受年龄限制?

    健美运动是不受年龄和性别限制的,男女老少均可参加。因为各人可根据自己的身体条件和体力强弱来确定练习的动作内容,选择锻炼器具和增减运动量。实践证明,不同年龄阶段的人,只要经过较系统的锻炼,都能取得较好的效果。

    (二) 健美锻炼要多长时间才能见效?

    见效的快慢因人而异。除了个人的身体条件不同以外,还与锻炼的程度和掌握动作的准确性有关系。所以有的人见效快,有的人则见效较慢。一般情况下,大多数人经过2-3个月的锻炼后,体力都会有明显的增长。 

    (三) 健美锻炼时,肌肉酸痛是怎么回事?

    刚开始锻炼的人,锻炼过后肌肉会感到酸痛,这是由于肌肉在运动时产生大量乳酸造成的,是正常的生理现象。 

    (四) 某些已经比较粗壮的肌肉还要不要进行锻炼?

    如果某些部位的肌肉已比较粗壮,对这部分肌肉可以少练,但不应完全停止锻炼。如果长期不锻炼,这部分肌肉的素质就会逐渐衰退,弹性和力量也会下降,对其它部位的健美有消极作用。 

    (五) 锻炼后何时肌肉增长得较快?

    一般情况下,锻炼开始后前2-3个月肌肉增长得较快。因为头二、三个月的锻炼给肌肉带来了前所未有的强烈刺激,使肌纤维突然扩张,从外表看肌肉增粗,所以觉得肌肉增长比较快。加大运动量与平衡营养可保持增速。 

    (六) 为何想锻炼的肌肉没有酸胀感?

    这是因为掌握动作的技术要领不够准确。例如有的人在做“划船”动作时,重量不轻,组数不少,次数也足够。可是,由于两手向上提拉杠铃时,两肘没有夹在体侧尽力往上提,使杠铃沿着腿上拉至腹部,而是两肘外展垂直向上提拉杠铃至胸前。其结果使背阔肌没有充分收缩,却让其它肌肉“代劳”。 

    (七) 什么季节进行健美锻炼最好?

    任何季节都是锻炼的好季节。夏季锻炼虽然汗流浃背,体力消耗较大,肌肉增长稍慢,可是对减少脂肪,雕塑肌肉线条,却是最佳时节。 

    (八) 经常进行健美锻炼会不会把肌肉练僵?

    经常系统合理地进行健美锻炼,不仅不会把肌肉练僵,而且还能对身体产生良好的作用,使肌肉发达起来。然而,如果违背科学的锻炼规律,就会引起过度疲劳,机体创伤或有肌肉僵硬的感觉。因此,按要求去做,循序渐进,特别是锻炼后,必须做放松活动,使肌肉得到完全放松。 

    (九) 停止锻炼后会发胖吗?

    参加锻炼应该是经常性的。要是由于环境和条件的改变不能继续进行健美锻炼时,可以进行其它体育活动。如果完全停止锻炼,而又维持原来的食量,就会造成供给大于消耗,体内多余的热量就会转化为脂肪,逐渐积存于体内。 

    (十) 为何越练越胖?

    越练越胖者不外乎两个原因,一是运动项目不对路,减肥锻炼应采取较长时间的有氧运动。二是没有适当的控制饮食,造成热量的吸收大于支出。因此,减肥锻炼既要严格坚持定时定量进餐,科学搭配营养,还要根据情况选择锻炼项目,对运动的量、强度、密度和时间,科学合理地进行安排。 

九、健美误区 

    要美,更要健康。请不要进入———

    误区一:不吃早餐

    有人误人为不吃早餐能减少热量的摄入,从而达到减肥的目的,殊不知不吃早餐对人体伤害极大,无益健康。

    误区二:固定食谱

    这样做固然减少了许多东西的摄入,但久而久之会使身体缺少全面的营养成份,有害无益。

    误区三:高纤维食品的摄入

    如果是精麦包,其中的高纤维在加工中已被去除,营养也不健全。

    误区四:混淆烦躁和饥饿

    有时心情不好,肠胃不适,误以为是想吃东西。

    误区五:缺钙饮食

    一味追求苗条,忽视了钙质的摄入,从而容易患骨质疏松症。

    误区六:以药物代替天然食品

    如一味服用营养品、维生素类药,而忽视了日常饮食。

    误区七:认为鸡肉比牛肉脂肪低

    其实去皮鸡肉为低脂肪,而鸡翅上胆固醇却很高。

    误区八:认为勤擦脸能保护皮肤

    其实如果经常用毛巾擦脸,特别是易长暗疮的皮肤,只能增加皮肤的分泌物,促进暗疮的生长,正确的方法是以按摩的方法洗脸。

    误区九:忽视颈部护理

    平日颈部受到化妆品、风沙、头发油能的污染侵袭,因而同样要每天加以清洁护理。

    误区十:油性皮肤不用涂润肤霜

    其实油性皮肤只是不应使用含油性成分高的润肤霜,但同样需要补充营养物质。

十、健美训练影响身高吗?

    有不少青少年朋友在进行健美训练时,常常对举重和深蹲类动作”敬而远之”。究其原因,是担心会把人压矮了,影响身体长高。其实,这种担心是没有科学根据的,也可以说是一种误解。

    我们知道,一个人的高矮取决于先天和后天两大因素。先天因素主要同遗传和种族有关。据研究,人的体长(身高)的遗传力高达0.75-0.92,即是说,男子身高约有75%、女子身高约有92%受到遗传变异的影响。男子只有25% ,女子仅有8%取决于后天其他因素。可见遗传对身高起着极为重要的作用。虽然父母高其儿女就不会矮,但高父母生下矮子女和矮父母生下较高子女的现象也不罕见。这说明其他因素对身高增长同样有很大的影响。从地域方面看,一般说来,寒冷地区的人间于热带地区的人,北方人高于南方人。

    俗话说:”腿长个子高。”在后天的众多因素中(包括营养健身健美锻炼左活条件、习惯、气候、地理环境和疾病等),尤其是青春期阶段下肢大、小腿长管状骨和脊柱骨的发育情况是影响人高矮的主要因素。这些长管状骨可分为骨骺和骨干两部分。在性成熟前,骨骺与骨干之间存在着一层骺软骨,称骺板或生长板。随着年龄的增加.骺软骨不断骨化变硬,同时不断长出的软骨这样就保证了骨骼不断变长,身高不断增长,个子便不断地长高。一般来说女孩子到17~20岁、男孩子到20~25岁,四肢长骨骺软骨全部骨化,骨干和骨骺之间融合形成一条骺线,骨的长度停止增长,人的个子也就不长了。

    但是,近年来的科学研究证明:适宜的健美运动除能给骺软骨的增殖提供充足的动力对其施以有益的“机械按摩”外,在一定的负荷范围,动态压力更有于骺板的增长。在健美训练中采用负重推举或深蹲动作施加于下肢长骨的压力显然也将成为诱发骨骺生长的有利因素。尤其是设计和选择一套科学的健美训练方也更有利于骨骼、肌肉和韧带的纵向生长发育,有利于骺软骨的生长促使身体长高。因此,在骺软骨还没有停止生长以前,青少年应积极参加科学系统的健美训练,则是影响身高后天因素中最积极且最为有效的手段。

    至于骺板会不会因健美训练过早停止生长的问题,近年来国内外有些学者通过科学实验提出些新见解,但健美训练会促使提前完成骨化的资料却未见到。恰恰相反,我国的体育科研人员曾对15-16岁的男生的骨骺进行过动态观察,通过练习一年举重项目的对比情况来看,仅身高就比只从事一般体育活动的同龄少年高出约10厘米。确认全部被检查的学生骨骺发育正常,未见到骺板提前愈合的现象。因此得出练习举重不会引起抑制骨骺生长的结论。这一结论同样适用于青少年的健美训练。

    我们认为16岁以前的青少年参加健美训练一定要因人而异,训练初期,不论年龄大小都要强调全面发展利循序渐进。要合理安排运动量。免采用”成人模式的训练方法”。健美训练的关键问题是器械练习的重量。早期训练阶段应以他自己每组练习能重复完成15~20次的重量为标准,每次训练课练习5~8个动作,每周训练2~3次为佳。切忌采用集中训练某一局动作与方法。应尽量避免练习那些过于紧张、持续时间长、憋气的耐力性和静力性的练习动作。当有了一定的力量基础后,使可采用”重复循环健美训练法”,因为“重复循环健美训练法”不仅容易增长力量,能有效地提高心血管系统的功能和肌肉耐力而且能将许多软组织(骺软骨、肌腱、韧带、结缔组织等)受到的压力减到最小的程度。训练时教练员要认真监督辅导。监督辅导不仅是为了安全,更重要的是要让他们切实掌握正确的健美技术动作。

    17岁以后,人体逐渐发育成熟,这个阶段不但可以系统地进行健美训练而且还可适当增大健美训练的负荷。因为肌肉增长最快的年龄阶段是在17~19岁。所以青少年参加健美训练必须遵循这一运动生理特点。

    不少青少年朋友之所以把个矮和健美训练联系在一起可能是由于他们平日里看到的我国一些著名健美运动员的个子都比较矮(如王力劲身高1.64米、杨新民身高 1.68米、张萍身高1.57米、粱月云身高1.55米等)这一错觉而造成的。我们知道健美运动员的身体肌肉比重比一般人要多30%以上,而且健美运动员又是按体重的轻重而分级进行比赛的。这样同一体重在体型等其他条件相同的情况下,身材矮小的运动员从视觉感官上给人的印象是肌肉更显发达,这也是身材较矮而且肌肉又很发达的运动员比身材较高、肌肉又较不发达的运动员容易获得较好成绩的主要原因。当有些练健美的人在没有训练前,可能由于身体比较消瘦,这样从外观上就显得个子较高。而当他们练了一个时期以后由于全身肌肉块的发达,显得肩宽、臂粗、腿粗,腰细,身体健壮,所以就相对地显得不高了,实际上这也是一种视觉上的错觉。不太懂行的人自然就会得出”练健美会把人压矮,影响身体长高”的结论。

    其实,无论是国内还是国外.身材高大的健美运动员并不少(见表1),他们都是从青少年时就开始练健美的,然而他们的身高并未因此而受到影响。从我国99年全国健美锦标奏男女前15名运动员身高指标的统计表(见表2、3)可以看出他们的身高是符合人体生长发育规律的,也证明了科学,系统、正规的健美训练是不会影响身体长高的。

十一、健美冠军教你练健美 

    对于健美爱好者来说,波特·科尔这个名字应该是非常熟悉的。他是"冠军之夜"健美大赛冠军,在长期的训练中积累了丰富的经验,听听他的忠告,对于梦想拥有完美体态的健美爱好者会大有裨益。 

    科尔认为:如果你想成为一个真正的健美力士,就象电视上常看到的那种,甚至你想参加健美比赛,那么你必须有专门的教练指点,至少也得上专门的健美培训班,仅靠家庭健身器是不够的。 一般来说,健美的目的可以简单地归纳为三个方面:第一是减少脂肪(即减肥);第二是提高力量;第三是希望有健美的体魄。以上三个目标通过家庭健身器都可以实现吗?答案是肯定的。那么怎么实现呢?或者说,通过同一台器械,怎么达到不同的效果呢?关键的关键是力量的选择。 

    家庭健身器一般都可以调节力量的大小,这就是我们实现上述目标的基础。具体地说是这样的:

    如果你想减少脂肪,关键是轻负荷,大数量。锻炼时将健身器的力量调得小一些,标准是做起来很轻松,可以做很多次,一般要求至少能做20次以上。每次锻炼要做三组至五组。(注意:力量也不能太小,如果能做到50次以上,那就太轻了,是达不到效果的)。 

    力量训练与减肥刚好相反,它要求你将健身器的力量调大,标准是你用尽全身的力气也只能完成1-2次。每次锻炼要做二组至三组。(注意:为防止受伤,也不要太勉强) 

    如果你的目标是增加肌肉,那么训练的关键是适量的负荷与数量。练肌肉的力量调整介于上述两者之间,标准是你只能完成8-12次,再做就做不动了,那就对了。每次锻炼要做三至四组。 

    下面是科尔对健美过程中一些关键问题的回答: 

    时间:科尔认为一天之中最佳的锻炼时间是下午3点- 5点。当然除了专业运动员,大多数人这段锻炼的黄金时间也是工作和生活的最繁忙的时间,不太可能有时间去做健美。那么就不妨挑晚上8点左右锻炼,效果也不错。爱睡懒觉的朋友们,健美并不辛苦吧! 

    频率:健美运动并不需要每天做,而且每天做的效果并不好,最佳的效果是每周做三次,即隔天做,然后周末多休息一天。如果做不到,那么每周做二次也行,但不能再少了,否则就没有效果。对于以减肥为目的的朋友们,可以再多做一次。

    呼吸:在做健美运动时,正确的呼吸是相当重要的,可以起到事半功倍的效果。具体是:用力时吸气,尽量吸得深;放松时呼气,尽量排的彻底。 

    次序:就健美本身而言,是无所谓次序的。但由于我们都是业余训练,没有专门的人来保护你,所以正确的次序就相当重要了,它可以保护你免受意外伤害。具体是:先做下肢运动,再做胸背运动,再做上肢运动,最后做腹部运动。按以上的次序做一遍就称为一组。 

    辅助器械:家庭健身器的功能是有局限性的,有几个部位的肌肉是练不到的,因此你最好再购买一些辅助器械,其中最常用的是哑铃。如果经济条件许可,可购买一套不同重量的哑铃,反之购买一付可调节重量的哑铃也可。别小看小小的哑铃,它可做的运动相当多,它可以锻炼你的二头肌,三头肌,腕力,胸肌;将哑铃放在脖子下做仰卧起坐,效果相当好。 

    健美运动关键在于持之以恒。按以上方法坚持做,三个月后就会有明显变化,一年后一定会使你自己大吃一惊。为了检验健美的效果,你可以在决定做健美运动之前将自己身体各部位的尺寸量一下,记录下来(包括腰围、胸围、臂围等等),然后三个月或半年后再测量一下,你一定会信心大增。 

十二、帮你制定训练计划 

    如果你刚开始健美训练,那就应立即制订一个完全符合你的身体特点、工作性质和时间安排的训练计划。

    为了计划的准确制订和正确实施,你首先要选择一个好的健身房,好健身房的概念是:1.充足和实用的设备,2.专业健美教练。专业教练非常重要,他可以帮你制订计划,而且在你今后的训练过程中可以给你正确的指导,从而避免走弯路。如果你现在的教练是举重教练或其他不具备健美专业知识的人,那就应另择健身房,换一个教练。

    制订训练计划应遵循以下要点。

(一)、简单至上

    每个训练者刚开始时都想找到能令肌肉快速发达的训练秘诀,所以把明星的训练方法奉为至宝。但明星的训练方法大多都相当复杂,包含很多孤立练习,有些还是自创的动作,技术性很强,强度也很大。所以,明星们的训练方法并非初练者要寻找的秘诀。如果说健美训练有什么秘诀的话,那就是科学—训练的科学。对初练者而言,训练的科学就是简单的、基本的复合性训练,如卧推、深蹲、硬拉等等。尽管这些简单的动作很乏味,但效果却不容置疑。几乎每个冠军都是靠复合性训练获得了“超级大块”。八届奥林匹亚先生获得者李·哈尼在夺得全美冠军后才开始分部训练,在此之前他的训练计划中差不多全部是复合性练习。

    把基本的复合性训练列为“主菜”,目的是增强基本素质,练出大肌肉块,为将来的“精雕细琢”打下坚实基础。

(二)、目标明确

    你的训练计划最好用大纸、大字列出来,训练目标应用红笔写在最醒目的位置。它越明确越好,比如“我要练出60厘米围度的大腿!“或“体重 70公斤十8块腹肌!” 当你对枯燥的训练感到厌烦时,当你想偷懒时,那些醒目的字会深深地刺激你,让你为自己的惰性感到无地自容。

(三)、持续性和渐进性

    持续性和渐进性是制订训练计划的的两个重要原则。不坚持训练,肌肉就得不到持续的、有规律的刺激,以致生长迟缓;训练强度不增加,肌肉对所给予的刺激产生适应性,生长也会迟缓。一个有效的计划除了保证训练的持续性外,还要保证循序渐进地增加训练强度、频度、数量、强度是训练计划的三个要素。这些要素的量和度都决定于是否能保持训练的持续性和渐进性。所以,不要中断训练,不要错过一节训练课。反之,训练不能过频,训练量不能过大,增加重量不能急于求成,否则会造成训练过度,甚至会因负荷过大而受伤。那样你就不得不中断训练了。

(四)、频度

    频度是指一星期练几次。频度的设定取决于你训练后的恢复能力,恢复能力又取决于身体素质、睡眠和营养三个因素。另外,你的工作性质和家庭负担对恢复能力的影响也不容忽视。如果你的工作和家务每天都耗费很多体力和精力,那就会延缓你的恢复过程。

    一般来说,有工作有家庭的初级训练者一星期进行两个循环的重量练习比较合适。对学生而言,一周三个循环也可以。每个循环的具体安排视时间和身体状况而定,最好一个循环练两天,一天练上身,一天练腿。

    一周两循环是基于人体的平均恢复能力而言的,保证充足而不拖沓的恢复时间既兼顾了训练的持续性,也不会破坏训练的渐进性。

    一星期进行两个循环的重量练习能使时间比较宽松,体脂较大者还可在两个循环之间的休息日安排O-40分钟的有氧训练。但有氧训练的强度不能太大,以训练时心率120—140次为宜。

(五)、数量

    数量就是训练量,练多少组、每组多少次以及组间休息时间的长短等。

    首先,组数的安排不是固定的,但每个动作必须有一个热身组。热身组的作用是:1.加速代谢,进人训练状态;2.充分活动关节和韧带,避免受伤。

    其次,正式组以2—4组为宜,较少的组数有助于提高训练效率。每个正式组的次数6—12次,热身组不少于 20次。

    再次,每组之间的间歇时间一般不多于2分钟。间歇时间视身体状况而定,2分钟以上也是允许的,但不允许在休息时聊天或做其它影响训练的事情。否则不但拖延了训练时间,而且降低了训练效率,破坏了训练的持续性。

    最后,每次训练不要超过1小时,因为在无氧训练 40分钟后,一些影响训练的重要的内分泌激素就会大幅度减少,直到基本停止,以致造成肌肉损耗。对初级训练者而言,精简时间、提高效率是必须养成的习惯。

(六)、强度

    强度是指训练中你所承受的负荷水平。负荷水平价高低取决于三个因素:重量,训练间歇,力竭程度。“高强度”是指在训练间歇较短的前提下,每组都使用较大以重量训练至接近力竭。“力竭”的概念是“无能力完成一次”。“高强度”的要点是达到力竭的边缘,而不是力竭;因为力竭的时候肌肉无法完成一次完整的动作,肌肉收缩不充分肌纤维就得不到足够刺激。另外,力竭时肌肉对训练重量失去控制,随时都有受伤的危险。所以,完全力竭对初级训练者来说不可取。

    了解“高强度”的概念和要点对如何增加重量是极其重要的。因为增加重量就要影响训练次数和力竭程度。刚入门的朋友要注意,增加重量不可操之过急。下面介绍一种行之有效的方法。

    刚开始训练时,正式组使用的重量允许你完成的次数就是练至力竭的次数,它是:目标次数十5次。例如,你的目标次数为8次,那么所使用的重量应该允许你完成13次,而你完成8次就停下来。接下来的6-8周内,逐渐增加重量,直到所使用重量允许你完成的次数变为8-10次,而你仍是完成8次就停下来。保持这样的强度训练了2一3周,然后改变目标次数为6次,使用力竭次数为11次的重量训练。接下来仍然用上述方法增加重量。

    肌肉的生长决定于所受的刺激。经常改变重量、次数等可变因素,才能使肌肉对刺激保持敏感,不断生长。

    掌握以上六点可以帮助你制订一个适合自己的训练计划,而真正的考验是计划能否严格实施。树立了目标就要付诸行动,不要为了偷懒而找任何借口。健美运动是强壮体格的运动,也是增强意志的运动。懒惰就是懦弱,克服它。才会更强。

十三、你会用拉力器吗?

    拉力器作为大众健身锻炼的器械,深受广大健身受好者的欢迎。为了确保使用拉力器锻炼安全有效,必须注意以下几点:

    1.使用拉力器时,不要佩带笔、钥匙、小刀、徽章等锋利的物品和手表、手机、首饰等贵重物品,以免影响锻炼,造成损伤或不必要的损失。

    2.在使用钢丝弹簧拉力器前,要检查一下钢丝弹簧的钩子结构和安装是否牢固,以免滑脱,发生伤害事故。

    3.钢丝弹簧拉力器的最大拉伸距离为15O厘米;每条弹簧的拉力约为6千克。不可牵拉得过长,否则会使钢丝弹簧失去弹性。

    4.存放已久的钢丝弹簧、钢丝拉绳或橡皮条(带、管),如已生锈或发硬老化,不宜再用,以免在拉伸过程中发生断裂。

    5.使用钢丝弹簧拉力器或橡皮条拉力器前,拉力器的一端要牢牢地用手或脚踩住固定或固定在其它物体上,应握牢、踩牢、扎紧、固定好,防止滑脱或突然反弹回来造成伤害事故。

    6.使用钢丝弹簧拉力器时;要穿长袖运动服和运动长裤;钢丝拉力器不要紧贴身体,防止在钢丝弹簧拉神后收缩还原时夹伤皮肤和毛发。

    7.使用钢丝弹簧拉力器时,每条钢丝弹簧务必要约在大环上,用手握住手柄牵拉。不要握住几个大环牵拉,以防力量过于集中在钢丝弹簧圈上,把钢丝弹簧拉坏。

    8.使用完拉力器后,务必要用干布擦净橡皮条、钢丝弹簧及手柄或把手上的汗边。隔一段时间要在钢丝弹簧上、重锤钢丝拉绳上、滑轮上和杠杆的中轴上擦些润滑油,防止生锈。

    9.当动作完成后务必要用肌肉的力量控制弹簧、皮条或重锤缓慢还原,这既能避免弹簧、皮条或重锤钢丝拉绢发生碰撞和叠结现象;又充分发挥拉力器”退让性’锻炼的独特优点,使肌肉得到最大限度的刺激,从而收到最佳的锻炼效果。

    IO.在使用滑轮重锤拉力器前,必须要检查拉力器的完好与牢固程度;并要熟悉拉力器械的结构和使用方法,不要抓起滑轮重锤拉力器就牵拉,拿起滑轮重锤拉力器就推举,以防因器械失灵和散落等原因造成伤害事故。要查看滑轮重锤拉力器的插销是否插到位,螺丝是否松动、脱落,钢丝拉绳是否结实,握把和滑轮是否安装牢固,做到防患于未然。

    11.在使用拉力器的过程中,要养成运用护掌、握力带、半指手套、护膝、腰带和护腕等保护器材的良好习惯。例如在牵拉大重量的钢丝弹簧、橡皮条或重锤块锻炼时,需要系腰带保护腰部。因为做某些动作时,腰部会前后左右摆动,系腰带可使腰部相对固定;避免损伤。
        
十四、测试你的耐力 

    这是一组耐力测试方法,在开始之前,请先阅读注意事项:

    1、不要做任何使你感到疼痛的动作, 如果你有慢性疾病或近期有疾患,更应慎重;

    2、做好热身练习,一开始动作不要太猛;

    3、不要强迫自己,即使是为了多做一个动作,你的身体会告诉你何时该停下;

    4、不要与别人比赛,按照自己的速度来。

    沿一段约有15级台阶的楼梯走上去,再走下来,要尽量快,往返三次。完成之后,你应该可以进行一次正常的谈话,而不是气喘吁吁,上气不接下气。原地跑步,脚离地面至少15厘米,在感到有点吃力时就停下来。如果你在50岁以上,应该能将上述动作轻松地持续2分钟;年轻人,时间更长些。用一把坚固的小椅子,单脚站上去,另一只脚悬空,然后下来,换脚,重复进行。如果你在50岁以上,上述动作持续2分钟之后,你应该可以轻松自如地讲话;如果你在50岁以下,上述活动你要轻松地进行3分钟。如果你不能轻松地完成第3项测试,请勿进行此次测试。这次要求你慢跑1500米,时间依你的年龄而定。如果你是45岁以下的男子,应在10分钟之内跑完,女子可放宽到12分钟;如果在45岁以上,每超过5岁(不足5岁按5岁计),时间加长1分钟。据此,一位60岁的女士,应在15分钟之内跑完。

十五、初级锻炼课程

动作名称     主要锻炼部位   组数                     次数 
-------------------------------------------------------------------------- 
    跳绳     逐步加快血液循环                          200次  
              活动全身肌肉关节 
-------------------------------------------------------------------------- 
                                      第一组        第二组           第三组 
    后蹲         股四头肌      3组                                用开始重量, 
                                      8-12次    加10公斤 6-10次 
                                                        &nbs;         不限次数  
-------------------------------------------------------------------------- 
   腿弯举 
  (立式)      股二头肌       2组   8-12次       不限次数 
-------------------------------------------------------------------------- 
  弯身划船       背阔肌        3组   8-12次   加5公斤 不限次数 用开始重量, 
                                                                 不限次数。 
-------------------------------------------------------------------------- 
  立式划船   斜方肌、前锯肌   2组    8-12次  用开始重量,不限次数 
-------------------------------------------------------------------------- 
    卧举    胸大肌、肱三头肌   3组   8-12次  加10公斤 6-10次  用开始重量, 
                                                                 不限次数 
-------------------------------------------------------------------------- 
  颈后推举   三角肌、上背部   3组    8-12次  用开始重量,不限次数 
-------------------------------------------------------------------------- 
  两臂弯举      肱二头肌       3组   8-12次   加5公斤  6-10次  用开始重量, 
                                                                 不限次数 

        
-------------------------------------------------------------------------- 
   腕弯举          前臂        3组   15-25次  用开始重量,不限次数 
-------------------------------------------------------------------------- 
  下斜仰卧 
    起坐          腹直肌       3组   15-20次      不限次数      不限次数 
-------------------------------------------------------------------------- 
  自抗前后 
   颈屈伸          颈部        2组   10-15次      10-15次 
-------------------------------------------------------------------------- 
  负重提踵        小腿         3组  15-20次   加10公斤 10-15次 用开始重量, 
                                                                 不限次数 
-------------------------------------------------------------------------- 
        屈膝颤动-两脚分立,膝微屈,放松全身。屈伸膝部,颤动全身200次。 
-------------------------------------------------------------------------- 

十六、全身各部肌肉锻炼 

颈部肌肉锻炼

单手侧压颈屈伸

起始姿势

     一手按头右侧,另一手叉在左侧腰间。坐立均可。 

动作过程

     按在头右侧的手用力把头向左侧推压,而颈部则用力顶住,不让轻易压倒,但逐渐被压倒。然后,颈部用力把头向上向右抬起,而右手则用力压住头部,不让其轻易抬起,但逐渐完全竖直。如此反复多次,直到颈部感到酸胀。练完一侧,换练另一侧。 
    
呼吸方法

     一手用力侧压头部时吸气,压到底时呼气。 

注意要点

     注意不要用过大过猛的抗力,前几次用力要小些,再逐渐加大,以避免颈部扭伤。切勿让颈部有任何旋转,而只是屈伸。  

双手正压颈屈伸

起始姿势

     双手十指导交叉,按在脑后。 

动作过程

     双手用力压头部,使其向前下屈,颈部则用力顶住,不让轻易下压,但逐渐被压到颈部触及锁骨柄。然后,颈部用力把头向上抬起,而两手则用力压住头部,不让其轻易抬起,但逐渐抬到原位。 

呼吸方法

     两手用力压头时吸气,压到底时呼气。头部上抬时吸气,抬到原位时呼气。 

注意要点

     头部屈伸时,身体不要前俯后仰,注意不要用过大过猛的抗力,前几次用力要小些,再逐渐加大,以避免颈部扭伤。切勿让颈部有任何旋转,而只是屈伸。  

肩部肌肉锻炼

三角肌前部 前平举

起始姿势

    两腿直立,挺胸收腹。两手正握哑玲或杠铃,两臂下垂于腿前。 

动作过程

    直臂持铃向上举起,至稍高于肩。静止一秒钟,再直臂徐徐放下,还原至腿前。如用哑铃,可左右手各一次,连续交替做。 

呼吸方法

    上举时吸气,下落时呼气。 

注意要点

    上举和下落时全身保持直立,两臂保持直伸,意念集中在三角肌。 

三角肌中部 侧平举

起始姿势

    两脚自然开立,两手握哑铃,下垂于身体两侧。 

动作过程

    收缩三角肌,直臂向侧上方举起,直到略高于肩,静止一秒钟,再让两臂徐徐放下到下垂位置。 

呼吸方法

    上举时吸气,静止时呼气。下降时吸气,完全落下时呼气。 

注意要点

    上举和下落时,全身保持直立,不要摇摆弯曲,臂部保持直伸。 

三角肌后部 俯身侧平举

起始姿势

    把杠铃从地面上拉到胸上,全身直立。 

动作过程

    两臂向上直推至完全伸直,静止一秒钟,让杠铃慢慢下落到胸上。 

呼吸方法

    上举时吸气,下落时呼气。 

注意要点

    上举和下放杠铃时,身体不要摆动。该动作对上臂三头肌也有较大锻炼作用。如将杠铃下落到颈后肩上,则对三角肌后部有更大的锻炼作用,称为颈后推举。胸前和颈后的推举,也可坐在凳上做。还可用哑铃,左右两臂时作交替的上推和下落,如此做,则可在上推和下落时吸气,静止时呼气。 
        

胸部肌肉锻炼

平卧举

起始姿势

    仰卧长凳 将杠铃放在乳头上方 

动作过程

    将杠铃垂直上举至两臂完全伸直,胸肌彻底收缩,静止一秒钟,慢慢下落。

呼吸方法

    上举时吸气,下落时呼气。 

注意要点

    上举时背部、臀部要平贴凳面,两脚用劲下踏。 

上斜卧举

起始姿势

    头朝上斜卧长凳30-45度 , 两手正握杠铃置于胸部上方 

动作过程

    把杠铃垂直上举至两臂完全伸直,静止一秒钟,慢慢下落徐徐至原位 

呼吸方法

    上举时吸气,静止时呼气。徐徐下落时吸气,落到原位时呼气。 

下斜卧举

起始姿势

    头朝下斜卧长凳, 两手正握杠铃置于胸部下方 

动作过程

    把杠铃垂直上举至两臂完全伸直,静止一秒钟,慢慢下落徐徐至原位 

呼吸方法

    上举时吸气,静止时呼气。徐徐下落时吸气,落到原位时呼气。 

仰卧飞鸟

    该动作直接锻炼胸肌,可采用平卧、上斜卧、下斜卧位置 

起始姿势

    仰卧长凳上,两手拳心相对,持哑铃;两臂向上直伸与地面垂直,两脚平踏地面。 

动作过程

    两手向两侧分开下落,两肘微屈,直到不能更低时止。静止一秒钟,让胸大肌完全伸展,然后将两臂从两侧向上,回合到开始位置。

呼吸方法

    两臂拉开时吸气,回复时呼气。 

注意要点

    两手不要紧握。分臂时,背部肌肉要收紧。意念集中在胸大肌的收缩和伸展上。 

臂部肌肉锻炼 

上臂三头肌 臂屈伸

起始姿势

    两手正握或反握杠铃或两手合握一个哑铃。将其高举过顶后,屈肘,让前臂向后下垂。全身直立或坐在凳上。 

动作过程

    两上臂贴近两耳,保持竖直,不摇动。收缩三头肌,逐渐伸展肘关节,把前臂向上挺伸,直到臂部完全伸直,三头肌彻底收紧。静止一秒钟,再屈肘,让前臂徐徐下垂到开始位置,使三头肌尽量伸展。 

呼吸方法

    挺伸前臂时吸气,屈降时呼气。 

注意要点

    挺伸前臂时切勿摆动上臂。  

上臂三头肌 俯身臂屈伸

起始姿势

    向前屈体,单手握哑铃,另一手撑开或一手扶膝后腿上,让握铃的上臂贴靠身侧,与上体平行。屈肘,让前臂自然下垂。 

动作过程

    上体和上臂保持不动,收缩三头肌,把前臂向后上方挺伸,直到臂部完全伸直,同时彻底收缩三头肌。静止一秒钟,再屈肘,让前臂徐徐下垂到开始位置。 

呼吸方法

    挺伸前臂时吸气,下垂时呼气。 

注意要点

    挺伸前臂时尽可能勿使上臂上下摆动,臂部完全挺直后,还要把手腕往上抬,使三头肌收缩更彻底。

上臂二头肌 两臂弯举

起始姿势

    全身直立,两手仰握杠铃,两臂下垂。 

动作过程

    上臂尽量保持不摆动,屈肘,弯起前臂到可能的最高点,同时收缩二头肌,静止一秒钟。松展肘关节,让前臂徐徐下落到两臂完全伸直。 

呼吸方法

    弯起前臂时吸气,回落时呼气。 

注意要点

    要依靠二头肌的力量使前臂向上弯起,在前臂弯起到最高点时,彻底收缩二头肌一秒钟,而不是立即放松它。不要在弯起前臂时让两肘随之向前上方摆动来使前臂上弯得更高。 

上臂二头肌 单臂蹲坐弯举

起始姿势

    蹲在地上或坐在凳上,一手握哑铃,让上臂贴在大腿内侧,前臂向下直垂。另一只手扶压在另一大腿上。 

动作过程

    收缩握铃一臂的二头肌将前臂向上弯起,到可能的最高点时,彻底收缩二头肌一秒钟,然后伸展肘关节,让哑铃徐徐下落到开始位置。练完一侧,换练另一侧。 

呼吸方法

    弯起前臂时吸气,下垂时呼气。 

注意要点

    让上臂贴靠大腿是为了确保不在弯起前臂时移动肘部

前臂 腕弯举

起始姿势

    两手反握杠铃,蹲坐下来。将前臂贴放在大腿上,把手腕向前伸出,垂于膝盖前,两手也可正握杠。反握主练前臂内侧肌肉。正握主练前臂外侧肌肉。也可把上臂贴靠在平板或斜板上做或用哑铃左右轮流做。 

动作过程

    前臂平贴大腿,只把手腕尽力向上、向内屈转(收缩屈指肌),直到不能再屈转时,静止一秒钟。放松前臂肌肉,让手腕向前回落。 

呼吸方法

    屈转手腕时吸气,回落时呼气。 

注意要点

    屈转到最后时,一定要尽力收缩前臂肌肉(屈指肌)一秒钟,再逐渐放松。  

背部肌肉锻炼 

上背部 立式耸肩

起始姿势

    身体直立,两手用正(俯)握法握杠铃或哑铃,握距稍宽于肩。 

动作过程

    先让肩部尽量下倾,两臂完全不使劲,然后耸起两肩(主要是收缩斜方肌),静止一秒钟,松下肩,重复再做。 

呼吸方法

    耸起肩部时吸气,松下时呼气。 

注意要点

    耸起肩部把杠铃稍稍上提要完全靠收缩斜方肌所产生的力量,两肘不能丝毫弯曲。 

上背部 直立划船 

起始姿势

    两脚自然开立,两手握杠,用上握法握距比肩狭(可窄到两拳在杠中央相接)。 

动作过程

    把杠铃徐徐向上拉起,直到横杠几乎触及颏部。静止一秒钟,让杠铃徐徐下垂到两臂完全伸直,重复再做。 

呼吸方法

    杠铃上拉时吸气,下垂时呼气。 

注意要点

    上拉时要让横杠尽量贴近身体。如握把较宽,杠铃上提时让两肘尖向上。上拉时身体不要摆动。下垂杠铃要徐徐而行,最后要让杠铃尽量下垂到可能的最低点。 

背阔肌 引体向上

起始姿势

    两手用宽握距正握(掌心向前)单杠,两脚离地,两臂身体自然下垂伸直。 

动作过程

    用背阔肌的收缩力量将身体往上拉起,直到单杠触及或接近胸部。静止一秒钟,使背阔肌彻底收缩。然后逐渐放松背阔肌,让身体徐徐下降,直到回复完全下垂,重复再做。 

呼吸方法

    将身体往上拉时吸气,下垂时呼气。 

注意要点

    上拉时意念集中在背阔肌,把身体尽可能的拉高,上拉时不要让身体摆动。下垂时脚不能触及地面。可在腰上钩挂杠铃片来加重。 


腹腰部肌肉锻炼 

仰卧起腿

起始姿势

    仰卧平垫上或头朝上仰卧斜板上。两手握住头后方的固定物件,全身伸直。 

动作过程

    收缩腹肌,将保持伸直的两腿向上弯起,直到可能的最大程度。保持一秒钟,再让两腿徐徐回落。

呼吸方法

    向上弯起两腿时吸气,回落时呼气。 

注意要点

    下落两腿时,仍要控制腹肌,勿使下落过快。

仰卧抬腿卷缩上体 

起始姿势

    平卧床上或地上。两膝弯屈,抬起小腿,勿使下降,两手抱头。 

动作过程

    在保持小腿不下放的姿势中,尽力把上体向前卷缩,身体实际上不会上抬很高。 

呼吸方法

    向前卷缩时吸气,回落时呼气。 

注意要点

    向前卷缩时,腰要下沉贴床或地面,腹肌尽量收缩。

小腿 

驴式提踵 

起始姿势

    用脚掌站在一长垫木边上。向前屈体,两手扶在身前凳上。让一同伴骑坐在身后臀部上。 

动作过程

    收缩小腓肠肌,使脚跟尽量上提,静止一秒钟,降下脚跟,重复再做。 

呼吸方法

    提起脚跟时吸气,降下时呼气。 

注意要点

    要让骑在身上的同伴尽量后坐,使身体重量主要压在臀部上,而不要在腰上。降下脚跟时要低于垫木面。开始几下,不要立即达到最高度以免小腿抽筋,然后逐步提高,并彻底收缩腓肠肌。脚跟下降时,要尽量低于垫木面,以加大升降幅度。

饮水,跑步不可省略的程序

记得在高中的体育课中,教练曾说过运动时不要喝水,理由是喝水会降低运动效率,创造不出好成绩。也许是这种观念作祟,现在仍有很多人误以为运动中喝水是一种不良的习惯。 会导致疲劳,这种说法似是而非,因为流汗是人体的自然需要。当外界气温过高或湿度上升,人的体温也随之上升,或者当运动使体温上升时,人体会为了维持正常活动所需的一定体温而流汗,依靠汗水蒸发所消耗的热量来降低过高的体温。所以,人体不能流汗时,体温必定上升,健康因而受到影响。   体温高导致的危险有:中暑、热衰竭及热痉挛三种。中暑是调节体温的机能不堪重负,体温因而极端升高以致昏倒;热衰竭是心脏送出的血量减少,引起循环失调:热痉挛时的体温并不高。可是血液中的钠及钾等盐类显著减少,因而产生肌肉痉挛、呕心、头昏目眩或腹痛等不适症状。   这些症状并非单独发生,有时同时出现,因此症状严重时,常有死亡的危险、尤其当流汗过多时,血液的浓度增加,如果不及时补给水分,便会导致脱水,脱水超过一定程度,即使补充水分,也无法遏止体温的上升,因而增加血液的黏度,引起血栓症。 
  根据美国人所做的研究,在气温9~15摄氏度。湿度35%~82%的最宜气候条件下,选手跑完马拉松时,直肠的温度高达40. 9摄氏度;在气温31.1摄氏度,湿度85%的晴朗天气时,中途弃权者的直肠温度高达41.3摄氏度。 
  根据直肠的体温来观察身体的症状,可得下列数据; 
  40.0~40.6摄氏度——心跳加速并且加强、   40.6~41.1摄氏度——肌力减弱,判断距离不准确、丧失平衡感等、   41.1摄氏度以上——发汗量降低,意识模糊。 
  由此可知,即使是跑完全程的选手,身体也已失去平衡,判断力也减弱很多。
  每年都有运动选手在高温下赛跑昏倒的新闻,其中大半起因于脱水。曾有学生在烈日下练棒球时死亡,这也是由于未能让学生及时摄取充足水分,引起高度脱水的结果。 
  美国的运动学家们向主办体育活动的各种单位提出呼吁,督促他们在高温下举办长距离赛跑时,应该注意下列事项:   当温度超过28摄氏度时,绝不可举办长达16公里以上的赛跑活动: 
  在天气炎热、温度超过27摄氏度的季节里,应该选择上午9点以前或下午4点以后举力、长距离赛跑;
  主办单位应该准备含电解质的饮料,运动员在赛跑途中,必须经常摄取饮料,赛跑前10~15分钟内应该摄取400~500毫升的饮料。  马拉松竞赛禁止选手在开始的10公里内喝水的规定应该修改,尤其在高温下举行16公里以上的长距离赛跑时,每隔三四公里就应设置供水站。   应教给赛跑选手基本的健康知识,熟悉中暑的初期症状,当觉得自己的胸前、上臂起鸡皮疙瘩,有恶寒、头痛目眩、恶心欲吐及皮肤干燥等现象时,必须立刻停止运动,不可再跑。   饮水供应站的管理人员发现选手有此类症状时,应该有权禁止该选手继续跑下去。   从美国人的这份建议可知,中年以上的人绝对不可参加这种因高温而有脱水危险的季节性赛跑。
  一般认为,气温5~20摄氏度、湿度60%、风速每秒7米以下是最适宜赛跑的天气,气温超过25摄氏度时,中老年人都不应勉强跑步。 www.qikan.com.cniQ6zJQ1ldexTGj2W
  可是,跑步中途饮水时,绝不可一次大量饮用。否则,很容易储存胃中,引起腹痛,最好是一次喝二三口,视需要再增加饮水次数。 

健美训练动作和肌肉图解(完全版)















































































































































































































附超级体格强壮术下载:点击下载

- 作者: 清水白菜 2007年04月17日, 期二 08:56  回复(1) |  引用(0) 加入博采

使用JAVA读取ORACLE BLOB字段实现上传下载  (作者置顶)

主题:使用JAVA读取ORACLE BLOB字段实现上传下载
作者:蔡毅(caiyi0903@hotmail.com
时间:2005-6-22

一 BLOB概述

大对象类型BLOB全称为Binary Large Objects,即二进制大对象。可以把BLOB区别为三种形式:声像数据、二进制数据和大文本数据。因此,最常见的应用就是存储图形、声音等对象,此外大二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储。我们在经常使用的编程环境中并不能直接支持BLOB字段,因此需要调用相应的函数完成BLOB的使用。


二 实际Struts项目的处理流程

1 插入BLOB字段的流程

表示层:
上传使用struts的<html:file property="drawingFile"/>标签,提交给指定处理的Action,在ActionForm中使用struts自带的FormFile

来保存文件。
核心代码:
<html:form action="/DrawingInputMultiAction" enctype="multipart/form-data">
<html:file property="drawingFile"/>
....省略
</html:form>

控制层:
在Action中将传入的ActionForm中的文件字段赋给VO值对象,并调用业务代理类的上传方法。
核心代码:
        //新增
        if(actionType.equals("insert")) {
            //得到文件类型
            int iFileType = this.getFileType(drawingInputForm.getFileExtendName());
            if(iFileType == 0) {
                //不支持文件类型
                this.addError(request, "drawing.errors.upload.UnSupportedFileType");
            } else {
                DrawingVO objDrawingVO = new DrawingVO();
                //图纸基本属性
                objDrawingVO.setDrawingName(drawingInputForm.getDrawingName());
               ...省略其他set方法

                //执行新增(上传)
                int iRt = objDrawingMan.insertDrawing(objDrawingVO);
                ...省略
        }

Facade门面:
通过业务代理类调用DAO中的上传方法,对客户端完全透明。
    public int insertDrawing(DrawingVO drawingVO) throws ComtopModuleException {
        try {
            DrawingDAO drawingDAO = new DrawingDAO();
            return drawingDAO.insertDrawing(drawingVO);
        } catch(DrawingException ex) {
            throw new ComtopModuleException("drawing.errors.insert", ex);
        }
    }

持久层:
DAO中实现和ORACLE数据库的底层交涉,完成真正的文件上传。
需要先插入一个空BLOB对象,然后Update这个空对象。
    public int insertDrawing(DrawingVO drawingVO) throws DrawingException {
        PreparedStatement pstmt = null;
        Statement stmt = null;
        Connection conn = null;
        int iKey = 0;
        ResultSet rs = null;
        //定义SQL语句
        String strSQLInsert = null;
        String strSQLUpdate = null;

        try {
            conn = dataSource.getConnection();
            conn.setAutoCommit(false);
            //插入空BLOB,empty_blob(),其中表中的Content是BLOC类型字段
            strSQLInsert =
                "insert into PROD_DRAWING (DRAWING_ID, DRAWING_NAME, 省略..." +
                "CONTENT)" +
                "values (?, ?, 省略..., empty_blob())";

            //得到待处理文件
            FormFile drawingFile = drawingVO.getDrawingFile();

            //插入普通字段
            pstmt = conn.prepareStatement(strSQLInsert);
            //得到主键
            iKey = Toolkit.getInstance().getNextKey(DrawingInfo.ID_STORE_KEY_DRAWING);

            pstmt.setInt(1, iKey);
            ....省略其他set方法

            pstmt.executeUpdate();

            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                   ResultSet.CONCUR_UPDATABLE);

            strSQLUpdate =
                "SELECT CONTENT FROM PROD_DRAWING WHERE DRAWING_ID ='" +
 nbsp;              iKey + "'" + " FOR UPDATE";

            //读出记录以增加图片Blob字段
            rs = stmt.executeQuery(strSQLUpdate);

            if(rs.next()) {
                logger.debug("开始写入BLOB");
                //这里不能用oracle.sql.BLOB,会报ClassCast异常
                weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.
                    oracle.
                    OracleThinBlob)rs.getBlob(1);
                logger.debug("得到输出流");
                OutputStream outStream = blob.getBinaryOutputStream();
                InputStream fin = drawingFile.getInputStream();
                logger.debug("开始分配缓存");
                byte[] b = new byte[blob.getBufferSize()];
                int len = 0;
                while((len = fin.read(b)) != -1) {
                    logger.debug("正在写入BLOB流");
                    outStream.write(b, 0, len);
                }
                logger.debug("关闭所有流");
                fin.close();
                outStream.flush();
                outStream.close();
            }
            rs.close();
            conn.commit();
        } catch(Exception ex) {
        ...省略
        }finally {
            DBUtil.destroyDB(rs, pstmt, conn);
        }
        return iKey;
    }

2 读取BLOB字段的流程

从数据库中读出BLOB数据没有上述由于连接池的不同带来的差异,程序流程同插入BLOB字段,但是读BLOB就不用那么复杂了,只需要J2SE的标准类java.sql.Blob就可以取得输出流。

DAO中的核心代码:
    public DrawingVO readDrawing(int drawingId) throws DrawingException {
        PreparedStatement pstmt = null;
        Connection conn = null;
        DrawingVO objDrawingVO = null;
        ResultSet rs = null;
        //定义SQL语句
        String strSQL = "SELECT * FROM PROD_DRAWING WHERE DRAWING_ID=?";
        try {
            conn = dataSource.getConnection();
            pstmt = conn.prepareStatement(strSQL);
            //设置参数
            pstmt.setInt(1, drawingId);
            //执行查询
            rs = pstmt.executeQuery();
            while(rs.next()) {
                objDrawingVO = new DrawingVO();
                objDrawingVO.setDrawingId(rs.getInt("DRAWING_ID"));
                objDrawingVO.setDrawingName(rs.getString("DRAWING_NAME"));
               ...省略其他set方法
                //set BLOB到VO中
                objDrawingVO.setContent(rs.getBlob("CONTENT"));
            }
        } catch(Exception ex) {
            ...省略
        }finally {
            DBUtil.destroyDB(rs, pstmt, conn);
        }
        return objDrawingVO;
    }
这样,传到Action中VO对象就包含这个BLOB对象了,然后需要在Action中对该对象转为输入流,可以选择文件输出流或Servlet输出流,根据具体情况定,这里选择文件输出流。

核心代码:
    private String getBlobToFile(Blob blob, DrawingVO objDrawingVO) throws Exception {

        InputStream ins = blob.getBinaryStream();
        //用文件模拟输出流
        String strFileName = objDrawingVO.getDrawingName() + "." +
                             objDrawingVO.getFileExtendName();
        String strRootFilePath = this.getServlet().getServletContext().getRealPath("");
        String strFilePath = "/temp/" + strFileName;
        String contextFilePath = strRootFilePath + strFilePath;
       //定义文件对象
        File file = new File(this.getServlet().getServletContext().getRealPath("") + "/temp");
        if(!file.exists()) {
            file.mkdir();
        }
        //定义输出流
      &nsp; OutputStream fout = new FileOutputStream(contextFilePath, true);
        //下面将BLOB数据写入文件
        byte[] b = new byte[1024];
        int len = 0;
        while((len = ins.read(b)) != -1) {
            fout.write(b, 0, len);
        }

        //依次关闭
        fout.close();
        ins.close();
        return strFilePath;
    }
最后,在Action中调用这个私有方法,完成读取操作。

- 作者: 清水白菜 2007年03月12日, 星期一 14:21  回复(0) |  引用(0) 加入博采

BEA WebLogic Workshop使用笔记之三 - Web应用篇  (作者置顶)
续EJB开发篇,通过本文的学习,读者将能领会在WebLogic Workshop上的Pageflow应用开发。本文,我们需要建立一个简单的Web应用,提供相应的友好界面来调用刚开发完毕EJB组件,在这个web应用中我们要使用到Pageflow。

什么是 Page Flow
Page Flow是一个基于Struts1.1的web应用编程模型,替代了早期Portal产品中的web flow,不再属于Portal专有,用以实现web应用中用户界面、业务逻辑、导航控制的分离,并且大大简化了WEB应用的开发过程,提高了开发效率

为什么要使用 Page Flow?
企业的WEB应用经常由成千上万的页面组成,维护这样一个网站通常是一件复杂、枯燥、耗时的任务。Page Flow 提供了一个易使用的框架结构来建立动态、复杂的WEB应用;并且通过用户界面、业务逻辑、导航控制的分离,避免了Web开发中经常出现的一些问题,提高了业务逻辑代码的可重用性。

Page Flow 的编程模型
沿用了 Struts Model 2 的MVC模型
模型(Model M) 组成部分
该部分可以由Custom Control文件(*.jcs), Java Control文件(*.jcx), Web Service文件(*.jws)或Process文件(*.jpd)等文件装配而成。

视图(View V)
由*.jsp等文件来实现

控制器(Controller C)
由Java Page Flow文件(*.jpf )来实现

关于Page flow的更多信息请参考dev2dev中文站点上的这篇文档:
BEA Workshop8.1之Java Page Flow介绍 by Doug Dew,Java Page Flow项目经理

建立Pageflow
我们在上一章中建好的EJBTest项目上继续Web应用的开发,右键点击EJBTest项目,选择"new"一个"Page Flow"


在Design View中将index.jsp页面删除,只留下Begin按钮,然后将myControl控件的"finderByCompanyName"方法拓展到Design View中,它将在这个Pageflow中成为一个带Form Bean的action"finderByCompanyName", 同时这个Form Bean也显示在Form Beans选项版中(Form Bean是Page Flow中的数据的承载体,其一个作用是用于页面中的form提交时存储form中的数据,其实质是一个Java Bean)

右键点击刚生成的action,选择"Generate Input Page"选项,Workshop将根据你action的Form Bean的参数,自动生成一个输入页面finderByCompanyNamePage.jsp。我们调整一下它们的位置,并且从Begin节点拉一条连接线,使得Begin开始后的Page Flow走到finderByCompanyNamePage.jsp页面。

这个Page Flow开始后将走到一个输入页面finderByCompanyNamePage.jsp,让你输入finderByCompanyName需要的数据,获得数据后,将到"finderByCompanyName"action中处理。
EJB控件myControl的finderByCompanyName()方法返回的是一个EJB对象的引用,我们对其做部分处理,使得它能返回Company中的全部信息("NO"及"COMPANY_NAME"),在PageFlow中传递数据的方法有很多中比如用Request、Session、FormBean等等进行数据的传递,在本例中我们为这个Pageflow增加两个Public的String型变量 "sNO"、"sCompanyName"用来承载"COMPANY"信息。
关于PageFlow的传值的更多相关信息请读者阅读相关文档:

  • dev2dev中文站点的 《数据绑定101》 这篇文档
  • Workshop联机帮助文档 Developing Web Applications à Guide to Building Page Flows à Using Data Binding in Page Flows部分 (在Workshop中按F1出联机文档,或是直接访问http://edocs.bea.com/workshop/docs81/doc/en/core/index.html)
然后在Pageflow中,双击"finderByCompanyName"节点,进入"Source View"编辑器,更改finderByCompanyName()方法,将myControl.finderByCompanyName()方法的返回的Company NO和Company Name赋值给相应的变量。
public class InvokeEJBPFController extends PageFlowController
{
/**
* This is the control used to generate this pageflow
* @common:control
*/
private TEJB myControl;
public String sNO;
public String sCompanyName;



……….

/**
* @jpf:action
* @jpf:forward name="success" path="showCompanyInfo.jsp"
*/
protected Forward finderByCompanyName(FinderByCompanyNameForm form)
{

SIMPLEEJB.Simple_ex sBean;

try
{
 sBean=myControl.finderByCompanyName("%"+form.getArg0()+"%");
 this.sNO= sBean.getCompanyId();
 this.sCompanyName=sBean.getCompanyName();
}
 catch(Throwable t)
{
 t.printStackTrace();
}

return new Forward( "success" );
}

"finderByCompanyName"action处理完后我们需要一个页面把这个处理结果显示出来,所以,从"Pallete"面板中拖拽出一个"page"到设计视图中,并命名为"showCompanyInfo.jsp"

双击这个showCompanyInfo.jsp页面,进入这个页面的编辑界面,我们需要对其加入部分定制代码段来显示出finderByCompanyName处理的结果。
1. 删除默认jsp页面上的文字;
2. 从"选项板"中拖拽"表格"到空白的jsp页面上,设置表格属性为4行2列;

3. 使用"表导航器"合并表头,和表尾;

4. 往表的6个表格中拖拽入"Label"标签

5. 对上诉table中的label值在属性编辑器中设定,由上至下,由左至右设定成:

Company Info
NO:{pageFlow.sNO}
Company Name:{pageFlow.sCompanyName}
"{pageFlow.sNO}"是一段表达式,"pageFlow"代表了对这个jsp所处的Page Flow对象的引用,"sNO"是这个对象的一个属性值,这对大括号的作用的是表明"pageFlow.sNO"应当做为一个表达式来处理,而不是做为一个值来被直接显示。


6. 对这个JSP页面加上返回连接,使得点击后它能返回主页面,通过拖拽的方式从"选项板"中拖拽"Anchor"标签到设计视图中,如下图设置属性,定位方式选中"调用某个操作",文本属性是这个标签的显示文字"return",操作属性的意思是这个"Anchor"标签会调用Page Flow中的那个操作,我们选择"begin",表明调用Page Flow开始节点。

7. 点击保存,回到Page Flow页面,我们运行这个Page Flow进行测试。

Page Flow的相互调用
在Workshop中开发Page Flow的相互调用也很简单,在接下来的创建Create Company Page Flow的过程中将为读者演示Page Flow调用的开发。
1. 右键点击"EJBTest"项目,选择"新建"一个"页面流",然后起名为"CreateCompany",删除无用的"index.jsp",只留下"Begin"节点,然后将TEJB.jcx控件从"应用程序"面板中拖拽到Design View中

2. 从"数据选项板"中拖拽"tEJB"控件的"create"方法到设计视图中来,它将生成一个"create"action,再右键点击这个"create"action,选择"生成输入页",入下图

3. 将"begin"节点和新生成的"createPage.jsp"页面间联线关联起来。然后再把我们刚建立好的Page Flow InvokeEJBPFController.jpf给拖拽进这个Page Flow中来,如下图

4. 右键点击新拖拽进入的"InvokeEJBPF"节点,选择"生成调用操作",再从"create"节点和"createPage.jsp"页面节点上拉出连线链接到新的"show_invokeEJBPF"节点上,如下图

5. "createPage.jsp"页面出现红色波浪线表明该页面上有错误,这个错误其实是因为我们还没有在页面上加连接到"show_invokeEJBPF"节点上的连接,所以报错,因而我们需要修改createPage.jsp页面,往其中加一个"Return Home"按钮,使其能返回主页面。

6. 再看这个CreateCompanyController.jpf,一切都ok,我们可以运行并测试它。


该EJB剩下的两个方法(FinderByNO()方法和FinderAll()方法)请读者自己练习,最后做成的Page Flow如下:

源码参见本文附的下载包。

小结
笔者期望读者通过本文的阅读及练习能够入门在BEA WebLogic Workshop上的Web App应用开发。
在下一篇使用笔记中,作者将给大家介绍如何用Workshop开发一个调用该PageFlow的Portal应用,敬请关注。

相关源文件请点击此处下载

BEA WebLogic Workshop 8.1学习笔记之一 - 准备篇

BEA WebLogic Workshop使用笔记之二 - EJB开发篇

 作者简介
李巍是(dev2dev ID:Hilaser)BEA BS Dept. 技术推广人

- 作者: 清水白菜 2007年02月3日, 星期六 17:34  回复(0) |  引用(0) 加入博采

BEA WebLogic Workshop 8.1学习笔记之一 - 准备篇  (作者置顶)
前言
本文作者用BEA WebLogic Workshop做了一个简单的EJB的开发的例子,并对该例子做了一些Web应用方面的拓展,力图通过这些使用流程教会读者能够上手使用BEA WebLogic Workshop。

WebLogic Workshop 8.1产品概述
BEA WebLogic Workshop是一个统一、简化、可扩展的开发环境,能够使所有开发人员(不仅仅是J2EE专家)都能够在 BEA WebLogic Platform 8.1 上,迅速构建、测试和部署面向服务的企业级应用。

WebLogic Workshop 8.1 的独特性表现在:
· 统一性-- 它是构建所有平台应用的一个IDE,一个框架和一种面向服务的方法,无论是构建 Web 应用、Web 服务,还是构建门户和集成应用全都适用。
· 简便性-- 它使所有的开发人员都能够使用 J2EE,而且变得更富有效率。即使是没有 J2EE 或面向对象编程经验的大量主流业务应用开发人员也是如此。
· 可扩展性-- 它提供了 Java 控件,也就是面向服务的组件,使 IT 能方便地连接、使用和重复使用任何 IT 系统或平台项目上的应用。

最终结果:WebLogic Workshop 8.1 使 IT 效率空前提高,加快了 IT 价值的实现。IT 开发人员因此可以从事任何 IT 项目的开发,并充分发挥出 WebLogic Platform 8.1 中 IT 资产的作用。

初始配置
BEA WebLogic Workshop 8.1是BEA WebLogic Platform8.1产品的一个组成部分:

所以安装完Platform后,你就可以使用Workshop了。
你可以从BEA站点上下载相应平台的在线安装包或整个安装包,WebLogic Platform 8.1的下载地址是:
http://commerce.bea.com/showproduct.jsp?family=WLP&major=8.1&minor=0
产品安装完成后,可以运行配置向导" Configuration Wizard "进行相关配置

要开发或运行WebLogic Platform的应用,必须创建一个相关的domain,我们选择建立一个"basic WebLogic Platform domain",这是最全的domain,其支持WebLogic Workshop运行时框架,Portal应用,Integration应用,所以注意配置到这个页面中做如下选择:


通用数据库客户端工具( DbVisualizer)

附带再介绍一个工具:通用数据库客户端工具( DbVisualizer)。用该工具能够方便的连接各类通用的数据库,使用起来只需要简单地配置一下,比如我们要连POINTBASE,只需要改动一下启动脚本C:\bea\weblogic81\common\eval\dbvisualizer\ run.bat,把POINTBASE Driver加到classpath中,所以在run.dat脚本中,加入如下语句:

set _CLASSPATH=%CLASSPATH%
rem ###################### added by lw #################
SET WL_HOME=C:\bea\weblogic81
SET POINTBASE_HOME=%WL_HOME%\common\eval\pointbase
SET POINTBASE_CLASSPATH=%POINTBASE_HOME%\lib\pbserver44.jar;%POINTBASE_HOME%\lib\pbclient44.jar
set CLASSPATH=%CLASSPATH%;%POINTBASE_CLASSPATH%
rem ###################### end #################

然后运行DbVisualizer

我们用这个工具Create一个表

CREATE TABLE LWTEST.SIMPLE_EX (
company_id VARCHAR(20) CONSTRAINT product_category_pk PRIMARY KEY,
company_name VARCHAR(40) NOT NULL


小结
关于WebLogic Platform的更多知识请参考学堂相关文档

BEA WebLogic Workshop 8.1学习笔记之二 -- EJB开发调试篇
BEA WebLogic Workshop 8.1学习笔记之三 -- Web应用篇

 作者简介
李巍是(dev2dev ID:Hilaser)BEA BS Dept. 技术推广人

- 作者: 清水白菜 2007年02月3日, 星期六 17:33  回复(0) |  引用(0) 加入博采

Eclipse插件之Bytecode Outline  (作者置顶)
本文介绍如何利用Eclipse插件Bytecode Outline在Eclipse中的操作使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

  Bytecode Outline 插件可以把当前的正在编辑Java的文件或者class文件直接显示出其相应的字节码出来,而且可以进行两个Java文件的字节码比较或者两个class文件的字节码比较或一个Java文件与一个class文件进行字节码的比较。

安装

JDK:1.5.0 从http://java.sun.com 上去下载安装
Eclipse:3.1.1 从http://www.eclipse.org 上去下载解压
Bytecode Outline 主页http://asm.objectweb.org/eclipse/bco/index.html

技巧

  Eclipse使用技巧之插件管理

  提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去,一大堆,累死你:(

  1. 前提是你已经安装好了Eclipse工具了,比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%来进行表示;
  2. 此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的;
  3. 在%ECLIPSE_HOME%下建立一个PlugInsNew的目录;

      比如:E:\OpenSource\Eclipse\PlugInsNew\

  4. 你下载了个新的插件,比如叫做:XYZ   那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse目录,eclipse目录包含有features与plugins两个子目录;结构如下图所示:

  5. 把下载的新插件的文件放在以下相应目录中

      %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
      %ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins

  6. 建立相关的.link的文件
      然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件
    内容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行这样的路径指示而已。
    这样,如果你下载了多个插件就可以如法炮制建立多个Link文件,想加载哪个插件就把哪个插件的Link文件放到%ECLIPSE_HOME%\links的目录中即可,使用与管理都很方便,建议千万不要放在默认的安装目录中;
    如果你的%ECLIPSE_HOME%与此不同,请修改XYZ.link文件里的路径
  7. 删除,关闭Eclipse
      删除%ECLIPSE_HOME%\links\XYZ.link文件即可
    删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件
  8. 重新启动Eclipse即可

安装细节

  Bytecode Outline插件安装方法有两种方式:

  • 一种就是采用上一节的《Eclipse使用技巧之插件管理》
    注意:因为Bytecode Outline的运行需要ASM Framework,所以也要下载这个文件
    进入到http://forge.objectweb.org/projects/asm/ 中,下载到如下两项内容的文件
    bytecode-outline 2.0.2 June 18, 2005,文件名de.loskutov.BytecodeOutline_2.0.2.jar
    asm-plugin 2.2.1 December 14, 2005,文件名org.objectweb.asm_2.2.1.jar
    并相应将这两个文件解压到
    bytecode\eclipse\plugins\de.loskutov.BytecodeOutline_2.0.2\
    bytecode\eclipse\plugins\org.objectweb.asm_2.2.1\
    的目录下面,如下图所示,重新启动即可。

  •   另一种就是通过Update Manager的形式来下载安装
    地址是:http://download.forge.objectweb.org/eclipse-update/
    安装步骤如下:

      Help => Software Updates => Find and Install…

      选择Search for new features to install,下一步

  新建一个站点,New Remote Site =>
  Name里填入Bytecode Outline
  URL里填入http://download.forge.objectweb.org/eclipse-update/
  OK后,Finish完成之

  于出现这个站点的相关插件,对于Bytecode Outline来说,仅需要asm和bytecode-outline两项即可,当然把jonas-dev和org-exoplatform-eclipse-plugins也弄下来用用也不错的,全选上(^_^)

   接下来就是接受协议并下一步了

  出现安装的路径选择,点击Change Location …更改你的Plugin安装路径,最好同上面所说的新的插件分开路径进行安装,于是就可以选择在PlugInsNew目录下的bytecode\eclipse来进行存放它了。

  四项内容,每个都要进行Change Location…,赫赫,比较麻烦了些,不过要是为了分开进行存放,你可以四个都存放到不一样的路径当中去,但是都要建立Link文件。

  下载完成后,提示你安装,选择安装所有Install All。

  顺利安装完成,出现重启提示。
注意:在点Yes之前,如果你刚才选择的路径不是默认的Eclipse插件的安装路径,你还是要建立一下Link文件!!!

  重新启动Eclipse后,可以在菜单Window => Show View => Other => Java => 可以看到多了Bytecode、Bytecode Reference两项,把这两项打开显示出来。

使用

  我们简单地创建一个示例工程,里面包含有一个接口类与两个实现该接口的实现类进行演示说明使用的方法。

接口类:IHelloWorld.java
public interface IHelloWorld
{
	String sayHelloWorld();
}

实现类一:HelloWorld1.java
public class HelloWorld1 implements IHelloWorld
{
	public HelloWorld1()
	{
		super();
	}

	public String sayHelloWorld()
	{
		return "Hello World HelloWorld1";
	}
}

实现类二:HelloWorld2.java
public class HelloWorld2 implements IHelloWorld
{
	public HelloWorld2()
	{
		super();
	}

	public String sayHelloWorld()
	{
		return "Hello World HelloWorld2";
	}
}

  双击打开IHelloWorld.java文件,在Bytecode窗口中可以看到如下信息:

  当光标定位在sayHelloWorld上面,则Bytecode内容相应地进行改变。

  点击ASM图标可以在true bytecode和ASMifier Java code 视图间进行切换

  当光标定位在sayHelloWorld上面,则Bytecode内容相应地进行改变。

  选中Link With Editor图标,当Java编辑器中当前的Java文件改变时,Bytecode里的内容会跟随着进行改变,方便进行查看。

  选中Show bytecode for current field/method only图标,当Java编辑器中当前的Java文件定位在某个域或方法时,则仅显示域或方法的字节码,方便进行查看,如下图仅定位在sayHelloWorld方法上,仅显示这个方法的相关信息。

  选中时,会把相关的附加信息也显示,比如下面的String,就会把java.lang包名都显示出来了。

  这些开关也可以通过下拉菜单来进行切换与设置,一样的操作方法。

  选中图标,可以切换到字节码的指令集视图上面来,当光标定位到不同的上面就会同样定位到相应的指令上,同样,在指令上面点击,相应地会定位到指令所对应的代码上去。

  比较两个Java代码的字节码

  相异之处特殊显示出来,以供查看。

  切换到ASM视图进行比较

  比较两个class代码的字节码

  比较一个Java文件和一个class文件的字节码

  选择比较其它的Java或class文件进行比较

  选择文件

  附带的JVM指令参考JVM Instruction Reference,有比较详细的资料说明。

  Help => Help Contents => JVM Instruction Reference

  更多的使用方法可以参阅: http://andrei.gmxhome.de/bytecode/index.html

总结

  这是一个很不错的学习编译、反编译、字节码的工具。

- 作者: 清水白菜 2007年02月3日, 星期六 17:32  回复(1) |  引用(0) 加入博采

Eclipse插件之Implementors  (作者置顶)
本文介绍如何利用Eclipse插件Implementors在Eclipse中的使用。

  Ecipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:
  如果你想看看某个类或者方法的实现,一般是Ctrl + 鼠标左键,单击即可以打开这个类或者方法的具体实现代码。但是如果碰到接口时,只是到达接口而已,不能到达具体的实现类里。

解决方法:利用Eclipse的Implementors插件。
  当追踪方法代码时,Eclipse默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。

  另外还有Call Hierarchy插件: 显示一个方法的调用层次,可以从中看到它被哪些方法调用了,以及它调用了哪些方法,是代码追踪比较实用的工具。Eclipse 3.1中已经自带有这个功能了。这个插件就不用另加介绍了。

安装

JDK:1.5.0 从http://java.sun.com上去下载安装
Eclipse:3.1.1 从http://www.eclipse.org 上去下载解压
Implementors 从http://eclipse-tools.sourceforge.net/implementors/

技巧

  Eclipse使用技巧之插件管理

  提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去,一大堆,累死你:(

  1. 前提是你已经安装好了Eclipse工具了,比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%来进行表示;
  2. 此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的;
  3. 在%ECLIPSE_HOME%下建立一个PlugInsNew的目录;
    比如:E:\OpenSource\Eclipse\PlugInsNew\
  4. 你下载了个新的插件,比如叫做:XYZ

      那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse目录,eclipse目录包含有features与plugins两个子目录;结构如下图所示:

  5. 把下载的新插件的文件放在以下相应目录中

    %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
    %ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins
  6. 建立相关的.link的文件

    然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件
    内容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行这样的路径指示而已。
    这样,如果你下载了多个插件就可以如法炮制建立多个Link文件,想加载哪个插件就把哪个插件的Link文件放到%ECLIPSE_HOME%\links的目录中即可,使用与管理都很方便,建议千万不要放在默认的安装目录中;
    如果你的%ECLIPSE_HOME%与此不同,请修改XYZ.link文件里的路径

  7. 删除,关闭Eclipse

    删除%ECLIPSE_HOME%\links\XYZ.link文件即可
    删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件

  8. 重新启动Eclipse即可

使用

  Implementors插件安装方法采用上一节的《Eclipse使用技巧之插件管理》

  重新启动Eclipse后,在代码编辑区域,右键,可以看到增加了两个右键菜单
Open Interface和Open Implementation,如下图所示:

  我们简单地创建一个示例工程,里面包含有一个接口类与两个实现该接口的实现类进行演示说明使用的方法。

接口类:IHelloWorld.java
public interface IHelloWorld
{
	String sayHelloWorld();
}

实现类一:HelloWorld1.java
public class HelloWorld1 implements IHelloWorld
{
	public HelloWorld1()
	{
		super();
	}

	public String sayHelloWorld()
	{
		return "Hello World HelloWorld1";
	}
}

实现类二:HelloWorld2.java
public class HelloWorld2 implements IHelloWorld
{
	public HelloWorld2()
	{
		super();
	}

	public String sayHelloWorld()
	{
		return "Hello World HelloWorld2";
	}
}

  在接口类IHelloWorld.java的方法sayHelloWorld()上面右键,在弹出的菜单中选择Open Implementation,如下图所示:

   

  单击菜单Open Implementation,于是会弹出该接口方法的相关实现类出来供你选择,如果该接口方法的实现类只有一个的话,就会直接跳转到实现类的代码上去了,不会出现提示选择框的。

  我们先选择实现类HelloWorld1,于是光标就会定位到实现类HelloWorld1.java的sayHelloWorld()方法上,并会加亮显示,如下图:

   

  再回到在接口类IHelloWorld.java的方法sayHelloWorld()上面右键,在弹出的菜单中选择Open Implementation,如下图所示:

  这次我们选择实现类HelloWorld2,于是光标就会定位到实现类HelloWorld2.java的sayHelloWorld()方法上,并会加亮显示,如下图:

   

  在接口中可以找到具体的实现,那在实现类里如何反查接口的定义呢?

  操作如下:在接口的实现类HelloWorld2.java的方法sayHelloWorld()上面右键,在弹出的菜单中选择Open Interface,如下图所示:

  于是光标就会定位到接口类IHelloWorld.java的sayHelloWorld()方法上,并加亮显示,如下图:

  当然,如果你的方法没有相应的接口就不会去进行跳转了。

总结

  此插件的功能虽小,但是方便了许多,估计在未来的Eclipse版本中会把这个功能集成进去了,就象Call Hierarchy插件一样(^_^)

- 作者: 清水白菜 2007年02月3日, 星期六 17:31  回复(0) |  引用(0) 加入博采

Eclipse插件之FindBugs  (作者置顶)
 本文介绍如何利用Eclipse插件FindBugs在Eclipse中的使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:
  当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。

解决方法:
  现在有很多Java代码分析工具,FindBugs中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。

安装

JDK:1.5.0 从http://java.sun.com上去下载安装
Eclipse:3.1.1 从http://www.eclipse.org 上去下载解压
FindBugs:0.9.4 从http://findbugs.sourceforge.net/
官方的文档 http://findbugs.sourceforge.net/manual/
Eclipse plugin for FindBugs version 0.0.17
http://findbugs.sourceforge.net/downloads.html 下载

技巧

  Eclipse使用技巧之插件管理

  提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去,一大堆,累死你:(

  1. 前提是你已经安装好了Eclipse工具了,比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%来进行表示;
  2. 此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的;
  3. 在%ECLIPSE_HOME%下建立一个PlugInsNew的目录;
    比如:E:\OpenSource\Eclipse\PlugInsNew\
  4. 你下载了个新的插件,比如叫做:XYZ

      那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse目录,eclipse目录包含有features与plugins两个子目录;结构如下图所示:

      

  5. 把下载的新插件的文件放在以下相应目录中

    %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
    %ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins

  6. 建立相关的.link的文件

    然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件
    内容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行这样的路径指示而已。
    这样,如果你下载了多个插件就可以如法炮制建立多个Link文件,想加载哪个插件就把哪个插件的Link文件放到%ECLIPSE_HOME%\links的目录中即可,使用与管理都很方便,建议千万不要放在默认的安装目录中;
    如果你的%ECLIPSE_HOME%与此不同,请修改XYZ.link文件里的路径

  7. 删除,关闭Eclipse

    删除%ECLIPSE_HOME%\links\XYZ.link文件即可
    删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件

  8. 重新启动Eclipse即可

使用

  FindBugs插件安装方法采用上一节的《Eclipse使用技巧之插件管理》

  重新启动Eclipse后,在Help => About Eclipse SDK => Plug-in Details你可以看到由“FindBugs Project”提供的“FindBugs Plug-in”版本0.0.17插件,如下图所示:

  

介绍

  FindBugs是一个可以在Java程序中发现Bugs的程序。
  它是专门用来寻找处于“Bug Patterns”列表中的代码的。
  Bug Patterns指很有可能是错误的代码的实例。

  原文:FindBugs is a program to find bugs in Java programs. It looks for instances of "bug patterns" --- code instances that are likely to be errors.

  目前FindBugs最高版本0.9.4,不过更新速度很快的,你应当经常上去看看是否有新版本发布。
Eclipse plugin for FindBugs最高版本0.0.17

要求

  使用FindBugs至少需要JDK1.4.0以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOS X 等平台上。

  运行FindBugs至少需要有256 MB内存,如果你要分析一个很大的项目,那就需要更加多的内存了。

  FindBugs独立运行和与Ant结合的详细操作就不介绍了,可以看官方的文档http://findbugs.sourceforge.net/manual/

  独立运行的效果图如下:

  

  本文主要介绍Eclipse中使用的情况

  打开Bug Details视图

  Windows => Show View => Other… => FindBugs => BugDetails

  

  在Package Explorer或Navigator视图中,选中你的Java项目,右键,可以看到“Find Bugs”菜单项,子菜单项里有“Find Bugs”和“Clear Bug Markers”两项内容,如下图所示:

  

  

  我们建立一个简单的测试文件Test.java 内容如下:

public class Test
{
private String[] name;
public String[] getName()
{
return name;
}

public void setName(String[] name)
{
this.name = name;
}
}

  我们点中“Find Bugs”,运行时会出现如下进度框:

  运行结束后可以在Problems中看到增加了如下的警告信息内容

  FindBugs运行后的警告信息内容不仅在Problems视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:
当光标指向你的警告信息的代码上面时,就会有相应的错误提示信息,与Eclipse本身的错误或警告信息提示类似。
选中Problems视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。
will point to locations in your code which have been identified as potential instances of bug patterns.

  

  在Problems视图里,选中相应的问题条目,右键,在弹出的菜单中,可以看到“Show Bug Details”,如下图所示:

  

  点中它,会切换到Bug Details视图上去,显示更加详细的提示信息。

  当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到Bud Details窗口去,查看详细的警告信息,如下图所示。

  

  根据这里详细的信息,你可以得到FindBugs为什么会对你的代码报警告信息,及相应的处理办法,根据它的提示,你可以快速方便地进行代码修改。

  

  根据提示,我们将代码修改成如下,再运行就不会报有警告信息了。

public class Test
{
private String[] name;
public String[] getName()
{
    String[] temp = name;
return temp;
}

public void setName(String[] name)
{
    String[] temp = name;
this.name = temp;
}
}

配置FindBugs
  选择你的项目,右键 => Properties => FindBugs =>

  

  可以配置的信息包括如上图所示的四个选项的相关设置:

  1. Run FindBugs Automatically开关
    当此项选中后,FindBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FindBugs就会运行,并将相应的信息显示出来。
    当此项没有选中,你只能每次在需要的时候自己去运行FindBugs来检查你的代码。

  2. Minimum priority to report选择项
    这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。
    比如:
    你选择了High选择项,那么只有是High级别的提示信息才会被显示。
    你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。
    你选择了Low选择项,那么所有级别的提示信息都会被显示。

  3. Enable bug categories选择项
    在这里是一些显示Bug分类的选择:
    Correctness关于代码正确性相关方面的
    Performance关于代码性能相关方面的
    Internationalization关于代码国际化相关方面的
    Multithreaded correctness关于代码多线程正确性相关方面的
    Style关于代码样式相关方面的
    Malicious code vulnerability关于恶意破坏代码相关方面的

    比如:如果你把Style的检查框去掉不选择中它,那么与Style分类相关的警告信息就不会显示了。其它的类似。

  4. Select bug patterns to check for选择项
    在这里你可以选择所要进行检查的相关的Bug Pattern条目
    可以从Bug codes、Detector name、Detector description中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的检查条件。

总结

  此插件的功能很不错,可以帮助我们提升Java代码的编写能力,写出更加安全可靠的代码。建议使用或加在Ant里进行持续构建。
  现在,你可以马上拿出你已经开发的一个项目,检查一下你的代码有没有问题了。

- 作者: 清水白菜 2007年02月3日, 星期六 17:09  回复(0) |  引用(0) 加入博采

Eclipse插件之EasyExplorer  (作者置顶)
本文介绍如何利用Eclipse插件EasyExplorer在Eclipse中的使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:
  如果你经常需要在Eclipse里打开相关资源文件所在的文件夹,比较麻烦,要右键,属性,在Location一栏中把所在的文件夹拷贝一下,然后再去资源管理器里输入这个路径,回车,打开它。

解决方法:
  用EasyExplorer插件,有了这个插件就可以很方便地打开资源文件所在的文件夹了。

安装

JDK:1.5.0 从http://java.sun.com上去下载安装
Eclipse:3.1.1 从http://www.eclipse.org 上去下载解压
EasyExplorer 从http://sourceforge.net/projects/easystruts/

技巧

  Eclipse使用技巧之插件管理

  提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去,一大堆,累死你:(

  1. 前提是你已经安装好了Eclipse工具了,比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%来进行表示;
  2. 此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的;
  3. 在%ECLIPSE_HOME%下建立一个PlugInsNew的目录;
    比如:E:\OpenSource\Eclipse\PlugInsNew\
  4. 你下载了个新的插件,比如叫做:XYZ

      那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse目录,eclipse目录包含有features与plugins两个子目录;结构如下图所示:

      

  5. 把下载的新插件的文件放在以下相应目录中

    %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
    %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\plugins

  6. 建立相关的.link的文件

      然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件
    内容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行这样的路径指示而已。
    这样,如果你下载了多个插件就可以如法炮制建立多个Link文件,想加载哪个插件就把哪个插件的Link文件放到%ECLIPSE_HOME%\links的目录中即可,使用与管理都很方便,建议千万不要放在默认的安装目录中;
      如果你的%ECLIPSE_HOME%与此不同,请修改XYZ.link文件里的路径

  7. 删除,关闭Eclipse

    删除%ECLIPSE_HOME%\links\XYZ.link文件即可
    删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件

  8. 重新启动Eclipse即可

使用

  EasyExplorer插件安装方法采用上一节的《Eclipse使用技巧之插件管理》

  重新启动Eclipse后,在Package Explorer、Outline、Naviagtor、Problems、文件编辑等等窗口中右键,可以看到多个一个带有文件夹图标Easy Explore…菜单。

  在Package Explorer窗口中右键,如下图所示:

  


  在Naviagtor窗口中右键中右键,如下图所示:

  


   

  在Outline窗口中右键中右键,如下图所示:

  

   

  在Problems窗口中右键中右键,如下图所示:

  

  在文件编辑窗口中右键中右键,如下图所示:

  

  利用EasyExplorer插件可以在Eclipse用Explorer打开资源文件所在的文件夹。其它配置是在这里Windows => Preferences => Easy Explore => Target => explorer.exe {0}

  可以看到在Windows平台上是用explorer.exe {0}来打开的,{0}是用来传递参数的。

  


   技巧:我习惯以资源管理器的方式来打开文件夹,方便进行拖动操作,即左边带文件树,那么在这里你可以设置成为explorer.exe /e,{0}即可,这样用EasyExplore打开文件夹时就是以这种方式来打开的,而且左边的文件树里,直接定位到文件夹上面,很是方便。

  Explorer.exe的参数如下:大家可以根据自己的喜好进行设定:
  命令格式Explorer [/n][/e][[,/root],[path]][[,/select],[path filename]]

参数说明
  /n表示以“我的电脑”方式打开一个新的窗口,通常打开的是Windows安装分区的根目录。
  /e表示以“资源管理器”方式打开一个新的窗口,通常打开的也是Windows安装分区的根目录。
  /root,[path]表示打开指定的文件夹,/root表示只显示指定文件夹下面的文件(夹),不显示其它磁盘分区和文件夹;[path]表示指定的路径。
  如果不加/root参数,而只用[path]参数,则可以显示其它磁盘分区和文件夹中的内容。另外,[path]还可以指定网络共享文件夹。
  /select,[path filename]表示打开指定的文件夹并且选中指定的文件,[path filename]表示指定的路径和文件名。
  如果不加/select参数,则系统会用相应的关联程序打开该文件。如果[path filename]不跟文件名就会打开该文件夹的上级目录并选中该文件夹。

  通过对以上explorer.exe的参数分析,我们可能会有个希望就是实现既显示左边的文件树,又同时右边也定位到的选定的文件或文件夹上面。
那应当是设置为:explorer.exe /e,/select {0},不过这件EasyExplore帮你打开的只是定位在文件夹上面,而不是相应的文件上面。

  你可以自己修改源代码来实现。
  把EasyExploreAction.java文件中的
if(selected instanceof IFile)
directory = directory.getParentFile();
if(selected instanceof File)
directory = directory.getParentFile();
注释掉,重启编译打包进去就可以,在Windows上面使用没有问题!

  打开这个插件包,我们可以看到easyexplore.jar里面只有三个文件,我们就用jad反编译过来看看,是怎么实现的。
  一个配置文件EasyExplorePreferencePage.java
  一个插件文件EasyExplorePlugin.java
  一个执行文件EasyExploreAction.java
  主要执行的相关代码是在执行文件EasyExploreAction.java中

  不过,我们可以从EasyExplorePlugin.java里面代码知道,EasyExplore支持Windows和Mac两种操作系统,关键代码如下:

protected void initializeDefaultPreferences(IPreferenceStore store)
    {
        String defaultTarget = "shell_open_command {0}";
        String osName = System.getProperty("os.name");
        if(osName.indexOf("Windows") != -1)
            defaultTarget = "explorer.exe {0}";
        else
        if(osName.indexOf("Mac") != -1)
            defaultTarget = "open {0}";
        store.setDefault("org.sf.easyexplore.targetPreference", defaultTarget);
    }

 

执行文件EasyExploreAction.java代码的关键分析:

    public void run(IAction action)
    {
        try
        {
            if("unknown".equals(selected))
            {
                MessageDialog.openInformation(new Shell(), "Easy Explore", "Unable to explore " + selectedClass.getName());
               EasyExplorePlugin.log("Unable to explore " + selectedClass);
                return;
            }
            File directory = null;
            if(selected instanceof IResource)
                directory = new File(((IResource)selected).getLocation().toOSString());
            else
            if(selected instanceof File)
                directory = (File)selected;
            if(selected instanceof IFile)
                directory = directory.getParentFile();
            if(selected instanceof File)
                directory = directory.getParentFile();
            String target = EasyExplorePlugin.getDefault().getTarget();
            if(!EasyExplorePlugin.getDefault().isSupported())
            {
                MessageDialog.openInformation(new Shell(), "Easy Explore", "This platform (" + System.getProperty("os.name") + ") is currently unsupported.\n" + "You can try to provide the correct command to execute in the Preference dialog.\n" + "If you succeed, please be kind to post your discovery on EasyExplore website http://sourceforge.net/projects/easystruts,\n" + "or by email farialima@users.sourceforge.net. Thanks !");
                return;
            }
            if(target.indexOf("{0}") == -1)
                target = target.trim() + " {0}";
            target = MessageFormat.format(target, new String[] {
                directory.toString()
            });
            try
            {
                EasyExplorePlugin.log("running: " + target);
                Runtime.getRuntime().exec(target);
            }
            catch(Throwable t)
            {
                MessageDialog.openInformation(new Shell(), "Easy Explore", "Unable to execute " + target);
                EasyExplorePlugin.log(t);
            }
        }
        catch(Throwable e)
        {
            EasyExplorePlugin.log(e);
        }
    }

  使用Runtime.getRuntime().exec(target);执行资源文件所在的文件夹target参数,就可以打开文件夹了。

总结

  此插件的功能很简单,但是很有用的小插件。如果你经常需要打开相关资源文件所在的文件夹,比较麻烦,要右键,属性,在Location一栏中把所在的文件夹拷贝一下,然后再去资源管理器里输入这个路径,回车,打开它。现在有了这个插件就很方便了呀。

  从下载的网址我们可以知道,这个EasyExplore是由EasyStruts项目组开发的。在开发基本Struts应用程序时,相信很多人都曾经用过EasyStruts的,不过EasyStruts已经很久没有更新了,它的最新版本只支持到Eclipse 2.1。

  不过,从网站上面可以得知,他们正在往3.0上面迁移,支持Eclipse3.x,相信到时又有新的EasyStruts可以用了:)

- 作者: 清水白菜 2007年02月3日, 星期六 17:08  回复(0) |  引用(0) 加入博采

Eclipse插件之WebLogic Plugin 2.0.0  (作者置顶)
本文介绍如何利用Eclipse插件WebLogic Plugin在Eclipse中的使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:

   WebLogic目前是使用比较多的应用服务器之一,Eclipse是流行的IDE,如何集成起来开发使用呢?

解决方法:

   采用BEA提供的WebLogic Plugin来进行集成开发。

安装

  JDK:1.4.2或1.5.0 从http://java.sun.com上去下载安装,如果是WebLogic 8.X.X系列的版本,应当选用JDK 1.4.2的版本。

   Eclipse:3.1.2 从http://www.eclipse.org 上去下载解压

   WebLogic Plugin 从https://eclipse-plugin.projects.dev2dev.bea.com/下载

技巧

Eclipse使用技巧之插件管理

  提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去,一大堆,累死你:(

  1. 前提是你已经安装好了Eclipse工具了,比如安装在E:\OpenSource\Eclipse\目录下,以下这个目录以%ECLIPSE_HOME%来进行表示;
  2. 此时默认的插件是在%ECLIPSE_HOME%\plugins目录中的;
  3. 在%ECLIPSE_HOME%下建立一个PlugInsNew的目录;比如:E:\OpenSource\Eclipse\PlugInsNew\
  4. 你下载了个新的插件,比如叫做:XYZ

      那么就在%ECLIPSE_HOME%\PlugInsNew\目录下建立XYZ目录,目录里面是eclipse目录,eclipse目录包含有features与plugins两个子目录;结构如下图所示:

    %ECLIPSE_HOME%\PlugInsNew\

  5. 把下载的新插件的文件放在以下相应目录中

       %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features

      %ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins

  6. 建立相关的.link的文件

       然后在%ECLIPSE_HOME%\links目录里建立一个XYZ.link的文件

      内容如是:path=E:/OpenSource/Eclipse/PlugInsNew/XYZ就一行这样的路径指示而已。

      这样,如果你下载了多个插件就可以如法炮制建立多个Link文件,想加载哪个插件就把哪个插件的Link文件放到%ECLIPSE_HOME%\links的目录中即可,使用与管理都很方便,建议千万不要放在默认的安装目录中;

      如果你的%ECLIPSE_HOME%与此不同,请修改XYZ.link文件里的路径

  7. 删除,关闭Eclipse

       删除%ECLIPSE_HOME%\links\XYZ.link文件即可

      删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录及文件

  8. 重新启动Eclipse即可

使用

  WebLogic Plugin现在有两个版本1.1.1和2.0.0。1.1.1只是能够配置一台服务器,并只提供启动停止服务器的功能,没有Redeploy、Undeploy;2.0.0可以配置多台,可以Redepoly、Undeploy,不过没有Deploy功能,而且还有一大BUG,就是只是每次重启Eclipse要重新设置一下用户与密码即可。对1.1.1感兴趣的朋友,可以查看:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=34318&tstart=120。下面介绍2.0.0版本的集成使用方法。以及Bug的修改。

WebLogic Plugin 2.0.0

功能

  • 启动、停止WebLogic 服务器
  • 利用JDT为高度J2EE的应用程序
  • 选择WebLogic域
  • 配置WebLogic服务器的启动参数

要求

  • Eclipse SDK 2.0.0 或更高的版本
  • WebLogic Server 6.0或更高的版本

安装

  插件安装方法有两种方式:

  • 一种就是采用上一节的《Eclipse使用技巧之插件管理》
  • 另一种就是通过Update Manager的形式来下载安装

  地址是:https://eclipse-plugin.projects.dev2dev.bea.com/update

   安装步骤如下:

  Help è Software Updates è Find and Install…

安装步骤

配置WebLogic Plugin

  • 菜单 Windows è Prefernces ,然后选中WebLogic节点可以看到右边配置的服务器实例列表,可以增加、修改、删除相应的服务器配置。

配置WebLogic Plugin

  • 现在开始增加服务器配置,在General标签设置以下各个参数
    • 设置服务器配置的显示名称
    • 选择你的WebLogic Server的版本
    • 设置BEA Home 的目录
    • 设置WebLogic Home的目录
    • 设置Domain 的名称
    • 设置Domain 的目录
    • 设置Server 的名称
    • 设置Host机器名称或IP,本机填localhost即可(weblogic.Admin使用的)
    • 设置端口号(weblogic.Admin使用的)
    • 设置SSL端口号(weblogic.Admin使用的),注意:这个要先在控制台http://localhost:7001/console/ 里先设置好才行,要不然保存时检测不到就保存不了。
    • 设置管理员名称(是有权限启动这个Server的用户名称如默认的weblogic)
    • 设置密码

设置SSL端口号

  • 在Classpath配置标签栏里,可以设置如下参数
    • Pre-startup WebLogic Classpath,是设置在WebLogic类库加载之前要先加载的一些类库
    • Prost-startup WebLogic Classpath,是设置在WebLogic类库加载之后才要开始进行加载的一些类库

         注意是先后顺序的不同,根据你的项目需要进行设置之,重新启动Eclipse后,在java.class.path=的前与后会增加进来你设置的这些Classpath

Pre-startup WebLogic Classpath

  • 在Runtime配置标签栏里,可以设置如下参数
    • JRE(选择用来启动WebLogic Server所要用到的JDK,这个可以在菜单Window è Preferences è Java è Installed JREs里进行配置的,上面说过了,要注意根据你的WebLogic的版本选择其相应支持的JDK方可。
    • VM Arauments(设置传递给JavaVM的参数,如最大与最小堆栈大小,以什么模式启动WebLogic Server,本例我们假设以产品模式启动)
    • JNI Library Path(设置要加载JNI时的搜索路径)
    • Run Mode(设置以产品模式还是开发模式进行启动WebLogic Server)

JRE设置

  • 菜单 Windows è Show View è Other …

可以看到WebLogic分类下面有WebLogic Servers菜单项,选择并打开它。

  这样可以在这里进行启动、停止WebLogic Server等操作。

WebLogic Servers

  • 选中WebLogic 下的 Project节点,并进行如下参数的设置

  Project added to the end of the classpath,通过Add按钮,可以选择你所要加载的项目,这样所选中的项目里所有的类库量也会自动地加进来的,不过它的加载顺序是在Classpath的最后面。

启动WebLogic服务器

  • 在打开的视图中,右键,选择Start就可以启动WebLogic Server了

启动WebLogic Server

  在控制台会有如下的启动信息显示:

控制台会有如下的启动信息

  显示启动成功。

  在这里也可以进行增加其它WebLogic Server的配置,如下:

增加其它WebLogic Server的配置

  修改WebLogic Server的配置

修改WebLogic Server的配置

  删除WebLogic Server的配置

删除WebLogic Server的配置

  也可以查看相应的帮助文档,如下:

查看相应的帮助文档

  打开WebLogic Plugin的帮助文档进行查阅,可惜没有看到:(

停止WebLogic服务器

  • 在打开的视图中,右键,选择Stop就可以停止WebLogic Server了

停止WebLogic Server

  在控制台会有如下的停止信息显示:

控制台会有如下的停止信息

部署、重新启动、停止应用程序

  部署应用:只能通过浏览器去部署新的应用,没有找到这里可以直接进行部署的地方。

  重新启动:假如我们通过浏览器或其它控制端部署了一个Web Application上去了。

  这时,通过插件停止WebLogic,再启动它后,双击展现Web Appplication Modules,可以在下面看我们部署上去的应用了。不过,而慢进行停止再启动。

  可以直接通过插件提供的刷新功能就会把部署上去的模块展现出来,如下:

刷新功能

  这时,要重新启动应用程序的话,只要在应用名称上面右键,在弹出的菜单中选择Redeploy即可重新部署应用了,速度很快的。

重新启动应用程序

  删除应用程序的话,只要在应用名称上面右键,在弹出的菜单中选择Undeploy即可删除应用了,模块名称立马消失,速度很快的,要重新部署又得通过浏览器或其它控制端来完成了。

删除应用程序

总结

  此插件的功能给予我们方便地集成Eclipse与WebLogic的开发使用,提高了效率。

  (^_^)

  Bug一个,大家要注意。

  关闭Eclipse之后重新启动Eclipse后,这时要启动WebLogic会发现以下错误而启动不了,郁闷了吧:)

<Critical> <Security> <BEA-090402> <Authentication denied: Boot identity not valid; The user name and/or password from the boot identity file (boot.properties) is not valid. The boot identity may have been changed since the boot identity file was created. Please edit and update the boot identity file with the proper values of username and password. The first time the updated boot identity file is used to start the server, these new values are encrypted.> 
***************************************************************************
The WebLogic Server did not start up properly.
Reason: weblogic.security.SecurityInitializationException: Authentication denied: Boot identity not valid; The user name and/or password from the boot identity file (boot.properties) is not valid. The boot identity may have been changed since the boot identity file was created. Please edit and update the boot identity file with the proper values of username and password. The first time the updated boot identity file is used to start the server, these new values are encrypted.
***************************************************************************

  不过解决的办法也简单,看到下图的信息了吧,这个插件在对用户进行存取的时候出了问题,导致错误的,你每次重新启动Eclipse后,要修改一下WebLogic的配置文件,把里面的用户名用密码再保存后才行的。

每次重新启动Eclipse后,要修改一下WebLogic的配置文件,把里面的用户名用密码再保存

后记

  文章写完后,我又修复了上述的BUG,这里重点再阐述一下解决过程:解压、反编译、替换加密方法、编译、重打包、关闭Eclipse、覆盖、重启:)

  1. 1、WebLogic Plugin 2.0.0的配置文件保存在
    %ECLIPSE_HOME%\workspace\.metadata\.plugins\com.bea.weblogic.eclipse\目录下
    dialog_settings.xml是保存配置对话框的大小之类的文件
    servers.xml是保存服器配置信息的文件
  2. 解压出weblogic-eclipse.jar里的所有文件
  3. 反编译com\bea\weblogic\eclipse\utils\XMLUtil.class得到XMLUtil.java
    在里面增加两个函数
    /**
      * 将 source 进行 BASE64 编码
      * 
      * @param source
      * @return
      */
    public static String buildBASE64(String source)
    {
      if(source == null)
      {
       return null;
      }
      return (new sun.misc.BASE64Encoder()).encode(source.getBytes());
    }
    
    /**
      * 将 BASE64 编码的字符串 base65code 进行解码
      * 
      * @param base65code
      * @return
      */
    public static String getFromBASE64(String base65code)
    {
      if(base65code == null)
      {
       return null;
      }
      BASE64Decoder base64decoder = new BASE64Decoder();
      try
      {
       byte[] b = base64decoder.decodeBuffer(base65code);
       return new String(b);
      }
      catch(Exception e)
      {
       e.printStackTrace();
       return null;
      }
    }
    
  4. 在public IServerInstall[] loadServers(File serversFile)函数里修改
    cServerInstall.setUsername(CryptoUtil.getDefault().decrypt(new String(Base64Util.base64ToByteArray(getNodeValue(cElement))),id));
    为
    cServerInstall.setUsername(getFromBASE64(getNodeValue(cElement)));
    
    修改
    cServerInstall.setPassword(CryptoUtil.getDefault().decrypt(new String(Base64Util.base64ToByteArray(getNodeValue(cElement))),id));
    为
    cServerInstall.setPassword(getFromBASE64(getNodeValue(cElement)));
    
  5. 在public void saveServers(IServerInstall servers[],File serversFile)函数里修改
    org.w3c.dom.Text usernameText = doc.createTextNode(Base64Util.byteArrayToBase64(CryptoUtil.getDefault().encrypt(cServer.getUsername(),cServer.getId()).getBytes()));
    为
    org.w3c.dom.Text usernameText = doc.createTextNode(buildBASE64(cServer.getUsername()));
    
    修改
    org.w3c.dom.Text passwordText = doc.createTextNode(Base64Util.byteArrayToBase64(CryptoUtil.getDefault().encrypt(cServer.getPassword(),cServer.getId()).getBytes()));
    为
    org.w3c.dom.Text passwordText = doc.createTextNode(buildBASE64(cServer.getPassword()));
    
  6. 编译这个XMLUtil.java得到XMLUtil.class,把XMLUtil.class打回weblogic-eclipse.jar包里
  7. 关闭Eclipse
  8. weblogic-eclipse.jar 覆盖掉原来插件目录里的文件
  9. 重新启动Eclipse
  10. Enjoy...

- 作者: 清水白菜 2007年02月3日, 星期六 17:04  回复(0) |  引用(0) 加入博采

常用log4j配置说明  (作者置顶)
常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:

一、log4j.properties

### 设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1,A2 ##
log4j.category.org.zblog=ERROR,A1
log4j.category.org.zblog=INFO,A2

log4j.appender.A1=org.apache.log4j.ConsoleAppender
### 设置输出地A1,为ConsoleAppender(控制台) ##
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式)##
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
### 配置日志输出的格式##

log4j.appender.A2=org.apache.log4j.RollingFileAppender
### 设置输出地A2到文件(文件大小到达指定尺寸的时候产生一个新的文件)##
log4j.appender.A2.File=E:/study/log4j/zhuwei.html
### 文件位置##
log4j.appender.A2.MaxFileSize=500KB
### 文件大小##
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
##指定采用html方式输出

二、log4j.xml

<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender">
<!-- 设置通道ID:org.zblog.all和输出方式:org.apache.log4j.RollingFileAppender -->
<param name="File" value="E:/study/log4j/all.output.log" /><!-- 设置File参数:日志输出文件名 -->
<param name="Append" value="false" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 设置输出文件项目和格式 -->
</layout>
</appender>

<appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E:/study/log4j/zhuwei.output.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="10240" /> <!-- 设置文件大小 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>

<logger name="zcw.log"> <!-- 设置域名限制,即zcw.log域及以下的日志均输出到下面对应的通道中 -->
<level value="debug" /><!-- 设置级别 -->
<appender-ref ref="org.zblog.zcw" /><!-- 与前面的通道id相对应 -->
</logger>

<root> <!-- 设置接收所有输出的通道 -->
<appender-ref ref="org.zblog.all" /><!-- 与前面的通道id相对应 -->
</root>

</log4j:configuration>


三、配置文件加载方法:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jApp {
public static void main(String[] args) {
DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加载.xml文件
//PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加载.properties文件

Logger log=Logger.getLogger("org.zblog.test");
log.info("测试");
}
}

四、项目使用log4j
在web应用中,可以将配置文件的加载放在一个单独的servlet中,并在web.xml中配置该servlet在应用启动时候加载。对于在多人项目 中,可以给每一个人设置一个输出通道,这样在每个人在构建Logger时,用自己的域名称,让调试信息输出到自己的log文件中。


五、常用输出格式

# -X号:X信息输出时左对齐;
# %p:日志信息级别
# %d{}:日志信息产生时间
# %c:日志信息所在地(类名)
# %m:产生的日志具体信息
# %n:输出日志信换行


- 作者: 清水白菜 2007年01月31日, 星期三 16:59  回复(0) |  引用(0) 加入博采

配置BEA WebLogic 8.1 JDBC连接  (作者置顶)

 配置BEA WebLogic 8.1 JDBC连接
--Oracle 8.1.7数据库使用的WebLogic 8.1 JDBC配置

时间:2004-12-02

本文描述了BEA WebLogic 8.1 Server中各种与JDBC相关功能的配置。尽管我们使用了Oracle 8.1.7作为我们的示例数据库管理系统(DBMS),但是只要其他关系数据库提供通过JDBC的连接,就可以很容易地把一般性的概念转移到这些数据库上。

  JDBC是标准的Java API,几乎所有需要访问数据库的J2EE应用程序都直接或间接地使用了它。在BEA WebLogic 8.1中,配置JDBC连接包括创建和配置两个主要的工件——JDBC连接池和数据源。与这两个主要工件相关的是其他次要的可配置工件,比如多池或数据源工厂。



连接池还是多池?
  在深入讨论如何创建和配置连接池之前,我们需要简要地看一看需要使用连接池的原因。
  如果您没有使用JDBC连接池访问数据库,那么为了建立到数据库的连接,您将需要进行以下步骤:

  • 加载JDBC驱动程序类。
  • 创建JDBC驱动程序的一个实例,并把它注册到驱动程序管理器中。
  • 通过提供一个数据库URL和其他所需的参数,从驱动程序管理器中获得一个到数据库的连接。
  • 完成之后关闭连接。

  与这种一次一个连接的方法相比,连接池是数据库连接的一个现存集合,而且可以在多个活动的J2EE应用程序中回收这些数据库连接。连接池中的连接是开放的,可用于访问。应用程序使用一个连接之后,这个连接没有被销毁,而是被返回到连接池中,随后可以为其他应用程序所用。通过节省与频繁建立和断开数据库连接相关的计算资源,连接池提高了数据库访问的性能,尤其是在负载高峰期内。
  多池是连接池的集合。多池的主要目的是提高可用性和在一组连接池间实现负载均衡。

为什么使用数据源?
  一个数据源就是一个提供对连接池或多池访问的Java命名和目录接口(Java Naming and Directory Interface,JNDI)对象。连接池或多池对于配置数据源是必需的。可以使用事务属性来配置数据源。非事务性的数据源用于本地事务;而事务性的数据源用于分布式事务。
  数据源封装了对数据库的访问,隐藏了访问连接池或多池所涉及的细节。另外,数据源使配置数据库连接的事务性特性变得容易。
  JDBC Data Source Factory是一个JNDI对象,企业应用程序使用它从应用程序范围内的连接池中获得连接。

JDBC驱动程序设置
  在WebLogic Server和 DBMS之间建立连接所需的JDBC驱动程序分为两种类型:Type 2和 Type 4。 Type 2 JDBC驱动程序需要本地库。使用Type 2 JDBC驱动程序时,需要把到WebLogic共享库(或动态链接库)目录的路径<WEBLOGIC>\server\bin\oci817_8和到Oracle客户端库目录的路径<ORACLE>\bin添加到系统变量< PATH >的开头部分。
  WebLogic 8.1 Server安装在< WEBLOGIC >目录中。Oracle 8.1.7数据库安装在< ORACLE >目录中。< PATH >是WebLogic Server Path变量。
  对于Type 2和 Type 4驱动程序来说,在WebLogic Server CLASSPATH中,需要相关的JDBC驱动程序类来配置连接池或数据源。把包含Oracle Type 2 JDBC驱动程序类的<ORACLE>\JDBC\lib\classes12.zip文件添加给<domain>/startWebLogic脚本文件中的<CLASSPATH>变量。

  • <CLASSPATH>:WebLogic Server Classpath变量。
  • <domain>:WebLogic Server Domain目录。

配置JDBC连接池
  现在,我们将考虑如何创建连接池和配置与其相关的各种参数。
  要创建一个JDBC连接池,在Administration Console中右击JDBC>Connection Pools节点,然后选择Configure a new JDBC Connection Pool。
  这将显示一个Configure a JDBC Connection Pool画面。为Oracle数据库选择Database Type – Oracle。选择一个Database Driver,然后点击Continue按钮(参见图1)。


图1

  随后显示Define Connection Properties画面。在这个画面中,指定一个Database Name、一个Database User Name和一个Password。点击Continue按钮。
  随后显示Test DataBase Connection。在这个画面中,指定Driver Classname、URL和Properties字段的值。Driver Classname就是用于获得数据库连接的驱动程序类名。URL是用于获得连接的数据库URL。Properties是用于创建连接的属性列表。
  表1中指定了用于不同Oracle JDBC驱动程序的Driver Classname和URL设置。


表1 驱动程序类名和URL设置

  在URL设置中,< host >是在<ORACLE>/network/ADMIN/tnsnames.ora文件中指定的HOST值,<port>是在tnsnames.ora文件中指定的PORT值,而<database>是数据库实例名称。
  在Properties文本框中的设置是: 
  user=<user>
  server=<database>

  <user>是指定登录到Oracle数据库中的用户名。<database>是Oracle数据库实例名称。如果使用了Oracle瘦(Type 4)驱动程序,就不应该指定服务器属性。
  点击Test Driver Configuration按钮,以测试JDBC Connection Pool。如果驱动程序配置测试成功,会显示一条“Connection successful”消息。如果驱动程序配置有错误,则会显示一条错误消息。
  随后会显示Create and Deploy画面。在这个画面中,选择一台服务器部署连接池,然后点击Create and Deploy按钮来创建和部署一个JDBC连接池。这将在被选中的服务器上创建和部署一个连接池。也可以把它部署在多台服务器上。Administration Console中的JDBC>Connection Pools节点将会增加一个<JDBCConnection Pool>节点。<JDBCConnection Pool>是连接池的名称。
  要修改JDBC Connection Pool配置,点击JDBC>Connection Pools><JDBCConnection Pool>节点,然后选择Configuration选项卡。要修改目标服务器,选择Target and Deploy选项卡。选择一台目标服务器,然后点击Apply按钮。选择Connections选项卡以配置JDBC Connections属性。

连接属性

  • Initial Capacity:创建连接池时所创建的数据库连接的数目。
  • Maximum Capacity: 连接池中连接的最大数目。
  • Capacity Increment: 连接池容量在最大容量限制范围内的增量。
  • LoginDelay: 在创建每个物理数据库连接之前要延迟的秒数。
  • Allow Shrinking: 将该项设置为true时,如果没有使用额外的连接,则允许连接池把容量减小到InitialCapacity。
  • Shrink Frequency: 在减小连接池容量之前要等待的秒数。如果将Shrink Frequency设置为true,那么也必须将Allow Shrinking设置为true。
  • Test Frequency: 数据库连接测试之间间隔的秒数。在每个Refresh Period时间间隔之后,如果设置了TestTableName,就会使用TestTableName测试未使用的数据库连接。
  • Test Reserved Connections: 如果选择了这个选项,服务器会在把连接提供给客户端之前对其进行测试。
  • Test Created Connections: 如果选择了这个选项,就会在创建一个JDBC连接之后和在把它添加到JDBC连接池中的可用连接列表之前,对该JDBC连接进行测试。
  • Test Released Connections: 如果选择了这个选项,服务器就会在把连接返回给连接池之前对其进行测试。
  • Test Table Name: 用于JDBC连接测试的数据库表名。如果指定了Test Frequeny,并且选择了Test Reserved Connections、Test Created Connections或Test Released Connections,则Table Name是必需的。

  在配置Connections画面之后,选择Apply按钮。

配置JDBC多池
  一个多池就是连接池的一个集合。在创建多池之前为多池配置连接池。要创建和配置一个新的多池,右击Administration Console中的JDBC>Multi Pools节点,然后选择Configure a New Multi Pool。
  随后会显示Configuration画面。在Multi Pool Configuration画面中,指定Algorithm Type并选择Create按钮。如果将Algorithm Type设置为“High availability”,那么在使用另一个池中的连接之前,一个池中的所有可用连接应已经用完。如果将Algorithm Type设置为“Load balancing”,多池会将连接请求平均地分布给多池中的所有连接池(参见图2)。


图2

  选择Pools选项卡,然后在Pools画面中选择要添加到多池中的连接池。点击Apply按钮。被选中的连接池将被添加到多池中。连接中使用的连接池是基于Algorithm Type进行选择的。
  选择Target and Deploy选项卡,然后在Target and Deploy画面中选择一台目标服务器。点击Apply按钮。可以把一个多池部署在多台服务器上。Administration Console中的JDBC>Multi Pools节点将会增加一个<Multi Pool>节点。<Multi Pool>是多池的名称。

配置JDBC数据源
  数据源是用于访问连接池或多池的JNDI对象。连接池或多池对于创建数据源是必需的。连接池对于创建事务性的数据源是必需的。应在创建数据源之前创建连接池或多池。
  要创建和配置数据源,在Administration Console中右击JDBC>Data Sources节点,然后选择Configure a new JDBCTxData Source。
  随后会显示Configuration画面。在Data Source Configuration画面中指定字段的设置。JNDI Name是数据源的JNDI路径。
  选择Honor Global Transactions,以创建一个事务性的(Tx)数据源。如果没有选中Honor Global Transactions,那么所创建的数据源就是非Tx数据源(参见图3)。


图3

  随后会显示Connect to Connection Pool画面。在Pool Name字段中,从可用连接池的列表中选择一个JDBC连接池,然后点击Continue按钮。数据源与被选中的连接池相连接。
  随后会显示Target the Data Source画面。在这个画面中,选择一台目标服务器,然后点击Continue按钮。这将在被选中的服务器上部署数据源,但是也可以在多台服务器上部署它。Administration Console中的JDBC>Data Sources节点将增加一个<JDBCData Source>节点。<JDBCData Source>是数据源的名称。要修改数据源配置,点击管理控制台中的JDBC>Data Sources><JDBCData Source>节点,选择Configuration选项卡。为了可以在一次服务器访问中把每个Result Set的多个行从服务器取到外部客户端,选择Row Prefetch Enabled并指定Row Prefetch Size。要为非XA的JDBC驱动程序启用全局事务,为非XA的驱动程序选择Emulate Two-Phase Commit,并选择Honor Global Transactions。要修改数据源的目标服务器,选择Target and Deploy选项卡。选择一台目标服务器,然后点击Apply按钮。

数据源和Tx数据源之比较
  如果在数据源配置中选择了Honor Global Transactions,数据源就是Tx数据源。数据源是和连接池或多池一起使用的。Tx数据源和连接池一起使用。数据源用于本地事务。Tx数据源用于分布式事务。
  在下列情况下,应该使用Tx数据源而不是数据源:

  • 使用容器托管的持久性实体bean。
  • 在事务期间访问多项资源。
  • 在一个事务中进行多个数据库更新。
  • 在多台服务器上使用同一个连接池。

配置JDBC数据源工厂
  JDBC数据源工厂是一项JNDI数据源资源。企业应用程序使用数据源工厂从应用程序范围内的连接池中获得连接。
  要创建和配置一个JDBC数据源工厂,在Administration Console中右击JDBC>Data Source Factories节点,然后选择Configure a new JDBCDataSourceFactory。
  随后会显示Configuration画面。在这个画面中,指定URL、Driver Class Name、 Factory Name和Properties字段的值,然后点击Create按钮(参见图4)。


图4

  Administration Console中的JDBC>Data Source Factories节点将增加一个<JDBCData Source Factory>节点。<JDBCData Source Factory>是数据源工厂的名称。要使用<JDBCData Source Factory>,需要重新启动服务器。

JDBC配置和服务器性能
  下面列出了BEA针对 WebLogic Server的各种JDBC配置设置给出的建议。
  为了提高生产模式下服务器的性能:

  • 在JDBC连接池配置中,把InitialCapacity的值设置为等于 MaxCapacity。如果InitialCapacity的值小于MaxCapacity,那么当负载增加时,服务器就会创建额外的数据库连接。在负载增加的情况下,必须分配资源以创建额外的数据库连接,同时资源对于完成jdbc客户端请求也是必需的。
  • 把MaxCapacity的值设置为等于需要JDBC连接的并发客户端会话的数量:为了确定一个连接池中的并发客户端会话,选择该连接池节点。选择Monitoring选项卡。Active Connections栏中的值是并发客户端会话的平均数目。Connections High的值是并发客户端会话的最大数量。在部署应用程序和监视活动连接之后,可以修改MaxCapacity的值。
  • 当外部客户端通过WebLogic Server使用JDBC访问数据库时,在数据源配置中选择Row Prefetch Enabled:通过在一次服务器访问中取多个行,行预取可以提高性能。

结束语
  按照上面概述过程,WebLogic开发人员应该能够针对Oracle 8.1数据库配置BEA WebLogic 8.1 Server了。配置其他数据库类似于配置Oracle 8.1。把包含相应数据库的驱动程序类的zip/jar文件添加给CLASSPATH变量,然后在JDBC连接池配置中指定相应的连接URL和驱动程序类名。

参考资料


  原文出处:http://www.sys-con.com/story/?storyid=43045&DE=1

 作者简介
Ajay Vohra是Compuware 公司的一名高级软件工程师。

- 作者: 清水白菜 2007年01月25日, 星期四 13:21  回复(0) |  引用(0) 加入博采