2009年4月15日

package Observer;

import java.util.ArrayList;
import java.util.List;

//import java.lang.Exception;

//事件类,用来响应事件
class WakenUpEvent{
  private long time;
  private String loc;
  private Child source;// 发出这件事的源对象

  public WakenUpEvent(long time,String loc,Child source){
   super();
  this.time = time;
  this.loc = loc;
  this.source = source;
  }
 
  public long getTime(){
        return time;
  }
 
  public void setTime(long time){
         this.time = time;
  }
 
  public String getLoc(){
          return loc;
  }
 
  public void setLoc(String loc){
          this.loc = loc;
  }
 
  public Child getSource(){
           return source;
  }

  public void setSource(Child source){
           this.source = source;
  }
}
//child类,并且在内部运行一个线程,激发事件的发生
class Child implements Runnable{
  //使用数组创建监听类
 private List<WakenUpListener> wakenUpListeners = new ArrayList<WakenUpListener>();
  // boolean wakenUp = false;
  
  public void addWakenUpListener(WakenUpListener l){
    wakenUpListeners.add(l);
  }
  void wakenUp(){
   for(int i=0; i<wakenUpListeners.size();i++){
    WakenUpListener l = wakenUpListeners.get(i);
    l.ActionToWakenUp(new WakenUpEvent(System.currentTimeMillis(),"bed",this));
   
   }
  }

  public void run(){
    try{
       Thread.sleep(3000);
    }catch(InterruptedException e){
       e.printStackTrace();
    }
     this.wakenUp();
  }


}
//Dad监听者类继承WakenUpListener接口
class Dad implements WakenUpListener{
  
  public void ActionToWakenUp(WakenUpEvent wue){
    System.out.println("Dad feeded");
  }

}
//Mom监听者类继承WakenUpListener接口
class Mom implements WakenUpListener{
 public void ActionToWakenUp(WakenUpEvent wue){
  System.out.println("Mom id here!");
 }    
}
class Dog implements WakenUpListener{
 public void ActionToWakenUp(WakenUpEvent wue){
  System.out.println("旺旺!!");
 }
}
//监听者接口,当添加新的监听者时,不用修改原来的代码,只需要添加一个新的实现即可
interface WakenUpListener{
 public void ActionToWakenUp(WakenUpEvent wue);
}
 public class ChildDadFeed{
   public static void main(String[] args){
     Child c = new Child();
     c.addWakenUpListener(new Dad());
     c.addWakenUpListener(new Mom());
     c.addWakenUpListener(new Dog());
     new Thread(c).start();
     }
}
 

posted @ 2009-04-15 18:02 pual.k3 阅读(34) 评论(0) 编辑


2009年4月10日

Java从网络上获取资源的步骤一般如下:

首先,生成URL对象;

然后,用Java中相应的方法去获取对象中所代表的资源;

最后,可以使用相应的方法对该资源进行相应的操作。

 

下面是几个常用的Java获取网络资源的例子:

1. Java从网络上获取图片:

Java Applet可以直接从网络上结点获取图象并显示出来。有两种格式,举例如下:

格式一:

import java.net.MalformedURLException;
import java.net.URL;
import java.awt.*;
import java.applet.*;

public class Imag1 extends Applet{
 Image image;
 URL url = null;
 public void init(){
  try{
  url = new URL("http://www.google.cn/intl/zh-CN/images/logo_cn.gif");
  }catch(MalformedURLException e){
   System.out.println("Can't open the URL!");
  }
  image = getImage(url);
 }
 public void paint(Graphics g){
  g.drawImage(image,0,0,this);
 }
}

格式二:

import java.awt.*;
import java.applet.*;
import java.net.URL;

public class imag0 extends Applet {
 Image image;
 //init()方法通知此 applet 它已经被加载到系统中
 public void init() {
  String url = "http://www.google.cn/intl/zh-CN/images/logo_cn.gif";
  //能够捕获异常
  try {
   image = getImage(new URL(url));

  } catch (Exception e) {
   System.out.println("Can&acute:t open the URL");
  }
 }

