心得

     1.MYSQL的问题,HIBERNATE+SPRING 不可以用....
2.struts里action type =delegatingactionProxy没写
3.struts里的plugIn 改写在web.xml里这样可以把server action 里的错误信息可以显示出来..
4. nullPoint空指针问题一般是没实例化.
5.noDefClasserr  没有加载到.jar包
6.有出现奇怪的问题的话,重装IDE,SQLSERVER之类的....
7.TOMCAT加载慢,把WEPPS里的工程去掉一些
8. tomcat里redeloy有问题,改路径

9.     Session sess = this.getSession();
     Query q = sess.createQuery("from Employ");
     q.setFirstResult(first);
     q.setMaxResults(pageSize);
     List list = q.list();
     if(sess != null && sess.isOpen())
       sess.close();
     return list;分页问题
10.一个<html:form></>一定要用一个ActionForm来对应,不然<html:form>不做任何动作.

11.如果用SPRING注入来实现的类(如:DAO)那么要引用他DAO则也要用注入的方式,而不是NEW一个出来
否则会抛出NULLPoniterException:

可用:

 

 

Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)

ctrl+1  快速修复(

Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)

Ctrl+J 正向增量查找
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

在这里我想说的一点就是关于inverse的设置,
在一对多的情况下建议将一端的inverse设为true,而由多端去自动维护关联关系,为什么这样做其实挺容易理解的,
假设org和user为一对多的关联,org.getUsers的inverse设置为false,

org.getUsers().add(user);
dao.update(org);

当update的时候org所关联的所有user的orgId都会更新一次,可想而知这个效率,而如果改为在多端维护(多端设置为inverse=false),则是这样:

user.setOrg(org);
dao.update(user);

当update的时候就仅仅是更新user这一条记录而已。

 

 

 

 


Session.save方法的执行步骤:
    1.在Session内部缓存中寻找待保存对象。内部缓存命中,则认为此数据已经保存(执行过insert操作),实体对象已经处于Persistent状态,直接返回。
    2.如果实体类实现了lifecycle接口,则调用待保存对象的onSave方法。
    3.如果实体类实现了validatable接口,则调用其validate()方法。
    4.调用对应拦截器的Interceptor.onSave方法(如果有的话)。
    5.构造Insert SQL,并加以执行。
    6.记录插入成功,user.id属性被设定为insert操作返回的新记录id值。
    7.将user对象放入内部缓存。
    8.最后,如果存在级联关系,对级联关系进行递归处理。

 

--------------------------------------------------------------------------------

    Session.update方法的执行步骤:
    1.根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前实体对象已经处于Persistent状态,返回。
    2.初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存。注意这里Session.update方法本身并没有发送Update SQL完成数据更新操作,Update SQL将在之后的Session.flush方法中执行(Transaction.commit在真正提交数据库事务之前会调用Session.flush)。

 

--------------------------------------------------------------------------------


    Session.saveOrUpdate方法的执行步骤:
    1.首先在Session内部缓存中进行查找,如果发现则直接返回。
    2.执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
    3.根据unsaved-value判断对象是否处于未保存状态。
    4.如果对象未保存(Transient状态),则调用save方法保存对象。
    5.如果对象为已保存(Detached状态),调用update方法将对象与Session重新关联。

 


。我们可以将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器

SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据,还缓冲了一些将来有可能重复利用的数据。
Configuration 接口

  Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

  虽然Configuration接口在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate时你所遇到的每一个对象。

为了能创建一个SessionFactory对象,你必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,你可以简单地抛弃它。如下是示例代码:

  Configuration cfg = new Configuration();
  cfg.addResource("hello/Message.hbm.xml");
  cfg.setProperties( System.getProperties() );
  SessionFactory sessions = cfg.buildSessionFactory();

 

realtek_alc650_app366.exeVIA_ac97vs_drv670beta.exe
 package org.labor.service.Impl;

import org.labor.service.IReadMsgService;

import cn.com.chundi.sendsms.Delete;
import cn.com.chundi.sendsms.Read;
import cn.com.chundi.sendsms.Sms;

public class ReadMsgService extends Thread  {


 


       //读取短信的线程
 public void run() {
  Integer i = new Integer(1);
  Sms sms = new Sms();  

  while (true) {
   try {
    System.out.println("读取第"+i+"条短信");
    Read msg = sms.readmsg(i.toString()); //读取第i条短信
    
               if ((msg != null) && (msg.isempty()==false)){
                 MobileSeekService mobileseekser = new MobileSeekService();
                 mobileseekser.mobileseek(msg.getoa(), msg.getmsg());
                    System.out.println("来自: " + msg.getoa());
                    System.out.println("内容: " + msg.getmsg());
    
                }
     //挂起30秒避免冲突
               sleep(30000);
              
    System.out.println("正在删除SIM中第" + i + "条短信...");
    Delete del = sms.deletemsg(i.toString());
    if ((del != null) && (del.isdelete()==true)){     
     System.out.println("SIM中第" + i + "条短信成功删除");
    }
    else{
     new DeleteMsgService(i.toString()).start();
    }     
               
               
               

    i = new Integer(i.intValue()+1);
    if(i.intValue()==31) i = new Integer(1);    
    sleep(60000);//挂起
   } catch (Exception e) {
    e.printStackTrace();
   }

  }

 

 }
}

 


