5

4月

苏州城

[2008-4-5 22:17 | 分类: 软件编程 | by Wudi ]
序:高中去过一次苏州而哪也没玩,而后只是无数次火车窗外看过“苏州站”。而前几天与同事聊起,便匆匆决定苏州一行。

   清早6点起床,很早比往日早的多,每次要提早起都不会晚,今天赶火车就更如此,床也没赖直接爬起,决定以后不论什么都得当成赶火车。7点15的火车,动车很快8点就到了(此处省去对火车提速的赞叹词若干……)。

点击在新窗口中浏览此图片

出了火车站寻找计划中的公交车,结果苏州站门口马路在整修,走了好几百米才找到“游1”的公交车。上了车直到目的地,“苏州博物馆,拙政园”。

点击在新窗口中浏览此图片
下了公交车就立刻看见博物馆的外观,之前就知道博物馆是贝聿铭老人设计的,外面看如果是现代与园林的结合。

点击在新窗口中浏览此图片
苏州博物馆正面,到时候9点未到,我与谢两人拍了几张就先去了隔壁的拙政园。

点击在新窗口中浏览此图片
马路边上的小桥流水。

点击在新窗口中浏览此图片
幽深的大街,苏州的古城区ms没什么高楼大厦,古老的建筑保存的相当完好,想想常州,叹气一声。

点击在新窗口中浏览此图片
拙政园大门,两边内外分别是“疏朗”“入胜”“淡泊”“通幽”四个小门。

点击在新窗口中浏览此图片
门内的鲜花,格外鲜艳。

点击在新窗口中浏览此图片
这是什么树呢?

点击在新窗口中浏览此图片
是了一下微距,这个好像叫树枝开花。

点击在新窗口中浏览此图片
树。只能靠自己的树枝探出墙外。

点击在新窗口中浏览此图片
石桥,庭院 - 课本中最典型的苏州园林的一角。


点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
粉红色的花儿。


点击在新窗口中浏览此图片
窗外的回廊与池塘。

点击在新窗口中浏览此图片
博物馆进门的房顶。

点击在新窗口中浏览此图片
博物馆隔院(咖啡厅)内的藤树。

点击在新窗口中浏览此图片
据说是镇馆之宝。

点击在新窗口中浏览此图片
戏院。

点击在新窗口中浏览此图片
"吴中第一山"

点击在新窗口中浏览此图片
郁金香

点击在新窗口中浏览此图片
母石狮。

点击在新窗口中浏览此图片
什么花?

1

4月

Leslie

[2008-4-1 14:48 | 分类: 软件编程 | by Wudi ]
你在愚人节愚弄了所有人的人 - Leslie,5年了。儿时,当同学都在听刘德华,张信哲的歌时,我在听你的,几乎所有的歌没落过,所有的演唱会也是。我不是什么崇拜明星的人,更不是追星一族,但别人问我最喜欢谁的歌,只有你。每次去KTV我都会唱支你的歌,虽然唱功相当差。五年了,你现在怎样。

29

3月

关于夏时制的一些想法

[2008-3-29 20:18 | 分类: 软件编程 | by Wudi ]
1.看见欧洲杯很多国家又开始执行夏时制,什么是夏时制?我简单介绍一下。
2.夏时制,又称“日光节约时制”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
3.对球迷最简单的好处就是足球比赛的时间可以提前1小时,凌晨3点45的比赛都会提前至2点45,可以少熬一个小时夜。
4.为什么中国不执行夏时制呢?有过,我刚刚搜索了下80年底执行过一段时间,但因为中国特色就取消了。
5.我的几个想法,中国必须根据自然时区划分不同的时间,不只能有一个北京时间,美国分了4个时区(主要是东西部两个时区)。
恢复夏时制,夏天白天长夜晚短,如果还是默认的时间,就要起码多消耗一个小时的电,全国要浪费多少电呢?
6.夏令时让俄罗斯每年能够节约20亿千瓦小时的电量,但这个数字只相当于两三个火力发电厂的发电量。该制度也使法国用于照明的能源消耗减少4%。
7.需要改革需要发展,先改革思想,就先开放夏时制。