 public void paint(Graphics g) {
  g.drawImage(image, 0, 0, this);
 }

}
2. 从网络上获取声音

Java从网络上获取声音文件并播放声音的编程方法有两类,一是利用Java提供的play(URL)及play(URL,String) 直接播放网络上的声音文件,另一类是通过getAudioClip(URL)或getAudioClip (URL,String)先从网络上获取声音文件,并生成AudioClip 类型的对象,然后对该对象进行操作。

3.从网页上获取HTML文件

利用Java提供的getAppletContext().showDocument(URL)可以显示其他结点的HTML文档,同前面的显示网络上其他结点的图象。

import java.applet.Applet;
import java.awt.Graphics;
import java.net.MalformedURLException;
import java.net.URL;

public class ShowDoc extends Applet {
 URL docurl = null;
 public void paint(Graphics g){
  try{
   docurl = new URL("http://www.163.com");
  }catch(MalformedURLException e){
   System.out.println("Can't Open!");
  }
  if(docurl!=null){
   getAppletContext().showDocument(docurl,"_blank");
  }
 }
}
4.从网页上获取文件内容

1) 创建URL对象

2) 利用URL类的openStream()方法获取对应的InputStream对象;

3) 将InputStream转化成DataInputStream;

4) 读取内容。使用readLine()方法

posted @ 2009-04-10 16:42 pual.k3 阅读(78) 评论(0) 编辑


2009年4月8日

wait(object对象方法)时别的线程可以访问锁定对象
*调用wait方法时必须锁定该对象
Sleep(String对象方法)时别的线程不能访问锁定对象

posted @ 2009-04-08 12:40 pual.k3 阅读(43) 评论(0) 编辑


2009年4月3日


java常见错误以及可能原因集锦

2008-07-08 15:550、 需要标识符
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,而非实现类

31, 数组越界
可能1: 在命令行后面需要加入参数.
可能2:加入的参数错误
32, car is not mapped
可能1: 在cfg.xml中没有增加映射的hbm.xml文件在<mapping.../>中

33, 属性没有找到
可能1: hbm.xml文件中的 <property name =""> 有问题, 也许是name的值与对应类中的成员名不一致

34,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>


35,SQLException: Syntax error: Encountered "table" at line 1, column 8.
可能1;执行SQL时出现冲突,可能是SQL语句中使用了关键字作为变量来用,比如
update order set balance=1000000;
其中order被用作表名来使用,这是错误的,因为order是个关键字,用在order by中

36, 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的目录中:J Boss/server/all/deploy/Spring-WebMvc.war/WEB-INF/lib

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


38 ,
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删除就可以了

39,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

40,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

41,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" />就好了

42,
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();

43,
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

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

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


46.如果使用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类来运行的话,可以正常运行。小心哦

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

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

49.小心下边的异常,
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,呵呵厉害。

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

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

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

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

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

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

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

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

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

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

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

61.我的基于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

62.使用displaytag时,在一列中放入多个元素
必须在display:table中定义一个id
<display:table name = "allBooks" class = "its" pagesize = "5" id = "item">
<display:column title = "操作">
查看
编辑
删除
</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为对象

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

64.实验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"

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

66.Hibernate出现 duplicate import : className
异常也可能是因为忘了为持久类在configuration中addClass了

67.<logic:iterate id = "author" name = "authors">
name所引用的是session里的attribute。

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

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

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

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

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

73.在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)
)

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

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

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

77.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" 需要小心的是不是类名。所以,以后最好显示指定名字为好。

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

79.
"xxx action = "/a" 不用.do和根目录名

80.
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中将父子关系反映出来的话,就会出现该异常

81.使用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("属性名")就可以了

82.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的目标页,不需要任何有关用于处理出错信息的处理。

83.服务器报
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的话,就会报上边的错误

84.
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

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

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

posted @ 2009-04-03 11:32 pual.k3 阅读(676) 评论(1) 编辑


2009年4月2日

