【转】java 自定义注解实践

Posted by & filed under Uncategorized.

转至http://anole1982.iteye.com/blog/1450421 ²  背景 最近在为公司的技术改造做准备,我设计了一个提高 Web 开发效率的技术框架,为了增加框架的友好性和易用性,决定采用注解来代替配置文件,于是我查询了很多的资料,进行整理和学习。     ²  概念 注解是 JDK5 引入的新特性,最初衍生自代码注释,但现在早已经超出了注释的范畴,以至于我很惶恐,不敢使用注释这个词汇来描述他,尽管现有的很多资料里仍然称其为注释。如果说反射使得很多技术实现(动态代理、依赖注入等)有了基础,那么注解就是使这些技术实现变得平民化的基础。   从 class 文件规范中可以看出, JDK5 开始, class 文件已经引入了注解描述片段。站在 java 虚拟机的角度来看, class 保留和运行时保留的注解已经和 java 二进制码放在了同等的地位。虚拟机在加载 class 文件时,会为注解内容分配空间并进行解析,最终还会为注解和对应的二进制码建立关联。尽管这些注解不会被运行,但其对代码的说明能力,结合反射技术已经足够我们做太多的事情。   我们知道, java 除了内置的注解( @Override 、 @Deprecated 等)以外,还支持自定义注解( Struts 、Hibernate 等很多框架甚至 java 自身都实现了很多自定义注解)。当然,更为厉害的是元注解,元注解是用来描述注解的注解(光听着就觉得厉害了吧)。   要实现一个自定义注解,必须通过 @interface 关键字来定义。且在 @interface 之前,需要通过元注解来描述该注解的使用范围( @Target )、生命周期( @Retention )及其他(其他的不重要,所以领盒饭了)。   @Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方),其取值有: 取值 描述 CONSTRUCTOR 用于描述构造器(领盒饭)。 FIELD 用于描述域(领盒饭)。 LOCAL_VARIABLE 用于描述局部变量(领盒饭)。 METHOD 用于描述方法。 PACKAGE 用于描述包(领盒饭)。 PARAMETER 用于描述参数。 TYPE 用于描述类或接口(甚至 enum )。   @Retention 用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取值有: 取值 描述 SOURCE 在源文件中有效(即源文件保留,领盒饭)。 CLASS 在 class 文件中有效(即 class 保留,领盒饭)。 RUNTIME 在运行时有效(即运行时保留)。   根据上述介绍,如果我需要定义一个用于对方法进行描述,且能在运行时可以读取到的自定义注解(假定我希望这个注解的名字是 Sample )。那么,我就应该这样: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public Read more […]

【转】JAVA SWING 日期选择控件

Posted by & filed under Uncategorized.

转至http://zgdeng.iteye.com/blog/1405650 package com.dzg.ticket.util; /**  * ClassName:DateChooser  * Copyright: copyright (c)2012  * @author   Deng Zhiguang  * http://zgdeng.iteye.com  * @Date  2012-2-7  * Modification History:  * Date      Author      Version    Reason  * ——————————————  */ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Point; import java.awt.Polygon; import java.awt.Stroke; import java.awt.Toolkit; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import Read more […]

【转】Java读写Properties文件

Posted by & filed under Uncategorized.

转至http://blog.csdn.net/shixing_11/article/details/5652347 Java中读写资源文件最重要的类是Properties,功能大致如下: 1. 读写Properties文件 2. 读写XML文件 3. 不仅可以读写上述两类文件,还可以读写其它格式文件如txt等,只要符合key=value格式即可.   注意:资源文件中含有中文时的处理方法  1. 将中文字符通过工作转成utf8编码,可以通过Java自带的nativetoascii或Eclipse中的属性编辑器。 2. 直接调用 new String(youChineseString.getBytes(“ISO-8859-1”), “GBK”);   附:WEB程序中加载资源文件的方法 Properties prop = null;  1. prop = Thread.currentThread().getContextClassLoader().getResourceAsStream(“filename”); 2. prop = this.getClass().getClassLoader().getResourceAsStream(“filename”);   Properties能读取以key,value存储的任何格式文件,究竟有什么神奇,猫一眼类结构, package Read more […]

【转】MyEclipse生成可执行Jar文件

Posted by & filed under Uncategorized.

转至http://blog.sina.com.cn/s/blog_6901b8370100xtdn.html 1. 先找到你的工程中提供接口的类(要包含MAIN方法), 2. 在该类中右键选择 RUN as 3. 选择 Run configurations 4. 在main窗口中选择main class为本类 5. 点击RUN 6. 选择你的工程,右键选择 EXPORT 7. 在弹出的窗口中选择 runnable jar file 8. 在弹出的 runnable jar file export窗口中第一个launch configuration 中选择你刚才配置的类,      第二个窗口中选择你要导出的路径 9. 然后选择下一步就OK了 (以上转自网上一位大仙,就这样ok,懒得自己写) 如果没有意外双击就可以运行了,但是如果关联了winrar就要修改打开方式 或者: 写批处理文件了 @title 测试运行jar C:\Java\jdk1.6.0\bin\java.exe Read more […]

【转】Java中WebService实例

Posted by & filed under Uncategorized.