28

3月

豆瓣的一篇文章

[2008-3-28 20:57 | 分类: 软件编程 | by Wudi ]
尊敬的萨伊德先生,您穿秋裤吗?

笑过之余需要很多人深思。

为什么很多比中国发达的国家都不穿?难道他们不怕冷?
我想不是的,是从小锻炼的,学校的硬性规定?
在中国,冬天经常看见外国人穿的短袖,他们是要风度吗,吸引眼球吗?

再笑笑了之吧。

26

3月

struts错误

[2008-3-26 21:44 | 分类: 软件编程 | by Wudi ]
type Status report

message No action instance for path /change could be created

description The server encountered an internal error (No action instance for path /change could be created) that prevented it from fulfilling this request.

在检查了配置文件后没有发现错误的地方而且其他的do可以执行

这个时候我就检查了Action实现类 ,发现没有继承org.apache.struts.action.Action; ( extends ControlAction )

21

3月

EL表达式

[2008-3-21 20:18 | 分类: 软件编程 | by Wudi ]
一、EL简介
1.语法结构
    ${expression}
2.[]与.运算符
    EL 提供.和[]两种运算符来存取数据。
    当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如:
        ${user.My-Name}应当改为${user["My-Name"] }
    如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
        ${sessionScope.user[data]}中data 是一个变量
3.变量
    EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
    因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
    假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
    属性范围在EL中的名称
        Page         PageScope
        Request         RequestScope
        Session         SessionScope
        Application     ApplicationScope
        
二、EL隐含对象
1.与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。

例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
    session.getAttribute("username") 取得username的值,
在EL中则使用下列方法
    ${sessionScope.username}

2.与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。

例如我们要取得用户的请求参数时,可以利用下列方法:
    request.getParameter(String name)
    request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
    ${param.name}
    ${paramValues.name}

3.其他隐含对象

cookie
JSTL并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。

header和headerValues
header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

