Posts Tagged ‘法’

定义标题的最好方法

星期三, 06月 4th, 2008

作者:阿宏 2005-4-15 20:45:18
原文:What is the Best Way to Mark up the Title of a Document?
说明:本文是 《Web Standards Solutions: The Markup and Style Handbook》一书中de一章.书号:ISBN:1590593812.我会陆续翻译此书中有价值de章节.
原作者:Dan Cederholm
翻译:阿宏
一个文档标题,最好de定义方法是什么?要回答这个问题,先设想我要在一个页面上定义文章de标题,通常我有三个方法来实现这个简单目de:

方法一: 有意义吗?
<span class=”heading”>文章标题</span>
虽然在某些情况下<span>会是一个方便de标签,但它并不能表达出标题de完整含义.采用这个方法de一个好处是,我可以对它附加一个CSS规则,分配其一个heading class,使其文字象标题一样显示.

.heading {
font-size: 24px;
font-weight: bold;
color: blue;
}
ok,现在所有de标题都用heading class标记成了大号de粗体字体,并且为蓝色.太棒了!但是这样做对吗?如果有人用一个不支持CSSde浏览器来观看,会怎样呢?

举个例子,如果我设置de这个外部样式表de规则不被老版本de浏览器支持,会怎样?又或者有视觉障碍de人用屏幕阅读器来阅读这个页面,又会怎样?一个访问者通过这些途径所看到(或听到)de应该和这个页面上正常de文本没有任何区别.

尽管class=”heading”为这个标签增加了一点意义,但<span>仍然只是一个普通de标签,可以被大多数浏览器de缺省样式所修改掉.

搜索引擎检索这个页面时会略过<span>标签,就好象它不存在一样,不会对其可能包含de关键字给于一点额外de重视.在后面我会更多de谈到搜索引擎和标题de关系.

最后,由于<span>标签是一个内嵌元素,我可能需要把它嵌套在一个额外de块级元素中,比如<p>标签或<div>标签,为de是使它能够形成单独de行,这会进一步被非必要de相关代码弄乱您de标签.而这些额外增加de标签却是必须de,这样才能使不支持CSSde浏览器显示出没有差别de文本.

方法二:<p>和<b>组合
<p><b>文章标题</b></p>
使用一个段落标签,将会给我带来块级de显示,<b>会把文本变成粗体.但是用这个方法标记一个重要de标题时,我面对de是同样无意义de结果.

不象方法A,<b>标签能在可视化de浏览器中把文字显示成粗体——甚至在不支持CSSde浏览器中.但是和<span>标签一样,搜索引擎也不会因为有一些东西在段落中被加粗了而给予更高de优先.

难以设计样式

用普通de<p>和<b>de组合,也带来了另一个缺憾——无法把这个标题设计成不同于其他段落de样式.我可能想用一个特别de样式来突出标题,来使页面内容更清晰更具结构,但是用这个方法只能使其显示成粗体.

方法三:样式加实质
<h1>文章标题</h1>
恩,多么好de标题定义.大多数de网页设计者对它都很熟悉.其实适当de使用它们,<Hn> 就能为页面内容提供灵活de、可索引de、以及可样式化de结构.

这也是聪明de定义方法,您会发现它很简单.不再需要额外de标签,您可以说,这仅仅比另外两个方法节省了一点点de字节,可以忽略不计,但节省一点是一点.

<h1>一直到<h6>,代表了标题de六个级别,从最重要de(<h1>)到最次要de(<h6>).他们本身就是块级de,不需要增加其它元素来使其单独成行.简单,有效——就是好工具.

轻松定制样式

因为我使用<h1>标签是唯一de,而<b>或<p>标签更适合使用在整个页面,所以我可以用各种各样deCSS方法来样式化.

更重要de是,尽管完全不用样式,一个标题标签也能明显de表示出一个标题!可视化de浏览器把 <h1>显示成更大de粗体.一个非样式化de页面将以被期望de那样显示文档结构,用适当de标题标签来传达意思.

屏幕阅读器、PDA、手机、以及可视化de和非可视化de浏览器都会明白,碰到一个标题标签时该做de事情,正确de处理,比页面上de普通文本更重视de来对待.而使用<span>标签,那些不支持CSSde浏览器就不会特别de对待它.

讨厌de默认样式

以往,由于浏览器默认de缺省值非常de丑陋,设计者们也许会避免完全de使用标题标签.或者,因为缺省值de巨大尺寸而避免使用<h1>或<h2>,取而代之de是用更高数值de标题标签来实现更小de尺寸.

然而,需要重点强调de是,我可以很简单de用CSS来改变这些标题标签——举个例子,一个< ;h1>并非一定是占满大半屏幕de巨大标版.在后面,我将证明用CSS来样式化标题标签是多么de简单,希望可以帮助您减轻巨大de恐惧.

对搜索引擎友好de

这是一个巨大de好处.搜索引擎喜欢标题标签.另一方面,一个<span>标签或者普通de加粗de段落标签却在意味着次要一点.适当de用<h1>到<h6>标记您de标题,只需要您de一点点努力,然而却让搜索引擎更容易de检索到您de页面,让人们最终能找到它们.

搜索引擎机器人会给予标题标签特别de关注——这是您可能放置一些关键词de地方.就象检索到 <title>和<meta>,它们会顺着标题标签往页面下面查找.如果您不使用这些标签,那么包含在里面de关键词将不会被认为是有价值de,从而被忽略掉.

所以只要付出一点点de努力,您就能增加人们基于页面de内容找到您de站点de可能性.听上去不错,不是吗?

关于标题de次序
在例子中,这个特别de标题是页面中最重要de,因为它是文档de标题.因此,我使用最重要de标题标签,<h1>.顺应W3Cde规范,一些人认为跳过数个标题级是个不好de使用.举个例子,想象我在下面de页面:

<h1>文章标题</h1>
我接下去de标题(如果不是用另一个<h1>重复de话)应该是<h2>,然后是<h3 >,等等.您也许不应该在<h1>后面跳过一级,直接跟上<h3>.我倾向于同意以上de观点,顺着行文保持级别de连续性,来构造一个排版结构.这样de话,给一个已经存在de页面添加标题和样式就更容易了,您会减少因使用超出de数字而导致de错误.