public class Readmsg extends HttpServlet {
 public void init() throws ServletException {
//  System.out.println("**********************************************************************");
  
//  ReadMsgService readmsgser = new ReadMsgService();
//  readmsgser.start();
//  
  
  
  
 }
Resource resource=new ClassPathResource("/WEB-INF/applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
MemberManageImp(要用的DAO的声名) mmi=(要用的DAO)factory.getBean("要用的DAO");

`
12..
NullPointerException (很有可能是数据库没记录的问题)

当一个应用在需要一个对象的地方试图使用 null 时抛出。它们包括:

1调用一个 null 对象的实例方法。
2访问或修改一个 null 对象的域。

3、使用了未初始化的变量(虽然已经声明)
4、使用了未初始化的对象(虽然已经声明)
5使用了关键字或已存在的类名作变量对象方法或类名。

 

13.CVS

14.
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: 是因为数据库中没有记录,或者关联的外表没有字段

15.快捷键的后加上H:/J2EE环境建设/ECLIPSE安装包/eclipse/eclipse.exe加上 -clean -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

16.调试有问题,数据库中没记录的问题一定要先检查.

17 小组开发时,MYSQL,MYQL GUI,STRUTS1.1.1.2,HIBERNATE3.1之类的版本要统一

18  INTERNAT SEARCH能力,,,,,,,,,,,,,,,,,


19 ("from "+this.tablename+" c where c.enterprise.enId=5");   c.enterprise.enId(HQL的标准)

20如果看过去一句程序都没错,可就是找不出来就删除再写.如
<%=((Enterprise)((Employ)(((List)request.getAttribute("list")).get(0)).getEnterprise()).getEnName().toString()%>


21
HQL可以关联得到外表的对像
CreateQuery("from Employ e where e.enterprise.enId=2");
而不是
CreateQuery("from Employ e where e.Enterprise().getEnId()=2");


22认真看LOG4J的信息,可以找出很多错误.

23.SESSION.CLOSE();不可以关闭的解决
<class name="mypack.Customer" table="CUSTOMERS" lazy="true"> lazy延迟机制 (1改lazy为false)可以让错误org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session is disconnected可以把数据LAZY懒加载到内存了,就可以SESSION.CLOSE;了

24.JSP文件的名称前面多了个空格,,则没法访问

25. java.lang.NullPointerException也有可能是STRUTS的ACTION TYPE没有用SPRING代理

26.使用Validator框架在struts-config.xml里的
<action
      attribute="enterOptionForm"
      input="/enterregist.jsp" 一定要有input否则出错No input attribute for mapping path

 


javax.servlet.jsp.JspException: Cannot find bean under name laborclass数据库问题


27 registering bean with name 'LaborDAO' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Bean class [org.labor.dao.Impl.LaborDAO] not found; nested exception is java.lang.ClassNotFoundException:找不到.CLASS文件,重新译一

 


28. 奶奶的,NULLPRINT..问题,,,SPRING.XML的问题

 

29,
这个好像是工厂没初始化了
public Session getSession() {
  session = HibernateSessionFactory.getSession();
  return session; 
 }

改写成是生成一个工厂:SessionFactory factory;
  public Session getSession(){
 Configuration config = Configuration();
 factory = configure ("./config/hibernate.cfg.xml").buildSessionFactory();
 session = factory.openSession();
 return session;
 }

 

30 数据库中的字段的类型长度比如只有50大小,却存入100个字符,,,的错误,,,,,,小心...有时只是看程序有没有字对,还有看数据库

 

 

31 这个是直接用HQL来写HIBERNATE的CRUD语句,比较好用

  Configuration config = new Configuration();
  
  factory = config.configure("/config/hibernate.cfg.xml")
  .buildSessionFactory();

   Session session = factory.openSession();
   Transaction tx = session.beginTransaction();
   String hql="from Course where courseid =    "+id.toString();//
   
   Query query = session.createQuery(hql);
   ArrayList list = (ArrayList)query.list();
   tx.commit();
  
   session.close();
   
   return (Course)list.get(0);

 

32 getParameter可以获得客户端传送给服务器端的参数值。  
   
  getAttribute可以得到由setAttribute设置的参数值,就相当于是使用getAttribute得到一个自己定义的参数,而不是从客户端得到的参数。我是这样理解的!


你是否已经厌倦了每次写for循环时都要写上那些机械的代码,尤其当你需要遍历数组或者Collection,如:

public void showAll (Collection c) {
for (Iterator iter = c.iterator(); iter.hasNext(); ) {
System.out.println(iter.next().toString());
}
}

public void showAll (String[] sa) {
for (int i = 0; i < sa.length; i++) {
System.out.println(sa[i]);
}
}
在5.0中,我们可以这样写:

public void showAll (Collection c) {
for (Object obj : c) {
System.out.println(obj.toString());
}
}

public void showAll (String[] sa) {
for (String str : sa) {
System.out.println(str);
}
}

 ,但是现在编写程序,完全可以不制定参数的类型,(具体用的时候)来确定,增加了程]

序的通用性,像是一个模板。


 自动解包装与自动包装的功能

从上面有没有看到有点别扭啊,h.get(new Integer(123))这里的new Integer(123);好烦的,在JDK5.0之前我们只能忍着了,现在这种问题已经解决了,请看下面这个方法。我们传入一个int这一基本型别,然后再将i的值直接添加到List中,其实List是不能储存基本型别的,List中应该存储对象,这里编译器将int包装成Integer,然后添加到List中去。接着我们用List.get(0);来检索数据,并返回对象再将对象解包装成int。恩,JDK5.0给我们带来更多方便与安全。

//Code list 7

public void autoBoxingUnboxing(int i) {

 ArrayList<Integer> L= new ArrayList<Integer>();

 L.add(i);

 int a = L.get(0);

 System.out.println("The value of i is " + a);

}
而原来要这么做....
List myIntList = new LinkedList();//1
myIntList.add(new Integer(0));//2包装
Integer x = (Integer) myIntList.iterator().next();//3解装

 

2.关于spring启动的优化的问题
<beans  default-autowire="byName" default-lazy-init="true">
     为TRUE时要时才加载,所以启动时会快很多但部署后还是用FALSE好


3.有的工程加载不进来,可以COPY到WORKSPACE里再加载就可以认了..

4,org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".这样的错可能是JAR包导入的有问题,,可能是SPRING1.0与SPRING2.0的JAR都导入了,---------如果不可以,就直接重新建一个工程,,,这个方法好


5.MYSQL.JAR驱动,不仅要用ECLIPSE的DB BROWER来加载.最好也在TOMCAT里的COMMON/LIB,JAVA,里也CP一份


6.EE 5.0以上的才可以而我自己的环境又是1.6版本的,是因为要在MYECLIPSE里把java-compiler-compiler compliance level 设为5.0以上


7.在hibernate.cfg.xml里面添加如下cache的配置
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
或 
 <property name="hibernateProperties">   
    <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
   </props>
  </property>
好像是jbpm要使用到cache,所以必须要指定一个cache的实现。

org.hibernate.HibernateException: Could not instantiate cache implementation
这个问题我就是这么解决的,你们试下
 

8.在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception;    Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.
    它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。

    Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。


9.You have an error in your SQL syntax
mysqldump出来的文件,再导回去,就报You have an error in your SQL syntax错误。原因是,有一个字段的名字是TABLE,用``把它括起来就解决了。 这就是SQL保留字的问题.......
10 约定高于配置。首先规定,对于query,list,show,get,find等开头的方法采用PROPAGATION_REQUIRED,readOnly级的事务定义;而对于set,save,update,remove,delete等开头的方法采用PROPAGATION_REQUIRED级的事务定义,基本上能满足大部分开发的需要。

 

11.execution(* *..BookManager.save(..))的解读:
第一颗* 代表ret-type-pattern 返回值可任意,
*..BookManager 代表任意Pacakge里的BookManager类。
如果写成com.xyz.service.* 则代表com.xyz.service下的任意类
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类
save代表save方法,也可以写save* 代表saveBook()等方法
(..) 匹配0个参数或者多个参数的,任意类型
(x,..) 第一个参数的类型必须是X
(x,,,s,..) 匹配至少4个参数,第一个参数必须是x类型,第二个和第三个参数可以任意,第四个必须是s类型。

12.      Singleton管理说白了就是先到一个map中按id找找看有没有已存在的实例。


13dispatchAction里不可以有excute()方法,否则不可以用..


网上的例子一般都不是全面的,不是按着他做就一定可以的,因为作者也有漏写的时候

14在eclipse中使用快捷键,不小心按错了,使得变量的高亮显示没了。

其恢复方式如下:

选择:windows-> preferences->java->Editor->Mark Occurences

选择最上的复选框,下面的就有很多了。

其中的Local variables就是变量的高亮显示。


15要研究一个新框架...最好的方便.看它的source源代码里有自带的做好的war工程

lazy是不是设置为true的问题
News是一,News_Pic是多,

sql = "from News as news";

在hibernate中,默认lazy=false,这样,在列表显示时,查询News时,对应的News_Pic的查询也会产生,

如果此时设置为lazy=true,即可解决此问题,

但是如果为ture,对显示News的具体信息(包括对应的News_Pic)时就会报错

failed to lazily initialize a collection of role:

no session or session was closed at

所以最终的解决办法是,lazy=false,无非是多显示几条sql

 

或者可以查询部分字段(需要的,不带pic的)

sql = "select news.id,news.title from News as news";

但在页面上就必须这样显示了

xml 代码
<ww:property value="top[0]"/>   

 投影查询

不过这样以后,维护相对来说麻烦些,如果不是报表。最好不要这样做

  另一种解决办法,就是使用OpenSessionInView.修改web.xml即可,加入以下代码即可

xml 代码
<filter>    
<filter-name>OpenSessionInViewFilterfilter-name>    
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilterfilter-class>    
<init-param>    
<param-name>singleSessionparam-name>    
<param-value>trueparam-value>    
init-param>    
filter>    
<filter-mapping>    
<filter-name>OpenSessionInViewFilterfilter-name>    
<url-pattern>*.actionurl-pattern>    
filter-mapping>  

 但是这样虽然解决了查询问题,但是在update,delete等操作上就又报错:

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

网上又说
尽管Open Session In View看起来还不错,其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码,这个方法实际上是被父类的doFilter调用的,因此,我们可以大约了解的OpenSessionInViewFilter调用流程: request(请求)->open session并开始transaction->controller->View(Jsp)->结束transaction并close session.

     一切看起来很正确,尤其是在本地开发测试的时候没出现问题,但试想下如果流程中的某一步被阻塞的话,那在这期间connection就一直被占用而不释放。最有可能被阻塞的就是在写Jsp这步,一方面可能是页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用户间传输时间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。

Open Session In View是个双刃剑,放在公网上内容多流量大的网站请慎用。
 
     1.MYSQL的问题,HIBERNATE+SPRING 不可以用....
2.struts里action type =delegatingactionProxy没写
3.struts里的plugIn 改写在web.xml里这样可以把server action 里的错误信息可以显示出来..
4. nullPoint空指针问题一般是没实例化.
5.noDefClasserr  没有加载到.jar包
6.有出现奇怪的问题的话,重装IDE,SQLSERVER之类的....
7.TOMCAT加载慢,把WEPPS里的工程去掉一些
8. tomcat里redeloy有问题,改路径

9.     Session sess = this.getSession();
     Query q = sess.createQuery("from Employ");
     q.setFirstResult(first);
     q.setMaxResults(pageSize);
     List list = q.list();
     if(sess != null && sess.isOpen())
       sess.close();
     return list;分页问题
10.一个<html:form></>一定要用一个ActionForm来对应,不然<html:form>不做任何动作.

11.如果用SPRING注入来实现的类(如:DAO)那么要引用他DAO则也要用注入的方式,而不是NEW一个出来
否则会抛出NULLPoniterException:

可用:
Resource resource=new ClassPathResource("/WEB-INF/applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
MemberManageImp(要用的DAO的声名) mmi=(要用的DAO)factory.getBean("要用的DAO");

`
12..
NullPointerException (很有可能是数据库没记录的问题)

当一个应用在需要一个对象的地方试图使用 null 时抛出。它们包括:

1调用一个 null 对象的实例方法。
2访问或修改一个 null 对象的域。

3、使用了未初始化的变量(虽然已经声明)
4、使用了未初始化的对象(虽然已经声明)
5使用了关键字或已存在的类名作变量对象方法或类名。

 

13.CVS

14.
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: 是因为数据库中没有记录,或者关联的外表没有字段

15.快捷键的后加上H:/J2EE环境建设/ECLIPSE安装包/eclipse/eclipse.exe加上 -clean -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

16.调试有问题,数据库中没记录的问题一定要先检查.

17 小组开发时,MYSQL,MYQL GUI,STRUTS1.1.1.2,HIBERNATE3.1之类的版本要统一

18  INTERNAT SEARCH能力,,,,,,,,,,,,,,,,,


19 ("from "+this.tablename+" c where c.enterprise.enId=5");   c.enterprise.enId(HQL的标准)

20如果看过去一句程序都没错,可就是找不出来就删除再写.如
<%=((Enterprise)((Employ)(((List)request.getAttribute("list")).get(0)).getEnterprise()).getEnName().toString()%>


21
HQL可以关联得到外表的对像
CreateQuery("from Employ e where e.enterprise.enId=2");
而不是
CreateQuery("from Employ e where e.Enterprise().getEnId()=2");


22认真看LOG4J的信息,可以找出很多错误.

23.SESSION.CLOSE();不可以关闭的解决
<class name="mypack.Customer" table="CUSTOMERS" lazy="true"> lazy延迟机制 (1改lazy为false)可以让错误org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session is disconnected可以把数据LAZY懒加载到内存了,就可以SESSION.CLOSE;了

24.JSP文件的名称前面多了个空格,,则没法访问

25. java.lang.NullPointerException也有可能是STRUTS的ACTION TYPE没有用SPRING代理

26.使用Validator框架在struts-config.xml里的
<action
      attribute="enterOptionForm"
      input="/enterregist.jsp" 一定要有input否则出错No input attribute for mapping path

 


javax.servlet.jsp.JspException: Cannot find bean under name laborclass数据库问题


27 registering bean with name 'LaborDAO' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Bean class [org.labor.dao.Impl.LaborDAO] not found; nested exception is java.lang.ClassNotFoundException:找不到.CLASS文件,重新译一

 


28. 奶奶的,NULLPRINT..问题,,,SPRING.XML的问题

 

29,
这个好像是工厂没初始化了
public Session getSession() {
  session = HibernateSessionFactory.getSession();
  return session; 
 }

改写成是生成一个工厂:SessionFactory factory;
  public Session getSession(){
 Configuration config = Configuration();
 factory = configure ("./config/hibernate.cfg.xml").buildSessionFactory();
 session = factory.openSession();
 return session;
 }

 

30 数据库中的字段的类型长度比如只有50大小,却存入100个字符,,,的错误,,,,,,小心...有时只是看程序有没有字对,还有看数据库

 

 

31 这个是直接用HQL来写HIBERNATE的CRUD语句,比较好用

  Configuration config = new Configuration();
  
  factory = config.configure("/config/hibernate.cfg.xml")
  .buildSessionFactory();

   Session session = factory.openSession();
   Transaction tx = session.beginTransaction();
   String hql="from Course where courseid =    "+id.toString();//
   
   Query query = session.createQuery(hql);
   ArrayList list = (ArrayList)query.list();
   tx.commit();
  
   session.close();
   
   return (Course)list.get(0);

 

32 getParameter可以获得客户端传送给服务器端的参数值。  
   
  getAttribute可以得到由setAttribute设置的参数值,就相当于是使用getAttribute得到一个自己定义的参数,而不是从客户端得到的参数。我是这样理解的!


  JSP的转页; response.sendRedirect("teacherlogin.jsp");

 

2 用SESSION来传:
 request.getSession().setAttribute("list", laborclass);
对应的页面<logic:present name="list" scope="session">

3   在JSP页面上有时不可以显示这样的句子,是因为懒汉LAZY没有设为false,,,

 <%= ((Datadownload)(((List)(session.getAttribute("downlist"))).get(0))).getCourse().getCoursename().toString()%> 因为是外键,要加载
       

4 做PS时,可以先把版面分成块,,,切后把图片拿掉,加入列表(下划虚线或灰白交叉,或加上头ICON)后效果就出来了


5.HTML代码<iframe src="/xg0501/weather/weather.html" frameborder="0" width="658" height="419" marginheight="0" marginwidth="0" scrolling="No"> </iframe>


LINK样式
<link rel="stylesheet" type="text/css" href="Style.css">


6 用SPRING事务代理可以不用管SESSIONFACTORY的创建,直接getSessionFactory().openSession();就可以了,
单独用HIBERNATE则要用

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new Configuration()
                .configure("/config/hibernate.cfg.xml")
                .buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}


这个类,,用时:
Session session = HibernateUtil.getSessionFactory().openSession();
  (直接类名就可以了)

就可以了,,
注意STATIC的用法:  第一次用HibernateUtil它会自动实例化STATIC块(HibernateUtil可以不用new 对象出来,再用,,什么什么的)

 

7 要顶部对齐,则要TABLE的上一级的< tr>对齐方式为valign=top
<tr valign="top">
<td>
<table > <tr><td></td></tr></table>
<td></tr>

 

8.<bean:write scope="request" property="cust/address" maxLength="6"
 
maxLengthString="…"/>


9 Cascade:当父表发生变化时,在所有子记录中作相同的改变。
Restrict:如果有子记录,不允许改变。
Ignore:忽略子记录,而只在父记录中修改。


10用CMD在命令集中打包...
不可以用绝对路径打包
jar cvf yourname.jar d:/net目录
要用:
jar cvf yourname.jar ./net

 

11
一切设计都要适度!!!

绝不会因为"高内聚,低耦合"变得更快, 也不会因为"高内聚,低耦合"让用户感觉更好. "高内聚,低耦合"可以让程序员更容易修改, 但是, 别忘了, 程序的真正目的是为了满足客户


敏捷思想里面过度设计叫浪费, 大大的浪费, 所以说不要为了理想的设计而浪费钱了, 但不要不做一点点设计.
总之为了尽快做出好东西, 你需要仔细权衡. 不断的权衡, 在未来和现实中权衡, 在权衡之中降低成本

"设计的时候,总是觉得设计和现实的实现差距很大.有时候还脱离了设计,有时候也觉得设计的很繁琐,实现起来有很多的冗余的代码."高内聚,低耦合"一直在追求,但却很难做到...
是否有什么好的途径和方法对设计进行分析,也不会去脱离具体的实践呢..设计和实现脱节是个很大的问题."

我认为好的设计是: 简单够用, 好改.
根本不需要刻意追逐所谓的高度设计, 现在看似很好的设计, 过两年就会觉得很不爽.


12  系统就是问题域,系统划分过程就是对问题分解过程。  

13通过阅读使我们明白Hibernate的Transaction都在干了些什么?我现在把用Hibernate写的例子翻译成JDBC,大家就一目了然了:

Connection conn = ...; <--- session = sf.openSession();

conn.setAutoCommit(false); <--- tx = session.beginTransactioin();

... <--- ...

conn.commit(); <--- tx.commit(); (对应左边的两句)
conn.setAutoCommit(true);

conn.close(); <--- session.close(); Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。


14<welcome-file-list>
 <welcome-file>/index.do</welcome-file>路径

</welcome-file-list>

把500错误用error.jsp来代换
 <error-page>
   <error-code>500</error-code>
   <location>/error.jsp</location>路径
  </error-page>

 

StringBuffer message=new StringBuffer();
message.append("一行");
message.append("两行");
message.append("kkkkkk黄仕勇");

System.out.print(message);
时则是:一行两行


15模版模式

总的想法就是不变的东西可以抽象出一个方法。比如对异常的检查。变的东西,比如对数据库的操作,抽象出一个接口的方法

 struts的validation有两种验证模式,服务器端和客户端。  
  如果你想在点击提交按钮时就弹出警告窗口,这是客户端验证。你需要在jsp中包含以下代码:  
  <html:javascript   formName="Orderform"   cdata="false"  
              dynamicJavascript="true"   staticJavascript="false"/>  
  然后在<html:form>中增加   οnsubmit="return   validateOrderForm(this)"  
   
  启动服务器后访问这个jsp,看看页面源代码中是否出现了struts自动生成的这些javascript验证脚本,如果出现,点击提交按钮时应该就能弹出警告窗口了。  
   
  另外的一种就是服务器端验证。基本上和你这里的配置一样,action配置中的input="/Orderform.jsp"  
  validate="true"  
  是必须的,后者说明启用服务器端验证,前者指明如果验证失败则跳转到某个页面。  
  还有就是你的Form类无需继承ValidatorForm,继承ActionForm即可。继承ValidatorForm的情况是你想在Form类中自己写验证代码。  
   
  建议你先试试客户端验证,看看jsp中是否自动生成了验证脚本,以便确认你的配置是否正确。

 

1.SSH整合

 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
  </plug-in>

org.springframework.web.struts.DelegatingActionProxy

 

2。SSH整合:找不到action servlet


本人用Spring集成Struts时老出Servlet action is not available错
找配置文件找了N久,没有找出错来。后面把
 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
   <set-property value="contextConfigLocation" property="/WEB-INF/applicationContext.xml"/>
  </plug-in>

这段代码给剪掉。在web.xml文件中加上
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <servlet>
 <servlet-name>context</servlet-name>
 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
  </servlet>
就OK了!!

 


3。STRUTS中每个FORM表单对应一个ACTIONFORM,property对应actionform中的属性

  <html:select property="labcId" styleClass="input_text">
        <html:options property="labcId" labelProperty="labcName" collection="LaborcOptions"/>
 </html:select>

 

 


4。hibernate+SPRING的生成DAO问题...

(lazy延迟机制

 

<class name="mypack.Customer" table="CUSTOMERS" lazy="true"> lazy延迟机制 (1改lazy为false)

 


以下的可以不用改,可以不用加入到WEB.XML
web.xml(2.改这个)  加入

<filter >
 <filter-name>hibernateFilter</filter-name>
 <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
 <init-param>
     <param-name>singleSession</param-name>   //要加这个来多SESSION.....
     <param-value>false</param-value>
    </init-param>
</filter >
 
<filter-mapping>
 <filter-name>hibernateFilter</filter-name>
 <url-pattern>*.do</url-pattern>
</filter-mapping >

 

 

 

 

 

 

struts+hibernate+MySql中文乱码解决方案

      1、修改MySql数据库的my.ini配置文件、
# CLIENT SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#
[client]
port=3306
default-character-set=GBK
#此处默认编码修改为GBK或utf-8

# SERVER SECTION
# ----------------------------------------------------------------------
#
2、创建数据表的时候
# 主机: localhost
# 数据库: cits
# 表: 'article'
#
CREATE TABLE `article` (
  `article_id` varchar(100) NOT NULL default '0',
  `article_title` varchar(100) default NULL,
  `domain_id` varchar(100) default NULL,
  `article_text` varchar(100) default '',
  `good_flg` tinyint(1) default NULL,
  `lock_flg` tinyint(1) default NULL,
  `top_flg` tinyint(1) default NULL,
  `read_times` int(11) default NULL,
  `reply_times` int(11) default NULL,
  `last_reply` char(6) default NULL,
  `last_reply_time` datetime default NULL,
  `add_user` varchar(30) default NULL,
  `add_date` datetime default NULL,
  `upd_user` varchar(30) default NULL,
  `upd_date` datetime default NULL,
  PRIMARY KEY  (`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
此处要用GBK编码
 
3、在jsp页面中使用UTF-8编码
<%
Object init = request.getAttribute("init");
String domainId = (String)request.getAttribute("domainId");
if ((init == null) || (init.equals("")) || (init.equals("null"))) {
 response.sendRedirect("./listArticle.do?domainId="+domainId);
} else {
%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import ="java.util.HashMap"%>
<%@ page import ="java.util.List"%>
<%@ page import ="bo.*" %>
<%
List articleList = (List)request.getAttribute("articleList");
//String domainId = (String)request.getAttribute("domainId");
int size = 0;
if(articleList !=null){
size = articleList.size();
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>帖子列表</title>
  </head> 
  <body>
  <p align="center"><a href="articleSave.jsp?domainId=<%=domainId%>">发表新主题</a></p>
  <table width="800" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6666FF">
    <tr>
      <td bgcolor="#6666FF"><div align="center">回/点击</div></td>
      <td bgcolor="#6666FF"><div align="center">标题</div></td>
      <td bgcolor="#6666FF"><div align="center">发表时间</div></td>
      <td bgcolor="#6666FF"><div align="center">发帖人</div></td>
      <td bgcolor="#6666FF"><div align="center">最后回复</div></td>
    </tr>
    <%for(int i = 0;i<size;i++){%>
    <tr>
      <td><div align="center"><%=((Article)articleList.get(i)).getReplyTimes()%><br>
        <%=((Article)articleList.get(i)).getReadTimes()%></div></td>
      <td><div align="center"><%=((Article)articleList.get(i)).getArticleTitle()%></div></td>
      <td><div align="center"><%=((Article)articleList.get(i)).getAddDate()%></div></td>
      <td><div align="center"><%=((Article)articleList.get(i)).getAddUser()%></div></td>
      <td><div align="center"><%=((Article)articleList.get(i)).getLastReply()%></div></td>
    </tr>
    <%}%>
  </table>
  </body>
</html>
<%}%>

4、给Web应用加上过滤器,做一个Fiter,对所有请求统一使用UTF-8编码
下面是Fiter的源代码
package com.util.common;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
   
    protected String encoding = null;
    protected FilterConfig filterConfig = null;
    protected boolean ignore = true;
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        System.out.println("====initEncodingFilter");
        String value = filterConfig.getInitParameter("ignore");
        if(value == null){
            this.ignore = true;
        }
        else if(value.equalsIgnoreCase("true")){
            this.ignore = true;
        }
        else if(value.equalsIgnoreCase("yes")){
            this.ignore = true;
        }
        else{
            this.ignore = false;
        }
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        if(ignore||(request.getCharacterEncoding() == null)){
            String encoding = selectEncoding(request);
            if(encoding!=null){
                request.setCharacterEncoding(encoding);
            }
        }
        chain.doFilter(request,response);
    }
    public void destroy() {
        // TODO Auto-generated method stub
        this.encoding = null;
        this.filterConfig = null;
    }
    protected String selectEncoding(ServletRequest request){
        return(this.encoding);
    }
}
 
5、在Web.xml中配置过滤器,使之能起过滤作用
在web.xml中加入下面代码
<filter>
      <filter-name>Encoding</filter-name>
      <filter-class>com.util.common.EncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>utf-8</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>Encoding</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
6、在hibernate.cfg.xml里连接数据的属性项修改成如下代码
<property name="connection.url">
 jdbc:mysql://localhost:3306/cits?useUnicode=true&amp;characterEncoding=UTF-8
 </property>

 

 

 

 

 

 

   log4j使用方法
一,放在类里
 实例logger
   final static Logger logger=Logger.getLogger(EmployOptionAction.class.getClass());
  


二,PropertyConfigurator.configure( "d://Log4j.properties" );(一定要放在方法体里用)

 

 


hibernate乐观锁异常。.hibernate3.HibernateOptimisticLockingFailureException: Unexpected row count: 2 expected: 1
我用的是hibernate3,对数据库数据的更新是默认的乐观锁。因为它是生来就相当乐观的,不考虑我们这种新手常犯的错误,数据关联重复。
比如:从数据库里取出一个对象,然后给它重新赋值,然后Update,如果其他表和它相关,而且有重复的记录,就会报这样的错。解决方法是想办法不让其他表的相关数据记录重复就可以解决。
3。我遇到的另一个不常见的异常:UncategorizedSQLException错误原因,mssql中的text型字段为空值,将他加上默认值后恢复正常,具体原因不太清楚。
org.springframework.jdbc.UncategorizedSQLException

 

 

 

 

       HSS的事务
<!--事务处理-->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory">
  <ref local="sessionFactory" />
 </property>
</bean>
         
<!-- 事务拦截器 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
 <property name="transactionManager">
  <ref bean="transactionManager"/>
 </property>
 <property name="transactionAttributes">
  <props>
  
   <prop key="*">PROPAGATION_REQUIRED</prop>
  </props>
 </property>
</bean>

<!-- 自动事务代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
 <property name="beanNames">
  <list>
        <!-- 所有名字以DAO,Service结尾的bean,将由该"bean后处理器"为其创建事务代理;实际上应该在业务层进行事务管理,这里只是举一个简单例子 --> 
            <value>*DAO,*Service</value> 

  </list>
 </property>
 <property name="interceptorNames">
  <value>transactionInterceptor</value>
 </property>
</bean>

 

 

< log4j这样就可以用喽,,,,很好用啊,CONSOLE输出的信息很详细,,,,,,,,,,,,,,,,,,,,,,>

如果出现 action 出错,一般是 spring 的配置文件出现问题了,可在 src 目录下创建一个 log4j.properties 文件,内容如下:
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

此文件将会输出日志信息到控制台,这样就可以得到错误的具体信息了。



Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

 

 

 

JAVA错误处理大集合
该错误集合中有些是我自己总结的,有些是从网络上搜索到的别人的一些错误处理集合,都放在一起来了

0、 需要标识符
a) 不在函数内
1、 非法表达式开始
b) 可能:丢失括号 .
2. no data found
a) 可能:setInt(1,100)中,没有100这个值
3. 找不到符号
a) 可能:没导入包
4. 指定了无效URL
a) 可能:数据库名或IP错误,即连接出错
5. 类路径没有找到
a) 可能: ClassNotFoundException: oracle.jdbc.driver.OracleDriver
b) 原因: 一般是指包名写错,或者没有import包,或者没有在类路径中找到jar文件
c) 解决: 没有加载Oracle驱动jar,在.bash_profile中把ojdbc14.jar加进来
6. 空指针异常
a) 可能: 数据源错误 比如数据库名或IP错误
7. 不能执行查询
a) 可能: 数据库中表的问题,比如列名不存在
8. invalid identity
a) 可能: 列名出错
9. 若在数据库中创建了 两个sequence ,运行时出现异常可能是先后执行了多次select语句,导致与原有的序列号产生冲突
10. 表名或列名不存在
a) 可能:表不存在或者没有插入数据到表中
11. 不支持的类,类的版本错误
a) 可能:没有导入jdk5.0,或者编译器仍为1.4
12. MappingNotFoundException
a) Maybe: In the Eclipse Not refersh , or not exist in the dirctory
13. HibernateException: /hibernate.cfg.xml not found
a) Maybe1: hibernate.cfg.xml not in the root directory
b) Maybe2: Could not parse configuration .
c) resolve: database not connect or use another database
14. ConstraintViolationException
a) Maybe: used a not true database
15. 驱动没有找到 或者 JDBC Driver not found
可能:连接数据库的驱动jar包不存在或者版本不一致,比如将旧的版本换成新的会造成该类错误
16. 空指针异常 , java.lang.NullPointerException 
a) 可能1:数据库连接出错,比如在hibernate.cfg.xml中的数据错误会导致异常。
17. 数据插入异常 ,GenericJDBCException: could not insert
a) 可能1:没有建立表或者表中没有任何数据
b) 可能2:插入数据后没有执行提交语句:commit
18. LazyInitializationException 或者延迟加载异常
a) 可能1:没有在查询语句中加fetch
19. IdentifierGenerationException
a) 可能1:高位表没有初始化(比如hi_value中没有记录)
20. could not initialize a collection: [hibernate.entity.Role.modules#32768] Syntax error: Encountered "-" at line 1, column 132.
a) 错误原因:<set name="modules" table="module-role" lazy="false">红色字部分中“-”为非法字符,替换为module_role
21. could not insert collection rows: [hibernate.entity.Module.roles#1]
 在Module.hbm.xml文件的如下配置中加入inverse=”true”
<set name="roles" table="module_role" inverse="true">

22.在部署Struts时,出现如下错误信息:
HTTP Status 404 - Servlet action is not available
 
type Status report
message Servlet action is not available
description The requested resource (Servlet action is not available) is not available.
问题原因:
1.、web.xml文件中未配置ActionServlet。
2、struts-config.xml文件未配置你要访问的Action。
3、你的jsp文件form标记中action属性的路径名称错误。
4、非以上三种情况。
针对以上4种情况相应的解决方案如下:
1、在web.xml文件中加上ActionServlet的配置信息
?????? /WEB-INF/struts-config.xml?
?2、在struts-config.xml文件检查你要访问的Action配置文件。
3、检查jsp文件form标记中action属性的路径名称是否与struts-config.xml文件中action标记的path属性的路径名称一致。
4、非以上情况的解决办法就是检查web容器的log日志,如果时tomcat则检查下logs目录下的localhost_log文件,看里边是否记录有错误信息,然后根据错误信息提示将其纠正。

23.java.lang.NoClassDefFoundError: org/apache/commons/beanutils/Converter
缺少spring-framework-2.0.3/lib/jakarta-commons/commons-beanutils.jar
24.
ava 代码Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type  
缺少spring-framework-2.0.3/lib/asm/asm-2.2.2.jar包,版本不同,该包的名字有相应的区别

java 代码Caused by: java.lang.NoClassDefFoundError: org/dom4j/DocumentException  
缺少spring-framework-2.0.3/lib/dom4j/dom4j-1.6.1.jar包,版本不同,该包的名字有相应的区别
把这个包进去就可以了:/Spring206/lib/dom4j、dom4j-1.6.1.jar

java 代码Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap  
缺少spring-framework-2.0.3/lib/jakarta-commons/commons-collections.jar包,版本不同,该包的名字有相应的区别

java 代码Caused by: java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter  
缺少spring-framework-2.0.3/lib/cglib/cglib-nodep-2.1_3.jar包,版本不同,该包的名字有相应的区别

java 代码Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor  
缺少hibernate-3.2/lib/asm.jar包,版本不同,该包的名字有相应的区别

java 代码
org.hibernate.exception.SQLGrammarException: could not load an entity: [www.proudsoul.xml.User#1] 
JAVA工程与WEB工程包的区别:一个是asm.jar,一个是jta.jar

java 代码Caused by: java.lang.NoClassDefFoundError: javax/transaction/TransactionManager  
缺少spring-framework-2.0.3/lib/j2ee/jta.jar包,版本不同,该包的名字有相应的区别此种错误请检查相应的***.hbm.xml配置文件的配置

25,
Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not get next sequence value; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value
Caused by: org.hibernate.exception.SQLGrammarException: could not get next sequence value
原因:没有加Sequence或者数据库的方言写错了

26,
我的配置文件
    <id name="id" column="id">
            <generator class="native" />
        </id>
然后我运行保存一条数据进去
The database returned no natively generated identity value
就会报这个错误
因为你native是根据看底层数据库的能力选择identity, sequence 或者hilo中的一个
而我建表的时候id没有指定
alter table `student` change `id` `id` int auto_increment
我们把我们的表的结构小小的改动一下就没问题了

27,
UpdateManager无法启动2007-08-09 15:21如果在应用程序安装过程中,暴力中断安装程序,会出现如下状况:1.apt-get remove 和dpkg --remove 无法删除软件 2.UpdateManager无法启动3.新立得软件包管理程序无法启动
以上可能是deb损坏之类造成的
sudo dpkg -r sqldveloper
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
E: 软件包 sqldeveloper 需要重新安装,但是我无法找到相应的安装文件。
解决方法:1.从 /var/lib/dpkg/status 中把对应的段删掉
重要:修改之前请先备份
在status中找到你对应的包删除就OK了...

28,
Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException
少了antlr-2.7.5H3.jar包,从D:/eclipse/eclipse/plugins/com.genuitec.org.hibernate.eclipse_4.1.1/myeclipse-data/3.0/lib

29,
Caused by:
java.lang.NoClassDefFoundError: javax/transaction/Synchronization
缺少Spring206/lib/j2ee/jta.jar

30,
Caused by:
java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy3] to required type [business.impl.PriceBiz] for property 'priceBiz': no matching editors or conversion strategy found
在java类中设置priceBiz时应该设置的是接口PriceBizIf,而非实现类

18, 数组越界
 可能1: 在命令行后面需要加入参数.
 可能2:加入的参数错误
19, car is not mapped
 可能1: 在cfg.xml中没有增加映射的hbm.xml文件在<mapping.../>中   
20, 属性没有找到
 可能1: hbm.xml文件中的 <property name =""> 有问题, 也许是name的值与对应类中的成员名不一致
21,SQLException: 无当前连接          可能1:在比如创建帐户时没有对相应的方法添加到<list>中去,比如这个没有加入:<value>newAccount</value>
 
 <bean id="transactionAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  <property name="advice">
   <ref bean="advice"/>
  </property>
  <property name="mappedNames">
   <list>
    <value>transfer</value>
   </list>
 </bean>
22,SQLException: Syntax error: Encountered "table" at line 1, column 8.
 可能1;执行SQL时出现冲突,可能是SQL语句中使用了关键字作为变量来用,比如
  update order set balance=1000000;
  其中order被用作表名来使用,这是错误的,因为order是个关键字,用在order by中

23, Servlet /Spring-WebMvc threw load() exception
org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
 jar包的冲突,spring-1.2.6.jar和spring.jar出现在一个war的目录中:JBoss/server/all/deploy/Spring-WebMvc.war/WEB-INF/lib   

24, java.sql.SQLException: 当事务仍处于活动状态时,无法关闭连接。


25 ,
validateJarFile(/home/soft01/Tomcat/webapps/sms-token-struts/WEB-INF/lib/servlet-api.jar)
Servlet /sms-struts-tiles threw load() exception
java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
原因:在WEB-INF/lib/ 目录下有servlet-api.jar与/Tomcat/common/lib目录下的servlet-api.jar冲突了,把WEB-INF/lib/下的servlet-api.jar删除就可以了

26,java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn
Marking servlet action as unavailable
10:30:47,088 ERROR [/NetCT_OSS]:3953 - Servlet /NetCT_OSS threw load() exception
javax.servlet.UnavailableException

27,org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
缺少MyEclipse/eclipse/plugins/com.genuitec.eclipse.springframework_5.5.0/data/2.0/dist/modules/spring-struts.jar

28,Caused by: java.sql.BatchUpdateException: ORA-02291: integrity constraint (SD0702.FK82D343CF49A4B831) violated - parent key not found
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
有可能是ID生成策略的问题,我将它XML映射文件改成<generator class="increment" />就好了

29,
2007-08-19 16:21:43,290 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/OSS].[action]] - Servlet.service() for servlet action threw exception
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [entity.Module#2]
java.util.ConcurrentModificationException
原因:已经有对象拥有了所选择的module,用clear(),而不是remove();

30,
ERROR [org.apache.catalina.session.ManagerBase] - IOException while loading persisted sessions: java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429
java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429
在Module中加上一个关键字:transient

31,
Caused by: java.sql.BatchUpdateException: ORA-02292: integrity constraint (SD0702.SYS_C00132664) violated - child record found
原因:有其他的表引用了该表的外建,所以报这个异常,如果没有引用就不会出现

32,
出现数组越界的时候,看看是不是循环时没有加=,比如:
for(int i = 1; i<arr.length;i++)可以改成
for(int i = 1; i<=arr.length;i++)

 

1.如果使用Ant和Junit是被报找不到test,检查一下是否误用了private
出错信息:
    <failure message="No tests found in test.AllTest" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: No tests found in test.AllTest
该错误有个很特别的特点,当你不通过ant来运行测试,而是通过AllTest类来运行的话,可以正常运行。小心哦

2.如果遇到报:表名无效,且jvm报严重错误,看看是不是用了数据库的保留关键字来做表名了,如User。

3.使用ant时必须小心ant的classpath它用的不是IDE的classpath,小心!

4.小心下边的异常,
exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of xp.bean.Users.?" type="net.sf.hibernate.PropertyAccessException">java.lang.ClassCastException at xp.bean.UsersMetaClass1.setPropertyValues(<generated>) at net.sf.hibernate.persister.AbstractEntityPersister.setPropertyValues
上次出现该错错误的原因是:
源文件里我的class类型为一个类Contact contact
而跑到mapping里却成了Set,呵呵厉害。

5.突然间冒出大量的NullPointException
重新build一下看看先。

6.="Flush during cascade is dangerous - this might occur if an object was deleted and then re-saved by cascade"

7.Tapestry的出错信息:
Class com.bookshop.Hello does not implement the IPage interface.
location: context:/WEB-INF/Home.page, line 6
原因:与显示有关的哪个java类没有从IPage家族继承。

8.使用ant时给出的路径好象不允许出现空格。

9.由于使用ant时用junit做测试的话,classpath中出现j2ee.jar的话,问题多多。例如xml格式的log文件生成不了,莫名其妙的NullPointException等。所以我设置了两个包个包含j2ee.jar,为编译用;一个没有,为junit用

10.进行单元测试时,在查询返回后应马上assertNotNull(),这样可以更快速的定位NullPointException

11.要使用ResourceBundle的话,要千万小心。必须用日志记录下它的状态。还有该属性文件应该放在classes下面。

12.当要显示任何页面时,都被提示无效,那么应该检查一下lib目录了,还有一些很奇怪的异常,例如你明明可以找到一个类但是服务器却提示ClassNotDefException,那么估计是缺少了该类所必须的包了。或者多了不兼容的包,如, xdoclet系列包不被struts的lib目录所兼容

13.编写clone时从Java编程思想(2nd)上学到的(732):
.引数传递过程中会自动产生别名(alias)。
.没有局域对象(local objects),只有局域性的(local)references。
.reference受范围(scope)的限制,对象则否。
.对象的寿命从来不是Java的讨论议题(因为有垃圾回收机制)

14.try catch finally的域居然是分离的。

15.jsp乱码的其中一个原因:charset="gb2312" 等号"="的两边不允许有空格。

16.我的基于Displaytag的简单报表解决方案。
http://displaytag.sourceforge.net/
下载displaytag.jar和displaytag.tld
displaytag.jar放在lib目录,而displaytag.tld放在WEB-INF目录,在web.xml中为displaytag.tld声明一下。
  <taglib>
    <taglib-uri>http://displaytag.org</taglib-uri>
    <taglib-location>/WEB-INF/displaytag.tld</taglib-location>
  </taglib>
在jsp里使用前,加上
  <%@ taglib uri="http://displaytag.org" prefix="display" %>
       
注意该软件有个bug,他要用的一个包common-lang.jar版本必须在2.0以上。
如果碰到下面异常,则应坚持一下是否该包的版本问题。
java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.capitalize(Ljava/lang/String;)Ljava/lang/String;
然后就可放心使用了
<display:column property = "xxx"/>其中xxx为对象中的带有getter的变量>。
定义表格的样子,用css定义。如
TABLE.its THEAD TR {
 BACKGROUND-COLOR: #69c
}
TABLE.its TR.even {
 BACKGROUND-COLOR: #def
}
在使用分页时,可能会出现这种情况,点击其他页时,弹出下载窗口,让你下载当前jsp页面,这是因为你在当前页面读取了数据的缘故。解决办法为在action里读取数据而不是在jsp里。可以参考
http://www.displaytag.org/example-paging.jsp?d-26189-p=2

17.使用displaytag时,在一列中放入多个元素
必须在display:table中定义一个id
<display:table name = "allBooks" class = "its" pagesize = "5" id = "item">
  <display:column title = "操作">
    <a href = "/Bookshop/admin/bookManagement.do?action=view&id=<%=((Book)item).getId()%>" target = "_blank" >查看</a>
    <a href = "/Bookshop/admin/bookManagement.do?action=edit&id=<%=((Book)item).getId()%>">编辑</a>
    <a href = "/Bookshop/admin/bookManagement.do?action=delete&id=<%=((Book)item).getId()%>">删除</a>
  </display:column>
要在displaytag中使用链接,必须具备paramId,否则不显示为链接
 <display:column property = "product.name" href = "viewDetailV2.0.jsp" title = "书名" paramId="item" paramProperty="product.id"/>
可以这样使用display
  <display:column property = "product.id" title = "ID"/>
其中product为对象

18.<bean:write name = "xxxx" property = "xxx"/> 可以直接取到session.getAttribute()取到的东西。

19.实验struts-upload例子时要注意的地方:
   1.If you would rather write this file to another file, please check here:
 这一行要打钩
   2.If you checked the box to write to a file, please specify the file path here:
在这里要重命名如:c:/b.jpg
上传成功的话,会出现提示 The file has been written to "c:/b.jpg"

20.Hibernate的like可以这么用:
      Query query = session.createQuery("from src.persistent.Book as book where upper(book.name) like :name ");
      query.setString("name", "%");
      result = query.list();

21.Hibernate出现 duplicate import : className
异常也可能是因为忘了为持久类在configuration中addClass了
     
22.<logic:iterate id = "author" name = "authors">
name所引用的是session里的attribute。

23.如果发现要出现询问下载的情况,有可能是因为要跳转的页面出现了问题。试试在要跳转到的页删掉
<%@ page contentType="text/html; charset=gb2312"%>

24.如果JSP页面跳转时出现下边的错误信息:
The request sent by the client was syntactically incorrect (Invalid path /web/shoppingCart was requested).
原因是struts-config的action = "x" 写成了 action = "x.do"

25.在struts中,strut-config.xml中,forward时使用redirect = "true"可以将.do重定向为.jsp

26.以后在判断相等性之前先用logger把两个值显示出来。

27.从session里getAttribute后,修改并不需要重新setAttribute一次。

28.在hibernate中使用subclass是一棵继承树共用一个表,仅生成个mapping。
每个类中必须有discrimator-value。在最上层的类中必须声明:
@hibernate.discriminator column = "class"。
不可以将子类添加到configuration里去。(即不可addClass(子类))
使用Xdoclet的建立subclass的例子(该类是父类)
/**
 * @hibernate.class discriminator-value = "customer"
 * @hibernate.discriminator column = "class"
 */

而使用joined-subclass则是一类一表,也不许将子类添加进configuration里去。
/**
 * @hibernate.joined-subclass
 * @hibernate.joined-subclass-key
 * column="customer_id"
 */
如果发现生成的mapping文件中joined-subclass的key column为空,那么可能是@hibernate.joined-subclass-key这句没有写对。
用joined-subclass生成的表,仔细看。Member extends Customer
create table Customer (
   id VARCHAR2(255) not null,
   name VARCHAR2(255),
   description VARCHAR2(255),
   primary key (id)
)
create table Member (
   customer_id VARCHAR2(255) not null,
   password VARCHAR2(255),
   primary key (customer_id)
)

29.在junit中尽量使用assertEquals代替assertTrue;

30.Hibernate
如果Child extends Parent
那么from Parent as parent 也将会将Child选出来,而from Child as child 则不会选出Parent

31.Hibernate
使用hibernate的one-to-one时,应该两方向都set,否则会报save NullPointException
parent.setChild(child);
child.setParent(parent);

32.Hibernate
遇到下边的异常,估计是与因为外键出现了问题:

java.lang.NullPointerException
 at net.sf.hibernate.persister.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:675)
 at net.sf.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:33)
如:
* @hibernate.id generator-class = "foreign"
* @hibernate.generator-param name = "property" value = "customer"
* @hibernate.one-to-one name = "custmoer" class = "src.persistent.Customer"
value的值和one-to-one 中name的值不符,则会出现上边的异常。如果不显示指定name则默认取成员变量名

Customer a
则name = "a" 需要小心的是不是类名。所以,以后最好显示指定名字为好。

33.出现异常:
Exceptionobject references an unsaved transient instance - save the transient instance before flushing: src.persistent.Product
原因没有为某对象进行set设置, 如上边的这个就是某对象没有调用setProduct

34.
"xxx action = "/a" 不用.do和根目录名
<a href = "b.do" 需要.do和根目录名

35.
Caused by: java.sql.SQLException: ORA-02291: 违反完整约束条件 (BOOKSHOP.FK4AAEE
47687CCA6B) - 未找到父项关键字
如果你觉得该做的e是出现这个问题,那么检查一下,是否将类的继承关系在hibernate的mapping中反映了出来。joined-subclass或subclass
例如a extends b
如果持久类c 需要Set的是持久类a,那么你把b传入,而b又没有在mapping中将父子关系反映出来的话,就会出现该异常

36.使用DynaActionForm需要注意的问题
在struts-config声明
<form-bean name="memberloginForm" dynamic ="true" type="org.apache.struts.action.DynaActionForm">
  <form-property name = "name" type = "java.lang.String"/>
  <form-property name = "password" type = "java.lang.String"/>
</form-bean>
在Action里将form强制转化成DynaActionForm,然后get("属性名")就可以了

37.那位大侠能给出一个用hibernate进行分页得实际例子,学习中!
http://forum.hibernate.org.cn/viewtopic.php?t=1772
Query q = s.find(".....");
q.setFirstResult(10);   //  从第11条记录开始
q.setMaxResults(100);  //  取出100条
......

38.struts的validate最简单实现
1.首先准备好错误提示信息。
xxx.properties 里
errors.required={0} is required.(默认已有)
2.Form必须从ValidatorForm继承
3.不可以重载ValidatorForm的validate函数
4.在validate.xml中为你想验证的表单进行验证设计。例如
<form name="logonForm">
    <field property="userName" depends="required">
 <arg0 key="prompt.userName"/>
 (该参数将在显示错误信息是从xxx.properties读取prompt.userName,填入{}方括号里,取代0。如果是arg1将将填入{1}位置,以此类推。
    </field>
</form>
不需要在action里做任何处理。只管forward就行了。作为forward的目标页,不需要任何有关用于处理出错信息的处理。

39.服务器报
The requested resource (/xxxx/xxx.htm) is not available.的很奇怪的一个的可能原因
在web.xml中定义的tld,没有找到
或者是lib目录下的包太多出现了问题。

  <taglib>
    <taglib-uri>/spring</taglib-uri>
    <taglib-location>/WEB-INF/spring.tld</taglib-location>
  </taglib>
如WEB-INF目录下不存在spring.tld的话,就会报上边的错误

40.
spring的xxx-servlet.xml的使用SimpleFormController系列的类问题:
  <bean id = "priceIncreaseForm" class="PriceIncreaseFormController">
    <property name="sessionForm"><value>true</value></property>
    <property name="beanName"><value>priceIncrease</value></property>
    <property name="commandClass"><value>PriceIncrease</value></property>
    <property name="formView"><value>priceIncrease</value></property>
    <property name="successView"><value>hello</value></property>
    <property name="productManager">
      <ref bean="prodMan"/>
    </property>
  </bean>
这里要注意几个问题:
(1)上边的PriceIncrease是了类名,必须在classes里存在该类,否则报:
PropertyVetoExceptionsException: 1 errors:-- ErrorCodedPropertyVetoException: message=[Failed to convert property value of type [java.lang.String] to required type [java.lang.Class] for property named 'commandClass'; nested exception is:
 java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease]; errorCode=[typeMismatch]
java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease
(2)<property name="formView"><value>priceIncrease</value></property>
这一行必不可少,priceIncrease是页面的名字,他将会是prefix + priceIncrease + suffix
如果缺少该行,则报:
javax.servlet.ServletException: Error in ModelAndView object or View resolution encountered by servlet with name 'pocketSpring': View to render cannot be null with ModelAndView [ModelAndView: materialized View is [null]; Model=[{priceIncrease=PriceIncrease@148e798, org.springframework.validation.BindException.priceIncrease=org.springframework.validation.BindException: BindException: 0 errors}]]

使用Errors的rejectValue相关问题:
rejectValue(java.lang.String field, java.lang.String errorCode, java.lang.Object[] errorArgs, java.lang.String defaultMessage)
Reject the given field of the current object, using the given error description.
当前对象指的是xxx-servlet.xml中与validator类有联系的哪个对象。
         
第一个是:当前对象的属性名,必须存在
第二个是:将要从属性文件中读取的消息
第三个是:传递给所读取的消息的参数,如:
error.too-low=You have to specify a percentage higher than {0}!
第四个是:当从属性文件中读取消息不成功时,所reject的值

以后从request中读取parameter可以借用spring的RequestUtils包里的
getStringParameter
public static java.lang.String getStringParameter(javax.servlet.http.HttpServletRequest request,
                                           &bsp;      java.lang.String name,
                                                  java.lang.String defaultVal)
Get a string parameter, with a fallback value. Never throws an exception. Can pass a distinguished value to default to enable checks of whether it was supplied.
不会抛异常
Hibernate的问题:2.1rc的问题
INFO: cache provider: net.sf.ehcache.hibernate.Provider
net.sf.hibernate.HibernateException: could not instantiate CacheProvider:
解决办法,2.1rc比以前的版本多需要一个包
ehcache.jar

43.static的问题
static函数只可以访问static成员变量。
而static变量可以被任何成员函数访问。

44.
java.lang.NoClassDefFoundError: javax/transaction/Synchronization];
需要添加JTA.jar

用Spring集成Struts时老出Servlet action is not available错本人用Spring集成Struts时老出Servlet action is not available错

 


找配置文件找了N久,没有找出错来。后面把


 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
   <set-property value="contextConfigLocation" property="/WEB-INF/applicationContext.xml"/>
  </plug-in>

这段代码给剪掉。在web.xml文件中加上


<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <servlet>
 <servlet-name>context</servlet-name>
 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
  </servlet>
就OK了!!

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


/**
 * Java Reflection Cookbook
 *
 * @author Michael Lee
 * @since 2006-8-23
 * @version 0.1a
 */

public class Reflection {
    /**
     * 得到某个对象的公共属性
     *
     * @param owner, fieldName
     * @return 该属性对象
     * @throws Exception
     *
     */
    public Object getProperty(Object owner, String fieldName) throws Exception {
        Class ownerClass = owner.getClass();

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(owner);

        return property;
    }

    /**
     * 得到某类的静态公共属性
     *
     * @param className   类名
     * @param fieldName   属性名
     * @return 该属性对象
     * @throws Exception
     */
    public Object getStaticProperty(String className, String fieldName)
            throws Exception {
        Class ownerClass = Class.forName(className);

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(ownerClass);

        return property;
    }


    /**
     * 执行某对象方法
     *
     * @param owner
     *            对象
     * @param methodName
     *            方法名
     * @param args
     *            参数
     * @return 方法返回值
     * @throws Exception
     */
    public Object invokeMethod(Object owner, String methodName, Object[] args)
            throws Exception {

        Class ownerClass = owner.getClass();

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);

        return method.invoke(owner, args);
    }


      /**
     * 执行某类的静态方法
     *
     * @param className
     *            类名
     * @param methodName
     *            方法名
     * @param args
     *            参数数组
     * @return 执行方法返回的结果
     * @throws Exception
     */
    public Object invokeStaticMethod(String className, String methodName,
            Object[] args) throws Exception {
        Class ownerClass = Class.forName(className);

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);

        return method.invoke(null, args);
    }

 

    /**
     * 新建实例
     *
     * @param className
     *            类名
     * @param args
     *            构造函数的参数
     * @return 新建的实例
     * @throws Exception
     */
    public Object newInstance(String className, Object[] args) throws Exception {
        Class newoneClass = Class.forName(className);

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Constructor cons = newoneClass.getConstructor(argsClass);

        return cons.newInstance(args);

    }


   
    /**
     * 是不是某个类的实例
     * @param obj 实例
     * @param cls 类
     * @return 如果 obj 是此类的实例,则返回 true
     */
    public boolean isInstance(Object obj, Class cls) {
        return cls.isInstance(obj);
    }
   
    /**
     * 得到数组中的某个元素
     * @param array 数组
     * @param index 索引
     * @return 返回指定数组对象中索引组件的值
     */
    public Object getByArray(Object array, int index) {
        return Array.get(array,index);
    }
   
   
    public String username = null;
    private String password = null;
   
    public static void main(String[] args) {
     
     Reflection ref = new Reflection();
     ref.getProperty(Reflection, "username");
     
     
  
 }
   
   
   
   
   
//    使用
   
   
   
}用log4j可以理解框架的工作原理,因为有丰富的LOG信息

 


------------------------------------------------------------------------------------------
 业务日志log最好不要用原来的package结构,而是在项目里协调一个独立的名字,如business。


代码里:
private static final Log buzzLog = LogFactory.getLog("business");

/写入业务log
buzzLog.info("订单" + id + "发货入业务log");

 

log4j.properity里:
log4j.logger.business=INFO,db
log4j.appender.db.layout=org.apache.log4j.PatternLayout

 


CONSOLE显示:
 INFO [business黄仕勇] - <订单0发货入业务log>

 

也可以写到数据库里:

log4j.logger.business=INFO,db

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.URL=jdbc:mysql://localhost:3306/helloworld?useUnicode=true&characterEncoding=utf8
log4j.appender.db.driver=com.mysql.jdbc.Driver
log4j.appender.db.user=root
log4j.appender.db.password=123
log4j.appender.db.sql=INSERT INTO LOG4J_LOG (a,date,class,method,msg)
VALUES('%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')//大写的M为那个方法里的LOG.DEBUG("SADFASDF"); 小写的m为MSG INFO
log4j.appender.db.layout=org.apache.log4j.PatternLayout
---------------------------------------------------------------------------------------

 

 

 

---


为什么日志器(logger)要声明为static final的? 
 
(1):出于资源利用的考虑,LOGGER的构造方法参数是Class,决定了LOGGER是根据
类的结构来进行区分日志,所以一个类只要一个LOGGER就可以了,故static
(2):final表示一种编程习惯,表示该类的LOGGER只是记录该类的信息,否则日志
会无法提供可以令人信服的记录 
 

代码中怎么引用:

(1)
private Log log = LogFactory.getLog(this.getClass().getName());  
  上面这句主要利用到设计模式中的抽象工厂,返回一个log对象的引用

(2)
HIBERNATE生成的代码 是这样的:
  private static final Log log = LogFactory.getLog(EnterpriseDAO.class);

(3)SPRING从入门到精通书上写:
private Logger logger = Logger.getLogger(this.getClass().getName());

 

 

下面的是我自己做的日志log4j.properties

log4j.rootLogger=DEBUG,CONSOLE
log4j.addivity.org.apache=true
# /u5e94/u7528/u4e8e/u63a7/u5236/u53f0
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[HSY的日志] %x - %m%n
#log4jLppender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值