initParam
initParam取得设定web站点的环境参数(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
    可以使用 ${initParam.userid}来取得名称为userid

pageContext
pageContext取得其他有关用户要求或页面的详细信息。
    ${pageContext.request.queryString}         取得请求的参数字符串
    ${pageContext.request.requestURL}         取得请求的URL,但不包括请求之参数字符串
    ${pageContext.request.contextPath}         服务的web application 的名称
    ${pageContext.request.method}           取得HTTP 的方法(GET、POST)
    ${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0)
    ${pageContext.request.remoteUser}         取得用户名称
    ${pageContext.request.remoteAddr }         取得用户的IP 地址
    ${pageContext.session.new}             判断session 是否为新的
    ${pageContext.session.id}               取得session 的ID
    ${pageContext.servletContext.serverInfo}   取得主机端的服务信息

三、EL运算符
1.算术运算符有五个:+、-、*或$、/或div、%或mod
2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
3.逻辑运算符有三个:&&或and、||或or、!或not
4.其它运算符有三个:Empty运算符、条件运算符、()运算符
    例:${empty param.name}、${A?B:C}、${A*(B+C)}

四、EL函数(functions)。
语法:ns:function( arg1, arg2, arg3 …. argN)
其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置

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


<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

FOREACH:

var="item"
begin="0"
end="9"
step="1"
varStatus="var">
……




OUT:


c:out>将value 中的内容输出到当前位置,这里也就是把logininfo 对象的
username属性值输出到页面当前位置。
${……}是JSP2.0 中的Expression Language(EL)的语法。它定义了一个表达式,
其中的表达式可以是一个常量(如上),也可以是一个具体的表达语句(如forEach循环体中
的情况)。典型案例如下:
? ${logininfo.username}
这表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引
用对象的属性,也可以用“[]”引用对象属性,如${logininfo[username]}
与${logininfo.username}达到了同样的效果。
“[]”引用方式的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”,
此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免
这一现象的出现)。
与之等同的JSP Script大致如下:
LoginInfo logininfo =
(LoginInfo)session.getAttribute(“logininfo”);
String username = logininfo.getUsername();
可以看到,EL大大节省了编码量。
这里引出的另外一个问题就是,EL 将从哪里找到logininfo 对象,对于
${logininfo.username}这样的表达式而言,首先会从当前页面中寻找之前是
否定义了变量logininfo,如果没有找到则依次到Request、Session、
Application 范围内寻找,直到找到为止。如果直到最后依然没有找到匹配的
变量,则返回null.
如果我们需要指定变量的寻找范围,可以在EL表达式中指定搜寻范围:
${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
在Spring 中,所有逻辑处理单元返回的结果数据,都将作为Attribute 被放
置到HttpServletRequest 对象中返回(具体实现可参见Spring 源码中
org.springframework.web.servlet.view.InternalResourceView.
exposeModelAsRequestAttributes方法的实现代码),也就是说Spring
MVC 中,结果数据对象默认都是requestScope。因此,在Spring MVC 中,
以下寻址方法应慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
? ${1+2}
结果为表达式计算结果,即整数值3。
? ${i>1}
如果变量值i>1的话,将返回bool类型true。与上例比较,可以发现EL会自
动根据表达式计算结果返回不同的数据类型。
表达式的写法与java代码中的表达式编写方式大致相同。


IF / CHOOSE:


*

判定条件一般为一个EL表达式。
并没有提供else子句,使用的时候可能有些不便,此时我们可以通过
tag来达到类似的目的:


*


!


类似Java 中的switch 语句,提供了复杂判定条件下的简化处理手法。其
子句类似case子句,可以出现多次。上面的代码,在奇数行时输出“*”号,
而偶数行时输出“!”。
---------------------------------------------

1    EL表达式用${}表示,可用在所有的HTML和JSP标签中 作用是代替JSP页面中复杂的JAVA代码.

        2   EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}. ${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量.

        3   <%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.

        4   EL语言可显示 逻辑表达式如${true and false}结果是false    关系表达式如${5>6} 结果是false     算术表达式如 ${5+5} 结果是10

        5   EL中的变量搜索范围是:page request session application   点运算符(.)和"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量

19

3月

解决could not initialize a collection

[2008-3-19 21:22 | 分类: 软件编程 | by Wudi ]
出现这个问题是因为我使用的是Tomcat+JDBC驱动连接MSSQL数据库导致的.  
  其实并不是本身JDBC驱动不好.问题是MS的JDBC驱动(也就是3个JAR包)不支持二次查询导致的.  
  而用过Hibernate的人都知道,在用*.hbm.xml文件中通常用Set的时候需要采用延时的检索机制来减少不必要的开销.当如果我们需要采取立即检索的时候,通常是在代码中调用Hibernate.initialize()方法,而不是将lasy改为false,理由是这样程序员可以根据业务需要来控制检索策略.  
  当我们之前调用itemDAO.findById(item.getItemId());的时候,Hibernate会到DB中去检索一次数据,由于set的lasy属性为true,因此只是单纯的执行:  
  select   *   from   table   where   ID=?  
  而当执行Hibernate.initialize(item2.getStoreItems());则Hibernate会根据上次查询的结果再次去DB中检索数据,但是...JDBC不支持二次查询,因此最后就直接反馈给我们  
  could not initialize a collection

  最后解决问题的办法:更换驱动  
  用JTDS驱动,也就是采用jtds-1.2.jar而不用msbase.jar、mssqlserver.jar、msutil.jar这三个JAR包。将jtds-1.2.jar放到我们的lib目录的构件路径下。再次测试,成功通过。

16

3月

ajax类库

[2008-3-16 20:50 | 分类: 软件编程 | by Wudi ]
/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* ?2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
   see documentation or authors website for more details */

function sack(file) {
  this.xmlhttp = null;

  this.resetData = function() {
    this.method = "POST";
      this.queryStringSeparator = "?";
    this.argumentSeparator = "&";
    this.URLString = "";
    this.encodeURIString = true;
      this.execute = false;
      this.element = null;
    this.elementObj = null;
    this.requestFile = file;
    this.vars = new Object();
    this.responseStatus = new Array(2);
    };

  this.resetFunctions = function() {
      this.onLoading = function() { };
      this.onLoaded = function() { };
      this.onInteractive = function() { };
      this.onCompletion = function() { };
      this.onError = function() { };
    this.onFail = function() { };
  };

  this.reset = function() {
    this.resetFunctions();
    this.resetData();
  };

  this.createAJAX = function() {
    try {
      this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e1) {
      try {
        this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        this.xmlhttp = null;
      }
    }

    if (! this.xmlhttp) {
      if (typeof XMLHttpRequest != "undefined") {
        this.xmlhttp = new XMLHttpRequest();
      } else {
        this.failed = true;
      }
    }
  };

  this.setVar = function(name, value){
    this.vars[name] = Array(value, false);
  };

  this.encVar = function(name, value, returnvars) {
    if (true == returnvars) {
      return Array(encodeURIComponent(name), encodeURIComponent(value));
    } else {
      this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
    }
  }

  this.processURLString = function(string, encode) {
    encoded = encodeURIComponent(this.argumentSeparator);
    regexp = new RegExp(this.argumentSeparator + "|" + encoded);
    varArray = string.split(regexp);
    for (i = 0; i < varArray.length; i++){
      urlVars = varArray[i].split("=");
      if (true == encode){
        this.encVar(urlVars[0], urlVars[1]);
      } else {
        this.setVar(urlVars[0], urlVars[1]);
      }
    }
  }

  this.createURLString = function(urlstring) {
    if (this.encodeURIString && this.URLString.length) {
      this.processURLString(this.URLString, true);
    }

    if (urlstring) {
      if (this.URLString.length) {
        this.URLString += this.argumentSeparator + urlstring;
      } else {
        this.URLString = urlstring;
      }
    }

    // prevents caching of URLString
    this.setVar("rndval", new Date().getTime());

    urlstringtemp = new Array();
    for (key in this.vars) {
      if (false == this.vars[key][1] && true == this.encodeURIString) {
        encoded = this.encVar(key, this.vars[key][0], true);
        delete this.vars[key];
        this.vars[encoded[0]] = Array(encoded[1], true);
        key = encoded[0];
      }

      urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
    }
    if (urlstring){
      this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);
    } else {
      this.URLString += urlstringtemp.join(this.argumentSeparator);
    }
  }

  this.runResponse = function() {
    eval(this.response);
  }

  this.runAJAX = function(urlstring) {
    if (this.failed) {
      this.onFail();
    } else {
      this.createURLString(urlstring);
      if (this.element) {
        this.elementObj = document.getElementById(this.element);
      }
      if (this.xmlhttp) {
        var self = this;
        if (this.method == "GET") {
          totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
          this.xmlhttp.open(this.method, totalurlstring, true);
        }else if(this.method == "FILE") {
          this.xmlhttp.open(this.method, this.requestFile, true);
          try {
            this.xmlhttp.setRequestHeader("Content-Type", "multipart/form-data")
          } catch (e) { }
        } else {
          this.xmlhttp.open(this.method, this.requestFile, true);
          try {
            this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
          } catch (e) { }
        }

        this.xmlhttp.onreadystatechange = function() {
          switch (self.xmlhttp.readyState) {
            case 1:
              self.onLoading();
              break;
            case 2:
              self.onLoaded();
              break;
            case 3:
              self.onInteractive();
              break;
            case 4:
              self.response = self.xmlhttp.responseText;
              self.responseXML = self.xmlhttp.responseXML;
              self.responseStatus[0] = self.xmlhttp.status;
              self.responseStatus[1] = self.xmlhttp.statusText;

              if (self.execute) {
                self.runResponse();
              }

              if (self.elementObj) {
                elemNodeName = self.elementObj.nodeName;
                elemNodeName.toLowerCase();
                if (elemNodeName == "input"
                || elemNodeName == "select"
                || elemNodeName == "option"
                || elemNodeName == "textarea") {
                  self.elementObj.value = self.response;
                } else {
                  self.elementObj.innerHTML = self.response;
                }
              }
              if (self.responseStatus[0] == "200") {
                self.onCompletion();
              } else {
                self.onError();
              }

              self.URLString = "";
              break;
          }
        };

        this.xmlhttp.send(this.URLString);
      }
    }
  };

  this.reset();
  this.createAJAX();
}