前面提到de,设计者也许会用<h4>来标签一个页面上最重要de标题,仅仅是因为它de缺省de字体尺寸不象<h1>那样令人生厌de巨大.但是记住,先结构,后设计.我总是能用CSS来把标题样式化成任何我喜欢de文字尺寸.

在DIV CSS排版中新闻列表的制作方法

星期三, 06月 4th, 2008

CSS相关代码:

.list{

margin: 0px 10px 20px;

text-align: left;

}

.list ul{

list-style-type: none;

margin: 0px;

padding: 0px;

}

.list li{

background: url(/news/images/line.gif) repeat-x bottom;

/*列表底部de虚线*/

width: 100%;

}

.list li a{

color: #777777;

display: block;

padding: 6px 0px 4px 15px;

background: url(/news/images/dot.gif) no-repeat 0 6px;

/*列表左边de箭头图片*/

}

.list li span{

float: right;/*使span元素浮动到右面*/

text-align: right;/*日期右对齐*/

}

.list li a:hover{

color: #336699;

background: url(/news/images/dot2.gif) repeat-x bottom;

}

注意:span一定要放在前面,反之会产生换行

<ul class=”list”>

<li><span>2005年5月30日 </span><a href=”#”>新闻标题01</a></li>

<li><span>2005年5月30日 </span><a href=”#”>新闻标题02</a></li>

<li><span>2005年5月30日 </span><a href=”#”>新闻标题03</a></li>

<li><span>2005年5月30日 </span><a href=”#”>新闻标题04</a></li>

</ul>

XHTML标准语法

星期三, 06月 4th, 2008

写XHTML要求使用干净deHTML语法


——————————————————————————–

Some More XHTML Syntax Rules:
更多XHTML语法规则:
Attribute names must be in lower case
属性名称必须为小写
Attribute values must be quoted
属性值使用双引号
Attribute minimization is forbidden
属性简写是不允许de
The id attribute replaces the name attribute
用id属性来替代name属性
The XHTML DTD defines mandatory elements
XHTML DTD定义强制元素

——————————————————————————–

Attribute Names Must Be In Lower Case
属性名称必须为小写
This is wrong:
这是错误de:

<table WIDTH=”100%”>This is correct:
这是正确de:

<table width=”100%”>

——————————————————————————–

Attribute Values Must Be Quoted
属性值必须带上双引号
This is wrong:
这是错误de:

<table width=100%>This is correct:
这是正确de:

<table width=”100%”>

——————————————————————————–

Attribute Minimization Is Forbidden
不允许属性简写
This is wrong:
这是错误de:

<input checked>
<input readonly>
<input disabled>
<option selected>
<frame noresize>This is correct:
正确de是这样:

<input checked=”checked” />
<input readonly=”readonly” />
<input disabled=”disabled” />
<option selected=”selected” />
<frame noresize=”noresize” />Here is a list of the minimized attributes in HTML and how they should be written in XHTML:
这是在HTML中简写de属性和其在XHTML中应该怎样书写de列表:

HTML XHTML
compact compact=”compact”
checked checked=”checked”
declare declare=”declare”
readonly readonly=”readonly”
disabled disabled=”disabled”
selected selected=”selected”
defer defer=”defer”
ismap ismap=”ismap”
nohref nohref=”nohref”
noshade noshade=”noshade”
nowrap nowrap=”nowrap”
multiple multiple=”multiple”
noresize noresize=”noresize”


——————————————————————————–

The id Attribute Replaces The name Attribute
id属性替换name属性
HTML 4.01 defines a name attribute for the elements a, applet, frame, iframe, img, and map. In XHTML the name attribute is deprecated. Use id instead.
对于a, applet, frame, iframe, img和map,HTML 4.01中定义了一个name属性,在XHTML中是不赞成这样做de,使用id来代替.

This is wrong:
这是错误de:

<img src=”picture.gif” name=”picture1″ />This is correct:
这是正确de:

<img src=”picture.gif” id=”picture1″ />Note: To interoperate with older browsers for a while, you should use both name and id, with identical attribute values, like this:
注意:为了版本比较低de浏览器,您应该同时使用name和id属性,并使它们两个de值相同de,像这样:

<img src=”picture.gif” id=”picture1″ name=”picture1″ />IMPORTANT Compatibility Note:
兼容性注意点:

To make your XHTML compatible with today”’’s browsers, you should add an extra space before the “/” symbol.
让您deXHTML兼容当前de浏览器您应该在/标记前添加空格


——————————————————————————–

The Lang Attribute
Lang 属性
The lang attribute applies to almost every XHTML element. It specifies the language of the content within an element.
lang属性可以应用于几乎所有deXHTML元素.它指定了元素中内容de语言

If you use the lang attribute in an element, you must add the xml:lang attribute, like this:
如果您像在一个元素中应用lang属性,您必须加上xml:lang属性,像这样:

<div lang=”no” xml:lang=”no”>Heia Norge!</div>

——————————————————————————–

Mandatory XHTML Elements
强制XHTML元素
All XHTML documents must have a DOCTYPE declaration. The html, head and body elements must be present, and the title must be present inside the head element.
所有deXHTML文档都必须有一个DOCTYPE声名.html、head和body元素必须出现,并且title必须在head元素里

This is a minimum XHTML document template:
这是一个极小deXHTML文档模板

<!DOCTYPE Doctype goes here>
<html xmlns=”http://www.w3.org/1999/xhtml“>
<head>
<title>Title goes here</title>
</head><body>
Body text goes here
</body></html>Note: The DOCTYPE declaration is not a part of the XHTML document itself. It is not an XHTML element, and it should not have a closing tag.
注意:DOCTYPE声明并不是XHTML文档自身de一部分.它也不是XHTML元素,它不该有关闭标签.

Note: The xmlns attribute inside the <html> tag is required in XHTML. However, the validator on w3.org does not complain when this attribute is missing in an XHTML document. This is because “xmlns=http://www.w3.org/1999/xhtml” is a fixed value and will be added to the <html> tag even if you do not include it.
注意:XHTML文档要求xmlns属性出现在html标签中.然而,w3.orgde校验器不会由于这个属性没有出现在您deXHTML文档中而报告错误.这是因为”xmlns=http://www.w3.org/1999/xhtml”是一个固定de值,即使您de文档里没有包含它,它也会自动加上de.

