随笔-7  评论-0  文章-0  trackbacks-0
  2009年6月23日
  Java的核心API是非常庞大的,这给开发者来说带来了很大的方便,经常人有评论,java让程序员变傻。
但是一些内容我认为是必须掌握的,否则不可以熟练运用java,也不会使用就很难办了。
1、java.lang包下的80%以上的类的功能的灵活运用。
2、java.util包下的80%以上的类的灵活运用,特别是集合类体系、正规表达式、时间、属性、和Timer. 3、java.io包下的60%以上的类的使用,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。
4、java.math包下的100%的内容。
5、java.net包下的60%以上的内容,对各个类的功能比较熟悉。
6、java.text包下的60%以上的内容,特别是各种格式化类。
7、熟练运用JDBC. 8、java.security包下40%以上的内容,如果对于安全没有接触的话根本就不可能掌握java. 9、AWT的基本内容,包括各种组件事件、监听器、布局管理器、常用组件、打印。
10、Swing的基本内容,和AWT的要求类似。
11、XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理
以上文章摘自——北大青鸟徐州蓝海 www.xzbenet.com www.lanh.cn
posted @ 2009-09-11 15:25 sillyha 阅读(153) | 评论 (0)编辑 收藏
鉴于windows操作系统及office办公平台,在个人桌面上的垄断地位,使得excel/word/ppt等文件被广泛应用。通过java读 写excel文档是编程开发中常见问题,比如在swing和web应用中经常遇到。目前通过Java操作Excel的类库大致有[1]:
    1、POI,大名鼎鼎的Apache上的项目。
    2、Java Excel API(亦简称jexcelapi或jxl),纯java的excel开发包。
    3、jexcel,jxl的衍生品,适宜于Swing开发。
    4、jxls,依赖于POI,基于excel模板的可定制化报表输出工具。
    5、Jacob (Java COM Bridge),顾名思义,是采用桥接方式访问COM组件及Win32类库。
    6、其它方式,如数据导出到html格式的表格中,再另存为xls文档

    使用比较
    POI、jxl、jexcel可以划归为一类,通过java封装了Excel的操作,所以需要折腾Workbook,Sheet,Cell等对象,顾及excel的每个细节。这种方式,优点是功能强大。缺点是代码冗长拖沓,阅读困难。
    jxls虽然是基于POI,但其最大突破在于预先定制好Excel模板(如字段、格式、图表等),运行期绑定数据即可呈现多样化报表。其优点是编程轻松,功能灵活方便。缺点是对于过于动态化报表不太适用(如输出字段、格式非常多变)。
    Jacob和COM模型粘在一起,自然被纯java的拥趸者所不顾。所以,应用不是很广。
 

    jxls初体验

    业务部门经常需要我们技术部给推送一些定期报表,这些报表的字段及格式都是预定义好的。显而易见,在这种场合,jxls是再适合不过的工具了。只要定义好 输出报表的模板,绑定查询出的数据即大功告成。日常维护起来也很方便,比如加减字段、改变展现方式、嵌入excel自动图表等都能轻松搞定。
    百闻不如一见,从jxls主页[5]上下载了jXLS v.0.9.6(不知何故,自20080409日后没有再更新),安装起来运行其中自带的范例。自带范例可以通过maven来编译,偶试了试编译成功,但 不知道怎么运行范例。后来没辙,把范例导到eclipse中进行编译运行。编译时下载了最新的poi-3.2-FINAL-20081019.jar,结 果编译成功,但运行报错
    java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCell.setEncoding(S)V
    后来换成poi-3.1-FINAL-20080629.jar,又报别的错,最后好不容易从CSDN上下载了poi-3.0.1-FINAL- 200705.jar,总算运行成功。体验了一下,效果非常好。让人不解的是,在POI主站上只能下载到最新的POI3.2版本,老版本就是找不到。

    参考资料
    1、http://schmidt.devlib.org/java/libraries-excel.html,java操作Excel的类库清单
    2、http://jakarta.apache.org/poi/,POI主页
    3、http://www.andykhan.com/jexcelapi/index.html,jxl主页
    4、http://www.teamdev.com/jexcel/index.jsf,jexcel主页。
    5、http://jxls.sourceforge.net/,jxls主页
    6、http://jacob-project.wiki.sourceforge.net/,Jacob主页

