posts - 9, comments - 2, trackbacks - 0, articles - 1

2008年6月4日

jsreport遇到了一个很郁闷的问题总是出现
报表文件有错:Errors were encountered when compiling report expressions class file: D:\server\tomcat5.0.28\bin\mytest_1212552692656_858465.java:4: 软件包 net.sf.jasperreports.engine 不存在 import net.sf.jasperreports.engine.*; ^ D:\server\tomcat5.0.28\bin\mytest_1212552692656_858465.java:5: 软件包 net.sf.jasperreports.engine.fill 不存在 import net.sf.jasperreports.engine.fill.*; ^ D:\server\tomcat5.0.28
找了很长时间最后终于搞定,强行指定编译的classpath
String classPath =  "yourpath";
JRProperties.setProperty(JRProperties.COMPILER_CLASSPATH, classPath);

posted @ 2008-06-04 16:48 yuyu 阅读(84) | 评论 (0)编辑 收藏

2008年3月4日

有时候碰到一些问题真的是找不出办法,昨天也是。碰到了两个,总算是解决了一个。

问题一:
       网页打开之后长时间未响应,这个问题在邮件中已经分析过了,这里就不重复了。

问题二:
      mssql访问不到,telnet不通,netstat也没有程序监听,最后打sp4补丁搞好了。也算是解决了吧,这种问题以后还是要记得先查看版本信息。不过我记得就算是没有sp4也只是部分功能不能用,不会导致端口都不监听了吧。

问题三:
      mysql编码问题,这两天被编码的问题搞的很郁闷。mysql的确是很奇怪,字符编码到处都可以设。系统默认编码,数据库编码,表编码,表字段编码。这样的结果常常导致在导数据或者插入数据的时候数据库出现大量乱码,更奇怪的是用第三方工具查看的数据库是乱码,但是使用程序取出来的时候又是好的,原来第三方的工具编码也有问题。

posted @ 2008-03-04 12:12 yuyu 阅读(50) | 评论 (0)编辑 收藏

2008年3月3日

这篇短文写给没有做过Eclipse+Resin开发的朋友,并非写给各位高手。:)
主要介绍了无需Resin插件如何在Eclipse运行和调试WEB应用程序。

因为无需插件,纯JAVA环境运行,步骤可能多一点。
下面以Eclipse3.0.1、Resin3.0.12为例说明如何配置,相关配置内容为仅供参考。

1、建立基本结构
首先在Eclipse中新建一个项目pjt,结构如下:
|
|--src
|
|--context
   |
   |-- WEB-INF
       |
       |--classes
       |--lib
      
src: 类目录
context: WEB应用程序文档目录,即web-app的document-directory
WEB-INF: 你的*.xml、*.tld等等文档就在这里存放。
classes: 类编译输出文件夹
lib: 类库的存放目录,存放相应APPLICATION运行所需要的类库
以上为一大致结构,相信稍微做过开发的朋友都明白。

2、配置项目属性
在该项目属性中配置:
该项目JAVA文件编译的缺省输出文件夹为上面的classes目录。
在LIB列表中添加编译需要的jar。
具体的配置看个人情况而定了。


3、配置Resin的conf
拷贝一份resin安装目录conf目录下的resin.conf,命名为test.conf
编辑其中的内容,默认也可,在其后面的</host>上面添加一行:
<web-app id=/pjt document-directory="d:\pjt\webapp"/>
这是最简配置,详细参数自己可以定制。

4、配置Eclipse的运行
打开Eclipse的“运行”菜单,选择“运行”,如果你的是英文,应该都是RUN。:)
选择JAVA应用程序,点击下面的新建按钮,新建一个运行项目。
名称自己填写,我们暂时以RunTest来命名这个例子。然后配置其中的相关属性。

(1)主要
项目:我们选择刚刚新建的pjt项目。
Main类:填写com.caucho.server.resin.Resin
注意,如果你用的是resin2.1.5系列应该是 com.caucho.server.http.HttpServer