涉及网络编程时,需要用到的几个常用方法

星期二, 06月 3rd, 2008

涉及网络编程时,需要用到de几个常用方法.

1. 在ASP.NET中专用属性:
获取服务器电脑名:Page.Server.ManchineName
获取用户信息:Page.User
获取客户端电脑名:Page.Request.UserHostName
获取客户端电脑IP:Page.Request.UserHostAddress

2. 在网络编程中de通用方法:
获取当前电脑名:static System.Net.Dns.GetHostName()
根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名).AddressList
也可根据IP地址取出电脑名:static System.Net.Dns.Resolve(IP地址).HostName

3. 系统环境类de通用属性:
当前电脑名:static System.Environment.MachineName
当前电脑所属网域:static System.Environment.UserDomainName
当前电脑用户:static System.Environment.UserName

ASP.NET中用healthMonitor属性用法

星期二, 06月 3rd, 2008

  在ASP.NET 2.0中,可以使用healthMonitoring属性监测事件.healthMonitoring属性是一个基于方法deprovider,在这里可以构造自己deprovider.利用healthMonitoring属性,我可以诸如记录错语、成功de事件等,对不同de数据源,如事件日志,Sql Server甚至对于自己通过继承WebEventProvider类创建自己deproviders.在此文章中,我打算介绍配置一个监测SqlServer错语de并且对某人de电子信箱地址发送邮件deweb应用程序.首先,看一下在web.config中dehealthMonitoring程序片段,在此可以建立将要用到de事件.

<healthMonitoring Enabled=”true|false” heartBeatInterval=”time interval”>
 <bufferModes>… </bufferModes>
 <providers>… </providers>
 <eventMappings>… </eventMappings>
 <profiles>… </profiles>
 <rules>… </rules>
</healthMonitoring>

  如果看一下<healthMonitoring>元素,就可以判断是否可以将设置属性为有效或无效,也可以指定对WebHeaderBeatEvent被唤醒de时间间隔.healthMonitoring有5个孩子.

  bufferModes,在此可以定义一个Providerde缓冲区大小.

  Providers,在此说明处理事件deProviders.

  eventMappings, 在此可以画出与友好事件类型相关de事件名称.

  profiles, 在此定义一个可以用来配置事件de参数集集合.

  rules, 在此画出Providersde事件图.

  可以阅读更多含在VS 2550文档中de关于这些元素de东西.

  在继续之前,这里有一份含ASP.NET中de一些Providers清单:

System.Web.Management.MailWebEventProvider
System.Web.Management.SimpleMailWebEventProvider
System.Web.Management.TemplatedMailWebEventProvider
System.Web.Management.TraceWebEventProvider
System.Web.Management.EventLogWebEventProvider
System.Web.Management.SqlWebEventProvider
System.Web.Management.WmiWebEventProvider

  不需要解释这些,名字告诉我它们是干什么de.还要提一下SqlWebEventProvider依靠Sql server而工作,它将事件存储在aspnet_Web_Event表.为了安装此数据库,必须运行位于framework文件夹中deaspnet_regsql.exe向导.

  现在,配置对Sql server provider有登录错语并且发送一个电子邮件而产生错误de程序.

  下面是一个使用SqlWebEventProvider和SimpleMailWebEventProvider来存错语事件de例子.

<healthMonitoring enabled=”true” heartBeatInterval=”0″>
<bufferModes>
<add name=”Critical Notification” maxBufferSize=”100″ maxFlushSize=”20″urgentFlushThreshold=”1″ regularFlushInterval=”Infinite” urgentFlushInterval=”00:01:00″ maxBufferThreads=”1″/>

<add name=”Analysis” maxBufferSize=”1000″ maxFlushSize=”100″ urgentFlushThreshold=”100″
regularFlushInterval=”00:05:00″ urgentFlushInterval=”00:01:00″ maxBufferThreads=”1″/>

</bufferModes>
<providers>

<add name=”CriticalMailEventProvider” type=”System.Web.Management.SimpleMailWebEventProvider, System.Web …” from=info@nsquared2.net to=fnormen@hotmail.com priority=”High” bodyHeader=”Warning!”
bodyFooter=”Please investigate ASAP.” subjectPrefix=”Action required.” buffer=”true” bufferMode=”Critical Notification” maxEventLength=”4096″ maxSize=”4096″ maxMessagesPerNotification=”1″/>

<add name=”SqlWebEventProvider” type=”System.Web.Management.SqlWebEventProvider, System.Web …”
connectionStringName=”LocalSqlServer” maxEventDetailsLength=”1073741823″ buffer=”true”
bufferMode=”Analysis”/>

</providers>

<eventMappings>

<add name=”All Errors” type=”System.Web.Management.WebBaseErrorEvent, System.Web …”/>
<add name=”Request Processing Errors” type=”System.Web.Management.WebRequestErrorEvent, System.Web …/>

</eventMappings>

<profiles>

<add name=”Default” minInstances=”1″ maxLimit=”Infinite” minInterval=”00:10:00″/>

</profiles>

<rules>

<add name=”All Errors Default” eventName=”All Errors” provider=”SqlWebEventProvider” profile=”Default”
minInterval=”00:00:30″/>

<add name=”Request Processing Errors” eventName=”Request Processing Errors” provider=”CriticalMailEventProvider” profile=”Default”/>

</rules>

</healthMonitoring>

  在此例子中,使用Sql provider来记录所有错语事件,并且当Web请求错误事件被唤醒时使用mail provider来发送一个消息.

  这里有一些ASP .NET 2.0一起发布de事件:

System.Web.Management.WebBaseEvent
System.Web.Management.WebHeartBeatEvent
System.Web.Management.WebApplicationLifetimeEvent
System.Web.Management.WebRequestEvent
System.Web.Management.WebBaseErrorEvent
System.Web.Management.WebErrorEvent
System.Web.Management.WebRequestErrorEvent
System.Web.Management.WebAuditEvent
System.Web.Management.WebFailureAuditEvent
System.Web.Management.WebSuccessAuditEvent
System.Web.Management.WebManagementEvent
System.Web.Management.WebViewStateFailureAuditEvent
System.Web.Management.WebAuthenticationFailureAuditEvent
System.Web.Management.WebAuthenticationSuccessAuditEvent

  可以使用这些事件来对一个provider画图.也可以创建通过WebBaseEvent类继承来de自己de事件.

  为自动唤醒一个事件,可以使用WebBaseEvent类de唤醒方法:

try
{
 //….
}

catch(Exception e)
{
 if (HealthMonitoringManager.Enabled)
 {
  WebBaseEvent.Raise(new WebErrorEvent(”My Error message”, null, 5000, e));
 }
}

or:

if (HealthMonitoringManager.Enabled)
{
 WebErrorEvent event = new WebErrorEvent(”My error message”, null, 5000, e);
 event.Raise();
}

第一次用.net2.0 LOGIN登陆控件的困惑和解决方法

星期二, 06月 3rd, 2008

1、我没有真正de服务器,我只是租用了.net2.0 SQLserver空间,SQL数据库名是固定de.
2、空间提供商不可能给我设定数据源或给您aspnetdb数据库权限.
3、我没有服务器de \Windows\Microsoft.Net\Framework\v2.x\Config 权限.

已知上面三点,如果直接把本地测试好de项目传到服务器肯定会出错(因为他默认是调用\Windows\Microsoft.Net\Framework\v2.x\Config ),我认为好de解决方法是把aspnetdb数据库内容全部导入自己de远程SQL数据库后,再定义项目deweb.config数据库连接字符串.
web.config
<?xml version=”1.0″?>

<!–
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序de设置.可以使用 Visual Studio 中de
“网站”->“Asp.Net 配置”选项.
设置和注释de完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
–>
<configuration xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0“>
<connectionStrings>

<!–定义数据库连接–>
<add name=”DbName” connectionString=”Persist Security Info=False;server=127.0.0.1;database=aspnetdb;uid=sa;pwd=123;pooling=true”/>
</connectionStrings>
<appSettings>
</appSettings>

<system.web>

<!–
connectionStringName 数据库连接.这个要在web.config设置
enablePasswordRetrieval 获得一个值,指示当前成员资格提供程序是否配置为允许用户检索其密码.
enablePasswordReset 获得一个值,指示当前成员资格提供程序是否配置为允许用户重置其密码.
requiresQuestionAndAnswer 获取一个值,该值指示默认成员资格提供程序是否要求用户在进行密码重置和检索时回答密码提示问题.
applicationName 获取或设置应用程序de名称.
requiresUniqueEmail 指示用户在创建用户时是否必须提供唯一de电子邮件地址值.
passwordFormat 指示在成员资格数据存储区中存储密码de格式.下面有详细说明
maxInvalidPasswordAttempts 获取锁定成员资格用户前允许de无效密码或无效密码提示问题答案尝试次数.
minRequiredPasswordLength 获取密码所要求de最小长度.
minRequiredNonalphanumericCharacters 获取有效密码中必须包含de最少特殊字符数.
passwordAttemptWindow 获取在锁定成员资格用户之前允许de最大无效密码或无效密码提示问题答案尝试次数de分钟数.

对PasswordFormat de详细说明
属性指示存储密码de格式.密码可以采用 Clear、Encrypted 和 Hashed 密码格式存储.Clear 密码以明文形式存储,这可以提高存储和检索密码de性能,但安全性较差,当数据源安全性受到威胁时此类密码很容易被读取.Encrypted 密码在存储时进行了加密,可以在比较或检索密码时进行解密.此类密码在存储和检索时需要进行额外de处理,但比较安全,在数据源de安全性受到威胁时不容易被获取.Hashed 密码在存储到数据库时使用单向哈希算法和随机生成de salt 值进行哈希处理.在验证某一密码时,将用数据库中de salt 值对该密码进行哈希计算以进行验证.无法检索哈希密码.
–>


<roleManager enabled=”true” />
<membership>
<providers>
<remove name=”AspNetSqlMembershipProvider”/>
<add name=”AspNetSqlMembershipProvider”
type=” System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
connectionStringName=”DbName”
enablePasswordRetrieval=”false”
enablePasswordReset=”true”
requiresQuestionAndAnswer=”true”
applicationName=”/”
requiresUniqueEmail=”false”
passwordFormat=”Hashed”
maxInvalidPasswordAttempts=”5″
minRequiredPasswordLength=”6″
minRequiredNonalphanumericCharacters=”0″
passwordAttemptWindow=”10″
passwordStrengthRegularExpression=”" />
</providers>
</membership>


<!–
设置 compilation debug=”true” 可将调试符号插入
已编译de页面中.但由于这会
影响性能,因此只应在开发过程中设置
此值.

Visual Basic 选项:
设置 strict=”true” 将禁止所有会导致
数据丢失de类型转换.
设置 explicit=”true” 将强制声明所有变量.
–>
<compilation debug=”true” strict=”false” explicit=”true”/>
<pages>
<namespaces>
<clear/>
<add namespace=”System”/>
<add namespace=”System.Collections”/>
<add namespace=”System.Collections.Specialized”/>
<add namespace=”System.Configuration”/>
<add namespace=”System.Text”/>
<add namespace=”System.Text.RegularExpressions”/>
<add namespace=”System.Web”/>
<add namespace=”System.Web.Caching”/>
<add namespace=”System.Web.SessionState”/>
<add namespace=”System.Web.Security”/>
<add namespace=”System.Web.Profile”/>
<add namespace=”System.Web.UI”/>
<add namespace=”System.Web.UI.WebControls”/>
<add namespace=”System.Web.UI.WebControls.WebParts”/>
<add namespace=”System.Web.UI.HtmlControls”/>
</namespaces>
</pages>
<!–
通过 <authentication> 节可以配置 ASP.NET 使用de
安全身份验证模式,
以标识传入de用户.
–>
<authentication mode=”Forms” />
<!–
如果在执行请求de过程中出现未处理de错误,
则通过 <customErrors> 节可以配置相应de处理步骤.具体说来,
开发人员通过该节可以配置
要显示de html 错误页
以代替错误堆栈跟踪.

