web报表制作工具OpenReports 1.0-M2 发布

OpenReports 开发小组宣布,web报表制作工具OpenReports 1.0-M2 发布。 OpenReports 提供基于web 的灵活报表解决方案,支持 PDF,HTML 和XLS 报表格式,基于WebWork,Hibernate 和 Velocity 开发完成,并且还提供一个整合了Tomcat 的OpenReports-Tomcat 文件下载. 新版本包括了一系列的bug fix,支持JasperReports 1.2.0,以及scheduling 的提升。 下载地址:http://oreports.com/index.php?option=com_content&task=view&id=24&Itemid=30 <淘宝热门商品:
 

¥:50.00 

【北京同仁堂国药】

 

 

【化妆品大联盟】☆美丽佳人☆╯护肤·美妆~ 冲三冠特惠!

来源:程序员网

小小豆叮

Java 理论与实践:让 J2EE 脱离容器

大多数项目不是属于 J2EE 应用程序就是属于 J2SE 应用程序。不过,有一些 J2EE 技术可以存在于 J2EE 容器之外,并且有些 J2SE 应用程序可以对它们加以利用。本月,Brian Goetz 分析如何在 J2SE 应用程序中使用某些 J2EE 服务。在大多数情况下,Java 应用程序要么是 J2EE 应用程序、要么是 J2SE 应用程序,并且在这一点上是泾渭分明的。J2EE 应用程序需要 J2EE 容器的服务,容器要实现一长串的 J2EE API,包括 Enterprise JavaBean (EJB)、JTA、JNDI、JMS、JCA 和 JMX。J2EE API 设计为协同工作;毕竟,J2EE 设计是从多年来数百人开发企业应用程序的经验中提取出的公共需求。像所有框架一样,J2EE API 的主要目的是“不重新发明轮子”。 有一些 API 属于 J2EE 规范的一部分,但是可以很容易地在 J2SE 应用程序中使用,如 JDBC、JSP 和 servlet,但是对于大多数 J2EE API,J2EE 是一个要么是要么不是的命题??大多数 J2EE API 需要全功能的 J2EE 容器。不过,有一些服务器应用程序开发为 J2SE 应用程序而非 J2EE 应用程序,这通常都有很好的理由。为什么这些应用程序的开发人员必须重新发明轮子呢?J2EE 中是否有部分内容可以容易地被 J2SE 应用程序借用来提供同样的优点呢?什么组件可以同时用于 J2EE 和 J2SE 应用程序的组件呢? 松散耦合 J2EE 的一个主要设计原理是 J2EE 应用程序可以松散地耦合??用组件组装,在组装或者部署应用程序时而不是在组件开发时定义或者改变这些组件的相互连接。J2EE 组件使用 JNDI 相互查找和查找所需要的资源,如 JDBC 和 JMS 连接。JMS 这样的技术鼓励松散耦合,允许灵活地为工作流程建模、容易分配处理任务、可伸缩性和容错性。很多 J2SE 服务器应用程序也可以从这些技术和原理中受益。 像 JDBC、JMS 和 JNDI 这样的 API 基本上是“中间件”??它们作为应用程序与不同的服务提供者之间的统一接口。几乎每一个数据库服务器都有 JDBC 驱动程序,有大量的免费数据库服务器,所以几乎每一个希望利用数据库的 Java 应用程序都可以容易地做到这一点。不过,对于 JMS 就不是这样了。消息队列服务器远没有数据库这样常见,特别是在小型商店中。但是有大量的应用程序可以通过使用消息队列而极大地受益。 Somnifugi JMS 消息队列是一个功能强大的范例,它用于构建健壮的、灵活的、松散耦合的、可伸缩的应用程序。有一些商业消息队列产品,如 WebSphere MQ、Sonic、Fiorano、JBossMQ 和 SpiritWave。就像 JDBC 对于数据库一样,JMS 是消息的中间件??它使得应用程序可以通过统一的接口访问不同的消息队列产品,这个接口提供了像 Connection、Topic 和Message 这样的抽象。 许多 J2SE 应用程序使用某种形式的消息队列,但是不使用 JMS??而是使用线程池、工作队列、任务管理器等。AWT 和 Swing 框架使用消息(事件)在模型与视图层之间通信,JavaBean 组件利用监听器支持一种基于主题的消息。消息队列提供了很多结构上的优点??它固有的松散耦合有利于采用灵活的、基于组件的方法,并提供了有助于简化设计和减少互连的天然抽象边界。一个附带的好处是,MQ 范例使得分布式的、可伸缩的和容错的设计变得更容易了,因为消息生产者和使用者不一定需要运行在同一 JVM 中,大多数生产者/使用者任务的本性是允许并发处理的。 大多数项目不是属于 J2EE 应用程序就是属于 J2SE 应用程序。不过,有一些 J2EE 技术可以存在于 J2EE 容器之外,并且有些 J2SE 应用程序可以对它们加以利用。本月,Brian Goetz 分析如何在 J2SE 应用程序中使用某些 J2EE 服务。在大多数情况下,Java 应用程序要么是 J2EE 应用程序、要么是 J2SE 应用程序,并且在这一点上是泾渭分明的。J2EE 应用程序需要 J2EE 容器的服务,容器要实现一长串的 J2EE API,包括 Enterprise JavaBean (EJB)、JTA、JNDI、JMS、JCA 和 JMX。J2EE API 设计为协同工作;毕竟,J2EE 设计是从多年来数百人开发企业应用程序的经验中提取出的公共需求。像所有框架一样,J2EE API 的主要目的是“不重新发明轮子”。 有一些 API 属于 J2EE 规范的一部分,但是可以很容易地在 J2SE 应用程序中使用,如 JDBC、JSP 和 servlet,但是对于大多数 J2EE API,J2EE 是一个要么是要么不是的命题??大多数 J2EE API 需要全功能的 J2EE 容器。不过,有一些服务器应用程序开发为 J2SE 应用程序而非 J2EE 应用程序,这通常都有很好的理由。为什么这些应用程序的开发人员必须重新发明轮子呢?J2EE 中是否有部分内容可以容易地被 J2SE 应用程序借用来提供同样的优点呢?什么组件可以同时用于 J2EE 和 J2SE 应用程序的组件呢? 松散耦合 J2EE 的一个主要设计原理是 J2EE 应用程序可以松散地耦合??用组件组装,在组装或者部署应用程序时而不是在组件开发时定义或者改变这些组件的相互连接。J2EE 组件使用 JNDI 相互查找和查找所需要的资源,如 JDBC 和 JMS 连接。JMS 这样的技术鼓励松散耦合,允许灵活地为工作流程建模、容易分配处理任务、可伸缩性和容错性。很多 J2SE 服务器应用程序也可以从这些技术和原理中受益。 像 JDBC、JMS 和 JNDI 这样的 API 基本上是“中间件”??它们作为应用程序与不同的服务提供者之间的统一接口。几乎每一个数据库服务器都有 JDBC 驱动程序,有大量的免费数据库服务器,所以几乎每一个希望利用数据库的 Java 应用程序都可以容易地做到这一点。不过,对于 JMS 就不是这样了。消息队列服务器远没有数据库这样常见,特别是在小型商店中。但是有大量的应用程序可以通过使用消息队列而极大地受益。 Somnifugi JMS 消息队列是一个功能强大的范例,它用于构建健壮的、灵活的、松散耦合的、可伸缩的应用程序。有一些商业消息队列产品,如 WebSphere MQ、Sonic、Fiorano、JBossMQ 和 SpiritWave。就像 JDBC 对于数据库一样,JMS 是消息的中间件??它使得应用程序可以通过统一的接口访问不同的消息队列产品,这个接口提供了像 Connection、Topic 和Message 这样的抽象。 许多 J2SE 应用程序使用某种形式的消息队列,但是不使用 JMS??而是使用线程池、工作队列、任务管理器等。AWT 和 Swing 框架使用消息(事件)在模型与视图层之间通信,JavaBean 组件利用监听器支持一种基于主题的消息。消息队列提供了很多结构上的优点??它固有的松散耦合有利于采用灵活的、基于组件的方法,并提供了有助于简化设计和减少互连的天然抽象边界。一个附带的好处是,MQ 范例使得分布式的、可伸缩的和容错的设计变得更容易了,因为消息生产者和使用者不一定需要运行在同一 JVM 中,大多数生产者/使用者任务的本性是允许并发处理的。 在 JBoss 发行版的 jnpserver.jar JAR 文件中可以找到 JNP JNDI 服务器,它还依赖于 log4j 日志引擎。要使用它,必须配置 log4j,创建相应的 jndi.properties 文件(参见清单 1),并安排通过调用同一 JVM 或者另一个 JVM 中的 org.jnp.server.Main 的主入口点来启动服务器。访问 JNDI 名称空间的类文件在 JBoss 发行版的 jnpclient.jar JAR 文件中。 清单 1. JNPServer 的 jndi.properties java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces # Uncomment this line only if the JNDI server is to run in another JVM; # otherwise, local JNDI requests will go over RMI #java.naming.provider.url=localhost Java 管理扩展(JMX) Java 管理扩展(Java Management Extensions,JMX)是一种管理组件和服务的生命周期的机制。JBoss 大量使用 JMX??JBoss 中的几乎所有组件都作为 JMX 服务提供。结果就是很容易配置一个只包括所需服务的应用程序。对于每一个组件服务,创建一个名为 MBean (托管的 bean)对象,它包含生命周期方法(start() 和 stop())和公开属性的 getter 和 setter。清单 2 显示了描述一个简单 Web 容器服务的 MBean 接口: 清单 2. 简单 Web 容器服务的 MBean 接口 public interface WebServerMBean { // Lifecycle methods void create() throws Exception; void start() throws Exception; void stop(); void destroy(); // Getter and setter for listener-port property int getPort(); void setPort(int port); // Get the names of loaded Web applications String[] getWebApplications(); } JBoss 还包括一个 Web 应用程序(jmx-console),它可以查看当前装载到 JBoss 服务器中的 MBeans、检查它们当前的状态、并用浏览器读取和写入它们的属性。(JMX 参考实现还包括一个名为 HtmlAdapter 的 Web 应用程序。) 虽然 JMX 是为 J2EE 提供的,但是也可以在 J2SE 应用程序中容易地使用它。至少有两个免费的 JMX 实现,Sun 的参考实现和开放源代码 MX4J。编写一个 MBean 以描述一个组件是相当简单的??通常所要做的就是实现 start() 和stop() 方法。编写一个简单的装载一组 MBean 并启动它们的 JMS “容器”只需约 40 行代码。遵循 JMX 标准,不但得到使用 JMS 的好处,比如远程属性检查和操纵(这对于调试及管理都有好处),而且还可以更容易地编写可以轻易地同时运行在 J2SE 和 J2EE 环境中的组件。 结束语 虽然 J2EE 和 J2SE 是用于不同工作的不同工具,但是许多开发人员发现自己必须决定各种框架服务的“轻量级”和“重量级”实现,比如消息、配置或者管理。通过使用 J2EE 接口的较轻量级的实现,如 Somnifugi JMS,开发人员可以在短期内得到性能和易于使用的好处,同时又具有在将来需要时,可以容易地迁移到更重量级的解决方案的灵活性。 <淘宝热门商品:
 

保健品/滋补品 

淑芳阁_苗条姿_最有效的减肥瘦身与丰胸专卖店

 

185.00 元  

累计销售1000多件 G-STAR 雪纺短款夹克

来源:程序员网

小小豆叮

把WebLogic EJB程序迁移到JBoss上