有以下三点体会:

  1. 进程是一个静态的概念;
  2. 线程是一个进程中不同的执行路径;
  3. 在同一个时间点上一个CPU只能支持一个线程在执行;
  4. 多核可以支持多线程。

Java通过Java.lang.Thread实现多线程,可以通过创建Thread对象的run()方法来实现,也可以通过使用start()来启动新线程。

通过run()有两种方法实现:

  1. 定义线程实现Runnable接口:

              Thread myThread=new Thread (target) //targer为runnable接口类型

         runnable中只有一个方法:

                  public void run();用以定义线程运行体;

          使用Runnable接口可以为多线程提供共享的数据

           在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法‘

                   public static Thread currentThread() 获取当前线程的引用

   2. 可以定义一个Thread的子类并重写其run方法如:

                   class MyThread extends Thead{

                    public void run(){...}

                    }

然后生成该类的对象:

           MyThrea myThread = new MyThread(...)

 

3. sleep()方法 休眠

4. Jion()合并

5. yield() 暂停当前正在执行的线程对象,并执行其他线程,只让出一个时间片

6. 优先级:

public class TestPriotity {
 Thread t1 = new Thread(new T1());
 Thread t2 = new Thread(new T2());
 t1.setPriority(Thread.NORM_PRIORITY+3);
 t1.start();
 t2.start();
}
class T1 implements Runnable{
 public void run(){
  for(int i=0;i<=100;i++)
   System.out.println("T1:"+i);
 }
}
class T2 implements Runnable{
 public void run(){
  for(int j=0;j<100;j++)
   System.out.println("-----T2:"+j);
 }
}

输出结果是,t1输出一段后,开始输出t2,很快有继续输出t1.

6.一个进程启用多个线程:

public class TestThread2 {
 public static void main(String[] args){
  Runner2 r = new Runner2();
  Thread t1 = new Thread(r);
  Thread t2 = new Thread(r);
  t1.start();
  t2.start();
 }

}
class Runner2 implements Runnable{
 public void run(){
  for(int i=0;i<100;i++)
   System.out.println("NO.:"+i);
 }
}

posted @ 2009-04-02 17:40 pual.k3 阅读(57) 评论(0) 编辑

 

网上找到的两个简单爬虫的类图和序列图。

仔细分析一下,可以知道一个网络爬虫需要完成的任务流程是:
         获得网页的URL->根据URL进行连接->获得网页内容

 

posted @ 2009-04-02 11:56 pual.k3 阅读(195) 评论(0) 编辑

这几天一直在看爬虫的东西,找到的一点东西先放着。

import java.io.*;
import java.net.*;

public class FirstSocket
{
     public static void main(String args[])
     {
     
          //判断参数是否为两个,正确的用法为 FirstSocket 网站 页面
          if(args.length!=2)
          {
               System.out.println("Usage : FirstSocket host page\r\nExample:FirstSocket www.google.com /");
               System.exit(0);
          }
          String strServer=args[0]; //取得第一个参数
          String strPage = args[1]; //取得第二个参数
   
          try
          {
               String hostname = strServer;
               int port = 80;
               InetAddress addr = InetAddress.getByName(hostname);
               Socket socket = new Socket(addr, port); //建立一个Socket
              
               //发送命令
               BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
               wr.write("GET " + strPage + " HTTP/1.0\r\n");
               wr.write("HOST:" + strServer + "\r\n");
               wr.write("\r\n");
               wr.flush();
              
               //接收返回的结果
               BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
               String line;
               while ((line = rd.readLine()) != null) {
                System.out.println("返回结果"+line);
               }
               wr.close();
               rd.close();
          }
          catch (Exception e)
          {
               System.out.println("发生错误"+e.toString());
          }
     }
}

posted @ 2009-04-02 11:05 pual.k3 阅读(415) 评论(0) 编辑

public class Access implements Runnable{
    
    HttpURLConnection huc; 
    InputStream is;
    BufferedReader reader;
    String url;
    