posted @ 2009-07-14 11:24 sillyha 阅读(2606) | 评论 (0)编辑 收藏

1、

org.springframework.orm.ObjectRetrievalFailureException: Object of class [com.xindeco.myregister.pojo.MyRegisterInfo] with identifier [14]: not found

MyRegisterInfo在数据库没有identifier [14]对象。

2、

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column: password (should be mapped with insert="false" update="false")

出错原因:password 和repassword同时对应数据库表中的password一列,同时update和insert都设为true。

xml文件如下:

    <property name="password"

                          type="java.lang.String"

                          update="true"

                          insert="true"

                          access="property"

                          column="password"

                          length = "32"

                          />

                         <property name="repassword"

                          type="java.lang.String"

                          update="false"

                          insert="false"

                          access="property"

                          column="password"

                          length = "32"

                          />

解决的方法:

将repassword的insert和update设为false。

3、

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed;

nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class

错误原因:hibernate的映射文件中ID是大写的,而pojo的类中id是小写的

注意事项:每个pojo的类都要继承abstractEntity,其中abstractEntity类有个ID的属性要重写

public abstract class AbstractEntity

    implements Entity, BaseDTO {

    abstract public long getID();

    abstract public void setID(long id);

    public int hashCode() {

        return (int)this.getID();

    }

    public boolean equals(Object obj) {

        if (obj == this) {

            return true;

        }

        if (obj instanceof Entity) {

            return this.getID() == ( (Entity) obj).getID();

        }

        return false;

    }

}

4、

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition

错误原因:

在application.xml文件中deleteRegister方法以delete开头,并没有被设定为可更改的,应如下设置:

<!--为事物创建代理类,并指定方法的事物类型-->

<bean id="baseTxProxy" lazy-init="true" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="transactionManager">

      <ref bean="transactionManager"/>

    </property>

    <property name="transactionAttributes">

      <props>

        <prop key="add*">PROPAGATION_REQUIRED</prop>

        <prop key="cancel*">PROPAGATION_REQUIRED</prop>

           </props>

    </property>

</bean>

加上一行

<prop key="delete*">PROPAGATION_REQUIRED</prop>

5、

   ERROR org.apache.struts.util.RequestUtils - Error creating form bean of class com.xindeco.business.web.form.GraAppInfoForm

public class GraAppInfoForm

extends ActionForm 错误写成

public abstratic class GraAppInfoForm

extends ActionForm

6、

2006-04-25 08:56:38,495 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@8e2fb5

java.lang.ClassCastException: $Proxy0

at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:30)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)

at com.xindeco.core.web.action.BaseAction.dispatchMethod(BaseAction.java:153)

at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)

actioin类中的newone方法如下:

public class GraAppAction

    extends BaseAction {

    public ActionForward newone(ActionMapping mapping, ActionForm form,

                              HttpServletRequest request,

                              HttpServletResponse response) throws Exception {

       GraAppService graservice = (GraAppService) this.getBean("GraAppService");

}

applicationcontext中的GraAppService的配置如下:

    <bean id="GraAppDAO" class="com.xindeco.business.dao.impl.GraAppDAOImpl">

    <property name="support">

      <ref local="support"/>

    </property>

    <property name="sessionFactory">

      <ref local="sessionFactory"/>

    </property>

</bean>

<bean id="GraAppService" parent="baseTxProxy">

    <property name="target">

      <bean class="com.xindeco.business.service.impl.GraAppServiceImpl" autowire="byName">

        <property name="baseDAO">

          <ref bean="GraAppDAO"/>

        </property>

      </bean>

    </property>

</bean>

因此this.getBean("GraAppService");是为了得到GraAppServicImpl类的实现。GraAppService是interface

public class GraAppServiceImpl extends BaseServiceImpl

    implements GraAppService{

}

7、org.hibernate.hql.ast.QuerySyntaxException: Demand is not mapped. [from Demand where unitid = ? and needNum > usedNeedNum]

hibernate.cfg.xml没有配置Demand.hbm.xml文件的目录

8、org.springframework.jdbc.BadSqlGrammarException: Bad SQL grammar [] in task 'Hibernate operation'; nested exception is java.sql.SQLException: 列名 'id' 无效。

java.sql.SQLException: 列名 'name' 无效。

因为hibernate声明的id,name的columnid属性没有与数据库的字段对应,所以id,name无效。

9、java.lang.NumberFormatException: null

at java.lang.Integer.parseInt(Integer.java:415)

at java.lang.Integer.parseInt(Integer.java:497)

at com.xindeco.business.service.impl.DemandServiceImpl.findDemandListByUnitId(DemandServiceImpl.java:33)

错误语句为

needNum = Integer.parseInt(demand.getNeedNum());

usedNeedNum = Integer.parseInt(demand.getUsedNeedNum());

因为demand.getUsedNeedNum()==null,无法转化为string 类型,

10、rg.apache.jasper.JasperException: /GraAppInfo/GraAppInfoNew.jsp(343,29) According to TLD, tag bean:write must be empty, but is not

错误的原因:

       <select name="politicsID" >

             <option value="">请选择</option>

       <logic:notEmpty name="politicsList">

                <logic:iterate id="politics" name="politicsList">

       </logic:notEmpty>

       <option value="<bean:write name="politics" property="codeID"/>"><bean:write name="politics" property="codeName"/></option>

       </logic:iterate>

</select>

就因为少了/>

以后懂得通过查找字数,来检查错误

11、2006-04-26 13:27:54,812 ERROR com.xindeco.core.util.BeanUtils - bean property [Nation] copy failed

com.xindeco.core.exception.ConvertException: org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: java.lang.String; nested exception is org.hibernate.MappingException: Unknown entity: java.lang.String

beanUtil.beanCopy(grapojo,form,BizConstants.CONVERTER);

要求:

1、pojo类的属性只有与form属性名字相同,才能beancopy成功

2、pojo中属性是实体,在form中一定要用int,long表示

出现这错误的原因是pojo中的属性不是实体,而错误写成:

string

private String nation;应改成 private Syscode nation;

12、

2006-04-26 14:38:37,843 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@fa1b2d

java.lang.NullPointerException

at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:43)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

hibernate配置文件没改,程序找不到相应的类

        <many-to-one

            name="FSUnit"

            class="com.xindeco.business.pojo.EmployUnitBaseInfo"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="fSUnit"

        />

其实FSUnit对应的类应该是FSUnit

        <many-to-one

            name="FSUnit"

            class="com.xindeco.business.pojo.FSUnit"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="fSUnit"

        />

13、

org.hibernate.MappingException: An association from the table GraAppInfo refers to an unmapped class: com.xindeco.business.pojo.FSUnit

错误原因:hibernate.cfg.xml没有配置fsunit.hbm.xml文件的位置

14、

java.lang.ClassCastException: com.xindeco.business.dao.impl.GraAppDAOImpl

at com.xindeco.business.service.impl.GraAppServiceImpl.addGraduateApp(GraAppServiceImpl.java:16)

GraAppServiceImpl.java:16

第16行: GraAppDAO dao = (GraAppDAO) this.getBaseDAO();//其实得到的是GraAppDAOImpl

错误的原因是

public class GraAppDAOImpl

    extends BaseDAOImpl {

}