WebLogic服务器是一款顶级的商业应用程序服务器。但是对于小规模的开发者来说,开发源代码的、基于标准的应用程序服务器JBoss是可以用来替换类似WebLogic或WebSphere等商业应用程序服务器的。不幸的是,在WebLogic中开发的应用程序不能在JBoss中部署。JBoss迁移服务为我们提供了把应用程序迁移到JBoss上的支持。作为代替,通过把厂商特定的部署文件信息迁移到JBoss上,是可能把应用程序迁移到JBoss上的。为了演示如何把应用程序迁移到JBoss的过程,我们将把一个在WebLogic中开发的带有Oracle数据库的EJB应用程序迁移到带有MySQL数据库的JBoss应用程序服务器上。   预安装软件   为了配置MySQL数据库的JDBC连接,需要下载MySQL数据库驱动程序类。   1.下载MySQL JDBC驱动程序.jar文件   2.下载和安装MySQL数据库服务器   3.下载和安装JBoss 4.0应用程序服务器   开发一个Java应用程序,我们将使用它和XSLT把WebLogic部署文件转换为JBoss部署文件。该部署文件也可以使用XSLT工具进行转换。   概述   在不进行修改的时候,WebLogic中开发的应用程序是不能部署在JBoss中的。JBoss应用程序的部署文件与WebLogic的部署文件不同。在本文中,我们将把一个在WebLogic中开发的实体(entity)EJB应用程序示例迁移到JBoss中,迁移的方法是把WebLogic部署文件转换为JBoss部署文件。   示例应用程序包含一个Catalog实体EJB。该EJB的bean类(CatalogBean.java)、远程接口(Catalog.java)、和home接口(CatalogHome.java)都在本文下载链接的weblogic-jboss-resources.zip示例文件中。我们将使用MySQL开放源代码数据库来配置JBoss应用程序。把WebLogic EJB应用程序部署到JBoss中并不需要修改实体EJB类,只需要修改该EJB的部署文件。   配置JBoss和MySQL   MySQL是一个开放源代码的数据库,它适合于开放源代码的项目和小型组织。为了配置JBoss和MySQL数据库需要进行下面一些修改。   配置JBoss类路径   为了使用JBoss 4.0和MySQL,我们首先要把驱动程序类.jar文件(mysql-connector-java-3.0.9-stable-bin.jar)复制到<JBoss>/server/default/lib目录中。其中的<JBoss>是JBoss应用程序服务器安装的目录。lib目录的.jar和.zip文件都包含在JBoss服务器的Classpath(类路径)中。   配置MySQL数据源   为了使用MySQL数据源,需要把<JBoss>/docs/examples/jca/mysql-ds.xml复制到<JBoss>/server/default/deploy目录中。当JBoss服务器启动的时候,deploy目录中的数据源配置文件就被部署好了。依照下面的步骤修改mysql-ds.xml配置文件:   · 把<driver-class/>设置为com.mysql.jdbc.Driver,<connection-url/>设置为jdbc:mysql://localhost/<database>,其中<database>是MySQL数据库。<database>的值可以设置为test,它是MySQL中的示例数据库。   · 在jndi-name元素中指定数据源的JNDI名称。   · 指定连接MySQL数据库的用户名和密码。在默认情况下,root用户名不需要密码。   · 把type-mapping元素指定为mySQL。type-mapping元素指定了standardjbosscmp-jdbc.xml部署文件中预定义的数据库类型映射关系。对于MySQL数据库来说,类型映射是mySQL。   修改过的mysql-ds.xml如下所示: <?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost/test</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password></password> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources>   我们可以通过提供数据源JNDI名称从数据源获取一个JDBC连接: InitialContext initialContext = new InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource) initialContext.lookup("java:/MySqlDS"); java.sql.Connection conn = ds.getConnection();   配置登录信息   现在我们根据MySQL数据库设置来修改login-config.xml配置文件。为了登录到MySQL数据库,应用程序策略MySqlDbRealm是必要的。给login-config.xml添加下面的<application-policy/>元素: <application-policy name = "MySqlDbRealm"> <authentication> <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag = "required"> <module-option name ="principal"></module-option> <module-option name ="userName">root</module-option> <module-option name ="password"></module-option> <module-option name ="managedConnectionFactoryName"> jboss.jca:service=LocalTxCM,name=MySqlDS </module-option> </login-module> </authentication> </application-policy>   通过修改mysql-ds.xml和login-config.xml文件,JBoss 4.0服务器已经被配置好了,可以使用MySQL数据库了。除了前面的一些特定的设置之外,可能还需要对JBoss部署文件和JBoss JDBC配置文件作一些修改。   如果"建立表"选项被选中(通过把jbosscmp-jdbc.xml中的create-table元素设置为true)用于部署CMP实体EJB,并且MySQL表的主键(或唯一键)的长度超过了500字节,应用程序的部署过程会在MySQL数据库中生成一个SQL语法错误。对于java.lang.String类型的CMP字段,我们可以通过在standardjbosscmp-jdbc.xml部署文件的mySQL类型映射中把用于Java类型java.lang.String的SQL类型设置为较低的VARCHAR值来减小主键(或唯一键)的长度。另一个可能出现的问题是jbosscmp-jdbc.xml部署文件中的column-name元素。如果某个MySQL表的列名与MySQL保留字相同,在JBoss中部署J2EE应用程序的时候会产生一个错误。解决这个问题的方法是使列名与MySQL保留字不同。 转换WebLogic EJB应用程序   在建立起使用MySQL的JBoss服务器之后,你现在必须把该WebLogic EJB应用程序转换为JBoss EJB应用程序,这就涉及到部署文件的修改。WebLogic实体EJB应用程序由EJB部署文件(ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml),bean类(CatalogBean.java)、远程接口(Catalog.java)和home接口(CatalogHome.java)组成。为了在WebLogic服务器上部署实体EJB,需要建立一个EJB .jar文件,这个EJB .jar文件的结构如下: META-INF/ ejb-jar.xml weblogic-ejb-jar.xml weblogic-cmp-rdbms-jar.xml CatalogBean.class Catalog.class CatalogHome.class   EJB的结构信息和应用程序汇编信息都在部署文件中指定。结构信息包括说明EJB是对话EJB还是实体EJB。ejb-jar.xml部署文件中的应用程序汇编信息在assembly-descriptor元素中指定。WebLogic中该实体EJB部署文件包括ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml。相应的JBoss部署文件是ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml。这些文件之间的转换如下所示。   ejb-jar.xml部署文件对于WebLogic和JBoss来说都是一样的,除了multiplicity元素之外。JBoss服务器的ejb-jar.xml中的multiplicity元素需要大写,例如One或Many,而不是one或many。   示例实体EJB的ejb-jar.xml部署文件包含在示例代码中。示例ejb-jar.xml定义了一个叫做"Catalog"的实体EJB。这个示例EJB拥有CMP字段catalogId、journal和publisher。其主键字段是catalogId。   把weblogic-ejb-jar.xml转换为jboss.xml   weblogic-ejb-jar.xml和jboss.xml部署文件都是EJB厂商的特定部署文件。为了把WebLogic EJB应用程序部署到JBoss应用程序服务器上,必须把weblogic-ejb-jar.xml部署文件转换为jboss.xml。   weblogic-ejb-jar.xml中的根元素是weblogic-ejb-jar。jboss.xml中的根元素是jboss。在jboss.xml和weblogic-ejb-jar.xml部署文件中指定某个EJB的JNDI名称的元素是jndi-name或local-jndi-name。本文中的示例实体EJB的weblogic-ejb-jar.xml部署文件也包含在示例代码中。weblogic-ejb-jar.xml部署文件的DOCTYPE元素是: <!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN" "http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd" > jboss.xml部署文件的DOCTYPE是: <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">   我们通过一个自定义的XSLT样式表jboss.xslt(包含在示例代码中)把部署文件weblogic-ejb-jar.xml转换为jboss.xml。该样式表建立jboss.xml,它是与WebLogic的weblogic-ejb-jar.xml部署文件相当的JBoss文件。使用jboss.xslt样式表所生成的jboss.xml文件也包含在示例代码中。   把weblogic-cmp-rdbms-jar.xml转换为jbosscmp-jdbc.xml   weblogic-cmp-rdbms-jar.xml部署文件指定了CMP实体EJB的数据库持续信息。weblogic-cmp-rdbms-jar.xml文件包含实体EJB的表名称、连接到数据库的数据源和与该实体EJB CMP字段对应的列。示例实体EJB的weblogic-cmp-rdbms-jar.xml部署文件包含在可以下载的.zip文件中。指定CMP视图EJB持续信息的JBoss部署文件是jbosscmp-jdbc.xml。   weblogic-cmp-rdbms-jar.xml的根元素是weblogic-rdbms-jar;jbosscmp-jdbc.xml的根元素是jbosscmp-jdbc。weblogic-cmp-rdbms-jar.xml文件中指定连接到数据库的数据源的data-source-name元素与jbosscmp-jdbc.xml部署文件中的datasource元素功能相当。weblogic-cmp-rdbms-jar.xml指定实体EJB CMP字段与数据库表的列之间映射关系的field-map元素与jbosscmp-jdbc.xml中的cmp-field元素功能相当。weblogic-cmp-rdbms-jar.xml中指定列名的dbms-column元素与jbosscmp-jdbc.xml中的column-name元素功能相当。weblogic-cmp-rdbms-jar.xml部署文件的DOCTYPE是: <!DOCTYPE weblogic-rdbms-jar PUBLIC -//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB RDBMS Persistence//EN http://www.bea.com/servers/wls810/dtd/weblogic-rdbms20-persistence-810.dtd> jbosscmp-jdbc.xml的DOCTYPE是: <!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_4_0.dtd">   我们使用自定义的XSLT样式表jbosscmp-jdbc.xslt(包含在示例代码中)把部署文件weblogic-cmp-rdbms-jar.xml转换为jbosscmp-jdbc.xml。该样式表建立jbosscmp-jdbc.xml,它是与WebLogic的weblogic-cmp-rdbms-jar.xml部署文件功能相当的JBoss文件。jbosscmp-jdbc.xml也包含下载在.zip文件中。   WebLogic部署文件的DTD与JBoss部署文件的不同。使用自定义的XSLT的时候,如果部署文件中还出现了一些额外的元素,可能还需要做进一步的修改,可以把WebLogic部署文件转换为JBoss部署文件。在下面的部分中,我们将在JBoss服务器上部署这个EJB应用程序。   在JBoss中部署该EJB应用程序   把WebLogic EJB部署文件转换为JBoss部署文件之后,你必须建立一个心的EJB .jar文件以部署到JBoss服务器上。该JBoss .jar文件的结构如下: META-INF/ ejb-jar.xml jboss.xml jbosscmp-jdbc.xml CatalogBean.class Catalog.class CatalogHome.class   编译示例EJB类和接口: java Catalog.java CatalogBean.java CatalogHome.java   把JBoss部署文件ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml复制到META-INF目录中。使用jar工具从JBoss部署文件、类和接口中建立一个.jar文件。 jar cf CatalogEJB.jar CatalogBean.class Catalog.class CatalogHome.class META-INF/*.xml   部署该JBoss实体EJB应用程序的过程是,把该.jar文件(EntityEJB.jar)复制到<JBoss>\server\default\deploy目录(其中<JBoss>是JBoss安装的目录)中。当服务器启动的时候,该EJB应用程序就在JBoss服务器上面部署好了。JBoss应用程序服务器中的部署(deploy)目录与WebLogic应用程序服务器中的应用程序(applications)目录对应。   结论   通过转换部署文件可以把WebLogic中部署的实体EJB应用程序迁移到JBoss应用程序服务器上。使用相似的步骤,通过把weblogic.xml 部署文件转换为jboss-web.xml ,也可以把WebLogic J2EE Web应用程序迁移到JBoss上。 <淘宝热门商品:
 

50.00 元 

黑头粉刺净 扫光黑头粉刺顽痘 卖疯了

 

188.00 元  

脚踏运动-专卖品牌折扣店(已加入消费者保障计划)

08款 耐克5折=nike WMNS LEGEND 板鞋 女 311958-193 包邮+赠品

来源:程序员网

小小豆叮

Java 语法高亮显示JHighlight 1.0 初版发布

JHighlight 1.0 近日宣布发布其首个版本。 JHighlight 是一个可嵌入的Java 语法高亮显示包支持Java、Groovy、C++、HTML、XHTML、XML 和LZX 语言并支持导出成XHTML。 这个包可用于许多个方面,可嵌入到其它工具比如博客和论坛,或当成一个Servlet 过滤器来高亮显示服务器上的源代码文件,或通过命令行来生成本地加亮文件。它还可高亮显示RIFE(web框架)模板标签。 URL:https://jhighlight.dev.java.net/servlets/ProjectDocumentList <淘宝热门商品:
 

52.00 元  

【卡盟在线】

皇冠在线充|QQ黑钻腾讯黑钻地下城与勇士(DNF)黑钻3月

 

46.00 元 

千姿百袋 淘宝第一热销包包!特价疯抢日韩时尚通勤手提包14色

来源:程序员网

小小豆叮

快速上手Spring--4.安装和使用IDE