<customErrors mode=”RemoteOnly” defaultRedirect=”GenericErrorPage.htm”>
<error statusCode=”403″ redirect=”NoAccess.htm” />
<error statusCode=”404″ redirect=”FileNotFound.htm” />
</customErrors>
–>

</system.web>
</configuration>

注:membership节点de那个注释是转载de,忘了地址了.

ASP.NET技巧:数据岛出到Excel最为简易的方法

星期二, 06月 3rd, 2008

只需将ContentType 设置为 “application/vnd.ms-excel”,表示以Excel方式输出.
相关代码如下:
DataToExcel.aspx:
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”DataToExcel.aspx.cs” Inherits=”DataToExcel” %>

<html xmlns=”http://www.w3.org/1999/xhtml“>
<head runat=”server”>
<title>DataToExcel</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<asp:GridView ID=”GridView1″ runat=”server”>
</asp:GridView>
</form>
</body>
</html>DataToExcel.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class DataToExcel : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.Response.ContentType = “application/vnd.ms-excel”;
string ConnStr = “server=localhost;uid=sa;pwd=;database=northwind”;
SqlConnection Conn = new SqlConnection(ConnStr);
Conn.Open();
string sqlcmd = “select lastname,firstname,title, address, city from employees”;
SqlCommand cmd = new SqlCommand(sqlcmd, Conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
this.GridView1.DataSource = ds.Tables[0].DefaultView;
this.GridView1.DataBind();
}
}
}

ASP.NET2.0服务器控件之Render方法

星期二, 06月 3rd, 2008

  控件呈现是指向HTTP输出流中写入标记文本de过程.服务器通过HTTP输出流向客户端发送生成de标记文本,这些文本将会通过客户端浏览器转换为可视化de元素显示出来.使用控件呈现,开发人员可以将HTML标记、脚本相关代码、CSS样式表等等输入到客户端浏览器.实现服务器控件呈现主要有两种方式:一是Control类deRender方法,二是WebControldeRenderContents方法.本文重点介绍使用Control类deRender方法实现控件呈现de应用.
  使用HtmlTextWriter类
  Control类deRender方法主要用于实现控件呈现,其声明相关代码如下:
protected virtual void Render(HtmlTextWriter output)


  如上相关代码所示,Render方法de参数是一个HtmlTextWriter类型.为了更好de应用Render方法,读者应首先了解HtmlTextWriter类及其相关内容.
  根据MSDN2005de描述,HtmlTextWriter类用于将标记字符和文本写入到ASP.NET服务器控件输出流.此类提供了ASP.NET服务器控件在向客户端呈现标记时所使用de格式设置功能.为了实现类de功能,HtmlTextWriter类定义了多个字段、属性和方法.由于成员对象众多,本文只挑选了一些常用成员加以说明,同时,还将介绍一些ASP.NET 2.0de新增成员.
  常用成员对象包括:
  ·AddAttribute方法
  对于HtmlTextWriter对象通过对RenderBeginTag方法de后续调用创建de元素,向其开始标记中添加指定de标记属性和值.
  ·AddStyleAttribute方法
  对于 HtmlTextWriter 对象通过对 RenderBeginTag 方法de后续调用创建de元素,向其开始标记中添加标记样式属性.
  ·Write方法
  将指定数据类型连同任何挂起de制表符间距一起写入到输出流.
  ·WriteAttribute方法
  将标记属性及其值写入到输出流.
  ·WriteBeginTag方法
  任何制表符间距和指定标记元素de开始标记写入到输出流.
  ·WriteEndTag方法
  写入指定de标记元素de任何制表符间距和结束标记.
  ·Encoding属性
  获取 HtmlTextWriter 对象用于将内容写入页de编码.
  ·Indent属性
  获取或设置用以缩进每一行标记de开始位置de制表符位置数.
  ·NewLine属性
  获取或设置由 HtmlTextWriter 对象使用de行结束符字符串.
  对于初学者而言,建议重点掌握以上成员对象de应用.另外,ASP.NET 2.0还为HtmlTextWriter类新增了一些成员,这些成员包括:
  ·BeginRender方法
  通知 HtmlTextWriter 对象或派生类de对象,某个控件将会呈现.
  ·EndRender方法
  通知 HtmlTextWriter 对象或某个派生类de对象,某控件已完成呈现.
  ·IsValidFormAttribute方法
  检查一个属性以确保它可以在 <form> 标记元素de开始标记中呈现.
  ·WriteEncodedUrl方法
  对指定de URL 进行编码,然后将它写入到输出流.URL 可以包括参数.
  ·WriteEncodedText方法
  对请求de设备de指定文本进行编码,然后将其写入到输出流.
  ·WriteBreak方法
  将 <br /> 标记元素写入到输出流.

  使用Render方法实现控件呈现
  1、基础知识
  本文所讲解deRender方法隶属于System.Web.UI.Controls.Control类.该类是创建服务器控件de基类,很多控件类均继承自该类.在Control类中包括三个用于实现控件呈现de方法:Render、RenderChildren和RenderControl.它们都使用HtmlTextWriterde实例作为参数,它们允许为一个HtmlTextWriter对象提供服务器控件de内容,并将其内容封装至HTTP输出流中输出到客户端显示.下面简单对这三个方法进行简单介绍.
  (1) protected virtual void Render(HtmlTextWriter writer);
  该方法用于将服务器控件内容发送到提供deHtmlTextWriter对象,此对象编写将在客户端呈现de内容.在开发服务器控件时,可以重写此方法以呈现服务器控件.
  (2) protected virtual void RenderChildren(HtmlTextWriter writer);
  该方法用于将服务器控件子级de内容输出到提供deHtmlTextWriter对象,此对象编写将在客户端呈现de内容.该方法通知ASP.NET呈现页中de所有Active Server Pages相关代码.如果页上没有任何ASP相关代码,此方法将呈现服务器控件de所有子控件.
  (3) protected virtual void RenderControl(HtmlTextWriter writer);和protected void RenderControl (HtmlTextWriter writer,ControlAdapter adapter)
  RenderControl有两个重载方法,它们都用于将服务器控件de内容输出到所提供deHtmlTextWriter对象中.如果已启用跟踪功能,则存储有关控件de跟踪信息.如果服务器控件deVisible属性设置为true,该方法将确定是否启用页de跟踪功能.如果启用,它将存储与控件有关de跟踪信息,同时向页呈现服务器控件de内容.另外,前一个重载方式是ASP.NET 2.0从ASP.NET 1.0中继承而言,后一个重载方式是ASP.NET 2.0新增de.后者具体使用提供deControlAdapter对象将服务器控件内容输出到提供deHtmlTextWriter对象.其中参数adapter是ControlAdapter类型,它用于定义呈现deControlAdapter.当实现在各种设备和浏览器中运行de服务器控件时,该方法比较常用.
  以上3个方法看起来好像是独立de3个方法,然而,实际上它们之间存在密切de联系.读者可通过阅读以下示意性相关代码,从而理解它们之间de关系.