(2)自变量
程序自变量:-conf "d:\resin-3.0.12\conf\test.conf"
VM自变量:
-Dresin.home="G:\workspace\resin-3.0.12"
-Djava.util.logging.manager=com.caucho.log.LogManagerImpl
如果是开发Tapestry,需要page可以自动更新,那再添加:
-Dorg.apache.tapestry.enable-reset-service=true
-Dorg.apache.tapestry.disable-caching=true

(3)JRE:选择自己系统安装的JRE。

(4)类路径:添加Resin home的lib下的jar。

其它项目默认或根据情况自己定制即可。
配置好之后点击“应用”按钮,然后点击下面的“运行”按钮即可运行该项目。:)

以后你会发现工具条上运行按钮的下拉列表里面多了一个RunTest。
这样以后通过工具条上的运行和调试按钮就可以来运行这个pjt项目了。

转自:http://www.web521.com/web/554468/T642458.shtml

posted @ 2008-03-03 11:43 yuyu 阅读(41) | 评论 (0)编辑 收藏

2007年12月10日

TCP/IP通信程序设计的丰富多样性

 

刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程
序,据此一些人可能会认为TCP/IP编程很简单。其实不然,
TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在
通信方式和报文格式的多样性上。


一。通信方式

主要有以下三大类:

(一)SERVER/CLIENT方式

1.一个Client方连接一个Server方,或称点对点(peer to peer):
2.多个Client方连接一个Server方,这也是通常的并发服务器方式。
3.一个Client方连接多个Server方,这种方式很少见,主要
用于一个客户向多个服务器发送请求情况。


(二)连接方式

1.长连接

Client方与Server方先建立通讯连接,连接建立后不断开,
然后再进行报文发送和接收。这种方式下由于通讯连接一直
存在,可以用下面命令查看连接是否建立:

netstat –f inet|grep 端口号(如5678)。

此种方式常用于点对点通讯。


2.短连接

Client方与Server每进行一次报文收发交易时才进行通讯连
接,交易完毕后立即断开连接。此种方式常用于一点对多点
通讯,比如多个Client连接一个Server.


(三)发送接收方式

1.异步

报文发送和接收是分开的,相互独立的,互不影响。这种方
式又分两种情况:

(1)异步双工:接收和发送在同一个程序中,有两个不同的
子进程分别负责发送和接收
(2)异步单工:接收和发送是用两个不同的程序来完成。

2.同步

报文发送和接收是同步进行,既报文发送后等待接收返回报文。
同步方式一般需要考虑超时问题,即报文发上去后不能无限等
待,需要设定超时时间,超过该时间发送方不再等待读返回报
文,直接通知超时返回。 


实际通信方式是这三类通信方式的组合。比如一般书上提供的
TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的
组合是基本不用的,比较常用的有价值的组合是以下几种:

同步短连接Server/Client
同步长连接Server/Client
异步短连接Server/Client
异步长连接双工Server/Client
异步长连接单工Server/Client

其中异步长连接双工是最为复杂的一种通信方式,有时候经
常会出现在不同银行或不同城市之间的两套系统之间的通信。
比如金卡工程。由于这几种通信方式比较固定,所以可以预
先编制这几种通信方式的模板程序。


二.报文格式

通信报文格式多样性更多,相应地就必须设计对应的读写报文的接
收和发送报文函数。

(一)阻塞与非阻塞方式 

1.非阻塞方式

读函数不停地进行读动作,如果没有报文接收到,等待一段时间后
超时返回,这种情况一般需要指定超时时间。

2.阻塞方式

如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。

 

(二)循环读写方式
 

1.一次直接读写报文

在一次接收或发送报文动作中一次性不加分别地全部读取或全部
发送报文字节。

2.不指定长度循环读写

这一般发生在短连接进程中,受网络路由等限制,一次较长的报
文可能在网络传输过程中被分解成了好几个包。一次读取可能不
能全部读完一次报文,这就需要循环读报文,直到读完为止。

3.带长度报文头循环读写