14

3月

最近整理项目框架,配置映射的时候经常出错,因为是改的旧程序,所以总结一下出错的几个地方:
Web.xml struts配置文件路径错误 servlet路径错误
struts-config.xml 与action对应错误
hibernate.cfg.xml 主要是把所有的映射的mapping的错误
XXXXXXXXX.hbm.xml 与表的对应,与字段的对应,与pojo里的对应
最后还有读取hibernate配置文件路径的问题。

这几天大概碰到的这些问题,ms有点多,但都值得注意。

13

3月

TreeView控件设置背景透明

[2008-3-13 19:08 | 分类: 软件编程 | by Wudi ]
今天搞页面效果,怎么都没办法把tree搞成透明的,终于给找到了个方法,与大家一起分享。
打开treeview.htc  
  修改  
  function   buildTreeFromRoot()  
  {  
          //treeviewNode   =   element.document.createElement("HTML");  
          //var   bodyNode   =   element.document.createElement("BODY");  
    
   //startmodify
  treeviewNode   =   element.document.createElement("DIV");  
  bodyNode   =   element.document.createElement("SPAN");  
  //end   modify  

  }  

12

3月

php小偷示例

[2008-3-12 21:07 | 分类: 软件编程 | by Wudi ]
为了顺利的完成QQ代码程序,先研究一下别人的一个小偷程序。
1、对原网站进行代码分析
首先确定视听mtv的地址是: http://mtv.8391.com/player.asp?id=ID
查看其原文件,判断出调用mtv路径的文件: http://mtv.8391.com/Yxwen.asp?id=ID
利用代码查看程序,取得 http://mtv.8391.com/Yxwen.asp?id=3488页面代码(3488为随机,只是了解页面代码)
2、对要偷取的页面进行代码分析
http://mtv.8391.com/Yxwen.asp?id=3488页面代码如下:
CODE: ??? 运行代码 - 复制代码 - 保存代码 ???