//RenderCotrol方法基本实现
public void RenderControl(HtmlTextWriter output)
{
 if(Visible)
 {
  Render(output);
 }
}
//Render方法基本实现
protected virtual void Render(HtmlTextWriter output)
{
 RenderChildren(output);
}
//RenderChildren方法基本实现
protected virtual void RenderChildren(HtmlTextWriter output)
{
 foreach(Control c in Controls)
 {
  c.RenderControl(output);
 }
}
  如上相关代码所示,其中列举了RenderControl、Render、RenderChildren方法de实现思路.显而易见de是,在控件呈现过程中,这三个方法都在起着作用,而且使用了一个简单de递归调用过程.大体而言,可以理解为:
  (1)页面框架建立一个HtmlTextWriter类de实例;
  (2)页面框架将这个实例对象传递给RenderControl方法;
  (3)RenderControl方法检查控件de可视属性Visible是否为true.如果为true,RenderControl方法将调用Render方法;如果为false,则不呈现该控件和其子控件;
  (4)Render方法执行默认实现,调用RenderChildren方法;
  (5)RenderChildren方法按照默认实现中de设定调用每个子控件deRenderControl方法;
  实际上,如果读者短时间内不能理解以上过程也没有很大de关系.对于初学者而言,关键是要记住最重要、最常用de是Render方法.控件开发者可以通过重写Render方法完成呈现控件de任务.
  2、示例应用
  上文介绍了使用Control类deRender方法实现控件呈现de基础知识.下面将通过一个典型示例,帮助读者初步理解Renderde使用方法.示例效果如图1所示.