这种情况一般是在长连接进程中,由于在长连接中没有条件能够
判断循环读写什么时候结束,所以必须要加长度报文头。读函数
先是读取报文头的长度,再根据这个长度去读报文.实际情况中,
报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须
转换成ASCII,常见的报文头码制有:
(1)n个字节的ASCII码
(2)n个字节的BCD码
(3)n个字节的网络整型码

 

以上是几种比较典型的读写报文方式,可以与通信方式模板一起
预先提供一些典型的API读写函数。当然在实际问题中,可能还
必须编写与对方报文格式配套的读写API.

在实际情况中,往往需要把我们自己的系统与别人的系统进行连接,
有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。

posted @ 2007-12-10 10:35 yuyu 阅读(358) | 评论 (0)编辑 收藏

2007年7月17日

MYSQL索引容易因意外重启等原因损坏,下面是转载的一篇文章,有碰到的不妨先试下文中讲述的方法。

     前几天因为mysql数据库部分数据损坏原因,我尝试了下恢复数据,之后整理以下文档,供各位参考,
以备各位同事以后如有类似问题,可以少走些弯路,尽快解决问题。
环境:windows2003
数据库:mysql
损坏数据文件名:function_products
将数据库内容物理文件直接导入到mysqldata下,每只表各3个文件,依次分别为:.frm .MYD .MYI
     首先我第一想到的是去网上搜索,寻找类似的工具,试图通过工具来恢复已损坏的文件,于是我在GOOGLE上查找,
找到一款名为MySQLRecovery的工具,安装后我用其进行恢复,只可惜效果太不理想,几十M大的数据文件,恢复
之后它提示我竟然只有几十K,令我吐血...
    我又想到了mysql下应有自己本身的修复程序等,于是想通过其来进行恢复,心想应不会太差劲吧,在网上查找了
资料,提示:
    由于临时断电,使用kill -9中止MySQL服务进程,或者是mysql正在高速运转时进行强制备份操作时等,
所有的这些都可能会毁坏MySQL的数据文件。如果在被干扰时,服务正在改变文件,文件可能会留下错误的
或不一致的状态。因为这样的毁坏有时是不容易被发现的,当你发现这个错误时可能是很久以后的事了。
于是,当你发现这个问题时,也许所有的备份都有同样的错误。
    我想我现在碰到的问题可能是这个问题,因为备份的数据也是有部分损坏的数据,所以导致不能完全运行,
 意识到myisamchk程序对用来检查和修改的MySQL数据文件的访问应该是唯一的。如果MySQL服务正在使用
某一文件,并对myisamchk正在检查的文件进行修改,myisamchk会误以为发生了错误,并会试图进行修复--
这将导致MySQL服务的崩溃!这样,要避免这种情况的发生,通常我们需要在工作时关闭

MySQL服务。作为选择,
你也可以暂时关闭服务以制作一个文件的拷贝,然后在这个拷贝上工作。当你做完了以后,重新关闭服务并使
用新的文件取代原来的文件(也许你还需要使用期间的变更日志)。
    MySQL数据目录不是太难理解的。每一个数据库对应一个子目录,每个子目录中包含了对应于这个数据库中的
数据表的文件。每一个数据表对应三个文件,它们和表名相同,但是具有不同的扩展名。tblName.frm文件是
表的定义,它保存了表中包含的数据列的内容和类型。tblName.MYD文件包含了表中的数据。tblName.MYI文件
包含了表的索引(例如,它可能包含lookup表以帮助提高对表的主键列的查询)。
   要检查一个表的错误,只需要运行myisamchk(在MySQL的bin目录下)并提供文件的位置和表名,或者是表的索引文件名:
% myisamchk /usr/local/mysql/var/dbName/tblName
% myisamchk /usr/local/mysql/var/dbName/tblName.MYI