这篇文章谈谈如何安装与使用SpringIDE。作为辅助Spring开发的工具,SpringIDE还是比较有用的。 ● 软件配置: · Eclipse 3.1 · SpringIDE 主页:http://springide.org/project/ 当前版本:1.2.1 http://springide.org/updatesite/updatesite_1.2.1.zip · GEF :只需要GEF Runtime就行了,3.1版本的下载地址。 ● 安装: · 解压安装GEF3.1, · 在eclipe中打开 Help ->Software Updates ->Find and install,选择 Search for new features to install. 在打开的界面中,选择new archived site,选择下载的zip文件(如果没有下载这个zip文件,也可以选择New Remote Site,直接从网上更新),再选择一个安装的目录就可以了. 点击Next,在出现的对话框中勾选“updatesite_1.2.1.zip”,然后一直点击Next,直到安装完成。 · 如果有疑问,可以参考http://springide.org/project/wiki/SpringideInstall ● 使用: 这里以前面文章中的SpringHello项目实践一下如何使用SpringIDE。 · 右击SpringHello,在弹出菜单中选择“Add Spring Project Nature”,如下图: 如果成功,则这时该项目就会在右上角挂上了“S”. · 右键项目名,查看其properties,选择“Spring Beans”,切换到“Config Files”,点击“Add”,将包javamxj.spring.beginning3下的bean.xml加入到其中。 · 这时可以看到bean.xml和HelloBean.java的右上角都挂上了“S”。 这是由于SpringIDE分析加载的bean.xml文件,找到了“helloBean”指向的类HelloBean.java。如果找不到这个文件,则会显示一个错误,指明这个类找不到;如果将“helloBean”指向了包javamxj.spring.beginning4下的bean.xml,虽然这个类存在,但由于属性不匹配,同样会显示出错误。这样就验证了XML的配置,可以提前知道配置中的错误。 · Spring Beans view 选中bean.xml,切换到“Navigate” ,如图: 显示图表,如图: <淘宝热门商品:
 

¥:1880.00 

正和宜时尚保健品 托玛琳颈肩腰膝腿护理 减肥产品-有礼品-快!

托玛琳电气石锗石玉石双温双控保健床垫 双人

 

68.00 元  

SOCOOL时尚女包五皇冠店~美一天~每一天~批发V零售

★五皇冠-SUPER LOVER黑白奶牛个性秋时尚翻盖斜挎包-3902★

来源:程序员网

小小豆叮

J2EE应用中常见的反模式(anti-patterns)

J2EE应用中有一些常见的毛病和错误的观念,按照时下流行的说法,叫反模式。稍不注意,我们自己也会犯,所以大概整理一下,一个是备忘,也是供需要的朋友参考: 1- 无EJB不叫J2EE EJB一直发展到今天的2.1仍然被广为诟病,它提供了很多时候我们并不需要的东西,而且我们在很多情况下一旦选用EJB就没有其他的方式不去使用那些笨重的功能。但是很多所谓范例让我们有一种错觉,好像不用EJB就不是J2EE应用。有一些折中的方案是使用Session Fa?ade模式,Entity Bean采用BMP + 本地接口,然后提供一层无状态的Session Bean,采用远程和本地接口,这样的设计模式,我想,多半是出于无奈。如今,甚至我们经常都能看到不使用EJB的言论,炒得很火的Spring则为这种完全不用EJB开发J2EE项目提供了实际的、强有力的佐证。 2- 过度分层 J2EE这个规范肤浅的来看,就是为我们定义了很多“层”,然后还有很多分工明确的“角色”,加上J2EE的蓝本应用程序就分了很多“层”,以至于大家都觉得J2EE的应用就应该是很多层的,其实不然,需要具体情况具体分析。 3- 频繁的往返调用 EJB的看似简单造成我们经常忽略可能在使用过程中出现的远程调用,比如有时候为了更新一条记录,每个字段都是远程的去set,大大增加了不必要的开销,于是我们意识到在调用中使用DTO是一个建议遵循的方案。 4- 过度使用有状态的Session Bean 一般来讲,一个Session Bean实例,如果它是有状态的,那么它只对某个固定的用户服务,如果是无状态的,则可以满足不同用户的调用。这有点类似(只是有点类似)一个类的静态方法和非静态方法的区别。我们在实际应用中,应该尽量避免使用有状态的Session Bean,除非特别必要。我们可以把状态保留在Session Bean之外,如Web容器的session对象或者我们自定义的类中,而不是完全依赖有状态的Session Bean去帮我们做。 5- 过度会话 Web容器的session对象是个好东西,用起来也很方便和直截了当,这造成了我们很多人对它的滥用,什么东西都往里面放。这有两个突出的问题,一个是资源浪费;另一个,万一Web服务器崩溃,那些本来需要持久化的数据就丢失了。我们需要考虑好,哪些数据本可以用request的,哪些数据又是需要持久化到数据库的,等等,不能一味依赖session。 6- 万能Servlet或者万能JSP J2EE为我们提供了Web层丰富的技术选择,Servlet或者JSP都只是其中一种,虽然它很强大,但是也不应该由它一个来承担所有MVC三个部分的功能。现实中我们的Struts很好的规范了这个问题:Servlet负责调度,专门的Action负责处理逻辑,而JSP用于用户界面显示。JSP和Servlet本质上是同一个东西,只是从不同的角度来处理问题,它们各有所长,互为补充。 <淘宝热门商品:
 

6.80 元  

北欧橱窗

三冠 三角形强力吸墙角架/置物架/杂物架 承重3公斤 不伤墙面0.14

 

运动鞋 

地球都踩在脚下

来源:程序员网

小小豆叮

a Socket编程中的一个秘密类

介绍   Java平台在java.net包里来实现Socket。在这本文中,我们将使用Java.net包中的下面三个类来工作:   ?URLConnection   ?Socket   ?ServerSocket   在java.net包里包含有更多的类,但是这些是你最经常遇见的,让我们从URLConnection开始,这个类提供了在你的java代码里使用Socket的方法而无需了解Socket的底层机制。   甚至不用尝试就可以使用sockets   连接到一个URL包括以下几个步骤:   ?创建一个URLConnection   ?用不同的setter方法配置它   ?连接到URLConnection   ?与不同的getter方法进行交互 下面,我们来用一些例子示范怎样使用URLConnection从一台服务器上请求一份文档。 URLClient类 我们将从URLClient类的结构开始讲起。 import java.io.*; import java.net.*; public class URLClient {  protected URLConnection connection;  public static void main(String[] args) {}  public String getDocumentAt(String urlString) {} }   注意:必须要先导入java.net和java.io包才行   我们给我们的类一个实例变量用于保存一个URLConnection   我们的类包含一个main()方法用于处理浏览一个文档的逻辑流(logic flow),我们的类还包含了getDocumentAt()方法用于连接服务器以及请求文档,下面我们将探究这些方法的细节。 浏览文档   main()方法用于处理浏览一个文档的逻辑流(logic flow): public static void main(String[] args) {  URLClient client = new URLClient();  String yahoo = client.getDocumentAt("http://www.yahoo.com");  System.out.println(yahoo); }   我们的main()方法仅仅创建了一个新的URLClient类的实例并使用一个有效的URL String来调用getDocumentAt()方法。当调用返回文档,我们把它储存在一个String里并把这个String输出到控制台上。然而,实际的工作是getDocumentAt()方法当中完成的。   从服务器上请求一份文档   getDocumentAt()方法处理在实际工作中如何从web上得到一份文档: public String getDocumentAt(String urlString) {  StringBuffer document = new StringBuffer();  try {   URL url = new URL(urlString);   URLConnection conn = url.openConnection();   BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));   String line = null;   while ((line = reader.readLine()) != null)    document.append(line + " ");    reader.close();  } catch (MalformedURLException e) {   System.out.println("Unable to connect to URL: " + urlString);  } catch (IOException e) {   System.out.println("IOException when connecting to URL: " + urlString);  }  return document.toString(); }   getDocumentAt()方法有一个String类型的参数包含我们想得到的那份文档的URL。我们先创建一个StringBuffer用于保存文档的行。接着,我们用传进去的参数urlString来创建一个新的URL。然后,我们创建一个URLConnection并打开它: URLConnection conn = url.openConnection();   一旦有了一个URLConnection,我们就获得它的InputStream并包装成InputStreamReader,然后我们又把它进而包装成BufferedReader以至于我们能够读取从服务器获得的文档的行,我们在java代码中处理socket的时候会经常使用这种包装技术。在我们继续学习之前你必须熟悉它: BufferedReader reader =new BufferedReader(new InputStreamReader(conn.getInputStream()));   有了BufferedReader,我们能够容易的读取文档的内容。我们在一个while...loop循环里调用reader上的readline()方法: String line = null; while ((line = reader.readLine()) != null) document.append(line + " ");   调用readLine()方法后从InputStream传入行终止符(例如换行符)时才产生阻塞。如果没有得到,它将继续等待,当连接关闭时它才会返回null,既然这样,一旦我们获得一个行,我们连同一个换行符把它追加到一个调用的文档的StringBuffer上。这样就保留了从服务器上原文档的格式。   当我们读取所有行以后,我们应该关闭BufferedReader: reader.close();   如果提供给urlString的URL构造器无效,则将会抛出一个MalformedUR特拉LException异常。同样如果产生了其他的错误,例如从连接获取InputStream时,将会抛出IOException。   总结   1.用一个你想连接的资源的有效的url String来实例化URL   2.连接到指定URL   3.包装InputStream为连接在BufferedReader以至于你可以读取行   4.用你的BufferedReader读取文档内容   5.关闭BufferedReader <淘宝热门商品:
 

3C数码配件 

家倍乐床上笔记本电脑桌专利厂家批发零售店

 

25.00 元 

重庆女人香专业减肥丰胸网~一品婷/美姿姿/脱脂减肥*批发代理

来源:程序员网

小小豆叮

Java中对HashMap的深度分析与比较