没有实现GraAppDAO接口,正确的做法是

public class GraAppDAOImpl

    extends BaseDAOImpl implements GraAppDAO {

}

先继承后实现

15、2006-04-27 08:38:54,078 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@1d6399b

java.lang.ClassCastException: com.xindeco.business.pojo.SysCode

at org.hibernate.type.StringType.set(StringType.java:26)

at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:63)

at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:40)

一般是因为hibernate声明类型和pojo类声明的类型不一样,并且前面已经出现了Hibernate: insert into TGraAppInfo (name, whereFrom, degree, college, speciality, studentRelTel, remark, higherEduLength, highSchool, studyResume, normalOrNot, proxyUnit, workPost, workPlace, studentAddress, studentPostNumber, nation, appStatus) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

的操作提示,查出错误的原因有:

        <many-to-one

            name="demand"

            class="com.xindeco.business.pojo.Syscode"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="demandID"

        />

         <property

            name="appStatus"

            type="int"

            update="true"

            insert="true"

            access="property"

            column="appStatus"

            length="10"

        />

应改为   

        <many-to-one

            name="demand"

            class="com.xindeco.business.pojo.Demand"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="demandID"

        />

<many-to-one

            name="nation"

            class="com.xindeco.business.pojo.SysCode"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="nation"

        />

16、

org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.xindeco.business.pojo.SysCode

at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:626)

at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:570)

at

org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:482)

pojo类为:

public class GraAppInfo{

    private College college;

}

action 类为