上面的两个命令都可以执行对指定表的检查。要检查数据库中所有的表,可以使用通配符:
% myisamchk /usr/local/mysql/var/dbName/*.MYI
要检查所有数据库中的所有表,可以使用两个通配符:
% myisamchk /usr/local/mysql/var/*/*.MYI
如果不带任何选项,myisamchk将对表文件执行普通的检查。如果你对一个表有怀疑,但是普通的检查不能发现任何错误,你可以执行更彻底的检查(但是也更慢!),这需要使用--extend-check选项:
% myisamchk --extend-check /path/to/tblName
对 错误的检查是没有破坏性的,这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟。另一方面,修复选项,虽然通常也是安全的,但是它对 你的数据文件的更改是无法撤消的。因为这个原因,我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份,并确保在制作这个备份之前你的MySQL服务 是关闭的。
 
    我在win2003下通过命令提示符,输入:
注:此为记录我当时操作的全部过程
D:Documents and SettingsAdministrator>c:
C:>cd mysql
C:mysql>cd data
C:mysqldata>cd hw_enterprice
C:mysqldatahw_enterprice>myisamchk function_products.frm
'myisamchk' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:mysqldatahw_enterprice>cd
C:>cd mysql
C:mysql>cd bin
注:查看myisamchk的帮助信息
C:mysqlin>myisamchk
myisamchk  Ver 2.6 for Win95/Win98 at i32
By Monty, for your professional use
This software comes with NO WARRANTY: see the PUBLIC for details.
Description, check and repair of ISAM tables.
Used without options all tables on the command will be checked for errors
Usage: myisamchk [OPTIONS] tables[.MYI]
Global options:
  -#, --debug=...     Output debug log. Often this is 'd:t:o,filename'
  -?, --help          Display this help and exit.
  -O, --set-variable var=option
                      Change the value of a variable. Please note that
                      this option is deprecated; you can set variables
                      directly with '--variable-name=value'.
  -t, --tmpdir=path   Path for temporary files
  -s, --silent        Only print errors.  One can use two -s to make
                      myisamchk very silent
  -v, --verbose       Print more information. This can be used with
                      --description and --check. Use many -v for more verbosity!
  -V, --version       Print version and exit.
  -w, --wait          Wait if table is locked.
Check options (check is the default action for myisamchk):
  -c, --check         Check table for errors
  -e, --extend-check  Check the table VERY throughly.  Only use this in
                      extreme cases as myisamchk should normally be able to
                      find out if the table is ok even without this switch
  -F, --fast          Check only tables that haven't been closed properly

-C, --check-only-changed
                      Check only tables that have changed since last check
  -f, --force         Restart with '-r' if there are any errors in the table.
                      States will be updated as with '--update-state'
  -i, --information   Print statistics information about table that is checked
  -m, --medium-check  Faster than extend-check, but only finds 99.99% of
                      all errors.  Should be good enough for most cases
  -U  --update-state  Mark tables as crashed if you find any errors
  -T, --read-only     Don't mark table as checked
Repair options (When using '-r' or '-o')
  -B, --backup        Make a backup of the .MYD file as 'filename-time.BAK'
  --correct-checksum  Correct checksum information for table.
  -D, --data-file-length=#  Max length of data file (when recreating data
                      file when it's full)
  -e, --extend-check  Try to recover every possible row from the data file
                      Normally this will also find a lot of garbage rows;
                      Don't use this option if you are not totally desperate.
  -f, --force         Overwrite old temporary files.
  -k, --keys-used=#   Tell MyISAM to update only some specific keys. # is a
                      bit mask of which keys to use. This can be used to
                      get faster inserts!
  -r, --recover       Can fix almost anything except unique keys that aren't
                      unique.
  -n, --sort-recover  Forces recovering with sorting even if the temporary
                      file would be very big.
  -p, --parallel-recover
                      Uses the same technique as '-r' and '-n', but creates
                      all the keys in parallel, in different threads.
                      THIS IS ALPHA CODE. USE AT YOUR OWN RISK!
  -o, --safe-recover  Uses old recovery method; Slower than '-r' but can
                      handle a couple of cases where '-r' reports that it
                      can't fix the data file.
  --character-sets-dir=...
                      Directory where character sets are
  --set-character-set=name
                      Change the character set used by the index
  -q, --quick         Faster repair by not modifying the data file.
                      One can give a second '-q' to force myisamchk to
                      modify the original datafile in case of duplicate keys
  -u, --unpack        Unpack file packed with myisampack.