在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键。由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题。找遍了大大小小的论坛,也把《Java 虚拟机规范》,《apress,.java.collections.(2001),. bm.ocr.6.0.shareconnector》,和《Thinking in Java》翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家分享感受和顺便验证我理解还有没有漏洞。 这里就拿HashMap来研究吧。   HashMap可谓JDK的一大实用工具,把各个Object映射起来,实现了“键--值”对应的快速存取。但实际里面做了些什么呢?   在这之前,先介绍一下负载因子和容量的属性。大家都知道其实一个 HashMap 的实际容量就 因子*容量,其默认值是 16×0.75=12; 这个很重要,对效率很一定影响!当存入HashMap的对象超过这个容量时,HashMap 就会重新构造存取表。这就是一个大问题,我后面慢慢介绍,反正,如果你已经知道你大概要存放多少个对象,最好设为该实际容量的能接受的数字。   两个关键的方法,put和get:   先有这样一个概念,HashMap是声明了 Map,Cloneable, Serializable 接口,和继承了 AbstractMap 类,里面的 Iterator 其实主要都是其内部类HashIterator 和其他几个 iterator 类实现,当然还有一个很重要的继承了 Map.Entry 的 Entry 内部类,由于大家都有源代码,大家有兴趣可以看看这部分,我主要想说明的是 Entry 内部类。它包含了 hash,value,key 和next 这四个属性,很重要。put的源码如下 public Object put(Object key, Object value) {Object k = maskNull(key);   这个就是判断键值是否为空,并不很深奥,其实如果为空,它会返回一个static Object 作为键值,这就是为什么HashMap允许空键值的原因。 int hash = hash(k);int i = indexFor(hash, table.length);   这连续的两步就是 HashMap 最牛的地方!研究完我都汗颜了,其中 hash 就是通过 key 这个Object的 hashcode 进行 hash,然后通过 indexFor 获得在Object table的索引值。   table???不要惊讶,其实HashMap也神不到哪里去,它就是用 table 来放的。最牛的就是用 hash 能正确的返回索引。其中的 hash算法,我跟JDK的作者 Doug 联系过,他建议我看看《The art of programing vol3》可恨的是,我之前就一直在找,我都找不到,他这样一提,我就更加急了,可惜口袋空空啊!!!   不知道大家有没有留意 put 其实是一个有返回的方法,它会把相同键值的 put 覆盖掉并返回旧的值!如下方法彻底说明了 HashMap 的结构,其实就是一个表加上在相应位置的Entry的链表: for (Entry e = table[i]; e != null; e = e.next) { if (e.hash == hash & & eq(k, e.key)) {  Object oldvalue = e.value;  e.value = value; //把新的值赋予给对应键值。  e.recordAccess(this); //空方法,留待实现  return oldvalue; //返回相同键值的对应的旧的值。 }}modCount++; //结构性更改的次数addEntry(hash, k, value, i); //添加新元素,关键所在!return null; //没有相同的键值返回}   我们把关键的方法拿出来分析: void addEntry(int hash, Object key, Object value, int bucketIndex) {table[bucketIndex] = new Entry(hash, key, value, table[bucketIndex]);   因为 hash 的算法有可能令不同的键值有相同的hash码并有相同的table索引,如:key=“33”和key=Object g的hash都是-8901334,那它经过indexfor之后的索引一定都为i,这样在new的时候这个Entry的next就会指向这个原本的table[i],再有下一个也如此,形成一个链表,和put的循环对定e.next获得旧的值。到这里,HashMap的结构,大家也十分明白了吧? if (size++ >= threshold) //这个threshold就是能实际容纳的量resize(2 * table.length); //超出这个容量就会将Object table重构   所谓的重构也不神,就是建一个两倍大的table(我在别的论坛上看到有人说是两倍加1,把我骗了),然后再一个个indexfor进去!注意!!这就是效率!!如果你能让你的HashMap不需要重构那么多次,效率会大大提高!   说到这里也差不多了,get比put简单得多,大家,了解put,get也差不了多少了。对于collections我是认为,它是适合广泛的,当不完全适合特有的,如果大家的程序需要特殊的用途,自己写吧,其实很简单。(作者是这样跟我说的,他还建议我用LinkedHashMap,我看了源码以后发现,LinkHashMap其实就是继承HashMap的,然后override相应的方法,有兴趣的同人,自己looklook)建个 Object table,写相应的算法,就ok啦。   举个例子吧,像 Vector,list 啊什么的其实都很简单,最多就多了的同步的声明,其实如果要实现像Vector那种,插入,删除不多的,可以用一个Object table来实现,按索引存取,添加等。 <淘宝热门商品:
 

5.00 元 

超人气面膜 平民价格 顶级效果

 

:鲜花速递/蛋糕配送/园艺花艺 

缤纷园艺淘宝店--苗圃直销各类花卉苗木 购买送惊喜

来源:程序员网

小小豆叮

AOP是什么?

为什么要区分J2EE容器和J2EE应用系统?   我们知道,J2EE应用系统只有部署在J2EE容器中才能运行,那么为什么划分为J2EE容器和J2EE应用系统? 通过对J2EE容器运行机制的分析(见我的电子教材“EJB实用原理”),我们可以发现:实际上J2EE容器分离了一般应用系统的一些通用功能,例如事务机制、安全机制以及对象池或线程池等性能优化机制。   这些功能机制是每个应用系统几乎都需要的,因此可以从具体应用系统中分离出来,形成一个通用的框架平台,而且,这些功能机制的设计开发有一定难度,同时运行的稳定性和快速性都非常重要,必须经过长时间调试和运行经验积累而成,因此,形成了专门的J2EE容器服务器产品,如Tomcat JBoss、Websphere、WebLogic等。   从J2EE系统划分为J2EE容器和J2EE应用系统两个方面,我们已经看到一种分散关注的思路(separation of concerns)。 分散关注   将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。    AOP就是这种实现分散关注的编程方法,它将“关注”封装在“方面”中。 AOP是什么?   AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。   举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。   为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。   使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下: abstract class Worker{   abstract void locked();   abstract void accessDataObject();   abstract void unlocked(); }   缺点: accessDataObject()方法需要有“锁”状态之类的相关代码。 Java只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Worker的父类,将无法方便实现。 重用被打折扣,具体访问类因为也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。 仔细研究这个应用的“锁”,它其实有下列特性: “锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。 “锁”行为其实是和具体访问类的主要功能可以独立、区分开来的。 “锁”功能其实是这个系统的一个纵向切面,涉及许多类、许多类的方法。如下图: 因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的程序结构就是aspect(方面)   在这个应用中,“锁”方面(aspect)应该有以下职责:   提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。 AOP应用范围   很明显,AOP非常适合开发J2EE容器服务器,目前JBoss 4.0正是使用AOP框架进行开发。   具体功能如下: Authentication 权限 Caching 缓存 Context passing 内容传递 Error handling 错误处理 Lazy loading 懒加载 Debugging  调试 logging, tracing, profiling and monitoring 记录跟踪 优化 校准 Performance optimization 性能优化 Persistence  持久化 Resource pooling 资源池 Synchronization 同步 Transactions 事务 AOP有必要吗?   当然,上述应用范例在没有使用AOP情况下,也得到了解决,例如JBoss 3.XXX也提供了上述应用功能,但是没有使用AOP。   但是,使用AOP可以让我们从一个更高的抽象概念来理解软件系统,AOP也许提供一种有价值的工具。可以这么说:因为使用AOP结构,现在JBoss 4.0的源码要比JBoss 3.X容易理解多了,这对于一个大型复杂系统来说是非常重要的。   从另外一个方面说,好像不是所有的人都需要关心AOP,它可能是一种架构设计的选择,如果选择J2EE系统,AOP关注的上述通用方面都已经被J2EE容器实现了,J2EE应用系统开发者可能需要更多地关注行业应用方面aspect。 AOP具体实现   AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),目前AOP具体实现有以下几个项目:   AspectJ (TM): 创建于Xerox PARC. 有近十年历史,成熟   缺点:过于复杂;破坏封装;需要专门的Java编译器。   动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。   基于动态代理API的具体项目有: JBoss 4.0 JBoss 4.0服务器 nanning 这是以中国南宁命名的一个项目,搞不清楚为什么和中国相关?是中国人发起的?   基于字节码的项目有: aspectwerkz  spring 在以后其它文章中,我将继续对AOP概念进行分析,和大家一起学习进步。 <淘宝热门商品:
 

3C数码配件 

家倍乐床上笔记本电脑桌专利厂家批发零售店

 

24.00 元  

輝縂、QQ业務连鎖店

官方秒开QQ会员QQ紫钻QQ黄钻QQ红钻QQ蓝钻QQ粉钻8元/月

来源:程序员网

小小豆叮

经典J2EE开发工具-IBM Eclipse简史

在1990年代末,IBM开始开发我们现在所知的Eclipse。现在在软件行业中有着很高的使用率,使用这一技术的成功应用在业内随处可见。这篇文章的主要目的是回顾Eclipse的产生,解释它在现在的开发工具领域中所扮演的角色,并谈谈我们对这一技术的发展过程的看法。 90年代中期到末期开发工具概览 在1990年代中期,有几个强大的商业开发环境。微软公司的Visual Studio在那时正朝着一个更加多用途化的工具方向发展。也出现了几个基于Java的集成开发环境,其中包括Symantec公司的Visual Café,Borland公司的JBuilder,IBM的Visual Age for Java等等。 在这一阶段,出现了用来使客户端程序开发人员不再关心操作系统的繁杂的细节和相关接口的应用服务器。对于Java开发来说,市场给我们提供了IBM的WebSphere应用服务器,BEA的 WebLogic,Sun公司的iPlanet。当时微软提供的MTS和COM+是那时使用的运行时环境。 IBM的主要目标 当时的情况实际上包括两个世界:一个着重于发展能够支持微软的运行时执行的工具,另外一个则关注集中于Java平台的更加开放的方法。IBM相信一个更开放的IT方法是保证用户长期成功的最好保证,Java开发工具是推动开发社区发展的关键。所以当时IBM的目标就是让开发者基于Java的中间件更近。 我们想要建立一个为所有的IBM开发工具产品提供支持的共同平台,以避免对基础结构中的最通用元素的重复。这可以让使用由IBM不同部分开发的多种不同的工具的客户,从一个工具切换到另外一个工具时,有一个更加完整的体验。我们设想用户的完整开发环境由多个不同种类的工具结合起来使用,这些工具包括来自于IBM的工具,用户自定义的工具箱以及第三方的工具。这种混合的但是兼容的工具环境是一个软件工具生态系统的开端。 建立技术:开发源码的作用 在1998年11月,IBM软件集团开始开发一个开发工具环境,这就是后来大家所熟悉的Eclipse。最初我们基于我们的Object Technology International(OTI)实验室的资源,建立了一个新的Java集成开发环境,该环境包括更宽的平台。OTI团队是有着非常广泛的高度熟练的团队,并具有完成几代集成开发环境的经验。同时,IBM开始建立其他的团队来在这个平台之上创建新的产品。 我们知道要使Eclipse得到广泛的使用,活跃的第三方系统非常重要。但是,商业伙伴开始的时候不愿意在我们的平台(由于还未经证明)上投资。所以,在2001年11月份,我们决定对这一技术采用开放源码的授权和运作模式来增加对该技术的关注并加速其应用。IBM和其他的八个组织一起,建立了Eclipse协会和eclipse.org网站。最初的发起成员中包括合作伙伴Rational Software、TogetherSoft,还有竞争者WebGain和Borland。协会的会员资格只需要给Eclipse一个真诚的许诺(但不强迫),许诺在内部使用、提高Eclipse,并基于Eclipse完成一个产品。 协会的运行原则是让开放源码社区来控制代码,而商业集团则推动市场和商业相关关系的发展。这是一个新的非常有趣的开放源码模型的应用。它仍然是基于一个开放、免费的平台,但是这一基础的重要补充就是被鼓励在上面创建盈利性工具的商业公司。Eclipse的大多数提交者和贡献者来自于一个很短的商业公司列表,这中间IBM是最大的内容、经济和人员资源的贡献者。 但是它是真的开放的吗? 在2003年以前,Eclipse的第一个主要发行版本被开发者很好的接受并被有力地使用。但业内分析家告诉我们市场上认为Eclipse是IBM控制的。使用者搞不清楚Eclipse到底是什么。这种想法让主要的厂商不愿意在Eclipse处于IBM控制之下的时候对它做出战略性的承诺。如果我们想看到来自于其他厂商的更严肃的承诺,Eclipse必须被认为更加独立――更加和IBM分离。 所以我们开始和其他人探讨怎样才能让一个更加独立的企业或组织来控制Eclipse,从而消除这一想法。和这些公司一起合作,我们帮助规划和创建了Eclipse基金会。接着,我们在EclipseCon 2004上宣布了这个新基金会,我们宣布该基金会是一个非盈利性组织,拥有自己独立的、有工作报酬的专业职员,并由它的会员公司交纳的会费提供支持。 到现在为止的结果 这一变动成功了。新的独立的Eclipse基金会完成了Eclipse 3.0,并在不久之后推出了Eclipse 3.1,和以前的版本比,这两个版本都引起了更大的兴趣和使用率。之后不久推出的Eclipse 3.1的发布引起了极大兴趣。我们看到了各层次会员引人注目的增长,并且所有的独立工具提供商和大多数的平台提供商做出了更深层次的承诺。Eclipse基金会和他们的成员在EclipseCon 2005宣布了几件事情,其中包括强大的Eclipse项目如Rich Client Platform、Web Tools Platform、Data Tools Platform、 Business Intelligence Reporting Tool的出现,并在我们的努力下,我们大大减小了碎片化的程度。 我们可以看到Eclipse的保证和支持令人兴奋的增长。到现在为止Eclipse已经有了12个战略开发会员,每一个承诺至少提供8个全职开发人员和至少每年25万美元的投资给Eclipse基金会。Eclipse基金会有四个战略用户也提供经济上的支持。有69个公司作为插件提供者,另外还有13个合作会员公司。如果你仔细的研究软件业,你会发现成百上千的Eclipse的商用插件和产品。Eclipse现在是业内主要的非微软软件工具平台。 IBM和Eclipse 在2004年12月,IBM Rational积极地修改了它的产品,使之平移到基于Eclipse平台上。我们称这一成果为IBM Rational Software Development Platform,它包括新的改进的IBM Rational产品,都是直接基于Eclipse平台之上,如图1所示。这一平台也包括其他的已经集成到Eclipse的软件生命周期工具。 图1:2004年12月,IBM Rational的软件生命周期工具的主要部分是建立在Eclipse平台之上的。 在这个新的平台中,开发者角色工具增加了其他的功能扩展了Eclipse的集成开发环境,让开发者有更高的效率。我们还开发了为其他的从业者优化的全软件生命周期工具,同时通过使用Eclipse的潜在机制,我们增强了各生命周期中Eclipse的能力。Eclipse已经成为我们下一代的工具集成平台。 对未来的展望 IBM创建了Eclipse并比以前更加对它负责。Eclipse是一个稳定的、成熟的平台,并且是被独立管理的。多数企业不再认为使用Eclipse有较大的风险,实际上,他们很舒适地从基本的Eclipse开始工作,并以逐渐增多的形式增加服务支持及另外的工具。我们看到商业公司开始支持这一趋势,提供了更多的组件化版本的增值工具和厂商支持服务。随着Eclipse和它的相关插件的不断增加,Eclipse基金会将处在一个非常好的位置来管理这一增长以及由它带来的复杂性。 关于作者 Gary Cernosek 现在是IBM Software Group Rational的一位市场部经理。他负责分析和响应软件开发市场趋势,主要致力于软件设计和开发技术,特别是可视化建模和模型驱动开发领域。先前,他曾在Rational销售,技术培训,客户咨询部门工作。加入Rational之前,他是NASA集团太空梭和太空站系统的软件开发人员,在NASA工作8年多。Gary Cernosek从Texas大学Austin分校获得电机工程专业学士学位,之后在Houston大学Clear Lake分校获计算机系统设计专业硕士学位,主要研究方向是面向对象的软件工程。 <淘宝热门商品:
 

225.00 元  

上海商盟】易淘视听商城

五钻100%原装松下HTX7耳机经典白色 松下头戴式耳机 东方神起代言

 

IP卡/网络电话/在线影音充值 

SKYPE官方代理商在线充值

来源:程序员网

小小豆叮

使用Java客户端类调用c# WebService和xml rpc server

  本文介绍一个非常实用的Java客户端工具类来调用C# WebServices和apache xml rpc server,这个类的源码是从网上下载的,我在博客网做项目的时候一直使用这个类来调试C# WebServices和MetaWeblog API。顺便在这里也给大家介绍一下C#如何处理此类发送的xml数据。 使用这个类不用安装任何第三方工具,因为采用http的方式发送xml文件,所以你只需要安装好JDK就可以了。执行此类还可以获得WebServices或xml rpc server返回的xml字符流,你可以根据返回的xml数据来进行其他程序处理。通过这种方式实现了Java平台和.NET平台的数据交换和WebService调用。 下面是此类的源代码SOAPClient4XG.java: /** * SOAPClient4XG. Read the SOAP envelope file passed as the second * parameter, pass it to the SOAP endpoint passed as the first parameter, and * print out the SOAP envelope passed as a response. with help from Michael * Brennan 03/09/01 * * * @author Bob DuCharme * @version 1.1 * @param SOAPUrl URL of SOAP Endpoint to send request. * @param xmlFile2Send A file with an XML document of the request. * * 5/23/01 revision: SOAPAction added */ import java.io.*; import java.net.*; public class SOAPClient4XG { public static void main(String[] args) throws Exception { if (args.length < 2) { //小于 System.err.println("Usage: java SOAPClient4XG " + "http://soapURL soapEnvelopefile.xml" + " [SOAPAction]"); System.err.println("SOAPAction is optional."); System.exit(1); } String SOAPUrl = args[0]; String xmlFile2Send = args[1]; String SOAPAction = ""; if (args.length > 2) //大于 SOAPAction = args[2]; // Create the connection where we're going to send the file. URL url = new URL(SOAPUrl); URLConnection connection = url.openConnection(); HttpURLConnection httpConn = (HttpURLConnection) connection; // Open the input file. After we copy it to a byte array, we can see // how big it is so that we can set the HTTP Cotent-Length // property. (See complete e-mail below for more on this.) FileInputStream fin = new FileInputStream(xmlFile2Send); ByteArrayOutputStream bout = new ByteArrayOutputStream(); // Copy the SOAP file to the open connection. copy(fin,bout); fin.close(); byte[] b = bout.toByteArray(); // Set the appropriate HTTP parameters. httpConn.setRequestProperty( "Content-Length", String.valueOf( b.length ) ); httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8"); httpConn.setRequestProperty("SOAPAction",SOAPAction); httpConn.setRequestMethod( "POST" ); httpConn.setDoOutput(true); httpConn.setDoInput(true); // Everything's set up; send the XML that was read in to b. OutputStream out = httpConn.getOutputStream(); out.write( b ); out.close(); // Read the response and write it to standard out. InputStreamReader isr = new InputStreamReader(httpConn.getInputStream()); BufferedReader in = new BufferedReader(isr); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } // copy method from From E.R. Harold's book "Java I/O" public static void copy(InputStream in, OutputStream out) throws IOException { // do not allow other threads to read from the // input or write to the output while copying is // taking place synchronized (in) { synchronized (out) { byte[] buffer = new byte[256]; while (true) { int bytesRead = in.read(buffer); if (bytesRead == -1) break; out.write(buffer, 0, bytesRead); } } } } } 编译:javac SOAPClient4XG.java 运行的命令格式: java -classpath . SOAPClient4XG http://localhost/BokeServices/Service1.asmx c:\loginReq.xml http://tempuri.org/UserLoginReq,不过先不要运行上面的命令,先介绍一下命令行的意思,http://localhost/BokeServices/Service1.asmx是C# WebService的地址,c:\loginReq..xml里的内容是调用的WebService方法的xml文件, http://tempuri.org是WebService方法的命名空间,一定要有,否则调用失败,如果你在C# WebServices中使用了方法默认的命名空间的话,就使用http://tempuri.org,否则要与C#中定义的一致,UserLoginReq是C# WebServices的方法名。注意xml文件中的方法名和参数名是与C# WebServices的方法名、参数名是一一对应的(参数顺序是可以颠倒的)。 我先介绍一个简单的例子(c:\loginReq.xml),这个xml文件调用了远程C# WebService的UserLoginReq方法,并带UserAcc(用户名)和UserPwd(口令)两个参数,调用成功后C#会自动返回一个xml格式的SOAP包。 <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <UserLoginReq xmlns="http://tempuri.org/"> <UserAcc>baozheng</UserAcc> <UserPwd>mypwd</UserPwd> </UserLoginReq> </soap:Body> </soap:Envelope> 现在看一下C# WebServices的UserLoginReq的方法的定义: public struct UserLoginResp { public string UserAcc; public int Result; } [WebMethod] public UserLoginResp UserLoginReq(string UserAcc,string UserPwd,int ReqFrom) { … } 注意结构UserLoginResp,C# WebServices返回SOAP信息时会自动将UserLoginResp结构转换成xml的格式。 用此类做xml rpc server 的客户端也很简单,下文是一个客户端rpc.xml文件,调用了xml rpc server 端实现的metaWeblog.deletePost方法。 <?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>metaWeblog.deletePost</methodName> <params> <param><value>appKeyValue</value></param> <param><value>746</value></param> <param><value>baozheng</value></param> <param><value>Hello123</value></param> </params> </methodCall> 调用命令的格式: java -classpath %CLASSPATH%;. SOAPClient4XG. http://192.168.25.97:8080/BokeeXmlRpc/xml-rpc rpc.xml 对比调用WebServices的命令行,可以看出调用xml rpc server的命令行少一个方法名参数。http://192.168.25.97:8080/BokeeXmlRpc/xml-rpc 是提供xml rpc 调用的server端servlet地址,关于如何用apache xml rpc技术实现MetalogAPI的帖子将在近期整理发布。 注:上文的左右尖括号为保证正常发贴替换为全角。 作者:王保政 QQ:19803446 Msn:baozhengw999@hotmail.com Email:baozhengw@netease.com <淘宝热门商品:
 

 

纤体·丽颜New Concept茶坊 纯天然美容瘦身品位花饮

 

3.80 元  

幸福生活 联盟津沽 种子蔬菜种子、花卉种子、园艺用品

【天津商盟】【皇冠信誉】食用草莓种子-观赏草莓种子-花种

来源:程序员网

小小豆叮

JXTA2.3.V Java 编程指南(1)翻译:陈凌晖

第一章 导言 JXTA是一整套开放的、一体化的P2P协议,它能使任何连接到网络的设备,包括手机、PDA、个人PC以及服务器,作为对等体进行通信和协作。JXTA协议独立于任何编程语言,可执行在不同的环境之下。本文专门介绍JXTA绑定在Java™ 2平台,Standard Edition software(J2SE™。 为什么使用JXTA 目前网络在内容和联网设备数量两方面不断增长,P2P计算已经变得越来越受欢迎。基于P2P技术的流行软件包括,文件共享、分布式计算和即时消息服务。当这些应用执行不同任务时,他们都会用到一些相同的机制,比如对等点的发现、搜索和文件或数据的传输。当前,应用程序的开发是低效的,开发者们解决相同的问题,重复那些相似的底层执行过程。并且,大多数的应用程序被限定在一种平台下,不能与其他应用程序通信和共享数据。 JXTA要实现的一个主要目标就是提供一个具有P2P网络所必备的基本功能的平台。除此之外,JXTA技术致力于解决现有的P2P系统中潜在的缺点: 协同性-JXTA技术能使对等体提供多种P2P服务,用于对等体之间互相定位与通信。 平台独立性-JXTA技术独立于编程语言,传输协议及开发平台。 普遍性-JXTA技术能使任何数字产品连接入网,不仅仅是PC机或某一特定的开发平台。 什么是JXTA JXTA是用于P2P计算的开放性网络计算平台,目的是为peer groups成员开发新的应用程序提供基本的构建模块和服务。 JXTA为开发P2P应用程序提供了一整套开发协议和开源参考使用方法。JXTA协议标准化了对等体以下几个方面的方式: 相互发现机制 对等体组自我组织机制 广告和网络服务发现机制 相互通信机制 相互监视机制 Java程序语言、C/C++、Perl以及大多数语言都可以实现JXTA协议,并且可以在TCP/IP、HTTP、蓝牙等其他协议之上执行。 JXTA技术能做什么 使用JXTA技术,开发人员能够编写基于网络的、通用性应用程序: 穿过防火墙,使用动态发现机制寻找网络中的其他节点 轻松的共享网络中任何人的文档 找出网络中站点的细小内容 创建一个提供服务的对等体组 远程监控节点的活动 为网络中通信的节点提供安全保障 第二章 JXTATM的体系结构 概述 JXTA软件体系结构可以划分为三层: 平台层(JXTA核心) 平台层封装了所有P2P网络都必须的基本要素,包括为P2P应用程序提供关键机制的构建模块。这些关键机制又包括发现、传输、创建对等体和对等体组的机制,以及相互关联的安全基元。 服务层 服务层包含了并不是P2P网络所绝对必需的网络服务,但它们在P2P环境下却是常见的。这样的网络服务包括搜索、索引、发现、存储系统、文件共享、分布式文件系统、协议转换以及PKI(公钥基础设施)服务。 应用层 应用层提供了集成的服务,例如,P2P即时消息、文档与资源共享、P2P Email 系统、分布式拍卖系统等。 服务层与应用层之间没有严格的界限。一个客户的应用将会被看成对另一个客户的服务。整个系统被设计成模块化的形式,开发者能够挑选他们需要的服务与应用。 JXTA组件 JXTA网络由一系列相互连接的节点、对等体组成。对等体能够自组织形成提供一套服务的对等体组。由对等体组提供的服务包括文档共享或聊天等应用。 JXTA对等体以一种叫做广告的XML文档发布其服务,广告能够通知网络中其它对等体如何连接上一个对等体的服务。 JXTA对等体之间通过管道发送消息。管道是一种用于服务通信的异步、单向消息传输机制。消息是封装了路由、摘要及认证等信息的XML文档。管道被绑定到特定的端点,就像在TCP传输协议中的端口和特点的IP地址连接起来一样。 JXTA体系结构中的关键部分 三个特征使得JXTA架构和其他的分布式网络模式相比更加优越: 利用XML格式的文档来描述网络资源的存在 更加灵活的命名机制,抛弃了对传统的中心命名机制DNS的依赖,采取了管道到对等点、对等点到端点的抽象映射。 采用了一种全局通用对等点地址命名机制,为每个对等点都定义了一个唯一的ID。 未完待续... <淘宝热门商品:
 

保健品/滋补品 

淑芳阁_苗条姿_最有效的减肥瘦身与丰胸专卖店

 

运动鞋 

地球都踩在脚下

来源:程序员网

小小豆叮

全面认识JAVA

全面认识JAVA 阅读次数5172 出处 (注明出处)JJANI -------------------------------------------------------------------------------- 以下是Java标准技术的一些要点: 一、Java的跨平台性,即一次编译到处运行 简单地说Java的跨平台性就是指,编译后的Java程序可直接在不同的平台上运行而不用重新编译,这一特性使得Java随着Web应用的普及而迅速普及起来。而Java的跨平台性是如何实现的呢?这就要理解Java虚拟机和字节码的概念。   实际上,编译后的Java代码并不是传统的二进制代码(如Windows下的.exe文件),而是Java字节码,这种字节码文件是不能直接在操作系统上执行的。要想在一个操作系统上运行一个Java程序必须有一个中间环节来负责将Java字节码解释成二进制码,这个中间环节就是Java虚拟机(简称JVM)。由于目前大多数操作系统已经实现了JVM,所以Java轻松实现跨平台性。   二、面象对象技术   Java全面支持面象对象技术,这体现在Class(类)是Java程序构成的基本单元,一个Java程序通常由许多Class组成,而且这些Class还会有一定的继承关系,Java支持Class的单继承,从而使类之间的继承关系更明确。继承的结果产生类的多态性,类的多态本质上讲就是可以用父类的引用访问继承类的实现(子类对象),类的这种多态性最终形成了组件对象模型的基础,即通过接口(父类)访问实现(子类)。   三、Java中的I/O操作   Java中以字节流(InputStream和OutputStream)、节符流(Reader和Writer)来分别读写二进制数据和字符数据,使用非常简单有效。Java类库中的File类不仅提供文件操作而且还包含文件夹操作,如下面这几行代码可以列出C盘根目录下的所有文件: File f=new File("c://"; String [] m_dir= f.list(); for(int i=0;i"); out.println(""); out.println("Hello world"); out.println(""); out.println(""); ??}catch(IOException e){} } } 将这个Class文件编译后放至Tomcat\webapps\examples\WEB-INF\classes下,然后在浏览器地址栏里输入http://127.0.0.1:8080/examples/servlet/Myservlet即可看到 Hello world出现在浏览器中。 (四)Java Server Page (JSP) 同Servlet相似的是,JSP运行于Web服务器端,并且也需要Tomcat之类的容器。不同的是,由于JSP是将Java代码嵌在html标记里(同ASP一样用<% ...%>),JSP的界面设计同后台开发人员的工作可以有效分离。可以想像让开发人员用Servlet写一个花捎的Web页面有多困难,所以JSP+Servlet混合Web应用是比较理想的选择。 看起来JSP同ASP的实现机制大同小异,其实也存在着本质的区别。所有的ASP页面都是解释运行的,而JSP页在第一次被请求时会被编译,再以后的客户请求都是直接运行服务器上的.class文件(在Tomcat的Work文件夹下),所以JSP要比ASP速度上快许多。 (五)Java Beans Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。 (六)Enterprise Java Beans (EJB) Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 这种模型很像COM+管理器,其实EJB容器正是起到COM+管理器的作用,只是EJB组件相对COM组件来说更易用、更安全。 总的说来,Java作为面象对象技术的一个代表,在当今商业应用中更容易开发出高效的、多层的分布式应用程序,而且,由于Java技术有很强的健壮性和易用性,加上同UML应用的结合,开发一个商业应用软件的周期会大大缩短,所以Java会有不错的前景。 <淘宝热门商品:
 

138.00 元  

免邮-七色瘦减肥胶囊-店主亲试劲减30斤前后照片

 

¥:78.00 

皇冠舒友阁 顶级特效美容护肤 效果才是硬道理

皇冠热销 印疤修复液 消除深浅痘印等色印、有效改善凹凸疤痕

来源:程序员网

小小豆叮

Java日期选择控件

一次项目研发中需要日期时间选择控件, 网上提供的不多, 且质量一般, 所以只好自己做,参考了 网上某位同学的 作品 Jave 日期选择控件 DateChooser 。 目前的代码将日期时间选择封装在一个按钮组件内, 应该很好用,支持Application 、Applet import java.util.Date; import java.util.Calendar; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.text.ParseException ; import java.awt.Color ; import java.awt.Font; import java.awt.Point ; import java.awt.Dimension ; import java.awt.BorderLayout ; import java.awt.FlowLayout ; import java.awt.GridLayout ; import java.awt.Component ; import java.awt.Cursor ; import java.awt.Frame ; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; //import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JSpinner ; import javax.swing.JSpinner.NumberEditor ; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.SwingConstants ; import javax.swing.event.ChangeListener ; import javax.swing.event.ChangeEvent ; import javax.swing.border.LineBorder ; public class DateChooserJButton extends JButton { private DateChooser dateChooser =null; private String preLabel ="" ; public DateChooserJButton() { this(getNowDate()) ; } public DateChooserJButton(SimpleDateFormat df , String dateString) { this() ; setText(df,dateString) ; } public DateChooserJButton(Date date) { this("",date); } public DateChooserJButton(String preLabel , Date date) { if (preLabel!=null) this.preLabel = preLabel ; setDate(date) ; setBorder(null) ; setCursor(new Cursor(Cursor.HAND_CURSOR)) ; super.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { if (dateChooser==null) dateChooser = new DateChooser(); Point p = getLocationOnScreen() ; p.y = p.y+30 ; dateChooser.showDateChooser(p) ; } }) ; } private static Date getNowDate() { return Calendar.getInstance().getTime() ; } private static SimpleDateFormat getDefaultDateFormat() { return new SimpleDateFormat("yyyy年MM月dd日HH时") ; } //覆盖父类的方法 public void setText(String s) { Date date ; try { date = getDefaultDateFormat().parse(s) ; }catch (ParseException e) { date = getNowDate() ; } setDate(date) ; } public void setText(SimpleDateFormat df , String s) { Date date ; try { date = df.parse(s) ; }catch (ParseException e) { date = getNowDate() ; } setDate(date) ; } public void setDate(Date date) { super.setText(preLabel+getDefaultDateFormat().format(date)); } public Date getDate() { String dateString = getText().substring(preLabel.length()); try { return getDefaultDateFormat().parse(dateString); } catch (ParseException e) { return getNowDate() ; } } //覆盖父类的方法使之无效 public void addActionListener(ActionListener listener ) { } private class DateChooser extends JPanel implements ActionListener ,ChangeListener { int startYear = 1980; //默认【最小】显示年份 int lastYear = 2050; //默认【最大】显示年份 int width = 200; //界面宽度 int height = 200; //界面高度 Color backGroundColor = Color.gray; //底色 //月历表格配色----------------// Color palletTableColor = Color.white; //日历表底色 Color todayBackColor = Color.orange; //今天背景色 Color weekFontColor = Color.blue; //星期文字色 Color dateFontColor = Color.black; //日期文字色 Color weekendFontColor = Color.red; //周末文字色 //控制条配色------------------// Color controlLineColor = Color.pink; //控制条底色 Color controlTextColor = Color.white; //控制条标签文字色 Color rbFontColor = Color.white; //RoundBox文字色 Color rbBorderColor = Color.red; //RoundBox边框色 Color rbButtonColor = Color.pink; //RoundBox按钮色 Color rbBtFontColor = Color.red; //RoundBox按钮文字色 JDialog dialog ; JSpinner yearSpin ; JSpinner monthSpin ; JSpinner hourSpin ; JButton[][] daysButton = new JButton[6][7] ; DateChooser() { setLayout(new BorderLayout()); setBorder(new LineBorder(backGroundColor, 2)); setBackground(backGroundColor); JPanel topYearAndMonth = createYearAndMonthPanal(); add(topYearAndMonth,BorderLayout.NORTH); JPanel centerWeekAndDay = createWeekAndDayPanal(); add(centerWeekAndDay,BorderLayout.CENTER); } private JPanel createYearAndMonthPanal(){ Calendar c = getCalendar() ; int currentYear =c.get(Calendar.YEAR); int currentMonth =c.get(Calendar.MONTH)+1; int currentHour =c.get(Calendar.HOUR_OF_DAY); JPanel result = new JPanel(); result.setLayout(new FlowLayout()); result.setBackground(controlLineColor); yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,startYear,lastYear,1)); yearSpin.setPreferredSize(new Dimension(48,20)) ; yearSpin.setName("Year") ; yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####")) ; yearSpin.addChangeListener(this) ; result.add(yearSpin) ; JLabel yearLabel = new JLabel("年"); yearLabel.setForeground(controlTextColor); result.add(yearLabel); monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth,1,12,1)); monthSpin.setPreferredSize(new Dimension(35,20)) ; monthSpin.setName("Month") ; monthSpin.addChangeListener(this) ; result.add(monthSpin) ; JLabel monthLabel = new JLabel("月"); monthLabel.setForeground(controlTextColor); result.add(monthLabel); hourSpin = new JSpinner(new SpinnerNumberModel(currentHour,0,23,1)); hourSpin.setPreferredSize(new Dimension(35,20)) ; hourSpin.setName("Hour") ; hourSpin.addChangeListener(this) ; result.add(hourSpin) ; JLabel hourLabel = new JLabel("时"); hourLabel.setForeground(controlTextColor); result.add(hourLabel); return result ; } private JPanel createWeekAndDayPanal() { String colname[] = {"日","一","二","三","四","五","六"}; JPanel result = new JPanel(); //设置固定字体,以免调用环境改变影响界面美观 result.setFont(new Font("宋体", Font.PLAIN, 12)); result.setLayout(new GridLayout(7,7)); result.setBackground(Color.white); JLabel cell ; for(int i=0;i<7;i++) { cell = new JLabel(colname[i]); cell.setHorizontalAlignment(JLabel.RIGHT); if (i==0 || i==6) cell.setForeground(weekendFontColor) ; else cell.setForeground(weekFontColor) ; result.add(cell) ; } int actionCommandId = 0 ; for(int i = 0; i < 6; i++) for(int j = 0; j < 7; j++) { JButton numberButton = new JButton(); numberButton.setBorder(null) ; numberButton.setHorizontalAlignment(SwingConstants.RIGHT); numberButton.setActionCommand(String.valueOf(actionCommandId)) ; numberButton.addActionListener(this) ; numberButton.setBackground(palletTableColor); numberButton.setForeground(dateFontColor) ; if (j==0 || j==6) numberButton.setForeground(weekendFontColor) ; else numberButton.setForeground(dateFontColor) ; daysButton[i][j] = numberButton; result.add(numberButton) ; actionCommandId ++ ; } return result; } private JDialog createDialog(Frame owner ) { JDialog result = new JDialog(owner,"日期时间选择",true) ; result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); result.getContentPane().add(this,BorderLayout.CENTER) ; result.pack() ; result.setSize(width, height); return result ; } void showDateChooser(Point position ) { Frame owner =(Frame)SwingUtilities.getWindowAncestor(DateChooserJButton.this) ; if (dialog==null || dialog.getOwner()!= owner) dialog = createDialog(owner ) ; dialog.setLocation(getAppropriateLocation(owner ,position ) ) ; flushWeekAndDay() ; dialog.show(); } Point getAppropriateLocation(Frame owner ,Point position ) { Point result = new Point(position) ; Point p = owner.getLocation() ; int offsetX = (position.x+width) - (p.x + owner.getWidth() ) ; int offsetY = (position.y+height) - (p.y + owner.getHeight() ) ; if (offsetX >0 ) { result.x -= offsetX ; } if (offsetY >0 ) { result.y -= offsetY ; } return result ; } private Calendar getCalendar() { Calendar result = Calendar.getInstance(); result.setTime(getDate()) ; return result ; } private int getSelectedYear() { return ((Integer)yearSpin.getValue()).intValue() ; } private int getSelectedMonth() { return ((Integer)monthSpin.getValue()).intValue() ; } private int getSelectedHour() { return ((Integer)hourSpin.getValue()).intValue() ; } private void dayColorUpdate(boolean isOldDay) { Calendar c = getCalendar() ; int day = c.get(Calendar.DAY_OF_MONTH); c.set(Calendar.DAY_OF_MONTH,1); int actionCommandId =day-2+c.get(Calendar.DAY_OF_WEEK) ; int i = actionCommandId/7; int j = actionCommandId%7; if (isOldDay) daysButton[i][j].setForeground(dateFontColor) ; else daysButton[i][j].setForeground(todayBackColor) ; } private void flushWeekAndDay() { Calendar c = getCalendar() ; c.set(Calendar.DAY_OF_MONTH,1); int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH); int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK) ; for(int i = 0; i < 6; i++) { for(int j = 0; j < 7; j++) { String s="" ; if (dayNo>=1 && dayNo<=maxDayNo ) s = String.valueOf(dayNo) ; daysButton[i][j].setText(s) ; dayNo ++ ; } } dayColorUpdate(false) ; } public void stateChanged(ChangeEvent e) { JSpinner source =(JSpinner)e.getSource() ; Calendar c = getCalendar() ; if (source.getName().equals("Hour")) { c.set(Calendar.HOUR_OF_DAY, getSelectedHour()); setDate(c.getTime()); return ; } dayColorUpdate(true) ; if (source.getName().equals("Year")) c.set(Calendar.YEAR, getSelectedYear()); else // (source.getName().equals("Month")) c.set(Calendar.MONTH, getSelectedMonth()-1); setDate(c.getTime()); flushWeekAndDay() ; } public void actionPerformed(ActionEvent e) { JButton source =(JButton)e.getSource() ; if (source.getText().length()==0) return ; dayColorUpdate(true) ; source.setForeground(todayBackColor) ; int newDay = Integer.parseInt(source.getText()); Calendar c = getCalendar() ; c.set(Calendar.DAY_OF_MONTH,newDay); setDate(c.getTime()); } } } <淘宝热门商品:
 

 

Оo*Оo*Оo淑芳阁_苗条姿_最有效的减肥瘦身与丰胸专卖店

 

 

义乌三冠店→大量贩の热销女性用品(零售+批发)

来源:程序员网

小小豆叮

浅析Java语言中两种异常使用的差别

浅析Java语言中两种异常使用的差别 阅读次数1065 出处 作者:Sabine 来源:赛迪论坛 -------------------------------------------------------------------------------- Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 它们的不同之处表现在两方面:机制上和逻辑上。 一、机制上 它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常。请看下面CheckedException的定义: public class CheckedException extends Exception {  public CheckedException() {}  public CheckedException( String message )  {   super( message );  } } 以及一个使用exception的例子: public class ExceptionalClass {  public void method1()   throws CheckedException   {    // ... throw new CheckedException( "...出错了" );   }  public void method2( String arg )   {    if( arg == null )    {     throw new NullPointerException( "method2的参数arg是null!" );    }   }  public void method3() throws CheckedException   {    method1();   } } 你可能已经注意到了,两个方法method1()和method2()都会抛出exception,可是只有method1()做了声明。另外,method3()本身并不会抛出exception,可是它却声明会抛出CheckedException。在向你解释之前,让我们先来看看这个类的main()方法: public static void main( String[] args ) {  ExceptionalClass example = new ExceptionalClass();  try  {   example.method1();   example.method3();  }  catch( CheckedException ex ) { } example.method2( null ); } 在main()方法中,如果要调用method1(),你必须把这个调用放在try/catch程序块当中,因为它会抛出Checked exception。 相比之下,当你调用method2()时,则不需要把它放在try/catch程序块当中,因为它会抛出的exception不是checked exception,而是runtime exception。会抛出runtime exception的方法在定义时不必声明它会抛出exception。 现在,让我们再来看看method3()。它调用了method1()却没有把这个调用放在try/catch程序块当中。它是通过声明它会抛出method1()会抛出的exception来避免这样做的。它没有捕获这个exception,而是把它传递下去。实际上main()方法也可以这样做,通过声明它会抛出Checked exception来避免使用try/catch程序块(当然我们反对这种做法)。 小结一下: * Runtime exceptions: 在定义方法时不需要声明会抛出runtime exception; 在调用这个方法时不需要捕获这个runtime exception; runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 * Checked exceptions: 定义方法时必须声明所有可能会抛出的checked exception; 在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去; checked exception是从java.lang.Exception类衍生出来的 <淘宝热门商品:
 

52.00 元  

【卡盟在线】

皇冠在线充|QQ黑钻腾讯黑钻地下城与勇士(DNF)黑钻3月

 

网络游戏点卡 

全服乱舞道具贩卖商人,有什么需要尽管说

来源:程序员网

小小豆叮

Java初学者需掌握的30个基本概念

Java初学者需掌握的30个基本概念 阅读次数11440 出处 ChinaITLab -------------------------------------------------------------------------------- 基本概念      1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率。      2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)。      3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)。      4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。      5.对象的3个主要特性      ehavior---说明这个对象能做什么。      tate---当对象施加方法时对象的反映。      dentity---与其他相似行为对象的区分标志。      每个对象有唯一的indentity 而这3者之间相互影响。      6.类之间的关系:      use-a :依赖关系      has-a :聚合关系      is-a :继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)      7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。      例:Data类的构造器叫Data      ew Data()---构造一个新对象,且初始化当前时间。      Data happyday=new Data()---把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者      是不同的.new返回的值是一个引用。      构造器特点:构造器可以有0个,一个或多个参数      构造器和类有相同的名字      一个类可以有多个构造器      构造器没有返回值      构造器总是和new运算符一起使用      8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法。      9.包(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包.java.lang java.util java,net等,包是分层次的所有的java包都在java和javax包层次内。      10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段。 11.扩展类:扩展类充分体现了is-a的继承关系. 形式为:class (子类) extends (基类)。      12.多态:在java中,对象变量是多态的.而java中不支持多重继承。 13.动态绑定:调用对象方法的机制。       1)编译器检查对象声明的类型和方法名。       2)编译器检查方法调用的参数类型。       3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法。       4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本。       5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码。      14.final类:为防止他人从你的类上派生新类,此类是不可扩展的。      15.动态调用比静态调用花费的时间要长。      16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。      例: public abstract string getDescripition      17.Java中的每一个类都是从Object类扩展而来的。      18.object类中的equal和toString方法。      equal用于测试一个对象是否同另一个对象相等。      toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示。      (toString 方法是一个很重要的方法)      19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。 20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大小。 21.class类 object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。      22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具。      能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大。      1)在运行时分析类的能力。      2)在运行时探察类的对象。      3)实现通用数组操纵代码。      4)提供方法对象。      而此机制主要针对是工具者而不是应用及程序。      反射机制中的最重要的部分是允许你检查类的结构.用到的API有:      java.lang.reflect.Field 返回字段。      java.reflect.Method 返回方法。      java.lang.reflect.Constructor 返回参数。      方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案。      23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface。      24.接口不是一个类,而是对符合接口要求的类的一套规范。      若实现一个接口需要2个步骤:      1)声明类需要实现的指定接口。      2)提供接口中的所有方法的定义。      声明一个类实现一个接口需要使用implements 关键字      class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口。      25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口:Cloneable      26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。      例:ActionListener 接口监听。      类似的API有:   java.swing.JOptionPane   java.swing.Timer   java.awt.Tookit      27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它。      28.内部类:一个内部类的定义是定义在另一个内部的类。      原因是:      1)一个内部类的对象能够访问创建它的对象的实现,包括私有数据。      2)对于同一个包中的其他类来说,内部类能够隐藏起来。      3)匿名内部类可以很方便的定义回调。      4)使用内部类可以非常方便的编写事件驱动程序。      29.代理类(proxy):      1)指定接口要求所有代码      2)object类定义的所有的方法(toString equals)      30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型。 <淘宝热门商品:
 