public class GraAppAction

    extends BaseAction {

       public ActionForward add(ActionMapping mapping, ActionForm form,

                             HttpServletRequest request,

                             HttpServletResponse response) throws Exception {

        graInfo.setCollege(new College());\\必须从数据库找到college这个对象,而不能新生成

        graInfo.getCollege().setID(graForm.getCollegeID());

        graInfo.setAppStatus(Integer.parseInt("0"));

      service.addGraduateApp(graInfo);

}

public class GraAppServiceImpl extends BaseServiceImpl

    implements GraAppService{

    public boolean addGraduateApp(GraAppInfo info){

        this.getBaseDAO().save(info);

        return true;

    }

}

dao类save方法为

    getHibernateTemplate().save(obj);

当cascade="all",插入new college 除了id和原来的记录一样,其他的字段全部都被更新,为null

当cascase=“insert”,插入new college 只会把它的id插入grainfo表中,其他字段不变。

17、java.sql.SQLException: Unable to convert between java.lang.Integer and BLOB.

因为

        <property

            name="province"

            type="com.xindeco.business.pojo.SysCode"//不能用复杂类,

            update="true"

            insert="true"

            access="property"

            column="provinceId"

        />

应该改为

            <many-to-one

            name="province"

            class="com.xindeco.business.pojo.SysCode"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="provinceId"

        />

18、javax.servlet.jsp.JspException: Cannot create iterator for this collection

at org.apache.struts.taglib.logic.IterateTag.doStartTag(IterateTag.java:265)

jsp文件如下:

   <logic:notEmpty name="graduateList" >

   <logic:iterate id="graduate" name="graduateList" >

   </ogic:notEmpty >

   </ogic:iterat>

graduateList是一个类,而logic:iterator要求必须是ArrayList,HashSet....这样的集合类,而graduateList中一个属性是ArrayList或HashSet的

应改为:

<logic:notEmpty name="graduateList" property="items">

<logic:iterate id="graduate" name="graduateList" property="items" >

</ogic:notEmpty >

</ogic:iterat>

19、2006-05-11 17:13:37,468 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@bc22eb

org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

SysUser user= (SysUser) request.getSession().getAttribute(WebConstants.SESSION_USER);

System.out.println(user.getRole().getRoleName());

当hibernate session取出数据放到http session时,

由于sysuser中role的lazy=“true”,所以没有将RoleName放到http session中,当System.out.println(user.getRole().getRoleName());

时,虽然http session还开着, hibernat seesion已经关闭

        <many-to-one

            name="role"

            class="com.xindeco.business.pojo.SysRole"

            lazy="false"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="roleID"

        />

20、Association references unmapped class: com.xindeco.workflow.WFNode

因为application.xml文件中没有配置<mapping resource="com/xindeco/workflow/WFNode.hbm.xml"/>

系统找不到WFNode

         < set

     name = " nodes "

            table = " WF_ROLENODES "

            lazy = " true "

            inverse = " false "

            cascade = " none "

            sort = " unsorted "

         >

< key column = " roleID " > </ key >               

< many - to - many

         class = " com.xindeco.workflow.WFNode "

         column = " nodeId "

         outer - join = " auto " />

         </ set >

posted @ 2009-06-24 11:25 sillyha| 编辑 收藏
我们经常用的就是扩展它的接口ApplicationContext.而它的实现又有多种,我们只介绍一些常用的实现。applicationContext.xml文件是位于Src目录下。
第一种就是:
ApplicationContext context = new ClassPathXmlApplicationContext(
                                     "applicationContext.xml");//用这个成功了,不过要在web-inf和src下面同时建立两个(后来改了,只在src下面建立就可以,见后面,O(∩_∩)O~)
第二种就是:
ApplicationContext context = new FileSystemXmlApplicationContext(
                                     "Src/applicationContext.xml ");//src下面建立xml的时候用该方法
然后DriveCar dc=(DriveCar)ctx.getBean("DriveCar");就可以使用了……
注意上面两种加载是的路径。
然后在把他们转换成BeanFactory就可以了。需要用到那个bean就用getBean(“”)取得,可以根据id或name都可以。
除此之外还有两种加载的方法:
第三种方法:
ClassPathResource resource =
new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
第四种方法:
Resource resource =
new FileSystemResource("Src/applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
同样要注意上面的路径的不同。其实classpath相对应的路径就是Src目录下,而fileSystem相对的是工程目录。所以它们路径是有区别的,加载时也要细心,不然就会报java.io.FileNotFoundException(系统找不到指定的文件)的异常了。


第三四种方法没有测试。

刚又查了spring的ContextLoaderListener,可以再web.xml中<web-app></web-app>之间添加
     <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/classes/applicationContext*.xml
        </param-value>
     </context-param>
</web-app>
就可以只在src目录下建立applicationContext.xml了,呵呵
posted @ 2009-06-24 10:45 sillyha| 编辑 收藏

今天看到网上有转载的获得Spring Bean的方法,觉得值得珍藏,现摘录在此。

众所周知,Spring框架将DI模式发挥到了极至,因此,系统里面用Spring管理的Bean相互之间的获取是非常

方便的,只要使用者提供一个setter方法并在配置文件中配置该属性就可以。

但是,对于系统中非Spring框架管理的类,如果需要获取Spring管理的类,或者,程序中需要动态的根据Be

an的id来获取Bean实例,不可能事先为该类提供所有需要的Bean属性的setter方法,在类似这样的情况下,

获取Spring框架管理的类实例的方法有多种,现在简单总结如下:

方法一:在初始化时保存ApplicationContext对象
代码:
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
说明:
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。


方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:

import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 =

WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
ac1.getBean("beanId");
ac2.getBean("beanId");
说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后

在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。


方法三:继承自抽象类ApplicationObjectSupport
说明:
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

方法四:继承自抽象类WebApplicationObjectSupport
说明:
类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

方法五:实现接口ApplicationContextAware
说明:
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

以上方法适合不同的情况,请根据具体情况选用相应的方法。

这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知

道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运

行环境,尽量通过DI的方式获取需要的服务提供者。

方法五比较可行,可以设计一个工具类,专门来获取Spring中的类。减少对业务代码的侵入性。

posted @ 2009-06-23 15:43 sillyha| 编辑 收藏