blogjava-凯发k8网页登录http://www.blogjava.net/xzclog/category/17318.htmlzh-cnsat, 09 jul 2011 04:31:52 gmtsat, 09 jul 2011 04:31:52 gmt60js 高级编程http://www.blogjava.net/xzclog/archive/2011/07/09/353978.htmlxzcxzcsat, 09 jul 2011 03:34:00 gmthttp://www.blogjava.net/xzclog/archive/2011/07/09/353978.htmlhttp://www.blogjava.net/xzclog/comments/353978.htmlhttp://www.blogjava.net/xzclog/archive/2011/07/09/353978.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/353978.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/353978.html

研究发现:属性(变量)可分为三类(对象属性、全局变量和局部变量)
对象属性:声明时以“this.”开头,只能被“类的实例”即对象所调用,不能被“类内部(对外不对内)”调用;全局变量:声明时直接以变量名开头,可以任意调用(对内对外);局部变量:只能被

“类内部(对内不对外)”调用。

 

js函数的声明与访问原理

 


下面看看如何调用:

 



xzc 2011-07-09 11:34
]]>
当ajax遭遇gbk编码 (完全凯发天生赢家一触即发官网的解决方案) http://www.blogjava.net/xzclog/archive/2011/06/21/352729.htmlxzcxzctue, 21 jun 2011 03:54:00 gmthttp://www.blogjava.net/xzclog/archive/2011/06/21/352729.htmlhttp://www.blogjava.net/xzclog/comments/352729.htmlhttp://www.blogjava.net/xzclog/archive/2011/06/21/352729.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/352729.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/352729.html 
[原文:  ]
早起的国内互联网都使用gbk编码,久之,所有项目都以gbk来编码了。对于j2ee项目,为了减少编码的干扰通常都是设置一个编码的filter,强制将request/response编码改为gbk。例如一个spring的常见配置如下:

 


    encodingfilter
    org.springframework.web.filter.characterencodingfilter
    
        encoding
        gbk
    
    
        forceencoding
        true
    