¥:21.00 

【义乌绘美家居】【收藏本店送礼品】

 

¥:22.00 

荣红喜商贸公司--迎三钻,贺店庆,所有产品低价疯狂销售中

来源:程序员网

小小豆叮

java数字比较进阶

java数字比较进阶 阅读次数1455 出处 CN-JAVA原创:joliny -------------------------------------------------------------------------------- 第一个程序: /** * AWT Sample application * * @author * @version 1.00 05/03/08 */ public class Chapter3 { int a,b,c; public void sort(int i,int q,int p) { if(i>q&&i>p) { a=i; if(q>p) { b=q; c=p; } else { b=p; c=q; } } if(q>i&&q>p) { a=q; if(i>p) { b=i; c=p; } else { b=p; c=i; } } if(p>i&&p>q) { a=p; if(i>q) { b=i; c=q; } else { b=q; c=i; } } System.out.print(a+"\t"); System.out.print(b+"\t"); System.out.print(c+"\t"); } public static void main(String[] args) { System.out.println("OutPut from big to small"); Chapter3 cha=new Chapter3(); cha.sort(3,6,9); System.out.println(); } } 第二个程序: /** * AWT Sample application * * @author * @version 1.00 05/04/26 */ package MyPackage.Stream; import java.io.*; import java.util.*; public class Compare { public static void sort(double arry[],int n)//排序函数 { // for(int j=0;j<=n+1;j++) for(;;) { for(int q=0;qarry[q+1]) { double t; t=arry[q]; arry[q]=arry[q+1]; arry[q+1]=t; } n--; if(n<0) break; } } public static String In() throws IOException { String str; BufferedReader Input=new BufferedReader(new InputStreamReader(System.in)); //数据流进行输入 str=Input.readLine();//读取行。 return str; } public static void main(String[] args) throws IOException { String st; int num; int i=0; double buffer[]; System.out.println("Input the Number to compare:"); st=In(); num=Integer.parseInt(st);//类型转换String->int buffer=new double[num];//动态定义数组存储数据 System.out.println("Input your Numbers:"); while(true)//保存 { st=In(); double f=Double.parseDouble(st);//类型转换String->double buffer[i]=f; i++; if(i==num) break; } sort(buffer,num);//进行数字的排序。 System.out.println("The Number to sort is:"); for(i=0;iint buffer=new double[num];//动态定义数组存储数据 System.out.println("Input your Numbers:"); while(true)//保存 { st=In(); double f=Double.parseDouble(st);//类型转换String->double buffer[i]=f; i++; if(i==num) break; } sort(buffer,num);//进行数字的排序。 Arrays.sort(buffer); System.out.println("The Number to sort is:"); for(i=0;idouble buffer[i]=f; i++; if(i==buffer.length) break; } catch(NumberFormatException e) { e.printStackTrace(); System.out.println("程序异常,请按回车退出程序!"); System.exit(0); } } Arrays.sort(buffer);//进行数字的排序? System.out.println("The Number to sort is:"); } public static void PrintOut(double buffer[]) { for(int i=0;iint if(num<=0)//判断数据的个数的正确性! { System.out.println("Please input a number which must bigger than zero!"); } else { break; } } double buffer[]=new double[num];//动态定义数组存储数据 System.out.println("Input your Numbers:"); PutIn(buffer); PrintOut(buffer); } catch(NumberFormatException e) { System.out.println("程序异常"); e.printStackTrace(); } } } 本来还有一个,不知道放在那里了。不过我想这么多也够了。呵呵。 <淘宝热门商品:
 

37.00 元  

深圳兴鹏电子/专业的索爱外壳配件供应商

【兴鹏电子】索爱W800外壳W800c机壳 高品质做工 比肩原装 大图

 

¥:88.00 

玩儿宝贝 小朋友的礼物

精装礼品手提箱

来源:程序员网

小小豆叮

解析Java的Class文件格式——解析魔数和版本号

解析Java的Class文件格式——解析魔数和版本号 阅读次数1154 出处 作者:陈跃峰 出自:http://blog.csdn.net/mailbomb -------------------------------------------------------------------------------- 熟悉Java语言有好几年了,技术也学了一些,现在主要从事J2ME技术方面的工作,最近工作不是很忙,就找了本电子书——《深入Java虚拟机(第二版)》,仔细阅读了一下,读起来比较吃力,现在把Java class文件格式的读书笔记共享给大家。 众所周知,Java语言的可执行文件是class文件,俗称类文件。这个文件为了让不同平台的虚拟机都能够正确的解释,详细规定了其文件格式。下面就按照顺序进行介绍: 1、 魔数(magic) 为了方便虚拟机识别文件是否是class格式的文件,SUN公司规定每个class文件都必须以一个word(4个字节)来开始,这个数字就称为魔数。魔数是有4个字节的无符号数字构成的,而且规定魔数必须是0xCAFEBABE。 2、 版本号(version) 魔数后续的内容就是一个word的长度来表示生成的class文件的版本号,版本号分为主版本号和次版本号,其中前两个字节表示次版本号,后两个字节表示主版本号,排列的顺序遵从高位在前,低位在后的原则。 下面我写了一个很简单的示例代码,从一个名字为First.class文件中读取到这些信息,然后输出出来,不足之处请大家指正! 该程序的代码如下: import java.io.*; /** * 解析class文件格式 */ public class ParseClassFile{ public static void main(String args[]){ try{ //读取文件数据,文件是当前目录下的First.class FileInputStream fis = new FileInputStream("./First.class"); int length = fis.available(); //文件数据 byte[] data = new byte[length]; //读取文件到字节数组 fis.read(data); //关闭文件 fis.close(); //解析文件数据 parseFile(data); }catch(Exception e){ System.out.println(e); } } private static void parseFile(byte[] data){ //输出魔数 System.out.print("魔数(magic):0x"); System.out.print(Integer.toHexString(data[0]).substring(6).toUpperCase()); System.out.print(Integer.toHexString(data[1]).substring(6).toUpperCase()); System.out.print(Integer.toHexString(data[2]).substring(6).toUpperCase()); System.out.println(Integer.toHexString(data[3]).substring(6).toUpperCase()); //主版本号和次版本号码 int minor_version = (((int)data[4]) << 8) + data[5]; int major_version = (((int)data[6]) << 8) + data[7]; System.out.println("版本号(version):" + major_version + "." + minor_version); } } <淘宝热门商品:
 

256.0元  

美美减肥瘦身及咨询 能为你服务是我的荣幸!

 

136.00 元  

达人公社 专柜正品 纽巴伦 newbalance 匡威 crocs折扣 店

正品 日版纽巴伦new balance 型号:TK02 深灰黑

来源:程序员网

小小豆叮

Java核心代码例程之:HelloWorld.java

// The most basic Java program public class HelloWorld { public static void main(String args[]) throws Exception { System.out.println("Hello World!"); } } <淘宝热门商品:
 

¥:9.99 

【黑龙江商盟】棋子儿平价美妆店-烟熏彩妆/假睫毛大全/新娘用品

买十送一全网最低价高级无痕透明根部自然浓密凌乱假睫毛仿真毛发

 

 

【杭州商盟】快美影像中心

来源:程序员网

小小豆叮

基于java的图片文件格式转换和线性缩放

基于java的图片文件格式转换和线性缩放 阅读次数1037 出处 CCID -------------------------------------------------------------------------------- 图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用jimi包,可从http://java.sun.com/products/jimi/下载该包及其源码和demo。   需要注意的是:jimi提供了对几乎所有图片格式的解码支持,但是为提供gif和tif/tiff格式的编码api,gif编码问题在网上可以找到县相关的源码,tiff好像jai:http://java.sun.com/products/java-media/jai/index.jsp提供了它的编码,不过我没有用jai,暂时用jpeg编码代替了。   察看jimi的源码,在com.sun.jimi.core中是jimi的核心处理api。 public void toJPG(String source, String dest, int quality) { if (dest == null || dest.trim().equals(""))  dest = source; if (!dest.toLowerCase().trim().endsWith("jpg")) {  dest += ".jpg";  System.out.println("Overriding to JPG, output file: " + dest); } if (quality < 0 || quality > 100 || (quality + "") == null || (quality + "").equals("")) {  System.out.println("quality must between ’0’ and ’100’");  System.out.println("set to DEFAULT value:’75’");  quality = 75; } try {  JPGOptions options = new JPGOptions();  options.setQuality(quality);  ImageProducer image = Jimi.getImageProducer(source);  JimiWriter writer = Jimi.createJimiWriter(dest);  writer.setSource(image);  // 加入属性设置,非必要  // /*  writer.setOptions(options);  // */  writer.putImage(dest); } catch (JimiException je) {  System.err.println("Error: " + je); } } 在进行格式转换时,并不需要关心原图的格式,只要要转换的图片格式在jimi的解码格式范围内,就可以完全透明的进行decode过程: ImageProducer image = Jimi.getImageProducer(source);   实际的解码只需要以行代码,就这么简单。   编码过程最简单的也只需要很少的代码: JimiWriter writer = Jimi.createJimiWriter(dest); writer.setSource(image); // 加入属性设置,非必要 // /* writer.setOptions(options); // */ writer.putImage(dest);   以上代码就完成了图片编码到输出到os生成转换后文件的全过程。   上面代码中的 writer.setOptions(options)是用来对输出文件的属性进行相关的设置,每种格式的属性都不一样,com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:   com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置: JPGOptions options = new JPGOptions(); options.setQuality(quality);   格式转换就这么简单。   jimi不支持的encode格式的解决 /** * * @param source * @param dest * @throws JimiException */ public void toGIF(String source, String dest) throws JimiException {  if (dest == null || dest.trim().equals(""))   dest = source;  // 1:转换为jpg  if (!dest.toLowerCase().trim().endsWith("jpg")) {   dest += ".jpg";  }  toJPG(source, dest, 75);  BufferedImage file_in = null;  File file = new File(dest);  try {   file_in = javax.imageio.ImageIO.read(file);  } catch (IOException e) {   e.printStackTrace();  }  int end = dest.lastIndexOf(".");  file.deleteOnExit();  // output *.gif  file.renameTo(new File(dest.substring(0, end) + ".gif"));  // jpg to gif  AnimatedGifEncoder e = new AnimatedGifEncoder();  e.start(dest);  e.addFrame(file_in);  e.finish();   } 这里用到了AnimatedGifEncoder 类,是我在网上搜索到的,对gif编码提供了一个实现,虽然还有待晚善的地方,不过单作格式转关已经够用了:) AnimatedGifEncoder e = new AnimatedGifEncoder(); e.start(dest); e.addFrame(file_in); e.finish();   需要注意的是:AnimatedGifEncoder 不能对所有格式的图片正确的识别,所以先要将其他格式转为jpg格式(最简单的方法是用imageIO) BufferedImage file_in = null; File file = new File(dest); try {  file_in = javax.imageio.ImageIO.read(file); } catch (IOException e) {  e.printStackTrace(); }   这样直接放入BufferedImage中就ok了 e.addFrame(file_in);   实际的编码过程在上面这句完成。 int end = dest.lastIndexOf("."); file.deleteOnExit(); // output *.gif file.renameTo(new File(dest.substring(0, end) + ".gif"));   最后,在完成之前别忘了用上面几句消灭证据哟:)   当然这种方法其实并不好,最彻底的方法是修改AnimatedGifEncoder,不过做人涅要厚道一点,毕竟是人家写的代码嘛,如果有兴趣的朋友可以讨论一下。   格式转换解决了,缩放功能也就不算是问题了,以下代码同时实现了格式转关和线性缩放: /** * * @param img * @param dest * @throws JimiException */ public void toTIF(Image img, String dest) throws JimiException {  if (!dest.toLowerCase().trim().endsWith("tif")) {   dest += ".tif";   System.out.println("Overriding to TIF, output file: " + dest);  }  dest = dest.substring(0, dest.lastIndexOf(".")) + ".jpg";  JimiWriter writer = Jimi.createJimiWriter(dest);  writer.setSource(img);  dest = dest.substring(0, dest.lastIndexOf(".")) + ".tif";  writer.putImage(dest); } /** * 线性改变图片尺寸(可同时改变图片格式) * * @param source * 源文件完整路径 * @param desc * 目标文件完整路径 * @param ins * 放大/缩小比率 * @throws JimiException * @throws IOException */ public void changeDimension(String source, String desc, double ins) throws JimiException, IOException {  String temp = desc;  File _file = null;  if (desc == null || desc.trim().equals(""))   desc = source;  if (!desc.toLowerCase().trim().endsWith("jpg")) {   temp = desc.trim() + ".jpg";  }  this.toJPG(source, temp, 75);  _file = new File(temp); // 读入文件  Image src = javax.imageio.ImageIO.read(_file); // 构造Image对象  double wideth = (double) src.getWidth(null); // 得到源图宽  double height = (double) src.getHeight(null); // 得到源图长  int iWideth = (int) (wideth * ins);  int iHeight = (int) (height * ins);  BufferedImage tag = new BufferedImage(iWideth, iHeight,  BufferedImage.TYPE_INT_RGB);  tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 绘制缩小后的图  if (!temp.trim().equals(desc))   _file.deleteOnExit();  if (desc.toLowerCase().trim().endsWith("gif")) {   AnimatedGifEncoder e = new AnimatedGifEncoder();   e.start(desc);   e.addFrame(tag);   e.finish();  } else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) {   this.toTIF(tag, desc);  } else {   JimiWriter writer = Jimi.createJimiWriter(desc);   writer.setSource(tag);   writer.putImage(desc);  } }   BufferedImage的构造函数中的参数类型为int,所以以上代码在改变图象尺寸时稍有偏差,不过简单演示一下还是可以的。   jimi的example中可以找到很多单项图片处理功能的demo,有时间可以研究一下,会有不少收获的。 <淘宝热门商品:
 

¥:88.00 

玩儿宝贝 小朋友的礼物

精装礼品手提箱

 

 

『女人天生是妖精』店内商品均为现货 拍下后可直接留言修改运费

来源:程序员网

小小豆叮

Java新手必看之Hello World 攻略

  问HelloWorld问题的人实在是太多了,而且经常都以“问一个最简单的问题”开头。其实回想一下,自己也是从这个阶段过来的,说一句“你好”,真的是一个最简单的问题吗?...//think 好了,言归正传,let's say "HelloWorld!" in java...   首先,我们要假设一下我们的平台是Windows+JDK(Linux环境下也差不多)。这个环境是相当普遍、基础和入门的。确定已经正确安装JDK了,下一步是小心翼翼地敲入某本教程上的HelloWorld源码,存盘,然后编译,javac ...问题来了:   * 错误1:   'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。 (javac: Command not found)   产生的原因是没有设置好环境变量path。Win98下在autoexce.bat中加入path=%path%;c:\jdk1.2\bin,Win2000下则控制面板->系统->高级->环境变量->系统变量...看到了?双击Path,在后面加上c:\jdk1.2\bin。当然我们假设JDK安装在了c:\jdk1.2目录下(有点唐僧了?)...好像还要重启系统才起作用...(//知道了!//西红柿)好,再试试!javac HelloWorld。   * 错误2: HelloWorld is an invalid option or argument.   拜托,给点专业精神,java的源程序是一定要存成.java文件的,而且编译时要写全.java呀。 OK, javac HelloWorld.java (这回总该成了吧?)   * 错误3: HelloWorld.java:1: Public class helloworld must be defined in a file called "HelloWorld.java". public class helloworld{ ^   这个问题嘛,是因为你的类的名字与文件的名字不一致。(谁说的,明明看到人家都有这样写的 ( ) OK,准确地说,一个Java源程序中可以定义多个类,但是,具有public属性的类只能有一个,而且要与文件名相一致。还有,main方法一定要放在这个public的类之中,这样才能java(运行)这个类。另外一点是Java语言里面是严格区分大小写的,初学者要注意呀。像上例中 helloworld 与 HelloWorld 就认为是不一样,因而...oh... 好,改好了,嘻嘻... javac HelloWorld.java...(咦,怎么什么也没有呀?)//faint 这就是编译通过了!看看是不是多了一个HelloWorld.class ?(hehe..按书上教的:) java HelloWorld (!! 这个我知道,不是java HelloWorld.class哟)   * 错误4: Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld   呵呵,这个嘛,就是著名的类路径(classpath)问题啦。实际上,类路径是在编译过程就涉及的Java中的概念。classpath就是指明去哪里找用到的类,就这么简单。由于我们的HelloWorld没用到其它的(非java.lang包中的)类,所以编译时没遇到这个问题。运行时呢,就要指明你的类在哪里了。解决方法嘛,可以用下面的命令运行: java -classpath . HelloWorld“.”就代表当前目录。当然这样做有点麻烦(是“太麻烦”!),我们可以在环境变量中设置默认的classpath。方法就照上述设置path那样。将classpath设为: classpath=.;c:\jdk1.2\lib\dt.jar;c:\jdk1.2\lib\tools.jar 后面的两个建议也设上 ,以后开发用的着。java -classpath . HelloWorld(再不出来我就不学java了)   * 错误5: Exception in thread "main" java.lang.NoSuchMethodError: main (//咣当)别,坚持住。看看你的代码,问题出在main方法的定义上,写对地方了吗, 是这样写的吗: public static void main(String args[]) { //一个字都不要差,先别问为什么了...   对,包括大小写! java -classpath . HelloWorld (听天由命了!) Hello World! (faint!终于...)   欢迎来到Java世界!所以说,无法运行HelloWorld 真的并不是一个“最简单的问题”。   附:HelloWorld.java // HelloWorld.java   public class HelloWorld  {     public static void main(String args[]) {      System.out.println("Hello World!")    } }( <淘宝热门商品:
 

160.00 元  

皇冠 店主亲身植物藻类瘦身劲减30斤

 

9.80 元  

恒睿日本长筒棉袜批发网

疯狂促销 韩国进口复古百搭格子围巾风扉全球明星必备 只要9.8

来源:程序员网

小小豆叮