    public Access(){
        try {
            url="http://www.yahoo.com.cn";
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            huc=(HttpURLConnection)new URL(url).openConnection();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        new Thread(this).start();
    }

    public void run() {
        try {
            huc.setRequestMethod("GET");
        } catch (ProtocolException e) {
            e.printStackTrace();
        }
        try {
            huc.setUseCaches(true);
            huc.connect();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            is=huc.getInputStream();
            reader=new BufferedReader(new InputStreamReader(is,huc.getContentType().equals("text-html; charset=gb2312")?"gb2312":"UTF-8"));
            StringBuffer temp=new StringBuffer();
            String str;
            while((str=reader.readLine())!=null){
                temp.append(str+"\n");
            }
            System.out.println(new String(temp));
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                reader.close();
                is.close();
                huc.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
}



该爬虫设计的关键:
1.control,交互界面,对爬虫的控制
2.analysis HTML,对HTML进行分析,从中提取心得hot link.
3.多线程.并发抓取页面

posted @ 2009-04-02 11:03 pual.k3 阅读(229) 评论(0) 编辑

 主题网络爬虫就是根据一定的网页分析算法过滤与主题无关的链接, 保留主题相关的链接并将其放入待抓取的URL 队列中; 然后根据一定的搜索策略从队列中选择下一步要抓取的网页URL, 并重复上述过程, 直到达到系统的某一条件时停止。所有被网络爬虫抓取的网页将会被系统存储, 进行一定的分析、过滤, 并建立索引, 对于主题网络爬虫来说, 这一过程所得到的分析结果还可能对后续的抓取过程进行反馈和指导。

主题网络爬虫的基本思路就是按照事先给出的主题, 分析超链接和

 

已经下载的网页内容, 预测下一个待抓取的URL 以及当前网页的主题相关度, 保证尽可能多地爬行、下载与主题相关的网页, 尽可能少地下载无关网页。相对于通用网络爬虫, 主题网络爬虫需要解决以下四个主要问题:
a) 如何描述或定义感兴趣的主题( 即抓取目标) ?
b) 怎样决定待爬行URL的访问次序? 许多主题网络爬虫根据己下载网页的相关度, 按照一定原则将相关度进行衰减,分配给该网页中的子网页, 而后将其插入到优先级队列中。此时的爬行次序就不是简单地以深度优先或广度优先顺序, 而是按照相关度大小排序, 优先访问相关度大的URL。不同主题网络爬虫之间的区别之一就是如何计算URL的爬行次序。
c) 如何判断一个网页是否与主题相关? 对于待爬行或己下载的网页可以获取它的文本内容, 所以可以采用文本挖掘技术来实现。因此不同主题网络爬虫间的区别之二就是如何计算当前爬行网页的主题相关度。

d) 怎样提高主题网络爬虫的覆盖度? 如何穿过质量不好( 与主题不相关) 的网页得到与用户感兴趣主题相关的网页,从而提高主题资源的覆盖度?对于主题网络爬虫性能的评价, 目前主要是基于harvestrate 来评价。Harvest rate 就是主题相关网页数目占所有抽取网页总数的比率:
harvest rate = numbers of relevant
pages/ numbers of all retrival pages

posted @ 2009-04-02 10:14 pual.k3 阅读(461) 评论(1) 编辑