Other actions:
  -a, --analyze       Analyze distribution of keys. Will make some joins in

                      MySQL faster.  You can check the calculated distribution
                      by using '--description --verbose table_name'.
  -d, --description   Prints some information about table.
  -A, --set-auto-increment[=value]
                      Force auto_increment to start at this or higher value
                      If no value is given, then sets the next auto_increment
                      value to the highest used value for the auto key + 1.
  -S, --sort-index    Sort index blocks.  This speeds up 'read-next' in
                      applications
  -R, --sort-records=#
                      Sort records according to an index.  This makes your
                      data much more localized and may speed up things
C:mysqlin>myisamchk c:mysqldatahw_enterpricefunction_products.frm
myisamchk: error: 'c:mysqldatahw_enterpricefunction_products.frm' is not a M
yISAM-table
C:mysqlin>myisamchk c:mysqldatahw_enterpricefunction_products.myi
Checking MyISAM file: c:mysqldatahw_enterpricefunction_products.myi
Data records:   85207   Deleted blocks:      39
myisamchk: warning: Table is marked as crashed
myisamchk: warning: 1 clients is using or hasn't closed the table properly
- check file-size
- check key delete-chain
- check record delete-chain
myisamchk: error: record delete-link-chain corrupted
- check index reference
- check data record references index: 1
- check data record references index: 2
- check data record references index: 3
- check record links
myisamchk: error: Wrong bytesec: 0-195-171 at linkstart: 841908
MyISAM-table 'c:mysqldatahw_enterpricefunction_products.myi' is corrupted
Fix it using switch "-r" or "-o"
继续进行操作:
C:mysqlin>myisamchk --recover --quick  c:mysqldatahw_enterpricefunction_p
roducts.myi
- check key delete-chain
- check record delete-chain
myisamchk: error: record delete-link-chain corrupted
myisamchk: error: Quick-recover aborted; Run recovery without switch 'q'
Updating MyISAM file: c:mysqldatahw_enterpricefunction_products.myi
MyISAM-table 'c:mysqldatahw_enterpricefunction_products.myi' is not fixed be
cause of errors

Try fixing it by using the --safe-recover (-o) or the --force (-f) option
系统提示我使用--safe-recover (-o) or the --force (-f) option进行修复操作,于是
C:mysqlin>myisamchk --safe-recover  c:mysqldatahw_enterpricefunction_prod
ucts.myi
- recovering (with keycache) MyISAM-table 'c:mysqldatahw_enterpricefunction_
products.myi'
Data records: 85207
Wrong bytesec:   0-195-171 at     841908; Skipped
Data records: 85215
  将修复后的物理文件复制到mysqldata下之后,通过phpMyAdmin进行访问,OK正常!
  本次数据修复操作成功,数据已被正常恢复,总计85215条记录,其中恢复数据共计85207条。
   总结本次经验及查找资料,如下:
 
当你试图修复一个被破坏的表的问题时,有三种修复类型。如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次--这通常是上一次修复操作遗留下来的。
这三种修复方法如下所示:
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName
 