< entry SKIPIFREF="YES">
< title>I Believe In Love
< author> 蓝牙音乐网 - www.8391.com
< copyright> 蓝牙音乐网 - www.8391.com
< ref href="http://218.78.213.183:880/daolianmtvfuc__________________kkkkkkkkkk//shela_believe.wmv"/ >
< param name="Artist" value="榭拉"/>
< param name="Album" value=" 蓝牙音乐网 - www.8391.com"/ >
< param name="Title" value="I Believe In Love"/ >
< /ENTRY >



确认有用数据:
歌曲名称:I Believe In Love
歌手:榭拉
歌曲路径:http://218.78.213.183:880/daolia ... //shela_believe.wmv
我们在小偷程序中只要得到以上数据就可以了
3、PHP代码编写
PHP:<  ?
/********
说明,为程序简单化,整个程序没有使用正则表达式
(我自己对这个方面也很臭,呵呵,高手别骂)
****/
//定义一个函数,对字符简单的过滤

function str($txt){
    $txt= str_replace("'","'",$txt);
    $txt= str_replace("\"","\\"",$txt);
    return $txt;
}
//初始化程序
$magic_quotes_gpc = get_magic_quotes_gpc();
$register_globals = @ini_get('register_globals');
if(!$register_globals || !$magic_quotes_gpc) {
    @extract(daddslashes($HTTP_POST_VARS));
    @extract(daddslashes($HTTP_GET_VARS));
    if(!$register_globals) {
        foreach($HTTP_POST_FILES as $key => $val) {
            $$key = $val['tmp_name'];
            ${$key.'_name'} = $val['name'];
            ${$key.'_size'} = $val['size'];
            ${$key.'_type'} = $val['type'];
        }
    }
}
if (function_exists('set_time_limit') == 1 && @ini_get('safe_mode') == 0) {
    @set_time_limit(1000);
}
//end
//为防止日后对方修改地址,把地址前部相同的提取出来
$host="http://218.78.213.183:880/daolianmtvfuc__________________kkkkkkkkkk/";
if(!$action){
echo "click here to start";
die();
}else{
 $end=3488;//结束ID
 if(!$id||$id<1)$id=1;//默认ID编号
 $url="http://mtv.8391.com/Yxwen.asp?id=".$id;    
 $str=@file_get_contents($url);//读取页面代码
 if($str){
   //利用关键字符,分割代码
   $a1=explode("value=\"",$str);//value=\"来分割字符
   //取歌手名称
   $n1=explode("\"",$a1[1]);
   $ges=str(trim($n1[0]));
   //取歌曲名称
   $g1=explode("\"",$a1[3]);
   $name=str(trim($g1[0]));
   //取歌曲地址
    $h1=explode("href=\"",$str);
     $h2=explode("\"",$h1[1]);
     $mtvurl= str(str_replace($host,"",trim($h2)));
     //添加数据库
     /********
     可根据自己的程序,适当的添加
     ********/
     
 }
 $id++;
 if($id<=$end){ echo "cleck here ";
  echo "";}
else die("program runing over"); 
}
?>

9

3月

QQ空间核心文件G4.1.js解析

[2008-3-9 20:49 | 分类: 软件编程 | by Wudi ]
G4.1.js 顾名思义4.1是其版本号,下面胡老师带大家一起分析一下该文件的具体实现。
初看这个文件很乱,但大的门户都喜欢这样,让别人看不懂,甚至看不下去。下面我就一个个的把他拆分。
从js文件开始到定义function的一段代码的用途是加载QQ空间的页面,其中调用到了我们前2天分析的样式的cgi数据以及最开始初始化的一些变量,同时还调用到了下面定义的哪些function的一部分东西,调用function的目的是获取数据。
接下来我们看最后的代码,g_Templet(g_Templet={}这里是最开始定义)的作用是聚合了一大堆html代码的数组,其作用就是将这些代码根据模板的调用,写入指定的div层内,接下来是调用checkUserStyle()方法,它的注释说明是“全部逻辑并如checkUserStyle”,那么我们就跟着checkUserStyle()方法看看里面具体是怎么实现的呢?
引用


checkUserStyle(){if(!top.g_Configuration||!top.g_Configuration.style){if(!window._entryCount){includeJS("http://"+g_Src_Domain+"/cgi-bin/entry_js.cgi?uin="+g_iUin,checkUserStyle);window._entryCount=true;return;}
document.write('');window.styleError=true;return;}
window.g_loadedStyleID=g_StyleID=top.g_Configuration.style;var rigItems=top.g_Configuration.items;var skinIdx=-1;for(var i=0; iif(skinIdx==-1){rigItems=insertGlobalConfig("items",[1,1,0,0,0,0,0],true).items;skinIdx=rigItems.length-1;}
if(isStar){simpleMode=g_Configuration.simpleMode;if(simpleMode){g_StyleID=150;g_paddingLeft=0;}}
loadedFullMode=simpleMode?1:g_Configuration.fullMode;frameStyle=simpleMode?1:g_Configuration.frameStyle;rigItems[skinIdx].zindex &=(1<<6)-1;rigItems[skinIdx].zindex |=loadedFullMode?(1<<6):0;rigItems[skinIdx].zindex |=(frameStyle<<7);if(!simpleMode){lineModUp();}
setCSS(g_StyleID,loadedFullMode,true);fillBody();if(Browser.isIE){continueLoadQzone();}else{addEvent(window,"load",continueLoadQzone);}}


这样我们可以看到,他再次读取了一遍样式然后进行设置。

最后我们来说一下g文件的funtcion的一些用途,我们先来说一些常用的。
showMsgbox 是弹出div层来现在显示,而非window自带的alert方法。
loadJsonData 是通过json(比较流行的方法)来读取数据。如果读取失败,我们就会经常看见“服务器繁忙,请稍后再试.”这样讨厌的字眼。
getItemDataUrl 加载所有数据的方法,其每个方法都是返回xml数据然后在进行load的。

先写这么多吧,眼睛有点花了。。
分页: 3/5 第一页 上页 1 2 3 4 5 下页 最后页 [ 显示模式: 摘要 | 列表 ]