按此在新窗口浏览图片
图1效果图
  如图1所示,该服务器控件呈现了一个超链接,并且设置了文本为红色.当用户单击红色文字时,页面将转向微软站点.当然,用户可以通过属性LinkUrl来设置超链接地址.
  下面列举了示例实现源相关代码.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace UsingRenderControl
{
 [DefaultProperty("LinkUrl")]
 [ToolboxData("<{0}:RenderControl runat=server></{0}:RenderControl>")]
 public class RenderControl : Control
 {
  // 实现LinkUrl
  [Bindable(true)]
  [Category("Appearance")]
  [DefaultValue("http://localhost/")]
  [Localizable(true)]
  public string LinkUrl
  {
   get { String s = (String)ViewState["LinkUrl"];
    return ((s == null) ? String.Empty : s);}
   set { ViewState["LinkUrl"] = value; }
  }
  // 重写Render方法
  protected override void Render(HtmlTextWriter writer)
  {
   writer.AddAttribute(HtmlTextWriterAttribute.Href, LinkUrl);
   writer.AddStyleAttribute(HtmlTextWriterStyle.Color, “red”);
   writer.RenderBeginTag(HtmlTextWriterTag.A);
   writer.Write(”浏览网站”);
   writer.RenderEndTag();
  }
 }
}
  如上相关代码实现了自定义服务器控件类RenderControl.该类从Control基类继承,具体实现了表示超链接地址deLinkUrl(默认值为http://localhost/),并重写了Render方法.在重写Renderde过程中,调用了一些HtmlTextWriter类成员,例如,Writer、AddAttribute、AddStyleAttribute、RenderBeginTag和RenderEndTag方法等.另外,可能开发人员在使用Writer方法过程中,需要呈现一个比较长de字符串.建议此时多多使用Writer方法,而不要使用字符串级联或者StringBuilder类de相关方法进行实现.因为,那样将会消耗大量de系统时间和内存,效率较低.

  可能有一些读者会问,如果将服务器控件呈现de多行相关代码de顺序变化一下,是否会有什么不同呢?例如,假设首先依次应用RenderBeginTag、Write、RenderEndTag方法,然后再调用AddAttribute和AddStyleAttribute方法,那么会显示相同de效果吗?答案是否定de.这里需要强调de是:在呈现控件de过程中,首先要定义服务器控件de属性和CSS样式等内容,然后再定义服务器控件de主体内容,这种顺序不能改变de.
  另外,如果读者感兴趣可以在相关代码中实现一个Text属性,用于获取或者设置控件所显示de文本.这样,在Render方法中,使用Write方法输出de”浏览网站”文字内容则可由Text属性代替.
  下面列举了为使用以上de自定义服务器控件,而创建deDefault.aspx文件源相关代码.

<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>
<%@ Register TagPrefix=”Sample” Assembly=”UsingRenderControl” Namespace=”UsingRenderControl” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>使用Render方法实现控件呈现</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<Sample:RenderControl runat=”server” ID=”CustomerControl” LinkUrl=”http://www.microsoft.com/”>
</Sample:RenderControl>
</div>
</form>
</body>
</html>
  以上相关代码比较简单,其中主要声明了自定义服务器控件RenderControl,并设置其LinkUrl属性值为http://www.microsoft.com,即微软站点地址.
  当用户在浏览器中运行以上页面,并查看相关deHtml源文件时,可得到如下de相关代码:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title> 使用Render方法实现控件呈现</title>
</head>
<body>
<form name=”form1″ method=”post” action=”Default.aspx” id=”form1″>
<div>
<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” value=”/wEPDwUJNzMyMTY5NTU2ZGQQYrLd/G vm1h41r2CEkxID63o5g==” />
</div>
<div>
<a href=”http://www.microsoft.com/” style=”color:red;”>浏览网站</a>
</div>
</form>
</body>
</html>
  通过观察以上相关代码可知,自定义服务器控件RenderControl实际呈现de结果是粗体所示部分de相关代码,其最终呈现为一个表示超链接de<a>标记.
  小结
  本文首先介绍了HtmlTextWriter类de基本知识,然后讲解了使用Render方法实现控件呈现de应用.在随后de一篇文章中,笔者将说明另外一种实现控件呈现de方法.从服务器控件开发技术总体而言,控件呈现技术是开发过程中最为常用,也是最为简单de内容.建议读者能够熟练掌握其中de内容.

Java布局管理器使用方法

星期一, 06月 2nd, 2008

很多初学者在用Java布局器自动布局画界面时,经常遇见不知道如何定义区域大小或按钮之间de距离等问题.我写过一篇《实现JAVA手动布局中各个组件能随窗口变化de方法》de文章,有读者反映算坐标不好算,问能不能用布局器实现文章中de界面.其实自动布局也可以解决定义区域大小或按钮之间de距离等问题,只是没有手动布局那么灵活.下面我就举一个例子.
  首先,建一个frame文件(Application应用程序),在Design中将this中delayout设置为BorderLayout.
  第二,在组件盘内点选Swing Container页签,选取Jpanel图标,在this中上方拖拽一块区域,布局器会自动调整位置与大小;同样de方法在中下方也拖拽一块区域;在Swing Container页签,选取jScrollPane图标,将jScrollPane在中间拖拽一块区域.拖拽de顺序一定要先上后下再中间.为了方便区分,在Propertiesdebackground中,将上方deJpanel1区域设置为红色,下方deJpanel2区域设置为橙色,中间dejScrollPane1为粉红色.将Jpanel1和Jpanel2delayout设置为flowLayout(必须要手动设置,不要采用默认值).
  第三,在Jpanel中放入一个Jlable标题栏,JTextField1文本框和Jbutton按钮,在组件盘内点选Swing 页签,选取JLable图标在Jpanel1de中画一个标题栏,将text改为“请输入查询条件”,再选取JtextField在Jpanel1中画一个文本框,将text改为空,最后选取Jbutton在Jpanel1中再画一个按钮将text改为“查询”.画完后他们都是在中间,而且大小固定,这时点选JpaneldeflowLayout1将右边Properties中dealignment设置为LEFT,这时Jpanel1中de组键就会向左排列.选中其中一个组键,在Properties中depreferredSize可以设置组键de宽和高.同样de方法在Jpanel2中画三个Jbutton按钮,将text分别设为“增加”、“删除”、“修改”.点选Jpane2deflowLayout2将右边Properties中dehgap设置为30(按钮de间距,可根据自己de需要调整数值大小), 这样就调整了三个按钮之间de距离,设置vgap还可以改变Jpane2区域de高度.
  第四,在jScrollPane1中建一个表格用来显示数据库数据de内容,在组件盘内点选Swing 页签,选取JTable图标,将Jtable加入到jScrollPane1中.
  最后,将this中dedefaultCloseOperation改为EXIT_ON_CLOSE,这样在关闭窗口时程序会自动退出.
  程序源相关代码如下(除中文注释部分de两句是自己加上去,其余是自动生成):
  import javax.swing.*;
  import java.awt.*;
  import java.awt.event.*;
  import java.util.Vector;
  import javax.swing.table.DefaultTableModel;
  public class Frame1
  extends JFrame {
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel jPanel1 = new JPanel();
  JPanel jPanel2 = new JPanel();
  JPanel jPanel3 = new JPanel();
  JLabel jLabel1 = new JLabel();
  JTextField jTextField1 = new JTextField();
  JButton jButton1 = new JButton();
  FlowLayout flowLayout1 = new FlowLayout();
  FlowLayout flowLayout2 = new FlowLayout();
  JButton jButton2 = new JButton();
  JButton jButton3 = new JButton();
  JButton jButton4 = new JButton();
  GridLayout gridLayout1 = new GridLayout();
  JScrollPane jScrollPane1 = new JScrollPane();
  JTable jTable1 = new JTable();
  public Frame1() {
  try {
  jbInit();
  }
  catch (Exception e) {
  e.printStackTrace();
  }
  }
  public static void main(String[] args) {
  Frame1 frame1 = new Frame1();
  frame1.setSize(new Dimension(400, 350));
  frame1.show();
  }
  private void jbInit() throws Exception {
  this.getContentPane().setLayout(borderLayout1);
  jPanel1.setBackground(Color.red);
  jPanel1.setLayout(flowLayout1);
  jPanel2.setBackground(Color.red);
  jPanel2.setLayout(flowLayout2);
  jPanel3.setBackground(Color.pink);
  jPanel3.setLayout(gridLayout1);
  jLabel1.setPreferredSize(new Dimension(100, 16));
  jLabel1.setText(”请输入查询条件”);
  jTextField1.setPreferredSize(new Dimension(140, 22));
  jTextField1.setText(”");
  jButton1.setText(”查询”);
  jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
  flowLayout1.setAlignment(FlowLayout.LEFT);
  flowLayout1.setHgap(5);
  flowLayout1.setVgap(10);
  jButton2.setText(”增加”);
  jButton3.setText(”删除”);
  jButton4.setText(”修改”);
  flowLayout2.setHgap(30);
  flowLayout2.setVgap(5);
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  this.getContentPane().add(jPanel1, BorderLayout.NORTH);
  jPanel1.add(jLabel1, null);
  jPanel1.add(jTextField1, null);
  jPanel1.add(jButton1, null);
  this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
  jPanel2.add(jButton2, null);
  jPanel2.add(jButton3, null);
  jPanel2.add(jButton4, null);
  this.getContentPane().add(jPanel3, BorderLayout.CENTER);
  jPanel3.add(jScrollPane1, null);
  jScrollPane1.getViewport().add(jTable1, null);
  }
  //模拟查询数据库
  void jButton1_actionPerformed(ActionEvent e) {
  try { //制作表
  Vector vcol = new Vector(); //列名
  Vector vrow = new Vector(); //内容
  for (int col = 1; col < 31; col ) {
  vcol.addElement(”列” col);
  }
  for (int row = 1; row < 101; row ) {
  Vector vr1 = new Vector();
  for (int col = 1; col < 31; col ) {
  vr1.addElement(row “/” col);
  }
  vrow.addElement(vr1);
  }
  DefaultTableModel dtm = new DefaultTableModel(vrow, vcol);
  jTable1 = new JTable(vrow, vcol);
  jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); //滚动条设置左右滚
  this.jScrollPane1.getViewport().add(jTable1, null); //在滚动条中放入表
  }
  catch (Exception ex) {
  JOptionPane.showMessageDialog(null, ex);
  }
  }
  }
  class Frame1_jButton1_actionAdapter
  implements java.awt.event.ActionListener {
  Frame1 adaptee;
  Frame1_jButton1_actionAdapter(Frame1 adaptee) {
  this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
  adaptee.jButton1_actionPerformed(e);
  }
  }

J2SE1.5 注释语法

星期一, 06月 2nd, 2008

说起注解语法,对于任何一个Java开发人员来说都已经耳熟能详了,我每天都在使用着 @author, @param,等等编写注释,然后用javadoc生成文档.Javade这种方便de文档生成方法受到了开发者de普遍赞誉.而从JDK1.5开始,注释语法提供了更为强大de功能.
  我先谈谈注释语法本身,它有时候也称为meta-data :“描述数据de数据” .一般来说它们可以被用来生成文档,检查相关代码间依赖关系,帮助编译器作语法检查.时下比较流行de工具有Xdoclet等.对于文档生成早已经有了javadoc工具de完美表现,而对于相关代码检查,如今java也提供了语言级de支持.
  我知道,javadoc是通过提取java源文件中de标签信息来生成文档.所以要学习新de注释语法,们首先要熟悉de就是新增de标签.新de注释语法支持两种标签,系统标准标签和用户自定义标签.标签de符号也原先一样,@符号加上标签名字.我先从JDK1.5自带de标准标签说起.
  首先介绍@override , 也不用多罗嗦,顾名思义了,就是用来说明方法覆载de.我假设有一个子类必须要覆载父类de方法.
  ================================================================================
  public class Parent{
  public void foo(){
  System.out.println(”Original Implementation of foo”);
  }
  }
  public class Child extends Parent{
  @Override
  public void foo(){
  System.out.println(”Overide Implementation of foo”);
  }
  }
  ================================================================================
  目前为止我看不出来这个@Override给我带来了任何好处,所以我先说说加个这个标签后,我用javac编译de时候编译器执行了些什么呢?编译器会检查这个方法,然后从父类查找是否有这个方法,否则就编译出错.这个特性可以帮助我避免一些低级错误.上面这个例子,子类想覆载foo()方法,不过您可能一时疏忽把它写成了fob(), 对于这样de”低级错误”,如果您没有在前期就发现de话,到系统集成测试de时候,可能会化上您几个小时甚至一两天去找出这样debug.现在好了,编译器在编译de时候就会给出错误,
  Child.java:3: method does not override a method from its superclass
  @Override
  ^
  1 error

  怎么样,这个功能还不错吧.
   看过了标准标签de使用方法,我来看看用户自定义标签.首先介绍@interface, 它用于定义新de注释类型(annotation type).新建一个注释类型看起来和定义一Interface 没有什么两样,MyTag.java用于新建一个用户自定义标签,相关代码如下,
  ===============================================================================
  package tiger.annotation;
  /**
  * 用户自定义标签??MyTag
  */
  public @interface MyTag { }
  定义了一个tag之后,我就可以在任何java文件中使用这个tag了,
  import tiger.annotation.MyTag;
  public class TagTest{
  @MyTag
  public void testTag(){
  }
  }
  ===============================================================================
  注释类型还可以有成员变量,
  ==============================================================================
  package tiger.annotation;
  /**
  * 用户自定义标签??带有成员变量deMyTag
  */
  public @interface MyTag {
  String name();
  int age();
  }
  =============================================================================
  然后我可以这么使用这个标签,
  @MyTag(name=”MyTag”,age=1)
  public void testTag(){
  }
  使用标签最终是为了帮助开发人员提取注释信息,然后根据不同需求做进一步处理,下面我来看看如何获取注释信息.
  =============================================================================
  import java.lang.annotation.Annotation;
  import tiger.annotation.MyTag;
  public class TagTest{
  @MyTag(name=”MyTag”,age=1)
  public void test(){
  }
  public static void main(String[] args){
  TagTest tt = new TagTest();
  try {
  Annotation[] annotation =tt.getClass().getMethod(”test”).getAnnotations();
  for (Annotation tag :annotation) {
  System.out.println(”Tag is:” tag);
  System.out.println(”tag.name()” ((MyTag)tag).name());
  System.out.println(”tag.age()” ((MyTag)(tag)).age());
  }
  } catch(NoSuchMethodException e) {
  e.printStackTrace();
  }
  }
  }
  ===============================================================================
  需要注意de一点是,在执行这段相关代码之前我还有一点小工作要做,还需要给我de自定义标签MyTag加上一个说明标签,@ Retention, 表明注释信息将可以在运行时刻通过反射机制得到.如果不加入这个标签,上面de相关代码将没有任何输出.修改以后deMyTag如下:
  ================================================================================
  /**
  * 用户自定义标签??带有成员变量deMyTag
  */
  @Retention(RetentionPolicy.RUNTIME)
  public @interface MyTag {
  String name();
  int age();
  }
  ================================================================================
  然后我执行TagTest可以得到输出如下,
  Tag is:@tiger.annotation.MyTag(name=MyTag, age=1)
  tag.name()MyTag
  tag.age()1
  好了,Tiger新de注释语法基本用法就这么简单,基本用法虽然简单,但是获取注释信息之后如何处理确很值得推敲,我可以用他们来做一些语法检查,文件相关性检查,进行各种统计等等.关于更多deTiger新注释语法de信息,可以访问[link=http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html].
  以上相关代码在win2k j2se5 GA下通过.