RBSE (Eichmann,1994)是第一个发布的爬虫。它有两个基础程序。第一个是“spider”,抓取队列中的内容到一个关系数据库中,第二个程序是“mite”,是一个修改后的www的ASCII浏览器,负责从网络上下载页面。
   WebCrawler(Pinkerton,1994)是第一个公开可用的 用来建立全文索引的一个子程序,他使用库www来下载页面;另外一个程序使用广度优先来解析获取URL并对其排序;它还包括一个根据选定文本和查询相似程度爬行的实时爬虫。
   World Wide Web Worm (McBryan, 1994)是一个用来为文件建立包括标题和URL简单索引的爬虫。索引可以通过grep式的Unix命令来搜索。
   Google Crawler (Brin and Page, 1998)用了一些细节来描述,但是这些细节仅仅是关于使用C++和Python编写的、一个早期版本的体系结构。因为文本解析就是 文检索和URL抽取的过程,所以爬虫集成了索引处理。这里拥有一个URL服务器,用来给几个爬虫程序发送要抓取的URL列表。在文本解析的时候,新发现的URL传送给URL服务器并检测这个URL是不是已经存在,如果不存在的话,该URL就加入到URL服务器中。
   CobWeb (da Silva et al., 1999)使用了一个中央“调度者”和一系列的“分布式的搜集者”。搜集者解析下载的页面并把找到的URL发送给调度者,然后调度者反过来分配给搜集者。调度者使用深度优先策略,并且使用平衡礼貌策略来避免服务器超载。爬虫是使用Perl语言编写的。
   Mercator (Heydon and Najork, 1999; Najork and Heydon, 2001)是一个分布式的,模块化的使用java编写的网络爬虫。它的模块化源自于使用可互换的的“协议模块”和“处理模块”。协议模块负责怎样获取网页(例如使用HTTP),处理模块负责怎样处理页面。标准处理模块仅仅包括了解析页面和抽取URL,其他处理模块可以用来检索文本页面,或者搜集网络数据。
   WebFountain (Edwards et al., 2001)是一个与Mercator类似的分布式的模块化的爬虫,但是使用C++编写的。它的特点是一个管理员机器控制一系列的蚂蚁机器。经过多次下载页面后,页面的变化率可以推测出来,这时,一个非线性的方法必须用于求解方程以获得一个最大的新鲜度的访问策略。作者推荐在早期检索阶段使用这个爬虫,然后用统一策略检索,就是所有的页面都使用相同的频率访问。
   PolyBot [Shkapenyuk and Suel, 2002]是一个使用C++和Python编写的分布式网络爬虫。它由一个爬虫管理者,一个或多个下载者,一个或多个DNS解析者组成。抽取到的URL被添加到硬盘的一个队列里面,然后使用批处理的模式处理这些URL。平衡礼貌方面考虑到了第二、三级网域(例如www.example.com 和 www2.example.com 都是三级网域),因为第三级网域通常也会保存在同一个网络服务器上。
   WebRACE (Zeinalipour-Yazti and Dikaiakos, 2002)是一个使用java实现的,拥有检索模块和缓存模块的爬虫,它是一个很通用的称作eRACE的系统的一部分。系统从用户得到下载页面的请求,爬虫的行为有点像一个聪明的代理服务器。系统还监视订阅网页的请求,当网页发生改变的时候,它必须使爬虫下载更新这个页面并且通知订阅者。WebRACE最大的特色是,当大多数的爬虫都从一组URL开始的时候,WebRACE可以连续地的接收抓取开始的URL地址。
   Ubicrawer (Boldi et al., 2004)是一个使用java编写的分布式爬虫。它没有中央程序。它有一组完全相同的代理组成,分配功能通过主机前后一致的散列计算进行。这里没有重复的页面,除非爬虫崩溃了(然后,另外一个代理就会接替崩溃的代理重新开始抓取)。爬虫设计为高伸缩性和允许失败的。
   FAST Crawler (Risvik and Michelsen, 2002) 是一个分布式的爬虫,在Fast Search&Transfer中使用,关于其体系结构的一个大致的描述可以在[citation needed]找到。
   Labrador,一个工作在开源项目Terrier Search Engine上的非开源的爬虫。
   TeezirCrawler是一个非开源的可伸缩的网页抓取器,在Teezir上使用。该程序被设计为一个完整的可以处理各种类型网页的爬虫,包括各种JavaScript和HTML文档。爬虫既支持主题检索也支持非主题检索。
   Spinn3r, 一个通过博客构建Tailrank.com反馈信息的爬虫。 Spinn3r是基于java的,它的大部分的体系结构都是开源的。
   HotCrawler,一个使用c语言和php编写的爬虫。
   ViREL Microformats Crawler,搜索公众信息作为嵌入到网页的一小部分。
  除了上面列出的几个特定的爬虫结构以外,还有Cho (Cho and Garcia-Molina, 2002)和Chakrabarti (Chakrabarti, 2003)发布的一般的爬虫体系结构。
  4.1 开源爬虫
   DataparkSearch是一个在GNU GPL许可下发布的爬虫搜索引擎。
   GNU Wget是一个在GPL许可下,使用C语言编写的命令行式的爬虫。它主要用于网络服务器和FTP服务器的镜像。
   Heritrix是一个互联网档案馆级的爬虫,设计的目标为对大型网络的大部分内容的定期存档快照,是使用java编写的。
   Ht://Dig在它和索引引擎中包括了一个网页爬虫。
   HTTrack用网络爬虫创建网络站点镜像,以便离线观看。它使用C语言编写,在GPL许可下发行。
   ICDL Crawler是一个用C++编写,跨平台的网络爬虫。它仅仅使用空闲的CPU资源,在ICDL标准上抓取整个站点。
   JSpider是一个在GPL许可下发行的,高度可配置的,可定制的网络爬虫引擎。
   LLarbin由Sebastien Ailleret开发;
   Webtools4larbin由Andreas Beder开发;
   Methabot是一个使用C语言编写的高速优化的,使用命令行方式运行的,在2-clause BSD许可下发布的网页检索器。它的主要的特性是高可配置性,模块化;它检索的目标可以是本地文件系统,HTTP或者FTP。
   Nutch是一个使用java编写,在Apache许可下发行的爬虫。它可以用来连接Lucene的全文检索套件;
   Pavuk是一个在GPL许可下发行的,使用命令行的WEB站点镜像工具,可以选择使用X11的图形界面。与wget和httprack相比,他有一系列先进的特性,如以正则表达式为基础的文件过滤规则和文件创建规则。
   WebVac是斯坦福WebBase项目使用的一个爬虫。
   WebSPHINX(Miller and Bharat, 1998)是一个由java类库构成的,基于文本的搜索引擎。它使用多线程进行网页检索,html解析,拥有一个图形用户界面用来设置开始的种子URL和抽取下载的数据;
   WIRE-网络信息检索环境(Baeza-Yates 和 Castillo, 2002)是一个使用C++编写,在GPL许可下发行的爬虫,内置了几种页面下载安排的策略,还有一个生成报告和统计资料的模块,所以,它主要用于网络特征的描述;
   LWP:RobotUA(Langheinrich,2004)是一个在Perl5许可下发行的,可以优异的完成并行任务的 Perl类库构成的机器人。
   Web Crawler是一个为.net准备的开放源代码的网络检索器(C#编写)。
   Sherlock Holmes收集和检索本地和网络上的文本类数据(文本文件,网页),该项目由捷克门户网站中枢(Czech web portal Centrum)赞助并且主用商用于这里;它同时也使用在Onet.pl。
   YaCy是一个基于P2P网络的免费的分布式搜索引擎(在GPL许可下发行);
   Ruya是一个在广度优先方面表现优秀,基于等级抓取的开放源代码的网络爬虫。在英语和日语页面的抓取表现良好,它在GPL许可下发行,并且完全使用Python编写。按照robots.txt有一个延时的单网域延时爬虫。
   Universal Information Crawler快速发展的网络爬虫,用于检索存储和分析数据;
   Agent Kernel,当一个爬虫抓取时,用来进行安排,并发和存储的java框架。
   Arachnod.net是一个使用C#编写,需要SQL Server 2005支持的,在GPL许可下发行的多功能的开源的机器人。它可以用来下载,检索,存储包括电子邮件地址,文件,超链接,图片和网页在内的各种数据。
   Dine是一个多线程的java的http客户端。它可以在LGPL许可下进行二次开发。

posted @ 2009-04-02 09:50 pual.k3 阅读(867) 评论(1) 编辑


posts - 10, comments - 3, trackbacks - 0, articles - 0

Copyright © pual.k3