知识大全 基于控件构架开发访问JavaMail的控件
Posted 知
篇首语:最慢的步伐不是跬步,而是徘徊;最快的脚步不是冲刺,而是坚持。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于控件构架开发访问JavaMail的控件相关的知识,希望对你有一定的参考价值。
基于控件构架开发访问JavaMail的控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Beehive只是提供了三种访问企业资源的系统控件 现实情况下我们需要访问更多类型的企业资源 所以我们需要自己来开发符合自己需要的控件 在这篇文章里 作者将介绍如何基于控件架构开发访问JavaMail资源的控件 简化对JavaMail资源的访问
从前面的文章中 我们已经学习了Beehive中提供的三种访问企业资源的控件 JDBC控件 EJB控件和JMS控件 而这也是Beehive中目前已经提供的全部系统控件 然而J EE标准中提供的企业资源类型远不止这三种 开发者选择等待Beehive开发组提供更多的控件显然是不明智的 我们必须自己动手来解决控件的开发
本文中就将给大家介绍如何基于控件架构提供的API来开发自己的控件 我们选择开发者经常需要访问的企业资源——JavaMail作为目标资源 按照控件的命名规则 我们暂且叫做JavaMail控件吧
要完成一个控件的设计 通常需要完成如下的工作
- 确定控件要完成的功能 分析要完成控件的功能 确定没有使用控件之前我们通常需要提供哪些参数 这些参数是否可能组合成集合使用 参数是否必须提供 参数的类型等 根据分析结果 设计和实现对应于这些参数的注释 这些注释能够完整地体现第二步中分析的结果 定义和实现控件公共类
根据控件的使用情况 确定控件公共接口类中需要对外提供的接口方法 要确定这些接口方法可能会比较困难 因为有些时候控件设计者可能难于确定是否为控件使用者提供低级接口以便使用者能够深入的控制控件的行为
提供控件实现类控件实现类通常被设计成可扩展(实现orntrols api bean Extensible接口)的 这样方便使用者扩展该实现类 控件实现类中最主要的方法是invoke(Method m Object[] args)方法 这个方法的参数 m 代表控件使用者调用的业务方法 而 args 数组则对应着控件使用者调用该业务方法时提供的调用参数 控件实现类需要根据使用者提供的注释和调用业务时提供的参数完成控件主体功能的实现
下面的章节中 我们将详细地讲解如果依照上面的步骤来完成JavaMail控件的设计和开发 本文中所有例子的源代码可以在通过资源下载区中的连接完成下载
控件功能定义
JavaMail控件的开发目标是完成访问SMTP服务器发送邮件的封装 提供足够的注释满足开发者在发送邮件时需要设置的参数 同时提供邮件发送的实现方法使开发者在使用控件后无需编写访问SMTP服务器 设置邮件发送者/接收者等参数 发送邮件的代码 而只需要将精力集中到业务逻辑上
需要提供的注释
在开发控件之前 我们需要确定向开发者提供哪些注释才能够满足他们定制控件的实际需求 因此我们首先要分析开发者使用这些控件时通常需要提供哪些参数 要访问SMTP服务器发送邮件 开发需要提供的参数分为两类
目标SMTP服务器的参数
目标SMTP服务器的参数包括目标SMTP服务器的地址 访问SMTP服务器是否需要提供安全信息以及访问SMTP服务器所需要的用户名和密码 其中目标SMTP服务器的地址是必须的 我们需要提供的参数和相关要求如表 所示
表 SMTP服务器参数表
参数名 参数类型 参数说明 是否必须提供 说明 serverAddress String SMTP服务器的地址 是 比如SMTP服务的地址是 authorizationRequired boolean 使用SMTP服务器发送邮件时是否需要提供安全信息 否 如果需要提供安全信息 这个参数设为true 否则设为false principal String 访问SMTP邮件服务器时使用的用户名 否 credentials String 访问SMTP邮件服务器时使用的密码 否被发送邮件的参数
要发送一个邮件 我们需要提供的参数和相关要求如表 所示
表 邮件参数表
参数名 参数类型 参数说明 是否必须提供 例子 from String 邮件发送者 是 to String 邮件的接收者 可以使用 的形式传递多个接收者 是 比如我们可以使用 来设置邮件有两个接收者 cc String 邮件抄送的接收者 可以使用 的形式传递多个抄送的接收者 否 bcc String 邮件暗送的接收者 可以使用 的形式传递多个暗送的接收者 否 subject String 邮件的主题 否 contentType String 被发送邮件的格式 默认使用text/plain 另外一种可选的类型是text/ 你还可以在这个参数中加入字符集的设置 否 比如我们可以使用 text/;charset= GB 来设置被发送的邮件使用格式 编码使用GB attachment String 邮件附件 否 Content Object 邮件内容 否注释设计 实现
从以上两种参数常见的使用场景来看 由于同一个应用中SMTP服务器通常是比较固定的 所以SMTP服务器的参数也是比较固定的 而被发送邮件的参数则随着业务的变化而不断发生变化 充分考虑到这种不同点 我们需要为上面这两种种情况提供不同的注释以及注释的使用范围
- SMTPServer注释
SMTP服务器参数的注释名为SMTPServer 它可以设计成一个类级别的注释 用于为控件的继承类提供注释 根据前面表 的分析 SMTPServer必须提供四个参数 serverAddress authorizationRequired principal credentials
由于和JavaMail控件结合非常紧密 SMTPServer注释被设计成控件接口的内部类 清单 的第 到 行显示了SMTP注释的全部代码 代码中为关键的内容提供了相应的提示信息
Message注释被发送邮件的参数对应的注释名为Message 由于通常和业务方法密切相关 因此我们Message注释被定义成为控件继承类中的业务方法提供注释
根据表 的分析 Message对象必须提供 个参数 分别是 from to cc bcc subject contentType attachment Content 其中Content(被发送邮件的参数中邮件内容)比较特殊 因为他会根据环境的不同而发生变化 所以我们将它看作Object类型的变量 在注释中定义Object这种类型没有必要 因此设计时我们不把Content当作的Message注释的属性 而是将它变成业务方法必须提供的参数
Message注释被设计成JavaMail控件接口的内部类 Message注释的全部代码参见清单 的第 ~ 行代码
- 控件接口
由于邮件发送的功能比较简单 因此我们的控件接口类并不需要过多的提供接口方法 唯一设计提供的接口方法名为getMailException 它的功能是控件使用者调用时返回邮件发送过程中产生的最后一个违例 清单 中提供了控件接口类的全部源代码
清单 src\\\\vivianj\\beehive\\controls\\examples\\javamail\\
JavaMailControl java
package ntrols examples javamail; import java lang annotation ElementType; import java lang annotation Inherited; import java lang annotation Retention; import java lang annotation RetentionPolicy; import java lang annotation Target; import orntrols api bean AnnotationConstraints; import orntrols api bean AnnotationMemberTypes; import orntrols api bean ControlInterface; import orntrols api properties PropertySet; /** * JavaMailControl 是JavaMail控件的公共接口类 */ @ControlInterface public interface JavaMailControl /** * 获取邮件发送过程中产生的最后一个违例 * @return 返回邮件发送过程中产生的最后一个违例 */ public Throwable getMailException(); /** * 类级别的注释 用于注释JavaMail控件中目标SMTP服务器的 相关信息 */ @PropertySet(prefix = SMTPServer ) /* 使用@ Inherited注释表示该注释可以被自动继承 */ @Inherited /* 使用AllowExternalOverride表示定义的接口可以被覆蓋 */ @AnnotationConstraints AllowExternalOverride @Retention(RetentionPolicy RUNTIME) /* 使用TYPE和FIRELD表示该注释能够作用于类 接口 以及类成员变量 */ @Target( ElementType TYPE ElementType FIELD ) public @interface SMTPServer /** * SMTP邮件发送服务器的地址 这个属性是必须设置的 */ String serverAddress(); /** * 使用该SMTP服务器发送邮件是否需要安全认证 * true 需要安全认证 * false 不需要安全认证 */ @AnnotationMemberTypes Optional boolean authorizationRequired() default false; /** * 访问SMTP邮件服务器时使用的用户名 */ @AnnotationMemberTypes Optional String principal() default ; /** * 访问SMTP邮件服务器时使用的密码 */ @AnnotationMemberTypes Optional String credentials() default ; /** * * Message 用于注释继承类中的业务方法 描述被发送邮件的信息 */ @PropertySet(prefix = Message ) @Inherited @AnnotationConstraints AllowExternalOverride @Retention(RetentionPolicy RUNTIME) @Target( ElementType METHOD ) public @interface Message /** * 邮件的发送者 */ String from(); /** * 邮件的接收者 可以使用 的 形式传递多个接收者 */ String to(); /** * 邮件抄送的接收者 可以使用 的形式传递多个抄送的接收者 */ @AnnotationMemberTypes Optional String cc() default ; /** * 邮件暗送的接收者 可以使用 的形式传递多个暗送的接收者 */ @AnnotationMemberTypes Optional String bcc() default ; /** * 邮件的主题 */ @AnnotationMemberTypes Optional String subject() default ; /** * 被发送邮件的类型 默认使用text/plain */ @AnnotationMemberTypes Optional String contentType() default text/plain;charset=UTF ; /** * 邮件附件 */ @AnnotationMemberTypes Optional String attachment() default ;
从清单 中提供的源代码中我们注意到 SMTPServer接口的authorizationRequired principal credentials属性之前使用了@AnnotationMemberTypes Optional注释 应用了@AnnotationMemberTypes Optional注释属性表示用户使用过程中可以不为这些属性提供内容 没有提供@AnnotationMemberTypes Optional注释的属性(比如serverAddress)被视为必须设置的属性 控件使用者使用该注释时必须提供对应的声明 否则将无法通过编译
控件实现类
JavaMail控件要完成邮件发送的工作 必须要完成获取目标SMTP服务器参数 设置SMTP服务器参数 获取用户业务方法调用中提供的注释和参数 发送邮件等工作 其中获取目标SMTP服务器参数 设置SMTP服务器参数的动作通常只需要一次完成就行了 我们设计成在控件初始化的时候完成 反映到JavaMail控件的实现类中 我们可以将这部分工作在onCreate方法中完成
在控件实现类中 最主要的方法就是invoke(Method m Object[] args) 这个方法中的两个参数为我们提供了用于调用业务方法时提供的注释内容和调用参数 邮件发送的工作也被设计成在这个方法中完成
JavaMail控件实现类继承了JavaMail控件的接口类 同时实现了orntrols api bean Extensible接口 这样JavaMail控件的使用者就可以直接继承该控件 清单 中显示了JavaMail实现类的完整源代码如下 源代码中在每一个关键点都提供了详细的说明 帮助大家理解JavaMail实现类的实现原理 请大家重点关注其中的onCreate和invoke两个方法
清单 src\\\\vivianj\\beehive\\controls\\examples\\javamail\\
JavaMailControlImpl java
package ntrols examples javamail; import java lang reflect Method; import java util Properties; import javax activation DataHandler; import javax activation FileDataSource; import javax mail Address; import javax mail BodyPart; import javax mail Multipart; import javax mail Session; import javax mail Transport; import javax mail internet InternetAddress; import javax mail internet MimeBodyPart; import javax mail internet MimeMessage; import javax mail internet MimeMultipart; import orntrols api bean ControlImplementation; import orntrols api bean Extensible; import orntext Context; import orntext ControlBeanContext; import orntext ResourceContext; import orntext ControlBeanContext LifeCycle; import orntrols api events EventHandler; /** * JavaMailControlImpl 用于封装访问SMTP邮件服务器发送邮件的操作 */ @ControlImplementation public class JavaMailControlImpl implements JavaMailControl Extensible java io Serializable static final long serialVersionUID = L; @Context ControlBeanContext context; @Context ResourceContext resourceContext; private Throwable lastException; private Session session; private Properties props; private String serverAddress; private boolean authorizationRequired; private String principal; private String credentials; private MimeMessage mimeMessage; private Multipart multipart; @EventHandler(field = context eventSet = LifeCycle class eventName = onCreate ) public void onCreate() SMTPServer server = (SMTPServer) context getControlPropertySet(SMTPServer class); /* 获取SMTP服务器的地址 */ serverAddress = server serverAddress(); /* 目标SMTP服务器发送邮件时是否需要安全认证 */ authorizationRequired = server authorizationRequired(); /* 访问目标SMTP服务器时的用户名 */ principal = server principal(); /* 访问目标SMTP服务器时的密码 */ credentials = server credentials(); if (props == null) props = System getProperties(); /* 初始化SMTP服务器地址 */ props put( mail smtp host serverAddress); /* 初始化访问目标SMTP服务器时是否需要提供安全信息 */ setAuthorizationRequired(authorizationRequired); /** * 返回邮件发送过程中的最后一个违例对象 */ public Throwable getMailException() return lastException; /** * 根据用户提供的注释和调用方法时传入的参数完成邮件发送的 动作 * * @param m * 被调用的业务方法 * @param args * 调用业务方法时传递的参数 */ public Object invoke(Method m Object[] args) throws Throwable Message message = (Message) context getMethodPropertySet(m Message class); /* 获取邮件的接收者 */ String to = message to(); /* 获取邮件的发送者 */ String from = message from(); /* 获取邮件抄送的接收者 */ String cc = (); /* 获取邮件暗送的接收者 */ String bcc = message bcc(); /* 获取邮件格式 */ String contentType = ntentType(); /* 获取邮件附件 */ String attachment = message attachment(); /* 获取邮件主题 */ String subject = message subject(); /* 获取邮件内容 */ Object body = null; /* 如果业务方法没有提供发送方法 抛出违例信息 */ if (args length < ) body = ; throw new IllegalArgumentException( At most one parameter may be defined as the + body of the Mail message ); else body = args[ ]; /* 创建邮件对象 */ createMimeMessage(); /* 设置邮件对象的发送者 */ setFrom(from); /* 设置邮件对象的接收者 */ setTo(to); /* 设置邮件对象的抄送接收者 */ setCC(cc); /* 设置邮件对象的暗送接收者 */ setBCC(bcc); /* 设置邮件主题 */ setSubject(subject); /* 设置邮件内容和格式 */ setBody(body contentType); /* 设置邮件附件 */ setAttachment(attachment); /* 发送邮件 */ sendMail(); return null; /** * 设置访问SMTP服务器时是否需要提供 * * @param need * 访问SMTP服务器时是否需要提供安全信息 true 需要 false 不需要 */ private void setAuthorizationRequired(boolean need) if (props == null) props = System getProperties(); if (need) props put( mail smtp auth true ); else props put( mail smtp auth false ); /** * 创建用于发送的邮件对象 */ private void createMimeMessage() throws Exception try /* 获得邮件发送上下文 */ session = Session getDefaultInstance(props null); catch (Exception e) e printStackTrace(); lastException = e; throw e; try /* 创建邮件发送消息对象 */ mimeMessage = new MimeMessage(session); /* 创建邮件发送对象 */ multipart = new MimeMultipart(); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 设置被发送邮件的内容 * * @param body * 被发送邮件的内容 * @param contentType * 被发送邮件的类型 */ public void setBody(Object body String contentType) throws Exception try BodyPart bodyPart = new MimeBodyPart(); bodyPart setContent(body contentType); multipart addBodyPart(bodyPart); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 设置被发送邮件的主题 * * @param subject * 被发送邮件的主题 */ public void setSubject(String subject) throws Exception try mimeMessage setSubject(subject); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 为被发送邮件增加附件 * * @param attachment * 附件的文件路径 */ public void setAttachment(String attachment) throws Exception try BodyPart bp = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(attachment); bp setDataHandler(new DataHandler(fileds)); bp setFileName(fileds getName()); multipart addBodyPart(bp); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 设置邮件的发送者 * * @param from * 邮件的发送者email地址 */ public void setFrom(String from) throws Exception try mimeMessage setFrom(new InternetAddress(from)); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 设置邮件的接收者 * * @param to * 邮件的接收者字符串 */ public void setTo(String to) throws Exception try mimeMessage setRecipients( javax mail Message RecipientType TO InternetAddress parse(to)); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 设置邮件抄送的接收者 * * @param cc * 邮件抄送的接收者字符串 */ public void setCC(String cc) throws Exception try mimeMessage setRecipients( javax mail Message RecipientType CC (Address[]) InternetAddress parse(cc)); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 设置邮件暗送的接收者 * * @param bcc * 邮件暗送接收者字符串 */ public void setBCC(String bcc) throws Exception try mimeMessage setRecipients( javax mail Message RecipientType BCC (Address[]) InternetAddress parse(bcc)); catch (Exception e) e printStackTrace(); lastException = e; throw e; /** * 发送邮件 * */ private void sendMail() throws Exception try /* 设置邮件发送消息对象 */ mimeMessage setContent(multipart); /* 保存邮件发送消息对象 */ mimeMessage saveChanges(); /* 获取邮件发送上下文 */ Session mailSession = Session getInstance(props null); /* 根据SMTP服务器对于安全的不同要求连接SMTP服务器 */ Transport transport = mailSession getTransport( smtp ); if (authorizationRequired) nnect((String) props get( mail smtp host ) principal credentials); else nnect((String) props get( mail smtp host ) ); /* 发送邮件给所有接收者 */ Address[] tos = mimeMessage getRecipients(javax mail Message RecipientType TO); if (tos != null && tos length > ) System out println( tos length = + tos length); transport sendMessage(mimeMessage tos); /* 发送邮件给所有抄收的接收者 */ Address[] ccs = mimeMessage getRecipients( javax mail Message RecipientType CC); if (ccs != null && ccs length > ) transport sendMessage(mimeMessage ccs); System out println( ccs length = + ccs length); /* 发送邮件给所有暗送的接收者 */ Address[] bccs = mimeMessage getRecipients( javax mail Message RecipientType BCC); if (bccs != null && bccs length > ) transport sendMessage(mimeMessage bccs); System out println( bccs length = + bccs length); /* 断开与SMTP服务器的连接 */ transport close(); catch (Exception e) e printStackTrace(); lastException = e; throw e;
经过上面的这些步骤以后 JavaMail控件的主体部分就已经全部完成了 我们可以将它编译 打包成jar文件 在另外的应用中使用它 下面的内容将介绍如何使用JavaMail控件完成JavaMail资源访问
使用JavaMail控件访问JavaMail资源
JavaMail控件本身并不能直接用于发送邮件 控件使用者必须继承该控件 提供对应的注释后才能够完成邮件发送的工作 本章节中将给大家讲解如何继承JavaMail控件来完成邮件发送的工作
使用JavaMail控件连接到需要提供安全认证的SMTP服务器网易(NEASE)公司是我个人比较喜欢的提供免费邮箱服务的网络公司 网易(NEASE)公司提供的免费邮箱对应的SMTP服务器()需要提供安全认证才能够发送邮件
我们将编写一段代码 调用已经完成的JavaMail控件 访问需要提供安全信息的网易公司的SMTP服务器 为了简化例子 我们假设仅仅需要通过这段代码将邮件发送给唯一的一个接收者 不需要暗送或者抄送给其他人 要发送的邮件也没有附件
清单 中显示了符合要求的一个例子
清单 src\\\\vivianj\\beehive\\controls\\examples\\
NeaseJavaMailControl java
package ntrols examples; import orntrols api bean ControlExtension; import ntrols examples javamail JavaMailControl; /** * NeaseJavaMailControl 用于继承JavaMail控件 完成邮件发送的 * 功能 使用邮件服务器 * 使用该SMTP服务器需要提供安全信息 */ @ControlExtension @JavaMailControl SMTPServer(serverAddress = authorizationRequired = true principal = principal credentials = credentials ) public interface NeaseJavaMailControl extends JavaMailControl /** * 完成发送邮件的功能 * 邮件发送者的邮箱是 * 邮件接收者的邮箱是 * 邮件主题是hello * 邮件的内容由控件使用者在调用时使用参数body传入 * * @param body * 邮件的内容 */ @JavaMailControl Message(from = to = subject = hello ) public void sendMail(String body);
使用Java控件连接到不需要提供安全认证的SMTP服务器是我创建的唯J族组织负责维护的一个网站 它同时能够为唯J族组织的部分用户提供SMTP服务 它所使用的SMTP服务器()在发送邮件时不需要用户提供安全认证信息
我们将编写一段代码 调用已经完成的JavaMail控件 连接到不需要提供安全信息的SMTP服务器—后发送邮件 为了简化例子 我们假设仅仅需要通过这段代码将邮件发送给唯一的一个接收者 不需要暗送或者抄送给其他人 要发送的邮件也没有附件
清单 中显示了符合要求的一个例子
清单 src\\\\vivianj\\beehive\\controls\\examples\\
VivianjJavaMailControl java
package ntrols examples; import orntrols api bean ControlExtension; import ntrols examples javamail JavaMailControl; /** * VivianjJavaMailControl 用于继承JavaMail控件 * 实现通过邮件服务器发送邮件的功能 * 使用该SMTP服务器不需要提供安全信息 */ @ControlExtension @JavaMailControl SMTPServer( serverAddress = authorizationRequired = false principal = username credentials = password ) public interface VivianjJavaMailControl extends JavaMailControl /** * 完成发送邮件的功能 * 邮件发送者的邮箱是p * 邮件接收者的邮箱是 * 邮件主题是hello * 邮件的内容由控件使用者在调用时使用参数body传入 * * @param body * 邮件的内容 */ @JavaMailControl Message(from = p to = subject = hello ) public void sendMail(String body);
结束语
Beehive 发布的时候 只是提供了三种系统控件 JDBC控件 EJB控件和JMS控件 分别用于访问JDBC数据源 EJB和JMS 然而实际应用情况下 我们通常需要访问更多类型的企业资源 所以我们必须要根据实际情况编写符合实际要求的控件
本文中 作者选择J EE中常见的JavaMail资源作为例子 详细地介绍了如何基于控件架构分析 设计 实现和访问JavaMail控件的过程 读者可以根据上面的步骤 结合自己的实际需求 编写更多的控件 简化企业应用开发
参考资源
Beehive在线资源
下载资源
本文中例子下载地址
JMSControlExamples zip
作者简介 肖菁 肖菁 是唯J族()创始人 BEA 杭州User Group负责人 自由撰稿人 开源项目BuildFileDesigner(buildfilede)和V Security(v secu)创始人 cha138/Article/program/Java/JSP/201311/19433相关参考
控件指南使用Data控件访问数据库 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用Data控
在C#中跨线程访问Winform控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在程序需要读
基于CStatic的波形曲线控件的实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!波形曲线控件在
我们在做winform应用的时候大部分情况下都会碰到使用多线程控制界面上控件信息的问题然而我们并不能用传统方法来做这个问题下面我将详细的介绍 首先来看传统方法 publicpartialcla
基于ASP.NET的Web动态控件创建 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 摘要web
知识大全 基于asp.net的web页面动态控件创建以及使用
摘要web设计中有很多场合页面的控件要动态创建甚至只能动态创建这样可以增加页面的灵活性但是给程序员带来了一些麻烦比如要使用动态创建的控件怎么使用都是要求解决的问题本文基于aspnet简要介绍了页面的
ASP.NET2.0中数据源控件之异步数据访问 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在
知识大全 asp.net身份验证(登录控件),基于标准的sqlserver
身份验证(登录控件)基于标准的sqlserver(vs+sqlserver) 文章类别ASPNET技巧|发表日期星期四|文章等级 广告PassBiBle微软MCSE|思科CCNA|CCNP|C
Asp.net控件开发----控件开发基础 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 服务器
控件的显示自然会离不开输出HTMLCSSJavascript等前台的显示内容所以开发一个控件的时候第一件事就是要知道如何输出客户端要显示的内容 一选择基类 中所有的标准控件都可以拿过来作为基类