第一种是最快的,用来修复最普通的问题;而最后一种是最慢的,用来修复一些其它方法所不能修复的问题。
检查和修复MySQL数据文件
如果上面的方法无法修复一个被损坏的表,在你放弃之前,你还可以试试下面这两个技巧:
如 果你怀疑表的索引文件(*.MYI)发生了不可修复的错误,甚至是丢失了这个文件,你可以使用数据文件(*.MYD)和数据格式文件(*.frm)重新生 成它。首先制作一个数据文件(tblName.MYD)的拷贝。重启你的MySQL服务并连接到这个服务上,使用下面的命令删除表的内容:
mysql> DELETE FROM tblName;
在 删除表的内容的同时,会建立一个新的索引文件。退出登录并重新关闭服务,然后用你刚才保存的数据文件(tblName.MYD)覆盖新的(空)数据文件。 最后,使用myisamchk执行标准的修复(上面的第二种方法),根据表的数据的内容和表的格式文件重新生成索引数据。
如果你的表的格式文件 (tblName.frm)丢失了或者是发生了不可修复的错误,但是你清楚如何使用相应的CREATE TABLE语句来重新生成这张表,你可以重新生成一个新的.frm文件并和你的数据文件和索引文件(如果索引文件有问题,使用上面的方法重建一个新的)一 起使用。首先制作一个数据和索引文件的拷贝,然后删除原来的文件(删除数据目录下有关这个表的所有记录)。
启动MySQL服务并使用当初的CREATE TABLE文件建立一个新的表。新的.frm文件应该可以正常工作了,但是最好你还是执行一下标准的修复(上面的第二种方法)。
如果有类似问题,建议自己先分析问题根源,查找资料,自己动手解决,不但可以多学更多知识技巧,更重要的是,自己也在解决问题的同时得到了快乐.

posted @ 2007-07-17 11:05 yuyu 阅读(219) | 评论 (0)编辑 收藏

2007年6月19日

最近在将公司的管理界面做成IE FF下通用的,刚刚做完,便在网上发现有位朋友已经将不同点列出来了。如果当初查阅了会节省很多时间,感激之余,转过来,慢慢欣赏。

 

 

IE & Netscape

IE only

1

居中

<center> OBJECT </center>

<p align=center> OBJECT </p>

2

form element 使用

所有<input>等要引用的元素,都放在一个<form></form>中

可以通过id直接访问,不通过form

3

元素的引用方法1

document.form_name.element_name

document.form_name.element_name[i]

document.form_name.elements[element_name]

form_name.element_name

form_name.all(element_name)

form_name.elements(element_name)

element_id

4

全选文本框

document.form_name.textbox_name.focus()

document.form_name.textbox_name.select()

注意:netscape6.1以上版本,可以不先focus

document.form_name.textbox_name.select()

(netscape中必须先focus)

5

Table

<table><tr><td><th>都有完整的结束标记</table></tr></td></th>

缺少一些没有关系

6

根据名字索引

document.all,这是造成大部分javascript函数不能使用的原因;

 

document.getElementById(id) 可用,但是只是支持id,不支持按name索引

 

(如果要同时用element_name or id 索引,可以考虑使用util.asp加入的新函数:

document_all(element_name_or_id) 见使用示例1)

注意:netscape4.8不支持document. GetElementById和document.all

document.all(element_name_or_id)

 

7

关于CSS

class=class_name

(class_name区分大小写, 而且不支持BORDER-COLLAPSE: collapse,这是造成界面难看的主要原因)

.css中的第一个类不起作用

class=class_name(class_name不区分大小写)

8

 

低版本javascriptswitch的能力很差不支持变量case

注意:我测过nerscapte6.1以上版本,支持case

 

9

元素引用2

引用元素的id时,区分大小写

引用元素的id时,不区分大小写

10

Cursor显示手形

Cursor: pointer

(ie6支持pointer; ie5以下不支持pointer)

Cursor: hand

11

innerText

innerHTML代替innerText

netscape6.0+不支持innerText

 

12

<Caption align=left></caption>(table的属性)

对于netscape,Caption出现在table的左侧,如附图1

对于ie,Caption出现在table的上方左侧,

如附图2

13

<col>

对于netscape,<col>的显示属性不会影响到所对应的其他列

对于ie,<col>的显示属性会影响到所对应的其他列

14

元素引用3

元素不是在form内时,引用元素使用document.getElementById("tblRole").

Window.tblRoleie可以.

15

自定义属性的使用.

有些界面上使用如<tr prj_code=’’>这样的自定义属性方式来保存值,netscape不支持tr.prj_code取值.需用objElm.attributes.getNamedItem(strAtrName).value.

注意:util.asp里已经写了function GetElementAttribute(objElm,strAtrName),可以直接调用.

Tr.prj_code可以取到值.