转至http://blog.csdn.net/kardelpeng/article/details/6321019 Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。 Web Service的关键技术和规则: 1.XML:描述数据的标准方法. 2.SOAP:表示信息交换的协议(简单对象访问协议). 3.WSDL:Web服务描述语言. 4.UDDI:通用描述、发现与集成,他是一种独立于平台,基于XML语言的用于在互联网上描述商务的协议。   一、利用JDK web服务api实现,这里使用基于SOAP message的Web Service: 1.首先创建一个Web Services项目,作为Web services Endpoint. 2.创建一个HelloService.java类 package com.yjpeng.hello; import Read more […]

【转】hibernate.current_session_context_class

Posted by & filed under Uncategorized.

hibernate.current_session_context_class属性 sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时hibernate将session绑定到当前线程,事务结束后hibernate将session从当前线程中释放并且关闭session。当再次调用getCurrentSession()时将得到一个新的session,并重新开始这一系列工作。 这样调用方法如下: Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); session.getTransaction().commit();   //不需要close session了。 前提是改值设置为了thread. 在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session Read more […]

【转】Struts2文件上传大小控制与提示

Posted by & filed under Uncategorized.

一、控制: (提示:struts.xml文件中的大小与实际文件大小的关系:1048576(Bytes) = 1024*1024 = 1M实际文件大小.)   首先我们来学习Struts2下文件上传大小控制。 Struts2文件上传控制有两种方式,两种方式相辅相成。可以说成是两道关卡。   第一道关卡是在struts.xml中进行配置。在struts.xml配置文件中加入如下代码: 这样我们就限制了Struts2上传的大小为4M。   如果真实的文件>4M. 抛出异常the request was rejected because its size (XXXX) exceeds the configured maximum (XXXX)异常,他是不能被国际化的。如何国际化在后面讨论。   第二道关是inteceptor中的maximumSize. 当真实的文件大小能通过第一道关时.针对不同的action中配置的inteceptor,maximumSize才能发挥相应的拦截作用. 如在struts.xml有如下配置:     struts.multipart.maxSize掌控整个项目所上传文件的最大的Size     struts.multipart.maxSize和fileUpload拦截器的maximumSize属性分工不同,总结如下:     1.struts.multipart.maxSize掌控整个项目所上传文件的最大的Size。超过了这个size,后台报错,程序处理不了如此大的文件。ActionError里面会有如下的提示: the request was rejected because its size (16272982) exceeds the configured maximum (9000000)     2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。 struts.multipart.maxSize默认2M,当maximumSize大于2M时,必须设置struts.multipart.maxSize的值大于maximumSize。     3.当上传的文件大于struts.multipart.maxSize时,系统报错 当上传的文件在struts.multipart.maxSize和maximumSize之间时,系统提示: File too large: file “MSF的概念.ppt” “upload__5133e516_129ce85285f__7ffa_00000005.tmp” 6007104  当上传的文件小于maximumSize,上传成功。   了解了第一道关卡和第二道关卡以及二者的关系之后,我们来分析在上面提到的 Read more […]

hibernate中jdbc.fetch_size 和 jdbc.batch_size配置说明

Posted by & filed under Uncategorized.

jdbc.fetch_size: 实质是调用 Statement.setFetchSize()  方法设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会 1 次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个保守的设定,根据测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。建议使用Oracle时将Fetch Read more […]

【转】struts2——使用通配符

Posted by & filed under Uncategorized.

struts2的配置文件是 struts.xml.. 在这个配置文件里面可以使用通配符..其中的好处就是,大大减少了配置文件的内容..当然,相应付出的代价是可读性.. 使用通配符的原则是 约定高于配置. 在项目中,我们有很多的命名规则是约定的…我们使用通配符那就必须有一个统一的约定.否则通配符将无法成立 看下面的例子. (1)先看我们的action配置  <package name=”user” extends=”struts-default” namespace=”/”>  <action name=”user_*” class=”com.test.action.UserAction” method=”{1}”>   <result>/user_{1}.jsp</result>  </action> </package> 带红字的解释下,第一个带”*” 表示的是 后面匹配任意字符…这个很容易理解 {1}表示的是第一个”*”的内容…注意,这里的大括号,比如,如果是user_add Read more […]

getHibernateTemplate()和getSession()的区别

Posted by & filed under Uncategorized.

自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢? 1.使用getSession()方法你只要继承sessionFactory,而使用getHibernateTemplate()方法必须继承 HibernateDaoSupport当然包括sessionFactory,这点区别都不是特别重要的,下面这些区别就很重要了 2.getSession()方法是没有经过spring包装的,spring会把最原始的session给你,在使用完之后必须自己调用相应的 close方法,而且也不会对声明式事务进行相应的管理,一旦没有及时关闭连接,就会导致数据库连接池的连接数溢出,getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接。 在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()并没有提供,这时我们用HibernateCallback 回调的方法管理数据库. 例如如下代码: /**      * 使用 hql 语句进行操作      * @param hql HSQL 查询语句(使用回调函数访问外部变量,必须是final的)      * @param offset 开始取数据的下标     * @param length 读取数据记录数     * @return List 结果集 */ public List getListForPage ( final String hql , final int offset , final int length ) {               List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {                             public Object doInHibernate ( Session session ) throws HibernateException, SQLException {                                             Query query = session.createQuery ( hql ) ;                                             query.setFirstResult ( offset ) ;                                             query.setMaxResults ( length ) ;                                             List list = query.list ( ) ;                                             return list ;                            }                }) ;                return list ; } Read more […]