毫无疑问,这在gbk编码的页面访问、提交数据时是没有乱码问题的。但是遇到ajax就不一样了。ajax强制将中文内容进行utf-8编码,这样导致进入后端后使用gbk进行解码时发生乱码。网上的所谓的终极凯发天生赢家一触即发官网的解决方案都是扯淡或者过于复杂,例如下面的文章:

    这样的文章很多,显然:

    • 使用vb进行utf-8转换成gbk提交是完全不可行(多浏览器、多平台完全不可用)
    • 使用复杂的js函数进行一次、多次编码,后端进行一次、多次解码也是不靠谱的,成本太高,无法重复使用

    如果提交数据的时候能够告诉后端传输的编码信息是否就可以避免这种问题?比如ajax请求告诉后端是utf-8,其它请求告诉后端是gbk,这样后端分别根据指定的编码进行解码是不是就解决问题了。

    有两个问题:

    1. 如何通过ajax告诉后端的编码?header过于复杂,cookie成本太高,使用参数最方便。
    2. 后端何时进行解码?每一个请求进行解码,过于繁琐;获取参数时解码,此时已经乱码;在filter里面动态设置编码是最完善的方案。
    3. 如何从参数中获取编码?如果是post的body显然无法获取,因此在获取之前所有参数就已经按照某种编码解码过了,无法还原。所以通过url传递编码最有效。支持get/post,同时成本很低。

    解决了上述问题,来看具体实现方案。 列一段java代码:

    import java.io.ioexception;
    import java.util.regex.matcher;
    import java.util.regex.pattern;
    import javax.servlet.filterchain;
    import javax.servlet.servletexception;
    import javax.servlet.http.httpservletrequest;
    import javax.servlet.http.httpservletresponse;
    import org.springframework.util.classutils;
    import org.springframework.web.filter.onceperrequestfilter;
    /** 自定义编码过滤器
     * @author  (imxylz#gmail.com)
     * @sine 2011-6-9
     */
    public class mutilcharacterencodingfilter extends onceperrequestfilter {
        static final pattern inputpattern = pattern.compile(".*_input_encode=([\\w-] ).*");
        static final pattern outputpattern = pattern.compile(".*_output_encode=([\\w-] ).*");
        // determine whether the servlet 2.4 httpservletresponse.setcharacterencoding(string)
        // method is available, for use in the "dofilterinternal" implementation.
        private final static boolean responsesetcharacterencodingavailable = classutils.hasmethod(httpservletresponse.class,
              "setcharacterencoding", new class[] { string.class });
        private string encoding;
        private boolean forceencoding = false;
        @override
        protected void dofilterinternal(httpservletrequest request, httpservletresponse response, filterchain filterchain)
     throws servletexception, ioexception {
            string url = request.getquerystring();
            matcher m = null;
            if (url != null && (m = inputpattern.matcher(url)).matches()) {//输入编码
                string inputencoding = m.group(1);
                request.setcharacterencoding(inputencoding);
                m = outputpattern.matcher(url);
                if (m.matches()) {//输出编码
                    response.setcharacterencoding(m.group(1));
                } else {
                    if (this.forceencoding && responsesetcharacterencodingavailable) {
                        response.setcharacterencoding(this.encoding);
                    }
                }
            } else {
                if (this.encoding != null && (this.forceencoding || request.getcharacterencoding() == null)) {
                    request.setcharacterencoding(this.encoding);
                    if (this.forceencoding && responsesetcharacterencodingavailable) {
                        response.setcharacterencoding(this.encoding);
                    }
                }
            }
            filterchain.dofilter(request, response);
        }
        public void setencoding(string encoding) {
            this.encoding = encoding;
        }
        public void setforceencoding(boolean forceencoding) {
            this.forceencoding = forceencoding;
        }
    }
    

    解释下:

    • 如果url的querystring中包含_input_encode就使用此编码进行设置request编码,以后参数按照此编码进行解析,例如如果是ajax就传入utf-8,如果是普通的gbk请求则无视此参数。
    • 如果无视此参数,则按照web.xml中配置的编码规则进行反编码,如果是gbk就按照gbk规则解析。
    • 对于输出编码同样使用上述规则。需要输出编码依赖输入编码,也就是说如果有一个_output_encode的输出编码,则同时需要有一个_input_encode编码来指定输入编码。当然你可以改造成不依赖输入编码。
    • 完全兼容spring的org.springframework.web.filter.characterencodingfilter编码规则,只需要替换类即可。
    • 没有继承org.springframework.web.filter.characterencodingfilter类的原因是,org.springframework.web.filter.characterencodingfilter里面的encoding参数和forceencoding参数是private,子类无法使用。在有_input_encode而无_output_encode的时候想依然保持spring的response解析规则的话无法做到,所以将里面的代码拷贝过来使用。(为了展示方便,注释都删掉了)
    • 正则表达式可以改进成只需要匹配一次,从而可以提高一点点效率。
    • 所有后端请求将无视编码的存在,前端ajax的get/post请求也将无视编码的存在,只是在url地址中加上一个_input_encode=utf-8的参数。仅此而已。
    • 如果想输出的编码也是utf-8,比如手机端请求、跨站请求等,则需要url地址参数_input_encode=utf-8&_output_encode=utf-8。
    • 对于post请求,编码参数不能写在body里面,否则无法解析。
    • 显然,这种终极凯发天生赢家一触即发官网的解决方案,在任何编码中都可以解决,gbk/utf-8/iso8859-1等编码任何组合都可以实现。
    • 唯一局限性是,此凯发天生赢家一触即发官网的解决方案限制在j2ee项目中,其它平台不知是否有类似filter这样的组件能够设置编码的概念。



    xzc 2011-06-21 11:54
    ]]>
    dom4j的使用(全而好的文章)http://www.blogjava.net/xzclog/archive/2008/10/31/237777.htmlxzcxzcfri, 31 oct 2008 03:33:00 gmthttp://www.blogjava.net/xzclog/archive/2008/10/31/237777.htmlhttp://www.blogjava.net/xzclog/comments/237777.htmlhttp://www.blogjava.net/xzclog/archive/2008/10/31/237777.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/237777.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/237777.html阅读全文

    xzc 2008-10-31 11:33
    ]]>
    经典正则表达式 javascript [zt]http://www.blogjava.net/xzclog/archive/2007/03/16/104313.htmlxzcxzcfri, 16 mar 2007 09:08:00 gmthttp://www.blogjava.net/xzclog/archive/2007/03/16/104313.htmlhttp://www.blogjava.net/xzclog/comments/104313.htmlhttp://www.blogjava.net/xzclog/archive/2007/03/16/104313.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/104313.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/104313.html摘要:收集一些常用的正则表达式。

    正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。

    匹配中文字符的正则表达式:

    [ \ u4e00 -\ u9fa5 ]

    匹配双字节字符(包括汉字在内):

    [ ^\ x00 -\ xff ]

    应用:计算字符串的长度(一个双字节字符长度计2,ascii字符计1)

    string . prototype . len = function (){ return this . replace ([ ^\ x00 -\ xff ] / g,"aa").length; }

    匹配空行的正则表达式:

    \ n [ \ s | ] *\ r

    匹配html标记的正则表达式:

    / <(.*)>.*< \/ \1>|<(.*) \/ > /

    匹配首尾空格的正则表达式:

    ( ^\ s * ) | ( \ s *$ )

    应用:j avascript中没有像v bscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

    string . prototype . trim = function ()
    {
        
    return this . replace ( / (^\s*)|(\s*$) /g , "" ) ;
    }

    利用正则表达式分解和转换ip地址
    下面是利用正则表达式匹配ip地址,并将ip地址转换成对应数值的javascript程序:

    function ip2v ( ip )
    {
        
    re = / (\d )\.(\d )\.(\d )\.(\d ) /g   //匹配ip地址的正则表达式
        
    if ( re . test ( ip ))
        
    {
            
    return regexp .$ 1 * math . pow ( 255 , 3 ) ) regexp .$ 2 * math . pow ( 255 , 2 ) ) regexp .$ 3 * 255 regexp .$ 4 * 1
        
    }
        
    else
        
    {
            
    throw new error ( " not a valid ip address! " )
        
    }
    }

    不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

    var ip = " 10.100.20.168 "
    ip = ip . split ( " . " )
    alert ( " ip值是: " ( ip [ 0 ] * 255 * 255 * 255 ip [ 1 ] * 255 * 255 ip [ 2 ] * 255 ip [ 3 ] * 1 ))

    匹配email地址的正则表达式:

    \ w ([ - . ] \ w ) *@\ w ([ -. ] \ w ) *\.\ w ([ -. ] \ w ) *

    匹配网址url的正则表达式:

    http : //([\w-] \.) [\w-] (/[\w- ./?%&=]*)?

    利用正则表达式去除字串中重复的字符的算法程序:[*注:此程序不正确]

    var s = " abacabefgeeii "
    var s1 = s . replace ( / (.).*\1 /g , " $1 " )
    var re = new regexp ( " [ " s1 " ] " , " g " )
    var s2 = s . replace ( re , "" )
    alert ( s1 s2 )   //结果为:abcefgi

    *注
    ===============================
    如果var s = “abacabefggeeii”
    结果就不对了,结果为:abeicfgg
    正则表达式的能力有限
    ===============================

    我原来在csdn上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

    得用正则表达式从url地址中提取文件名的javascript程序,如下结果为page1

    s = " http://blog.penner.cn/page1.htm "
    s = s . replace ( / (.* \/ ){ 0, }([^\.] ).* /i g , " $2 " )
    alert ( s )

    利用正则表达式限制网页表单里的文本框输入内容:

    用正则表达式限制只能输入中文:

    onkeyup = " value=value.replace(/[^\u4e00-\u9fa5]/g,'') " onbeforepaste = " clipboarddata.setdata('text',clipboarddata.getdata('text').replace(/[^\u4e00-\u9fa5]/g,'')) "

    用正则表达式限制只能输入全角字符:

    onkeyup = " value=value.replace(/[^\uff00-\uffff]/g,'') " onbeforepaste = " clipboarddata.setdata('text',clipboarddata.getdata('text').replace(/[^\uff00-\uffff]/g,'')) "

    用正则表达式限制只能输入数字:

    onkeyup = " value=value.replace(/[^\d]/g,'') " onbeforepaste = " clipboarddata.setdata('text',clipboarddata.getdata('text').replace(/[^\d]/g,'')) "

    用正则表达式限制只能输入数字和英文:

    onkeyup = " value=value.replace(/[\w]/g,'') " onbeforepaste = " clipboarddata.setdata('text',clipboarddata.getdata('text').replace(/[^\d]/g,'')) "

    匹配非负整数(正整数 0)

    ^\ d $

    匹配正整数

    ^ [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] *$

    匹配非正整数(负整数 0)

    ^ (( -\ d ) | ( 0 )) $

    匹配负整数

    ^- [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] *$

    匹配整数

    ^-?\ d $

    匹配非负浮点数(正浮点数 0)

    ^\ d ( \.\ d ) ?$

    匹配正浮点数

    ^ (([ 0 - 9 ] \. [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] *\. [ 0 - 9 ] ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * )) $

    匹配非正浮点数(负浮点数 0)

    ^ (( -\ d ( \.\ d ) ? ) | ( 0 ( \ .0 ) ? )) $

    匹配负浮点数

    ^ ( - (([ 0 - 9 ] \. [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] *\. [ 0 - 9 ] ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ))) $

    匹配浮点数

    ^ ( -?\ d )( \.\ d ) ?$

    匹配由26个英文字母组成的字符串

    ^ [ a - za - z ] $

    匹配由26个英文字母的大写组成的字符串

    ^ [ a - z ] $

    匹配由26个英文字母的小写组成的字符串

    ^ [ a - z ] $

    匹配由数字和26个英文字母组成的字符串

    ^ [ a - za - z0 - 9 ] $

    匹配由数字、26个英文字母或者下划线组成的字符串

    ^\ w $

    匹配email地址

    ^ [ \ w - ] ( \. [ \ w - ] ) *@ [ \ w - ] ( \. [ \ w - ] ) $

    匹配url

    ^ [ a - za - z ] : //匹配(\w (-\w )*)(\.(\w (-\w )*))*(\?\s*)?$

    匹配html tag

    <\ s * ( \ s )( \ s [ ^> ] * ) ?> ( .*? ) <\ s *\ / \1\s*>

    visual basic & c# regular expression
    1.确认有效电子邮件格式
    下面的示例使用静态 regex.ismatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 isvalidemail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 isvalidemail,在应用程序将地址存储在数据库中或显示在 asp.net 页中之前,筛选出包含无效字符的电子邮件地址。

    [visual basic]

    function isvalidemail(strin as string) as boolean
    ' return true if strin is in valid e-mail format.
    return regex.ismatch(strin, ("^([\w-\.] )@((\[[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.)|(([\w-] \.) ))([a-za-z]{ 2,4 }|[0-9]{ 1,3 })(\]?)$")
    end function

    [c#]

    bool isvalidemail(string strin)
    {
    // return true if strin is in valid e-mail format.
    return regex.ismatch(strin, @"^([\w-\.] )@((\[[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.)|(([\w-] \.) ))([a-za-z]{ 2,4 }|[0-9]{ 1,3 })(\]?)$");
    }

    2.清理输入字符串
    下面的代码示例使用静态 regex.replace 方法从字符串中抽出无效字符。您可以使用这里定义的 cleaninput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。cleaninput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。

    [visual basic]

    function cleaninput(strin as string) as string
    ' replace invalid characters with empty strings.
    return regex.replace(strin, "[^\w\.@-]", "")
    end function

    [c#]

    string cleaninput(string strin)
    {
        // replace invalid characters with empty strings.
        return regex.replace(strin, @"[^\w\.@-]", "");
    }

    3.更改日期格式
    以下代码示例使用 regex.replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。

    [visual basic]

    function mdytodmy(input as string) as string
    return regex.replace(input, _
    "\b(?\d{ 1,2 })/(?\d{ 1,2 })/(?\d{ 2,4 })\b", _
    "${ day }-${ month }-${ year }")
    end function

    [c#]

    string mdytodmy(string input)
    {
        return regex.replace(input,"\\b(?\\d{ 1,2 })/(?\\d{ 1,2 })/(?\\d{ 2,4 })\\b","${ day }-${ month }-${ year }");
    }

    regex 替换模式
    本示例说明如何在 regex.replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${ day } 插入由 (?…) 组捕获的子字符串。

    有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 regex.replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便

    4.提取 url 信息
    以下代码示例使用 match.result 来从 url 提取协议和端口号。例如,“http://www.penner.cn:8080……将返回“http:8080”。

    [visual basic]

    function extension(url as string) as string
    dim r as new regex("^(?\w )://[^/] ?(?:\d )?/", _
    regexoptions.compiled)
    return r.match(url).result("${ proto }${ port }")
    end function

    [c#]

    string extension(string url)
    {
        regex r = new regex(@"^(?\w )://[^/] ?(?:\d )?/",
        regexoptions.compiled);
        return r.match(url).result("${ proto }${ port }");
    }

    只有字母和数字,不小于6位,且数字字母都包含的密码的正则表达式
    在c#中,可以用这个来表示:

    " \w{ 6 }(\w )* "

    一个将需要将路径字符串拆分为根目录和子目录两部分的算法程序,考虑路径格式有:c:\aa\bb\cc ,\\aa\bb\cc , ftp://aa.bb/cc 上述路径将分别被拆分为:c:\和aa\bb\cc ,\\aa 和 \bb\cc , ftp:// 和 aa.bb/cc 用javascript实现如下:

    var strroot , strsub
    var regpathparse = / ^([^\\^ \/ ] [\\ \/ ] |\\\\[^\\] )(.*)$ /
    if ( regpathparse . test ( strfolder ))
    {
        
    strroot = regexp .$ 1
        
    strsub = regexp .$ 2
    }
    tags: 

    xzc 2007-03-16 17:08
    ]]>
    [dwr文档] web-inf 参考http://www.blogjava.net/xzclog/archive/2006/11/19/82028.htmlxzcxzcsun, 19 nov 2006 05:50:00 gmthttp://www.blogjava.net/xzclog/archive/2006/11/19/82028.htmlhttp://www.blogjava.net/xzclog/comments/82028.htmlhttp://www.blogjava.net/xzclog/archive/2006/11/19/82028.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/82028.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/82028.html阅读全文

    xzc 2006-11-19 13:50
    ]]>
    dom4j(version 1.6.1)快速入门http://www.blogjava.net/xzclog/archive/2006/11/17/81769.htmlxzcxzcfri, 17 nov 2006 07:14:00 gmthttp://www.blogjava.net/xzclog/archive/2006/11/17/81769.htmlhttp://www.blogjava.net/xzclog/comments/81769.htmlhttp://www.blogjava.net/xzclog/archive/2006/11/17/81769.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/81769.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/81769.htmlparsing xml

    或许你想要做的第一件事情就是解析一个某种类型的xml文档,用dom4j很容易做到。请看下面的示范代码:

    import java.net.url;

    import org.dom4j.document;
    import org.dom4j.documentexception;
    import org.dom4j.io.saxreader;

    public class foo {

    public document parse(url url) throws documentexception {
    saxreader reader = new saxreader();
    document document = reader.read(url);
    return document;
    }
    }

    使用迭代器(iterators)

    我们可以通过多种方法来操作xml文档,这些方法返回java里标准的迭代器(iterators)。例如:

    public void bar(document document) throws documentexception {
    element root = document.getrootelement();
    //迭代根元素下面的所有子元素
    for ( iterator i = root.elementiterator(); i.hasnext(); ) {
    element element = (element) i.next();
    //处理代码
    }

    //迭代根元素下面名称为"foo"的子元素
    for ( iterator i = root.elementiterator( "foo" ); i.hasnext(); ) {
    element foo = (element) i.next();
    //处理代码
    }

    // 迭代根元素的属性attributes)元素
    for ( iterator i = root.attributeiterator(); i.hasnext(); ) {
    attribute attribute = (attribute) i.next();
    // do something
    }
    }

    强大的xpath导航

    在dom4j中xpath可以表示出在xml树状结构中的document或者任意的节点(node)(例如:attribute,element 或者 processinginstruction等)。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如:

    public void bar(document document) {
    list list = document.selectnodes( "//foo/bar" );

    node node = document.selectsinglenode( "//foo/bar/author" );

    string name = node.valueof( "@name" );
    }

    如果你想得到一个xhtml文档中的所有超文本链接(hypertext links)你可以使用下面的代码:

    public void findlinks(document document) throws documentexception {

    list list = document.selectnodes( "//a/@href" );

    for (iterator iter = list.iterator(); iter.hasnext(); ) {
    attribute attribute = (attribute) iter.next();
    string url = attribute.getvalue();
    }
    }

    如果你需要关于xpath语言的任何帮助,我们强烈推荐这个站点zvon tutorial他会通过一个一个的例子引导你学习。

    快速遍历(fast looping)


    如果你不得不遍历一个非常大的xml文档,然后才去执行,我们建议你使用快速遍历方法(fast looping method),它可以避免为每一个循环的节点创建一个迭代器对象,如下所示:

    public void treewalk(document document) {
    treewalk( document.getrootelement() );
    }

    public void treewalk(element element) {
    for ( int i = 0, size = element.nodecount(); i < size; i ) {
    node node = element.node(i);
    if ( node instanceof element ) {
    treewalk( (element) node );
    }
    else {
    // do something....
    }
    }
    }

    生成一个新的xml文档对象

    在dom4j中你可能常常希望用程序生成一个xml文档对象,下面的程序为你进行了示范:

    import org.dom4j.document;
    import org.dom4j.documenthelper;
    import org.dom4j.element;

    public class foo {

    public document createdocument() {
    document document = documenthelper.createdocument();
    element root = document.addelement( "root" );

    element author1 = root.addelement( "author" )
    .addattribute( "name", "james" )
    .addattribute( "location", "uk" )
    .addtext( "james strachan" );

    element author2 = root.addelement( "author" )
    .addattribute( "name", "bob" )
    .addattribute( "location", "us" )
    .addtext( "bob mcwhirter" );

    return document;
    }
    }

    将一个文档对象写入文件中

    将一个文档对象写入writer对象的一个简单快速的途径是通过write()方法。

    filewriter out = new filewriter( "foo.xml" );
    document.write( out );

    如果你想改变输出文件的排版格式,比如你想要一个漂亮的格式或者是一个紧凑的格式,或者你想用writer 对象或者outputstream 对象来操作,那么你可以使用xmlwriter 类。

    import org.dom4j.document;
    import org.dom4j.io.outputformat;
    import org.dom4j.io.xmlwriter;

    public class foo {

    public void write(document document) throws ioexception {

    // 写入文件
    xmlwriter writer = new xmlwriter(
    new filewriter( "output.xml" )
    );
    writer.write( document );
    writer.close();


    // 以一种优雅的格式写入system.out对象
    outputformat format = outputformat.createprettyprint();
    writer = new xmlwriter( system.out, format );
    writer.write( document );

    // 以一种紧凑的格式写入system.out对象
    format = outputformat.createcompactformat();
    writer = new xmlwriter( system.out, format );
    writer.write( document );
    }
    }

    转化为字符串,或者从字符串转化

    如果你有一个文档(document)对象或者任何一个节点(node)对象的引用(reference),象属性(attribute)或者元素(element),你可以通过asxml()方法把它转化为一个默认的xml字符串:

    document document = ...;
    string text = document.asxml();

    如果你有一些xml内容的字符串表示,你可以通过documenthelper.parsetext()方法将它重新转化为文档(document)对象:

    string text = "james";
    document document = documenthelper.parsetext(text);

    通过xslt样式化文档(document)


    使用sun公司提供的jaxp api将xslt 应用到文档(document)上是很简单的。它允许你使用任何的xslt引擎(例如:xalan或saxon等)来开发。下面是一个使用jaxp创建一个转化器(transformer),然后将它应用到文档(document)上的例子:

    import javax.xml.transform.transformer;
    import javax.xml.transform.transformerfactory;

    import org.dom4j.document;
    import org.dom4j.io.documentresult;
    import org.dom4j.io.documentsource;

    public class foo {

    public document styledocument(
    document document,
    string stylesheet
    ) throws exception {

    // 使用 jaxp 加载转化器
    transformerfactory factory = transformerfactory.newinstance();
    transformer transformer = factory.newtransformer(
    new streamsource( stylesheet )
    );

    // 现在来样式化一个文档(document)
    documentsource source = new documentsource( document );
    documentresult result = new documentresult();
    transformer.transform( source, result );

    // 返回经过样式化的文档(document)
    document transformeddoc = result.getdocument();
    return transformeddoc;
    }
    }


    初次尝试翻译,如果有翻译不妥的地方,希望大家指出来,我们共同进步!
    谢谢!!
    [:)]



    xzc 2006-11-17 15:14
    ]]>
    java中四种操作xml方式的比较http://www.blogjava.net/xzclog/archive/2006/11/17/81766.htmlxzcxzcfri, 17 nov 2006 07:01:00 gmthttp://www.blogjava.net/xzclog/archive/2006/11/17/81766.htmlhttp://www.blogjava.net/xzclog/comments/81766.htmlhttp://www.blogjava.net/xzclog/archive/2006/11/17/81766.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/81766.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/81766.html1. 介绍

    1)dom(jaxp crimson解析器)
            dom是用与平台和语言无关的方式表示xml文档的官方w3c标准。dom是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而dom被认为是基于树或基于对象的。dom以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像sax那样是一次性的处理。dom使用起来也要简单得多。

    2)sax

            sax处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,sax还比它的替代者dom快许多。
       选择dom还是选择sax? 对于需要自己编写代码来处理xml文档的开发人员来说,  选择dom还是sax解析模型是一个非常重要的设计决策。 dom采用建立树形结构的方式访问xml文档,而sax采用的事件模型。

      dom解析器把xml文档转化为一个包含其内容的树,并可以对树进行遍历。用dom解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation apis访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用dom解析器的时候需要处理整个xml文档,所以对性能和内存的要求比较高,尤其是遇到很大的xml文件的时候。由于它的遍历能力,dom解析器常用于xml文档需要频繁的改变的服务中。

      sax解析器采用了基于事件的模型,它在解析xml文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。sax对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,sax这种扩展能力得到了更好的体现。但用sax解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

    3)jdom           

              jdom的目的是成为java特定文档模型,它简化与xml的交互并且比使用dom实现更快。由于是第一个java特定模型,jdom一直得到大力和促进。正在考虑通过“java规范请求jsr-102”将它最终用作“java标准扩展”。从2000年初就已经开始了jdom开发。

      jdom与dom主要有两方面不同。首先,jdom仅使用具体类而不使用接口。这在某些方面简化了api,但是也限制了灵活性。第二,api大量使用了collections类,简化了那些已经熟悉这些类的java开发者的使用。

      jdom文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)java/xml问题”(根据学习曲线假定为20%)。jdom对于大多数java/xml应用程序来说当然是有用的,并且大多数开发者发现api比dom容易理解得多。jdom还包括对程序行为的相当广泛检查以防止用户做任何在xml中无意义的事。然而,它仍需要您充分理解xml以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习dom或jdom接口都更有意义的工作。

      jdom自身不包含解析器。它通常使用sax2解析器来解析和验证输入xml文档(尽管它还可以将以前构造的dom表示作为输入)。它包含一些转换器以将jdom表示输出成sax2事件流、dom模型或xml文本文档。jdom是在apache许可证变体下发布的开放。

    4)dom4j  
                
            虽然dom4j代表了完全独立的开发结果,但最初,它是jdom的一种智能分支。它合并了许多超出基本xml文档表示的功能,包括集成的xpath支持、xml schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过dom4j api和标准dom接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。

      为支持所有这些功能,dom4j使用接口和抽象基本类方法。dom4j大量使用了api中的collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然dom4j付出了更复杂的api的代价,但是它提供了比jdom大得多的灵活性。

      在添加灵活性、xpath集成和对大文档处理的目标时,dom4j的目标与jdom是一样的:针对java开发者的易用性和直观操作。它还致力于成为比jdom更完整的凯发天生赢家一触即发官网的解决方案,实现在本质上处理所有java/xml问题的目标。在完成该目标时,它比jdom更少强调防止不正确的应用程序行为。

      dom4j是一个非常非常优秀的java xml api,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的。如今你可以看到越来越多的java都在使用dom4j来读写xml,特别值得一提的是连sun的jaxm也在用dom4j。

    2.. 比较

    1)dom4j性能最好,连sun的jaxm也在用dom4j。目前许多开源项目中大量采用dom4j,例如大名鼎鼎的hibernate也用dom4j来读取xml配置文件。如果不考虑可移植性,那就采用dom4j.

    2)jdom和dom在性能测试时表现不佳,在测试10m文档时内存溢出。在小文档情况下还值得考虑使用dom和jdom。虽然jdom的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,dom仍是一个非常好的选择。dom实现广泛应用于多种编程语言。它还是许多其它与xml相关的标准的基础,因为它正式获得w3c推荐(与基于非标准的java模型相对),所以在某些类型的项目中可能也需要它(如在javascript中使用dom)。

    3)sax表现较好,这要依赖于它特定的解析方式-事件驱动。一个sax检测即将到来的xml流,但并没有载入到内存(当然当xml流被读入时,会有部分文档暂时隐藏在内存中)。

    3. 四种xml操作方式的基本使用方法

    xml文件:

    <?xml version="1.0" encoding="gb2312"?>
    <result>
        <value>
            <no>a1234</no>
           <addr>四川省xx县xx镇xx路x段xx号</addr>
        </value>
        <value>
            <no>b1234</no>
           <addr>四川省xx市xx乡xx村xx组</addr>
        </value>
    </result>

    1)dom

    import java.io.*;
    import java.util.*;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;

    public class myxmlreader{
     public static void main(string arge[]){

      long lasting =system.currenttimemillis();
      try{ 
       file f=new file("data_10k.xml");
       documentbuilderfactory factory=documentbuilderfactory.newinstance();
       documentbuilder builder=factory.newdocumentbuilder();
       document doc = builder.parse(f);
       nodelist nl = doc.getelementsbytagname("value");
       for (int i=0;i<nl.getlength();i ){
        system.out.print("车牌号码:" doc.getelementsbytagname("no").item(i).getfirstchild().getnodevalue());
        system.out.println("车主地址:" doc.getelementsbytagname("addr").item(i).getfirstchild().getnodevalue());
       }
      }catch(exception e){
       e.printstacktrace();
    }

    2)sax

    import org.xml.sax.*;
    import org.xml.sax.helpers.*;
    import javax.xml.parsers.*;

    public class myxmlreader extends defaulthandler {

     java.util.stack tags = new java.util.stack();
     public myxmlreader() {
      super();
       }

     public static void main(string args[]) {
      long lasting = system.currenttimemillis();
      try {
       saxparserfactory sf = saxparserfactory.newinstance();
       saxparser sp = sf.newsaxparser();
       myxmlreader reader = new myxmlreader();
       sp.parse(new inputsource("data_10k.xml"), reader);
      } catch (exception e) {
       e.printstacktrace();
      }

      system.out.println("运行时间:" (system.currenttimemillis() - lasting) "毫秒");}
      public void characters(char ch[], int start, int length) throws saxexception {
      string tag = (string) tags.peek();
      if (tag.equals("no")) { 
       system.out.print("车牌号码:" new string(ch, start, length));
        }
        if (tag.equals("addr")) {
      system.out.println("地址:" new string(ch, start, length));
        }
       }

      public void startelement(string uri,string localname,string qname,attributes attrs) {
      tags.push(qname);}

    3) jdom

    import java.io.*;
    import java.util.*;
    import org.jdom.*;
    import org.jdom.input.*;

    public class myxmlreader {

     public static void main(string arge[]) {
      long lasting = system.currenttimemillis();
      try {
       saxbuilder builder = new saxbuilder(); 
       document doc = builder.build(new file("data_10k.xml")); 
       element foo = doc.getrootelement(); 
       list allchildren = foo.getchildren(); 
       for(int i=0;i<allchildren.size();i ) { 
        system.out.print("车牌号码:" ((element)allchildren.get(i)).getchild("no").gettext());
        system.out.println("车主地址:" ((element)allchildren.get(i)).getchild("addr").gettext());
       }
      } catch (exception e) {
       e.printstacktrace();
    }

    }

    4)dom4j

    import java.io.*;
    import java.util.*;
    import org.dom4j.*;
    import org.dom4j.io.*;

    public class myxmlreader {

     public static void main(string arge[]) {
      long lasting = system.currenttimemillis();
      try {
       file f = new file("data_10k.xml");
       saxreader reader = new saxreader();
       document doc = reader.read(f);
       element root = doc.getrootelement();
       element foo;
       for (iterator i = root.elementiterator("value"); i.hasnext();) {
        foo = (element) i.next();
        system.out.print("车牌号码:" foo.elementtext("no"));
        system.out.println("车主地址:" foo.elementtext("addr"));
       }
      } catch (exception e) {
       e.printstacktrace();
        }
    }

    转自:



    xzc 2006-11-17 15:01
    ]]>
    dom操作xml的示例代码http://www.blogjava.net/xzclog/archive/2006/11/16/81496.htmlxzcxzcthu, 16 nov 2006 04:28:00 gmthttp://www.blogjava.net/xzclog/archive/2006/11/16/81496.htmlhttp://www.blogjava.net/xzclog/comments/81496.htmlhttp://www.blogjava.net/xzclog/archive/2006/11/16/81496.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/81496.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/81496.html『本文地址: 』

    1.文档对象模型(dom)
    dom是html和xml文档的编程基础,它定义了处理执行文档的途径。

    编程者可以使用dom增加文档、定位文档结构、填加修改删除文档元素。w3c的重要目标是把利用dom提供一个使用于多个平台的编程接口。w3c dom被设计成适合多个平台,可使用任意编程语言实现的方法。
    2.节点接口
    xml parser用来装载xml文档到缓存中,文档装载时,可以使用dom进行检索和处理。dom采用树形结构表示 xml文档,文档元素是树的最高阶层,该元素有一个或多个孩子节点用来表示树的分枝。
    节点接口程序通常用来读和写xml节点树中的个别元素,文档元素的孩子节点属性可以用来构造个别元素节点。xml parser用来证明web中的dom支持遍历节点树的所有函数,并可通过它们访问节点和及其属性、插入删除节点、转换节点树到xml中。
    所有microsoft xml parser函数得到w3c xml dom的正式推荐,除了load和loadxml函数(正式的dom不包括标准函数loading xml文档)。有13个节点类型被microsoft xml parser支持,下面列出常用节点:
    节点类型 例子
    document type
    processing instruction
    element carlsberg
    attribute type="beer"
    text carlsberg
    3.使用xml parser
    为了更加熟练的处理xml文档,必须使用xml parser。microsoft xml parser是iis5.0所带的一个com组件,一旦安装了iis5.0,parser可以利用html文档和asp文件中的脚本。
    microsoft xmldom parser支持以下编程模式:
    ----支持 javascript, vbscript, perl, vb, java, c 等等
    ----支持 w3c xml 1.0 和 xml dom
    ----支持 dtd 和 validation
    如果使用ie5.0中的javascript,可以使用下面的xml文档对象:
    var xmldoc = new activexobject("microsoft.xmldom")
    如果使用vbscript,可以使用下面的xml文档对象:
    set xmldoc = createobject("microsoft.xmldom")
    如果使用asp,可以使用下面的xml文档对象:
    set xmldoc = server.createobject("microsoft.xmldom")
    4.装载一个xml文件到parser中
    下面的代码装载存在的xml文档进入xml parser:

    第一行脚本增加了一个microsoft xml parser实例,第三行装载名为”note.xml”的xml文档进入parser中。第二行保证文档装载完成以后parser进行下一步工作。
    5. parseerror对象
    打开xml文档时,xml parser产生错误代码,并存在parseerror对象中,包括错误代码、错误文本和错误行号,等信息。
    6.文件错误
    下面的例子将试图装载一个不存在的文件,然后产生相应的错误代码:
    var xmldoc = new activexobject("microsoft.xmldom")
    xmldoc.async="false"
    xmldoc.load("ksdjf.xml")
    document.write("
    error code: ")
    document.write(xmldoc.parseerror.errorcode)
    document.write("
    error reason: ")
    document.write(xmldoc.parseerror.reason)
    document.write("
    error line: ")
    document.write(xmldoc.parseerror.line)
    7.xml错误
    下面使用不正确的格式装载xml文档,
    var xmldoc = new activexobject("microsoft.xmldom")
    xmldoc.async="false"
    xmldoc.load("note_error.xml")
    document.write("
    error code: ")
    document.write(xmldoc.parseerror.errorcode)
    document.write("
    error reason: ")
    document.write(xmldoc.parseerror.reason)
    document.write("
    error line: ")
    document.write(xmldoc.parseerror.line)
    8. parseerror属性
    属性描述:
    errorcode 返回长整型错误代码
    reason 返回字符串型错误原因
    line 返回长整型错误行号
    linepos 返回长整型错误行号位置
    srctext 返回字符串型产生错误原因
    url 返回url装载文档指针
    filepos 返回长整型错误文件位置
    9.遍历节点树
    一种通用的析取xml文档的方法是遍历节点树和它的元素值。 下面是使用vbscript写的遍历节点树的程序代码:
    set xmldoc=createobject("microsoft.xmldom")
    xmldoc.async="false"
    xmldoc.load("note.xml")
    for each x in xmldoc.documentelement.childnodes
    document.write(x.nodename)
    document.write(": ")
    document.write(x.text)
    next

    10.为xml文件提供html格式
    xml的一个优点是把html文档和它的数据分离开。通过使用浏览器中的xml parser,html页面可以被构造成静态文档,通过javascript提供动态数据。下面的例子使用javascript读取xml文档,写xml数据成html元素:
    var xmldoc = new activexobject("microsoft.xmldom")
    xmldoc.async="false"
    xmldoc.load("note.xml")
    nodes = xmldoc.documentelement.childnodes
    to.innertext = nodes.item(0).text
    from .innertext = nodes.item(1).text
    header.innertext = nodes.item(2).text
    body.innertext = nodes.item(3).text
    11.通过名称访问xml元素
    下面的例子使用javascript读取xml文档,写xml数据成html元素:
    var xmldoc = new activexobject("microsoft.xmldom")
    xmldoc.async="false"
    xmldoc.load("note.xml")
    document.write(xmldoc.getelementsbytagname("from").item(0).text)
    12.装载纯xml文本进入parser
    下面的代码装载文本字符串进入xml parser :

    13.装载xml进入parser





    遍历xml节点树:





    装载xml 进入 html



    html using xml data


    blogjava-凯发k8网页登录


    to:


    from:









    xzc 2006-11-16 12:28
    ]]>
    实例解析js xml的操作方法http://www.blogjava.net/xzclog/archive/2006/11/16/81495.htmlxzcxzcthu, 16 nov 2006 04:25:00 gmthttp://www.blogjava.net/xzclog/archive/2006/11/16/81495.htmlhttp://www.blogjava.net/xzclog/comments/81495.htmlhttp://www.blogjava.net/xzclog/archive/2006/11/16/81495.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/81495.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/81495.html『本文地址: 』

    我的xml文件login.xml如下.


        
            
            
            
            
            
        

        
            
            
        

        
            


            
            
            
            
        

    现在我需要对这个xml文件的内容进行操作.
    首先,我们需要加载这个xml文件,js中加载xml文件,是通过xmldom来进行的.
    // 加载xml文档
    loadxml    = function(xmlfile)
    {
        var xmldoc;
        if(window.activexobject)
        {
            xmldoc    = new activexobject(’microsoft.xmldom’);
            xmldoc.async    = false;
            xmldoc.load(xmlfile);
        }
        else if (document.implementation&&document.implementation.createdocument)
        {
            xmldoc    = document.implementation.createdocument(’’, ’’, null);
            xmldoc.load(xmlfile);
        }
        else
        {
            return null;
        }
        
        return xmldoc;
    }
    xml文件对象出来了, 接下去我就要对这个文档进行操作了.
    比如说,我们现在需要得到节点login/weapon/w的第一个节点的属性,那么我们可以如下进行.
    本文由 点击设计 http://www.djasp.net 收集整理。谢绝无聊之人转载!

    // 首先对xml对象进行判断
    checkxmldocobj    = function(xmlfile)
    {
        var xmldoc    = loadxml(xmlfile);
        if(xmldoc==null)
        {
            alert(’您的浏览器不支持xml文件读取,于是本页面禁止您的操作,推荐使用ie5.0以上可以解决此问题!’);
            window.location.href=’/index.aspx’;
        }
        
        return xmldoc;
    }
    ★点击设计★ http://www.djasp.net 全力打造web技术站点,欢迎大家访问!
    // 然后开始获取需要的login/weapon/w的第一个节点的属性值
    var xmldoc    = checkxmldocobj(’/ebs/xml/login.xml’);
    var v    = xmldoc.getelementsbytagname(’login/weapon/w’)[0].childnodes.getattribute(’text’)
    而我在我的程序中的写法是这样子的,当然我在程序中的写法是已经应用到实际中的了.一并给出来,以供查看
    本文由 ★点击设计★ http://www.djasp.net 收集整理。谢绝无聊之人转载!
    initializeselect    = function(oid, xpath)
    {
        var xmldoc    = checkxmldocobj(’/ebs/xml/login.xml’);
        var n;
        var l;
        var e    = $(oid);
        if(e!=null)
        {
            n    = xmldoc.getelementsbytagname(xpath)[0].childnodes;
            l    = n.length;
            for(var i=0; i        {
                var option    = document.createelement(’option’);
                option.value    = n[i].getattribute(’value’);
                option.innerhtml    = n[i].getattribute(’text’);
                e.appendchild(option);
            }
        }
    }
    上面的访问代码中,我们是通过xmldoc.getelementsbytagname(xpath)来进行的.
    还可以通过xmldoc.documentelement.childnodes(1)..childnodes(0).getattribute(’text’)进行访问.
    一些常用方法:
    xmldoc.documentelement.childnodes(0).nodename,可以得到这个节点的名称.
    xmldoc.documentelement.childnodes(0).nodevalue,可以得到这个节点的值. 这个值是来自于这样子的xml格式:
    xzc 2006-11-16 12:25
    ]]>
    兼容在ie和firefox浏览器下操作xml(英)http://www.blogjava.net/xzclog/archive/2006/11/16/81492.htmlxzcxzcthu, 16 nov 2006 04:20:00 gmthttp://www.blogjava.net/xzclog/archive/2006/11/16/81492.htmlhttp://www.blogjava.net/xzclog/comments/81492.htmlhttp://www.blogjava.net/xzclog/archive/2006/11/16/81492.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/81492.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/81492.htmlhttp://www.w3schools.com,虽是英文版,但其脚本用法相信大家还是看得懂的,希望对大家编写基于xml的网页有所帮助。

    to read and update - create and manipulate - an xml document, you will need an xml parser.


    microsoft's xml parser

    microsoft's xml parser is a com component that comes with internet explorer 5 and higher. once you have installed internet explorer, the parser is available to scripts.

    microsoft's xml parser supports all the necessary functions to traverse the node tree, access the nodes and their attribute values, insert and delete nodes, and convert the node tree back to xml.

    the following table lists the most commonly used node types supported by microsoft's xml parser:

    node typeexample
    processing instruction<?xml version="1.0"?>
    element<drink type="beer">carlsberg</drink>
    attributetype="beer"
    textcarlsberg

    msxml parser 2.5 is the xml parser that is shipped with windows 2000 and ie 5.5.

    msxml parser 3.0 is the xml parser that is shipped with ie 6.0 and windows xp.

    the msxml 3.0 parser features:

    • javascript, vbscript, perl, vb, java, c , etc. support
    • complete xml support
    • full dom and namespace support
    • dtd and validation
    • complete xslt and xpath support
    • sax2 support
    • server-safe http

    to create an instance of microsoft's xml parser with javascript, use the following code:

    var xmldoc=new activexobject("microsoft.xmldom")

    to create an instance of microsoft's xml parser with vbscript, use the following code:

    set xmldoc=createobject("microsoft.xmldom")

    to create an instance of microsoft's xml parser in an asp page (using vbscript), use the following code:

    set xmldoc=server.createobject("microsoft.xmldom")

    the following code loads an existing xml document ("note.xml") into microsoft's xml parser:

    the first line of the script above creates an instance of the microsoft xml parser. the third line tells the parser to load an xml document called "note.xml". the second line turns off asynchronized loading, to make sure that the parser will not continue execution of the script before the document is fully loaded.


    xml parser in mozilla browsers

    plain xml documents are displayed in a tree-like structure in mozilla (just like ie).

    mozilla also supports parsing of xml data using javascript. the parsed data can be displayed as html.

    to create an instance of the xml parser with javascript in mozilla browsers, use the following code:

    var xmldoc=document.implementation.createdocument("ns","root",null)

    the first parameter, ns, defines the namespace used for the xml document. the second parameter, root, is the xml root element in the xml file. the third parameter, null, is always null because it is not implemented yet.

    the following code loads an existing xml document ("note.xml") into mozillas' xml parser:

    the first line of the script above creates an instance of the xml parser. the second line tells the parser to load an xml document called "note.xml".


    loading an xml file - a cross browser example

    the following example is a cross browser example that loads an existing xml document ("note.xml") into the xml parser:

    to:
    from:


    message:

    try it yourself


    loading xml text into the parser

    internet explorer supports two ways of loading xml into a document object: the load() method and the loadxml() method. the load() method loads an xml file and the loadxml() method loads a text string that contains xml code.

    the following code loads a text string into microsoft's xml parser:

    if you have internet explorer, you can try it yourself.



    xzc 2006-11-16 12:20
    ]]>
    buffalo vs dwrhttp://www.blogjava.net/xzclog/archive/2006/10/19/76177.htmlxzcxzcthu, 19 oct 2006 07:31:00 gmthttp://www.blogjava.net/xzclog/archive/2006/10/19/76177.htmlhttp://www.blogjava.net/xzclog/comments/76177.htmlhttp://www.blogjava.net/xzclog/archive/2006/10/19/76177.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/76177.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/76177.html

    摘要:

    本文根据bjug maillist讨论整理,取自buffalo网站,在此对michael的贡献表示感谢!文中引用的评论仅表示个人观点,供大家作为技术参考。先敬佩michael一个,能做到这样,michael付出了很多。下文简单比较一下buffalo和dwr,两者的思路基本类似,有很多共性的东西。总的看来,buffalo能满足基本的需要,但dwr已经在整体系统结构上有了更多优势...
    buffalo vs dwr

    作者:

    声明:文中引用的评论仅表示个人观点,供大家作为技术参考。


    开篇言:

        本文根据 maillist讨论整理,取自,在此对michael的贡献表示感谢!文中引用的评论仅表示个人观点,供大家作为技术参考。先敬佩michael一个,能做到这样,michael付出了很多。下文简单比较一下buffalo和dwr,两者的思路基本类似,有很多共性的东西。总的看来,buffalo能满足基本的需要,但dwr已经在整体系统结构上有了更多优势。框架的生命周期是有限的,如果不能与时俱进,将迟早面临被淘汰的局面。

    凯发k8网页登录的版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
    作者:cleverpig;
    原文:
    关键字:buffalo,dwr,ajax,比较

    一、两个ajax框架:


        是一个为java web项目而设计的轻量级ajax框架。它是开源的(apache license 2.0),其功能强大且易用。主要解决在j2ee ajax开发中的常见问题。它承诺为开发者和最终用户都能受益。最重要的buffalo的作者michael chen是位中国开发者,他就生活在北京。


        是一个java开源库,帮助你实现ajax网站。它可以让你在浏览器中的javascript代码调用web服务器上的java,就像在java代码就在浏览器中一样。dwr会根据你的java类动态的生成javascript代码。这些代码的魔力是让你感觉整个ajax调用都是在浏览器上发生的,但事实上是服务器执行了这些代码,dwr负责数据的传递和转换。

    二、共性:

        支持spring集成:均支持。

        使用一个servlet来接收所有的ajax请求:
            buffalo使用applicationservlet<————>dwr使用dwrservlet。

        使用xmlhttprequest javascript 传输数据:
            buffalo使用buffalo.js<————>dwr使用dwr.js & util.js。

        在java和javascript之间转换数据:
            buffalo使用marshallingcontext<————>dwr使用converter。

        协议:
            buffalo在1.2.x之前采用burlap, buffalo解析大数据量可能会比较慢,然而可以适用于多种服务器端和客户端,并且burlap协议的完整性和支持的数据类型更加丰富。2.0开始采用自定义的基于xml的协议(来自burlap,做了更适合web的修改),并自行编写了解析器,性能更高。

            dwr使用自定义的简单文本协议。


    三、buffalo特性:

       1. 基于prototype:如果你的ajax应用也是基于prototype,那么可以减少重复加载prototype的带宽,并且获得相当一致的编程概念。

       2. bind:提供了对结果数据的处理,直接将数据绑定到页面对象并展示,这是一个动人的特性。(dwr在util.js中也提供了一些方法来简化数据的展示,但不如 buffalo做的更多。) 在2.0中,bind能力更加强大,能够将值直接绑定到表单元素、表格、div/span、甚至整个表单上。关键是这种绑定是无侵入并且与buffalo 整体结构完全整合,对外表现只有一个简单的buffalo.bindreply或者buffalo.bind.bind即可。http://buffalo.sourceforge.net/binding.html有一些描述。

       3. 序列化:buffalo支持任意对象,任意深度,任意数据结构的java到javascript以及javascript到java的双向序列化。并且支持引用。这里有完整的协议说明。由于文档和演示不充分,很多人以为buffalo不支持任意对象了 ~

       4. 生命周期对象访问:1.2.4之前需要继承一个buffaloservice,
        从1.2.4开始就不需要继承了,引入了线程安全的buffalocontext对象,只需要通过buffalocontext.getcontext()即可获得一个线程安全的引用,并且对request的各种属性进行操作。更方便的是:

          map buffalocontext.getcontext.getsession()
          map buffalocontext.getcontext.getapplication()
          map buffalocontext.getcontext.getcookie()

          即可获得session/application/cookie的map,操作这些map即可获得对这些生命周期的各种变量进行查询和更新。这个特性参考了webwork中actioncontext的设计。

       5. 对collection/array的模糊处理:buffalo中提供了对collection/array对象的模糊识别能力。例如:服务器端有一个方法需要list参数,客户端传递过去一个javascript数组就可以了,不需要费心的组装对象。buffalo通过这些很细小的地方来提高程序员生产力。

       6. 客户端组装对象:据报告dwr只支持简单数据类型作为参数在客户端传入。buffalo支持在客户端组装对象,甚至可以直接将整个表单序列化为一个对象作为参数传给远程客户端。dwr协议天生不足,这方面,我猜想它完全没有能力。

       7. 对重载方法的处理能力:由于java与javascript之间类型的不匹配,dwr的代码生成无法对重载方法进行处理。例如,sum(double,double), sum(int, int) dwr很可能不知道你要调用哪一个。从2.0开始buffalo支持了对重载的处理。

    四、dwr特性:

       1. 支持batch:可以将多个service函数调用放在一个xmlhttprequest请求中完成。

       michael chen评论:我一直认为这不是一个好的实践。在客户端发起多个请求并获得响应除了获得编程的复杂外,还增加了服务器端设计service的自由度。这种方式感觉上更鼓励为远程调用设计细粒度的服务、将组装逻辑放在客户端。这种设计风格我不太喜欢,因此batch也一直没有考虑实现,虽然实现不太麻烦。

       2. converter:可以转换任意类型的java对象到javascript,并允许直接使用。例如:customer类包含一个address变量,当ajaxcall返回customer对象的时候,可以直接在javascript中使用customer.address来获得address的信息。

       3. httpservlet:支持在被调用的service方法中获得httpservletrequest和httpservletresponse对象,这样可以访问当前session中的数据。

       4. 允许expose部分函数和属性。(buffalo无限制,可以访问service中的任意函数。)

       michael chen评论: 这个我也考虑过...dwr的代码生成机制使得它不得不通过这种方式减小些流量。buffalo如果想实现这个特性也不是不行,只是我觉得,既然 service辛辛苦苦实现了,还需要通过这种方式来让别人不能用么?况且buffalo没有代码生成,无论你暴露多少方法流量都是一样的。考虑到实际情况,buffalo没有实现这个特性。

       5. dwr2.0中提出了reverse ajax:提供在java代码中来处理页面上元素的功能。

       michael chen评论: 这个东东...也还是代码生成的trick...然而我的态度是javascript与java同样重要的,因此不会让代码生成类的东西破坏javascript的整体性。


    五、相关资源:


       在过去的两年间,baffalo的开发者拥有值得兴奋的积极反馈:buffalo非常适于在java web项目的ajax开发。为了帮助更多的用户更好地使用buffalo,他们期待你的帮助:发布文档、bug报告和bug修正等。

       baffalo maillist:

       baffalo 论坛:




    xzc 2006-10-19 15:31
    ]]>
    ajax自动完成功能http://www.blogjava.net/xzclog/archive/2006/10/08/73785.htmlxzcxzcsun, 08 oct 2006 06:12:00 gmthttp://www.blogjava.net/xzclog/archive/2006/10/08/73785.htmlhttp://www.blogjava.net/xzclog/comments/73785.htmlhttp://www.blogjava.net/xzclog/archive/2006/10/08/73785.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/73785.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/73785.html

    近日学习了一下ajax,照做了几个例子,感觉比较新奇。

    第一个就是自动完成的功能即autocomplete,具体的例子可以在这里看:

    在search框内输入一个产品型号,就可以看见效果了。

    这里用到了一个开源的代码:,有兴趣的可以看一下。

    以下为代码片断:

    index.htm





    不知道为什么不能用keywords做文本框的名字,我试了很久,后来还是用keyword,搞得还要修改原代码。

    forcsv.php

      $keyword = $_get['q'];
      $count = 0;
      $handle = fopen("products.csv", "r");
      while (($data = fgetcsv($handle, 1000)) !== false) {
        if (preg_match("/$keyword/i", $data[0])) {
          if ($count > 10) { break; }
    ?>
         


           
         

        }
      }
      fclose($handle);
      if ($count == 0) {
    ?>
      : (, nothing found.
      }
    ?>

    原来的例子中的csv文件是根据\t来分隔的,我们也可以用空格或其它的来分隔,这取决于你的数据结构。

    当然你也可以不读文件,改从数据库里读资料,就不再废话了。

    效果图如下:

     



    trackback: http://tb.blog.csdn.net/trackback.aspx?postid=635858

    []   jxyuhua发表于 2006年03月23日 12:08:00



    xzc 2006-10-08 14:12
    ]]>
    xml 问题: 超越 dom (轻松使用 dom 的技巧和诀窍)http://www.blogjava.net/xzclog/archive/2006/08/22/65083.htmlxzcxzctue, 22 aug 2006 07:21:00 gmthttp://www.blogjava.net/xzclog/archive/2006/08/22/65083.htmlhttp://www.blogjava.net/xzclog/comments/65083.htmlhttp://www.blogjava.net/xzclog/archive/2006/08/22/65083.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/65083.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/65083.html文档对象模型(document object model,dom)是用于操纵 xml 和 html 数据的最常用工具之一,然而它的潜力却很少被充分挖掘出来。通过利用 dom 的优势,并使它更加易用,您将获得一款应用于 xml 应用程序(包括动态 web 应用程序)的强大工具。

    本期文章介绍了一位客串的专栏作家,同时也是我的朋友和同事 dethe elza。dethe 在利用 xml 进行 web 应用程序开发方面经验丰富,在此,我要感谢他对我在介绍使用 dom 和 ecmascript 进行 xml 编程这一方面的帮助。请密切关注本专栏,以了解 dethe 的更多专栏文章。 —— david mertz

    dom 是处理 xml 和 html 的标准 api 之一。由于它占用内存大、速度慢,并且冗长,所以经常受到人们的指责。尽管如此,对于很多应用程序来说,它仍然是最佳选择,而且比 xml 的另一个主要 api —— sax 无疑要简单得多。dom 正逐渐出现在一些工具中,比如 web 浏览器、svg 浏览器、openoffice,等等。

    dom 很好,因为它是一种标准,并且被广泛地实现,同时也内置到其他标准中。作为标准,它对数据的处理与编程语言无关(这可能是优点,也可能是缺点,但至少使我们处理数据的方式变得一致)。dom 现在不仅内置于 web 浏览器,而且也成为许多基于 xml 的规范的一部分。既然它已经成为您的工具的一部分,并且或许您偶尔还会使用它,我想现在应该充分利用它给我们带来的功能了。

    在使用 dom 一段时间后,您会看到形成了一些模式 —— 您想要反复做的事情。快捷方式可以帮助您处理冗长的 dom,并创建自解释的、优雅的代码。这里收集了一些我经常使用的技巧和诀窍,还有一些 javascript 示例。

    第一个诀窍就是“没有诀窍”。dom 有两种方法将孩子节点添加到容器节点(常常是一个 element,也可能是一个 documentdocumentfragment):appendchild(node)insertbefore(node, referencenode)。看起来似乎缺少了什么。假如我想在一个参考节点后面插入或者由前新增(prepend)一个子节点(使新节点位于列表中的第一位),我该怎么做呢?很多年以来,我的解决方法是编写下列函数:



    												
    														function insertafter(parent, node, referencenode) {
        if(referencenode.nextsibling) {
            parent.insertbefore(node, referencenode.nextsibling);
        } else {
            parent.appendchild(node);
        }
    }
    function prependchild(parent, node) {
        if (parent.firstchild) {
            parent.insertbefore(node, parent.firstchild);
        } else {
            parent.appendchild(node);
        }
    }
    
    												
    										

    实际上,像清单 1 一样,insertbefore() 函数已经被定义为,在参考节点为空时返回到 appendchild()。因此,您可以不使用上面的方法,而使用 中的方法,或者跳过它们仅使用内置函数:



    												
    														function insertafter(parent, node, referencenode) {
        parent.insertbefore(node, referencenode.nextsibling);
    }
    function prependchild(parent, node) {
        parent.insertbefore(node, parent.firstchild);
    }
    
    												
    										

    如果您刚刚接触 dom 编程,有必要指出的是,虽然您可以使多个指针指向一个节点,但该节点只能存在于 dom 树中的一个位置。因此,如果您想将它插入到树中,没必要先将它从树中移除,因为它会自动被移除。当重新将节点排序时,这种机制很方便,仅需将节点插入到新位置即可。

    根据这种机制,若想交换两个相邻节点(称为 node1node2)的位置,可以使用下列方案之一:

    												
    														
    																
    																		node1.parentnode.insertbefore(node2, node1);
    																
    														
    node1.parentnode.insertbefore(node2, node1);

    												
    														
    																
    																		node1.parentnode.insertbefore(node1.nextsibling, node1);
    																
    														
    node1.parentnode.insertbefore(node1.nextsibling, node1);







    web 页面中大量应用了 dom。若访问 bookmarklets 站点(参阅 ),您会发现很多有创意的简短脚本,它们可以重新编排页面,提取链接,隐藏图片或 flash 广告,等等。

    但是,因为 internet explorer 没有定义 node 接口常量(可以用于识别节点类型),所以您必须确保在遗漏接口常量时,首先为 web 在 dom 脚本中定义接口常量。



    												
    														if (!window['node']) {
        window.node = new object();
        node.element_node = 1;
        node.attribute_node = 2;
        node.text_node = 3;
        node.cdata_section_node = 4;
        node.entity_reference_node = 5;
        node.entity_node = 6;
        node.processing_instruction_node = 7;
        node.comment_node = 8;
        node.document_node = 9;
        node.document_type_node = 10;
        node.document_fragment_node = 11;
        node.notation_node = 12;
    }
    
    												
    										

    展示如何提取包含在节点中的所有文本节点:



    												
    														function innertext(node) {
        // is this a text or cdata node?
        if (node.nodetype == 3 || node.nodetype == 4) {
            return node.data;
        }
        var i;
        var returnvalue = [];
        for (i = 0; i < node.childnodes.length; i  ) {
            returnvalue.push(innertext(node.childnodes[i]));
        }
        return returnvalue.join('');
    }
    
    												
    										







    人们常常抱怨 dom 太过冗长,并且简单的功能也需要编写大量代码。例如,如果您想创建一个包含文本并响应点击按钮的

    元素,代码可能类似于:

    												
    														function handle_button() {
        var parent = document.getelementbyid('mycontainer');
        var div = document.createelement('div');
        div.classname = 'mydivcssclass';
        div.id = 'mydivid';
        div.style.position = 'absolute';
        div.style.left = '300px';
        div.style.top = '200px';
        var text = "this is the first text of the rest of this code";
        var textnode = document.createtextnode(text);
        div.appendchild(textnode);
        parent.appendchild(div);
    }
    
    												
    										

    若频繁按照这种方式创建节点,键入所有这些代码会使您很快疲惫不堪。必须有更好的凯发天生赢家一触即发官网的解决方案 —— 确实有这样的凯发天生赢家一触即发官网的解决方案!下面这个实用工具可以帮助您创建元素、设置元素属性和风格,并添加文本子节点。除了 name 参数,其他参数都是可选的。



    												
    														function elem(name, attrs, style, text) {
        var e = document.createelement(name);
        if (attrs) {
            for (key in attrs) {
                if (key == 'class') {
                    e.classname = attrs[key];
                } else if (key == 'id') {
                    e.id = attrs[key];
                } else {
                    e.setattribute(key, attrs[key]);
                }
            }
        }
        if (style) {
            for (key in style) {
                e.style[key] = style[key];
            }
        }
        if (text) {
            e.appendchild(document.createtextnode(text));
        }
        return e;
    }
    
    												
    										

    使用该快捷方式,您能够以更加简洁的方法创建 中的

    元素。注意,attrsstyle 参数是使用 javascript 文本对象而给出的。

    												
    														function handle_button() {
        var parent = document.getelementbyid('mycontainer');
        parent.appendchild(elem('div',
          {class: 'mydivcssclass', id: 'mydivid'}
          {position: 'absolute', left: '300px', top: '200px'},
          'this is the first text of the rest of this code'));
    }
    
    												
    										

    在您想要快速创建大量复杂的 dhtml 对象时,这种实用工具可以节省您大量的时间。模式在这里就是指,如果您有一种需要频繁创建的特定的 dom 结构,则使用实用工具来创建它们。这不但减少了您编写的代码量,而且也减少了重复的剪切、粘贴代码(错误的罪魁祸首),并且在阅读代码时思路更加清晰。







    dom 通常很难告诉您,按照文档的顺序,下一个节点是什么。下面有一些实用工具,可以帮助您在节点间前后移动:



    												
    														// return next node in document order
    function nextnode(node) {
        if (!node) return null;
        if (node.firstchild){
            return node.firstchild;
        } else {
            return nextwide(node);
        }
    }
    // helper function for nextnode()
    function nextwide(node) {
        if (!node) return null;
        if (node.nextsibling) {
            return node.nextsibling;
        } else {
            return nextwide(node.parentnode);
        }
    }
    // return previous node in document order
    function prevnode(node) {
        if (!node) return null;
        if (node.previoussibling) {
          return previousdeep(node.previoussibling);
        }
        return node.parentnode;
    }
    // helper function for prevnode()
    function previousdeep(node) {
        if (!node) return null;
        while (node.childnodes.length) {
            node = node.lastchild;
        }
        return node;
    }
    
    												
    										







    有时候,您可能想要遍历 dom,在每个节点调用函数或从每个节点返回一个值。实际上,由于这些想法非常具有普遍性,所以 dom level 2 已经包含了一个称为 dom traversal and range 的扩展(为迭代 dom 所有节点定义了对象和 api),它用来为 dom 中的所有节点应用函数和在 dom 中选择一个范围。因为这些函数没有在 internet explorer 中定义(至少目前是这样),所以您可以使用 nextnode() 来做一些类似的事情。

    在这里,我们的想法是创建一些简单、普通的工具,然后以不同的方式组装它们来达到预期的效果。如果您很熟悉函数式编程,这看起来会很亲切。beyond js 库(参阅 )将此理念发扬光大。



    												
    														// return an array of all nodes, starting at startnode and
    // continuing through the rest of the dom tree
    function listnodes(startnode) {
        var list = new array();
        var node = startnode;
        while(node) {
            list.push(node);
            node = nextnode(node);
        }
        return list;
    }
    // the same as listnodes(), but works backwards from startnode.
    // note that this is not the same as running listnodes() and
    // reversing the list.
    function listnodesreversed(startnode) {
        var list = new array();
        var node = startnode;
        while(node) {
            list.push(node);
            node = prevnode(node);
        }
        return list;
    }
    // apply func to each node in nodelist, return new list of results
    function map(list, func) {
        var result_list = new array();
        for (var i = 0; i < list.length; i  ) {
            result_list.push(func(list[i]));
        }
        return result_list;
    }
    // apply test to each node, return a new list of nodes for which
    // test(node) returns true
    function filter(list, test) {
        var result_list = new array();
        for (var i = 0; i < list.length; i  ) {
            if (test(list[i])) result_list.push(list[i]);
        }
        return result_list;
    }
    
    												
    										

    清单 9 包含了 4 个基本工具。listnodes()listnodesreversed() 函数可以扩展到一个可选的长度,这与 arrayslice() 方法效果类似,我把这个作为留给您的练习。另一个需要注意的是,map()filter() 函数是完全通用的,用于处理任何 列表(不只是节点列表)。现在,我向您展示它们的几种组合方式。



    												
    														// a list of all the element names in document order
    function iselement(node) {
        return node.nodetype == node.element_node;
    }
    function nodename(node) {
        return node.nodename;
    }
    var elementnames = map(filter(listnodes(document),iselement), nodename);
    // all the text from the document (ignores cdata)
    function istext(node) {
        return node.nodetype == node.text_node;
    }
    function nodevalue(node) {
        return node.nodevalue;
    }
    var alltext = map(filter(listnodes(document), istext), nodevalue);
    
    												
    										

    您可以使用这些实用工具来提取 id、修改样式、找到某种节点并移除,等等。一旦 dom traversal and range api 被广泛实现,您无需首先构建列表,就可以用它们修改 dom 树。它们不但功能强大,并且工作方式也与我在上面所强调的方式类似。

    注意,核心 dom api 并不能使您将 xml 数据解析到 dom,或者将 dom 序列化为 xml。这些功能都定义在 dom level 3 的扩展部分“load and save”,但它们还没有被完全实现,因此现在不要考虑这些。每个平台(浏览器或其他专业 dom 应用程序)有自己在 dom 和 xml 间转换的方法,但跨平台转换不在本文讨论范围之内。

    dom 并不是十分安全的工具 —— 特别是使用 dom api 创建不能作为 xml 序列化的树时。绝对不要在同一个程序中混合使用 dom1 非名称空间 api 和 dom2 名称空间感知的 api(例如,createelementcreateelementns)。如果您使用名称空间,请尽量在根元素位置声明所有名称空间,并且不要覆盖名称空间前缀,否则情况会非常混乱。一般来说,只要按照惯例,就不会触发使您陷入麻烦的临界情况。

    如果您一直使用 internet explorer 的 innertextinnerhtml 进行解析,那么您可以试试使用 elem() 函数。通过构建类似的一些实用工具,您会得到更多便利,并且继承了跨平台代码的优越性。将这两种方法混合使用是非常糟糕的。

    某些 unicode 字符并没有包含在 xml 中。dom 的实现使您可以添加它们,但后果是无法序列化。这些字符包括大多数的控制字符和 unicode 代理对(surrogate pair)中的单个字符。只有您试图在文档中包含二进制数据时才会遇到这种情况,但这是另一种转向(gotcha)情况。







    我已经介绍了 dom 能做的很多事情,但是 dom(和 javascript)可以做的事情远不止这些。仔细研究、揣摩这些例子,看看是如何使用它们来解决可能需要客户端脚本、模板或专用 api 的问题。

    dom 有自己的局限性和缺点,但同时也拥有众多优点:它内置于很多应用程序中;无论使用 java 技术、python 或 javascript,它都以相同方式工作;它非常便于使用 sax;使用上述的模板,它使用起来既简洁又强大。越来越多的应用程序开始支持 dom,这包括基于 mozilla 的应用程序、openoffice 和 blast radius 的 xmetal。越来越多的规范需要 dom,并对它加以扩展(例如,svg),因此 dom 时时刻刻就在您的身边。使用这种被广泛部署的工具,绝对是您的明智之举。







    • 您可以参阅本文在 developerworks 全球站点上的 。

    • 下载 ,它包含了上面的脚本和一个用于测试这些脚本的简单 。

    • 直接访问 dom 发源地 —— w3c 的 ,其中包含到所有与文档对象模型相关的标准的链接。

    • 查看 jesse ruderman 的 。虽然 ruderman 没有创造术语“bookmarkets”,但他收集了很多一流的、简短的、书签似的 javascript,使用它们开发 dom 的巨大潜力,使您的浏览器可以为您带来更多帮助。

    • 访问 sjoerd visscher 的 库,它提供了远远超过我在这里提及的用于函数式编程的工具。如果您可以将事物抽象为函数,那么 javascript 将会成为您得心应手的工具。

    • dom api 的标准参考在 w3c。这里是 的网址。

    • 了解 ajax 为什么已经引起了这么大的反响。它使用了异步调用来使服务器实时升级 web 应用程序。您可以使用上述的许多技术,并阅读 。

    • 了解一下 xml 编辑器和工具的 系列,它们都支持 dom api。它们由作者所在的公司 blast radius 开发。

    • 在 developerworks 的 了解更多 xml 相关的书籍,其中包括 david mertz 的 一书。

    • 了解如何才能成为 。


    xzc 2006-08-22 15:21
    ]]>web打印大全http://www.blogjava.net/xzclog/archive/2006/08/22/65079.htmlxzcxzctue, 22 aug 2006 07:07:00 gmthttp://www.blogjava.net/xzclog/archive/2006/08/22/65079.htmlhttp://www.blogjava.net/xzclog/comments/65079.htmlhttp://www.blogjava.net/xzclog/archive/2006/08/22/65079.html#feedback4http://www.blogjava.net/xzclog/comments/commentrss/65079.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/65079.html(1) 
    function setprintsettings() { 
     // -- advanced features 
     factory.printing.setmarginmeasure(2) // measure margins in inches 
     factory.setpagerange(false, 1, 3) // need pages from 1 to 3 
     factory.printing.printer = "hp deskjet 870c" 
     factory.printing.copies = 2 
     factory.printing.collate = true 
     factory.printing.papersize = "a4" 
     factory.printing.papersource = "manual feed" 

     // -- basic features 
     factory.printing.header = "this is meadco" 
     factory.printing.footer = "advanced printing by scriptx" 
     factory.printing.portrait = false 
     factory.printing.leftmargin = 1.0 
     factory.printing.topmargin = 1.0 
     factory.printing.rightmargin = 1.0 
     factory.printing.bottommargin = 1.0 

     

    (2) 
     
      function printsetup(){ 
      // 打印页面设置 
      wb.execwb(8,1); 
      } 
      function printpreview(){ 
      // 打印页面预览 
         
      wb.execwb(7,1); 
          
         
      } 

      function printit() 
      { 
      if (confirm(''确定打印吗?'')) { 
      wb.execwb(6,6) 
      } 
      } 
       
     
     

    height=0 id=wb name=wb width=0> 

    onclick="javascript:printit()"> 

    onclick="javascript:printsetup();"> 

    onclick="javascript:printpreview();"> 

    onclick="javascript:window.close();"> 

    ------------------------------------------------ 
    关于这个组件还有其他的用法,列举如下: 
    webbrowser.execwb(1,1) 打开 
    web.execwb(2,1) 关闭现在所有的ie窗口,并打开一个新窗口 
    web.execwb(4,1) 保存网页 
    web.execwb(6,1) 打印 
    web.execwb(7,1) 打印预览 
    web.execwb(8,1) 打印页面设置 
    web.execwb(10,1) 查看页面属性 
    web.execwb(15,1) 好像是撤销,有待确认 
    web.execwb(17,1) 全选 
    web.execwb(22,1) 刷新 
    web.execwb(45,1) 关闭窗体无提示 

    2、分页打印 
     
     
     
     
     
    <%while not rs.eof%> 

    <%=rs(0)%>

     
    <%rs.movenext%> 
    <%wend%> 
     
     

    3、asp页面打印时如何去掉页面底部的路径和顶端的页码编号 
    (1)ie的文件-〉页面设置-〉讲里面的页眉和页脚里面的东西都去掉,打印就不出来了。 
    (2) 
     
     new document  
     
     
     
    dim hkey_root,hkey_path,hkey_key 
    hkey_root="hkey_current_user" 
    hkey_path="\software\microsoft\internet explorer\pagesetup" 
    ''//设置网页打印的页眉页脚为空 
    function pagesetup_null() 
      on error resume next 
      set regwsh = createobject("wscript.shell") 
      hkey_key="\header"   
      regwsh.regwrite hkey_root hkey_path hkey_key,"" 
      hkey_key="\footer" 
      regwsh.regwrite hkey_root hkey_path hkey_key,"" 
    end function 
    ''//设置网页打印的页眉页脚为默认值 
    function pagesetup_default() 
      on error resume next 
      set regwsh = createobject("wscript.shell") 
      hkey_key="\header"   
      regwsh.regwrite hkey_root hkey_path hkey_key,"&w&b页码,&p/&p" 
      hkey_key="\footer" 
      regwsh.regwrite hkey_root hkey_path hkey_key,"&u&b&d" 
    end function 
     
     

     

     

     

     

     

     

     
     
     

     
     
     
    4、浮动帧打印 
     
    function button1_onclick() { 
      var odoc=window.iframe1.document; 
      var r=odoc.body.createtextrange(); 
      var stxt=r.htmltext; 
      alert(stxt) 
      var pwin=window.open("","print"); 
      pwin.document.write(stxt); 
      pwin.print(); 

     
    4、用filesystem组件实现web应用中的本地特定打印 
     
    function print_onclick //打印函数 
    dim label 
    label=document.printinfo.label.value //获得html页面的数据 
    set objfs=createobject("scripting.filesystemobject") //创建filesystem组件对象的实例 
    set objprinter=objfs.createtextfile ("lpt1:",true) //建立与打印机的连接 
    objprinter.writeline("__________________________________") //输出打印的内容 
    objprinter.writeline("| |") 
    objprinter.writeline("| 您打印的数据是:"&label& " |”) 
    objprinter.writeline("| |") 
    objprinter.writeline("|_________________________________|") 
    objprinter.close //断开与打印机的连接 
    set objprinter=nothing 
    set objfs=nothing // 关闭filesystem组件对象 
    end function 
     
    服务器端脚本: 
    <%……… 
    set conn=server.createobject ("adodb.connection") 
    conn.open "dsn=name;uid=xxxx;pwd=xxxx;" 
    set rs=server.createobject("adodb.recordset") 
    rs.open(“select ……”),conn,1,1 
    ……….%> //与数据库进行交互 
    html页面编码: 
     
    ……… 
     
    >" id=print name=print > //调用打印函数 
    > //保存服务器端传来的数据 
    ……… 



    xzc 2006-08-22 15:07
    ]]>
    javascript中使用dom操作xml文档 http://www.blogjava.net/xzclog/archive/2006/06/22/54451.htmlxzcxzcthu, 22 jun 2006 04:28:00 gmthttp://www.blogjava.net/xzclog/archive/2006/06/22/54451.htmlhttp://www.blogjava.net/xzclog/comments/54451.htmlhttp://www.blogjava.net/xzclog/archive/2006/06/22/54451.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/54451.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/54451.html<script language="javascript">

    script>

    、文档对象模型(dom)
      文档对象模型(dom)是表示文档(比如html和xml)和访问、操作构成文档的各种元素的应用程序接口(api)。一般的,支持javascript的所有浏览器都支持dom。本文所涉及的dom,是指w3c定义的标准的文档对象模型,它以树形结构表示html和xml文档,定义了遍历这个树和检查、修改树的节点的方法和属性。

    7.4.1、dom眼中的html文档:树
      在dom眼中,html跟xml一样是一种树形结构的文档,是根(root)节点,、、<body>是<html>的子(children)节点,互相之间是兄弟(sibling)节点;<body>下面才是子节点<table>、<span>、<p>等等。如下图: <p>  <img src="http://dev2dev.bea.com.cn/images/image051114027.gif" /></p><p>  这个是不是跟xml的结构有点相似呢。不同的是,html文档的树形主要包含表示元素、标记的节点和表示文本串的节点。</p>7.4.2、html文档的节点<br />  dom下,html文档各个节点被视为各种类型的node对象。每个node对象都有自己的属性和方法,利用这些属性和方法可以遍历整个文档树。由于html文档的复杂性,dom定义了nodetype来表示节点的类型。这里列出node常用的几种节点类型: <table cellspacing="1" cellpadding="4" bgcolor="#000000"><tbody><tr bgcolor="#ffffff"><td valign="top" width="159">接口</td><td valign="top" width="322">nodetype常量</td><td valign="top" width="113">nodetype值</td><td valign="top" width="117">备注</td></tr><tr bgcolor="#ffffff"><td valign="top" width="159">element</td><td valign="top" width="322">node.element_node</td><td valign="top" width="113">1</td><td valign="top" width="117">元素节点</td></tr><tr bgcolor="#ffffff"><td valign="top" width="159">text</td><td valign="top" width="322">node.text_node</td><td valign="top" width="113">3</td><td valign="top" width="117">文本节点</td></tr><tr bgcolor="#ffffff"><td valign="top" width="159">document</td><td valign="top" width="322">node.document_node</td><td valign="top" width="113">9</td><td valign="top" width="117">document</td></tr><tr bgcolor="#ffffff"><td valign="top" width="159">comment</td><td valign="top" width="322">node.comment_node</td><td valign="top" width="113">8</td><td valign="top" width="117">注释的文本</td></tr><tr bgcolor="#ffffff"><td valign="top" width="159">documentfragment</td><td valign="top" width="322">node.document_fragment_node</td><td valign="top" width="113">11</td><td valign="top" width="117">document片断</td></tr><tr bgcolor="#ffffff"><td valign="top" width="159">attr</td><td valign="top" width="322">node.attribute_node</td><td valign="top" width="113">2</td><td valign="top" width="117">节点属性</td></tr></tbody></table><p>  dom树的根节点是个document对象,该对象的documentelement属性引用表示文档根元素的element对象(对于html文档,这个就是<html>标记)。javascript操作html文档的时候,document即指向整个文档,<body>、<table>等节点类型即为element。comment类型的节点则是指文档的注释。具体节点类型的含义,请参考《javascript权威指南》,在此不赘述。</p><p>  document定义的方法大多数是生产型方法,主要用于创建可以插入文档中的各种类型的节点。常用的document方法有:</p><table cellspacing="1" cellpadding="4" bgcolor="#000000"><tbody><tr bgcolor="#ffffff"><td valign="top" width="204">方法</td><td valign="top" width="506">描述</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">createattribute()</td><td valign="top" width="506">用指定的名字创建新的attr节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">createcomment()</td><td valign="top" width="506">用指定的字符串创建新的comment节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">createelement()</td><td valign="top" width="506">用指定的标记名创建新的element节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">createtextnode()</td><td valign="top" width="506">用指定的文本创建新的textnode节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">getelementbyid()</td><td valign="top" width="506">返回文档中具有指定id属性的element节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">getelementsbytagname()</td><td valign="top" width="506">返回文档中具有指定标记名的所有element节点。</td></tr></tbody></table><p>  对于element节点,可以通过调用getattribute()、setattribute()、removeattribute()方法来查询、设置或者删除一个element节点的性质,比如<table>标记的border属性。下面列出element常用的属性:</p><table cellspacing="1" cellpadding="4" bgcolor="#000000"><tbody><tr bgcolor="#ffffff"><td valign="top" width="99">属性</td><td valign="top" width="611">描述</td></tr><tr bgcolor="#ffffff"><td valign="top" width="99">tagname</td><td valign="top" width="611">元素的标记名称,比如<p>元素为p。html文档返回的tabname均为大写。</td></tr></tbody></table><p>  element常用的方法:</p><table cellspacing="1" cellpadding="4" bgcolor="#000000"><tbody><tr bgcolor="#ffffff"><td valign="top" width="204">方法</td><td valign="top" width="506">描述</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">getattribute()</td><td valign="top" width="506">以字符串形式返回指定属性的值。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">getattributenode()</td><td valign="top" width="506">以attr节点的形式返回指定属性的值。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">getelementsbytabname()</td><td valign="top" width="506">返回一个node数组,包含具有指定标记名的所有element节点的子孙节点,其顺序为在文档中出现的顺序。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">hasattribute()</td><td valign="top" width="506">如果该元素具有指定名字的属性,则返回true。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">removeattribute()</td><td valign="top" width="506">从元素中删除指定的属性。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">removeattributenode()</td><td valign="top" width="506">从元素的属性列表中删除指定的attr节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">setattribute()</td><td valign="top" width="506">把指定的属性设置为指定的字符串值,如果该属性不存在则添加一个新属性。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="204">setattributenode()</td><td valign="top" width="506">把指定的attr节点添加到该元素的属性列表中。</td></tr></tbody></table><p>  attr对象代表文档元素的属性,有name、value等属性,可以通过node接口的attributes属性或者调用element接口的getattributenode()方法来获取。不过,在大多数情况下,使用element元素属性的最简单方法是getattribute()和setattribute()两个方法,而不是attr对象。 </p>7.4.3、使用dom操作html文档<br />  node对象定义了一系列属性和方法,来方便遍历整个文档。用parentnode属性和childnodes[]数组可以在文档树中上下移动;通过遍历childnodes[]数组或者使用firstchild和nextsibling属性进行循环操作,也可以使用lastchild和previoussibling进行逆向循环操作,也可以枚举指定节点的子节点。而调用appendchild()、insertbefore()、removechild()、replacechild()方法可以改变一个节点的子节点从而改变文档树。 <p>  需要指出的是,childnodes[]的值实际上是一个nodelist对象。因此,可以通过遍历childnodes[]数组的每个元素,来枚举一个给定节点的所有子节点;通过递归,可以枚举树中的所有节点。下表列出了node对象的一些常用属性和方法:</p><p>  node对象常用属性:</p><table cellspacing="1" cellpadding="4" bgcolor="#000000"><tbody><tr bgcolor="#ffffff"><td valign="top" width="114">属性</td><td valign="top" width="596">描述</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">attributes</td><td valign="top" width="596">如果该节点是一个element,则以namednodemap形式返回该元素的属性。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">childnodes</td><td valign="top" width="596">以node[]的形式存放当前节点的子节点。如果没有子节点,则返回空数组。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">firstchild</td><td valign="top" width="596">以node的形式返回当前节点的第一个子节点。如果没有子节点,则为null。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">lastchild</td><td valign="top" width="596">以node的形式返回当前节点的最后一个子节点。如果没有子节点,则为null。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">nextsibling</td><td valign="top" width="596">以node的形式返回当前节点的兄弟下一个节点。如果没有这样的节点,则返回null。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">nodename</td><td valign="top" width="596">节点的名字,element节点则代表element的标记名称。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">nodetype</td><td valign="top" width="596">代表节点的类型。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">parentnode</td><td valign="top" width="596">以node的形式返回当前节点的父节点。如果没有父节点,则为null。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="114">previoussibling</td><td valign="top" width="596">以node的形式返回紧挨当前节点、位于它之前的兄弟节点。如果没有这样的节点,则返回null。</td></tr></tbody></table><p>  node对象常用方法:</p><table cellspacing="1" cellpadding="4" bgcolor="#000000"><tbody><tr bgcolor="#ffffff"><td valign="top" width="144">方法</td><td valign="top" width="566">描述</td></tr><tr bgcolor="#ffffff"><td valign="top" width="144">appendchild()</td><td valign="top" width="566">通过把一个节点增加到当前节点的childnodes[]组,给文档树增加节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="144">clonenode()</td><td valign="top" width="566">复制当前节点,或者复制当前节点以及它的所有子孙节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="144">haschildnodes()</td><td valign="top" width="566">如果当前节点拥有子节点,则将返回true。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="144">insertbefore()</td><td valign="top" width="566">给文档树插入一个节点,位置在当前节点的指定子节点之前。如果该节点已经存在,则删除之再插入到它的位置。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="144">removechild()</td><td valign="top" width="566">从文档树中删除并返回指定的子节点。</td></tr><tr bgcolor="#ffffff"><td valign="top" width="144">replacechild()</td><td valign="top" width="566">从文档树中删除并返回指定的子节点,用另一个节点替换它。</td></tr></tbody></table><p>  接下来,让我们使用上述的dom应用编程接口,来试着操作html文档。</p></span></span> <img src ="http://www.blogjava.net/xzclog/aggbug/54451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-06-22 12:28 <a href="http://www.blogjava.net/xzclog/archive/2006/06/22/54451.html#feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax开发简略http://www.blogjava.net/xzclog/archive/2006/06/22/54448.htmlxzcxzcthu, 22 jun 2006 04:23:00 gmthttp://www.blogjava.net/xzclog/archive/2006/06/22/54448.htmlhttp://www.blogjava.net/xzclog/comments/54448.htmlhttp://www.blogjava.net/xzclog/archive/2006/06/22/54448.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/54448.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/54448.htmlhttp://www.blogjava.net/eamoi/archive/2005/10/31/17489.aspx



    xzc 2006-06-22 12:23
    ]]>
    开发跨浏览器的javascripthttp://www.blogjava.net/xzclog/archive/2006/06/21/54365.htmlxzcxzcwed, 21 jun 2006 13:55:00 gmthttp://www.blogjava.net/xzclog/archive/2006/06/21/54365.htmlhttp://www.blogjava.net/xzclog/comments/54365.htmlhttp://www.blogjava.net/xzclog/archive/2006/06/21/54365.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/54365.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/54365.html1向表中追加行
    2通过javascript设置元素的样式
    3设置元素的class属性
    4创建输入元素
    5向输入元素增加事件处理程序
    6创建单选按钮
    1. 1.
    2. var cell = documentcreateelement("td").appendchild(document.createtextnode("foo"));
    3. var row = document.createelement("tr").appendchild(cell);
    4. document.getelementbyid("mytableboyd").appendchild(row);
    5. 2.
    6. var spanelement = document.getelementbyid("myspan");
    7. //spanelement.setattribute("style","font-weight:bold;color:red");
    8. spanelement.style.csstext="font-weight:bold;color:red";
    9. 3.
    10. element.setattribute("class","stylename");//非ie
    11. element.setattribute("classname","stylename");//ie
    12. 4.
    13. var button = document.createelement("input");
    14. button.setattribute("type","button");
    15. document.getelementbyid("form").appendchild(button);
    16. 5.
    17. var element = document.getelementbyid("ee");
    18. element.onclick=function(){todo();};
    19. 6.
    20. var ration = document.createelement(");//ie
    21. vat radion = document.createelement("input");
    22. radion .setattribute("type","radio");
    23. radion.setattribute("name","radionsss");
    24. radion.setattribute("value","checked");


    xzc 2006-06-21 21:55
    ]]>
    网站地图