16

事件event及取事件源元素

Netscape事件.target”而不支持event. SrcElement取事件源元素.

Netscape也不能用event直接得到事件,可以考虑以“触发事件时将event传到javascript的方式得到事件”.

注意:util.asp里已经写了event_SrcElement(ObjEvent)来获得事件源元素.

触发事件的方法如:

<input type=button onclick=”invokeClick(event);”>

Event. SrcElement

17

Form

NetScape中必须使用document.FormName,

IE中可以使用document.FormName

Window.FormName

18

对表格的操作

TableId.rows[i].cells[i].childNodes[i]

Netscpate里不能使用 ( )

TableId.rows[i].cells[i].childNodes[i]

TableId.rows(i).cells(i).childNodes(i)

19

TableId.rows[i].cells[i].childNodes[i].length不同的问题

 

子节点类型有2,一种是element node;(nodeType=1),另一种是text node(nodeType = 3),可以遍历所有子节点,把所有的text node删掉,也可以修改html代码,把多余的空格删掉

方法一:

var tbl1 = document.getElementById(“table1”);

for (I=0;I<tbl1.childNodes.length)

{

   var temp = tbl1.childNodes[i];

if (temp.nodeType == 3)

{

 tbl1.removeChild(temp);

}

}

20

parentElement

ParentNode

Netscape中不能使用parentElement

ParentElement

parentNode

21

SrcElement

IEsrcElement,netscapetarget,

ie不能用target

 

22

Children,childNodes

ChildNodes

Children,childNodes

23

Radiobuttonnetscape中出现可以多选的问题

必须把radiobutton放入<form></form>

 

24

Msxml.dll

NETSCAPE:

VarxmlDoc= document.implementation.createDocument("","",null);

 

var xmlServerHttp = new XMLHttpRequest();

 

 

 

IE:

var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");

 

var xmlServerHttp = new ActiveXObject("Msxml2.XMLHTTP");

Ie 支持:xmlDoc.load(filename) 和 xmlDoc.loadXML(string)

NS只支持xmlDoc.load(filename)方法

 

if (navigator.appName =="Microsoft Internet Explorer") //IE

    {  

        var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");

        var xmlServerHttp = new ActiveXObject("Msxml2.XMLHTTP");      

        xmlDoc.async = false;

        xmlDoc.loadXML(xmlStr);

        xmlServerHttp.open("POST",toUrl, false);

        xmlServerHttp.send(xmlStr);

        re = xmlServerHttp.responseText;

    }

    else

    {

        var xmlDoc = document.implementation.createDocument("","",null);

        var xmlServerHttp = new XMLHttpRequest();

        var DOM = new DOMParser();

        xmlDoc.async = false;

        var DOMdoc = DOM.parseFromString(xmlStr,"text/xml");

        xmlDoc.load(DOMdoc);

        xmlServerHttp.open("POST",toUrl, false);

        xmlServerHttp.send(DOMdoc);

        re = xmlServerHttp.responseText;

    }  

SponOrgXMLforUpdate1 = “<sponsor_org name=’zwh’ age=’22’ />”

if (navigator.appName =="Microsoft Internet Explorer") //IE

{

var xmlDoc = new ActiveXObject("Msxml2.DOMDocument"); xmlDoc.async=false; xmlDoc.loadXML(SponOrgXMLforUpdate1);

 node = xmlDoc.selectSingleNode("//sponsor_org");

} else

{

var DOM = new DOMParser();

var xmlDoc = DOM.parseFromString(SponOrgXMLforUpdate1, 'text/xml'); var node = xmlDoc.getElementsByTagName('sponsor_org')[0]; }

 

25

<tr id=”tr1” a=”a1” b=”b1”>

取值:

tr1.attributes.getNamedItem("a ").value

tr1.attributes.getNamedItem("b ").value

赋值或者设置属性

tr1.setAttribute(“a”,”a1”)

tr1.setAttribute(“b”,”b1”);

 

Tr1.a

Tr1.b

26

给下来框新增一个option

Var newOpt =new Option(text,value,false,false); Select.options[Select.options.length] = newopt;

var oOption = document.createElement("OPTION"); oOption.text="" ; oOption.value=""; Select.add(oOption);

27

删除下拉框的某个option

 Select.options[i] = null;

Select.options[i] = null;

Select.options.remove(i);

 
转自 http://tb.blog.csdn.net/TrackBack.aspx?PostId=250206

posted @ 2007-06-19 11:41 yuyu 阅读(98) | 评论 (1)编辑 收藏

2007年6月12日

package tmp;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class DiskTest {
    
public static void main(String[] args) throws Exception {
        
// TODO Auto-generated method stub
        File file = new File("D:\\picture.rar");
        
byte[] content=readFile(file);
        System.out.println(content);
        writeBytes(
"D:\\picture1.rar",content);
    }


    
/**读文件到字节数组
     * 
@param file
     * 
@return
     * 
@throws Exception
     
*/

    
static byte[] readFile(File file) throws   Exception {
        
if (file.exists() && file.isFile()) {
            
long fileLength = file.length();
            
if (fileLength > 0L{
                BufferedInputStream fis 
= new BufferedInputStream(
                        
new FileInputStream(file));
                
byte[] b = new byte[(int) fileLength];
                
while (fis.read(b)!= -1{
                }

                fis.close();
                fis 
= null;

                
return b;
            }

        }
 else {
            
return null;
        }

        
return null;
    }


    
/**将字节数组写入文件
     * 
@param filePath
     * 
@param content
     * 
@return
     * 
@throws IOException
     
*/

    
static boolean writeBytes(String filePath, byte[] content)
            
throws IOException {
        File file 
= new File(filePath);
        
synchronized (file) {
            BufferedOutputStream fos 
= new BufferedOutputStream(
                    
new FileOutputStream(filePath));
            fos.write(content);
            fos.flush();
            fos.close();
        }

        
return true;

    }

}

有人在群中问如何读取写入一般文件,在这里写了一个供以后参考

posted @ 2007-06-12 17:26 yuyu 阅读(563) | 评论 (1)编辑 收藏

2007年5月15日

产生验证码图片的文件-----image.jsp

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
        }
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文
Graphics g = image.getGraphics();

//生成随机类
Random random = new Random();

// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));

//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);


// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
 int x = random.nextInt(width);
 int y = random.nextInt(height);
        int xl = random.nextInt(12);
        int yl = random.nextInt(12);
 g.drawLine(x,y,x+xl,y+yl);
}

// 取随机产生的认证码(4位数字)
String sRand="";
for (int i=0;i<4;i++){
    String rand=String.valueOf(random.nextInt(10));
    sRand+=rand;
    // 将认证码显示到图象中
    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    g.drawString(rand,13*i+6,16);
}

// 将认证码存入SESSION
session.setAttribute("rand",sRand);


// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());


%>

 

---------------使用验证码图片的文件---------a.jsp------------------------------------

<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>认证码输入页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> 
<META HTTP-EQUIV="Expires" CONTENT="0"> 
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系统产生的认证码:</td>
<td><img border=0 src="image.jsp"></td>
</tr>
<tr>
<td align=left>输入上面的认证码:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交检测"></td>
</tr>
</form>
</body>
</html>



-----------------验证的页面----------check.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<title>认证码验证页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> 
<META HTTP-EQUIV="Expires" CONTENT="0"> 
</head>

<body>
<% 
 String rand = (String)session.getAttribute("rand");
 String input = request.getParameter("rand");
%>
系统产生的认证码为: <%= rand %><br>
您输入的认证码为: <%= input %><br>
<br>
<%
  if (rand.equals(input)) {
%>
<font color=green>输入相同,认证成功!</font>
<%
  } else {
%>
<font color=red>输入不同,认证失败!</font>
<%
  }
%>
</body>
</html>

原文:http://www.cnblogs.com/maxwoods/archive/2007/04/11/709002.html

posted @ 2007-05-15 15:54 yuyu| 编辑 收藏