5
4月
序:高中去过一次苏州而哪也没玩,而后只是无数次火车窗外看过“苏州站”。而前几天与同事聊起,便匆匆决定苏州一行。
清早6点起床,很早比往日早的多,每次要提早起都不会晚,今天赶火车就更如此,床也没赖直接爬起,决定以后不论什么都得当成赶火车。7点15的火车,动车很快8点就到了(此处省去对火车提速的赞叹词若干……)。

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

下了公交车就立刻看见博物馆的外观,之前就知道博物馆是贝聿铭老人设计的,外面看如果是现代与园林的结合。

苏州博物馆正面,到时候9点未到,我与谢两人拍了几张就先去了隔壁的拙政园。

马路边上的小桥流水。

幽深的大街,苏州的古城区ms没什么高楼大厦,古老的建筑保存的相当完好,想想常州,叹气一声。

拙政园大门,两边内外分别是“疏朗”“入胜”“淡泊”“通幽”四个小门。

门内的鲜花,格外鲜艳。

这是什么树呢?

是了一下微距,这个好像叫树枝开花。

树。只能靠自己的树枝探出墙外。

石桥,庭院 - 课本中最典型的苏州园林的一角。




粉红色的花儿。

窗外的回廊与池塘。

博物馆进门的房顶。

博物馆隔院(咖啡厅)内的藤树。

据说是镇馆之宝。

戏院。

"吴中第一山"

郁金香

母石狮。

什么花?
清早6点起床,很早比往日早的多,每次要提早起都不会晚,今天赶火车就更如此,床也没赖直接爬起,决定以后不论什么都得当成赶火车。7点15的火车,动车很快8点就到了(此处省去对火车提速的赞叹词若干……)。
出了火车站寻找计划中的公交车,结果苏州站门口马路在整修,走了好几百米才找到“游1”的公交车。上了车直到目的地,“苏州博物馆,拙政园”。
下了公交车就立刻看见博物馆的外观,之前就知道博物馆是贝聿铭老人设计的,外面看如果是现代与园林的结合。
苏州博物馆正面,到时候9点未到,我与谢两人拍了几张就先去了隔壁的拙政园。
马路边上的小桥流水。
幽深的大街,苏州的古城区ms没什么高楼大厦,古老的建筑保存的相当完好,想想常州,叹气一声。
拙政园大门,两边内外分别是“疏朗”“入胜”“淡泊”“通幽”四个小门。
门内的鲜花,格外鲜艳。
这是什么树呢?
是了一下微距,这个好像叫树枝开花。
树。只能靠自己的树枝探出墙外。
石桥,庭院 - 课本中最典型的苏州园林的一角。
粉红色的花儿。
窗外的回廊与池塘。
博物馆进门的房顶。
博物馆隔院(咖啡厅)内的藤树。
据说是镇馆之宝。
戏院。
"吴中第一山"
郁金香
母石狮。
什么花?
1
4月
你在愚人节愚弄了所有人的人 - Leslie,5年了。儿时,当同学都在听刘德华,张信哲的歌时,我在听你的,几乎所有的歌没落过,所有的演唱会也是。我不是什么崇拜明星的人,更不是追星一族,但别人问我最喜欢谁的歌,只有你。每次去KTV我都会唱支你的歌,虽然唱功相当差。五年了,你现在怎样。
Flash Player文件
Flash Player文件29
3月
1.看见欧洲杯很多国家又开始执行夏时制,什么是夏时制?我简单介绍一下。
2.夏时制,又称“日光节约时制”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
3.对球迷最简单的好处就是足球比赛的时间可以提前1小时,凌晨3点45的比赛都会提前至2点45,可以少熬一个小时夜。
4.为什么中国不执行夏时制呢?有过,我刚刚搜索了下80年底执行过一段时间,但因为中国特色就取消了。
5.我的几个想法,中国必须根据自然时区划分不同的时间,不只能有一个北京时间,美国分了4个时区(主要是东西部两个时区)。
恢复夏时制,夏天白天长夜晚短,如果还是默认的时间,就要起码多消耗一个小时的电,全国要浪费多少电呢?
6.夏令时让俄罗斯每年能够节约20亿千瓦小时的电量,但这个数字只相当于两三个火力发电厂的发电量。该制度也使法国用于照明的能源消耗减少4%。
7.需要改革需要发展,先改革思想,就先开放夏时制。
2.夏时制,又称“日光节约时制”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
3.对球迷最简单的好处就是足球比赛的时间可以提前1小时,凌晨3点45的比赛都会提前至2点45,可以少熬一个小时夜。
4.为什么中国不执行夏时制呢?有过,我刚刚搜索了下80年底执行过一段时间,但因为中国特色就取消了。
5.我的几个想法,中国必须根据自然时区划分不同的时间,不只能有一个北京时间,美国分了4个时区(主要是东西部两个时区)。
恢复夏时制,夏天白天长夜晚短,如果还是默认的时间,就要起码多消耗一个小时的电,全国要浪费多少电呢?
6.夏令时让俄罗斯每年能够节约20亿千瓦小时的电量,但这个数字只相当于两三个火力发电厂的发电量。该制度也使法国用于照明的能源消耗减少4%。
7.需要改革需要发展,先改革思想,就先开放夏时制。
28
3月
尊敬的萨伊德先生,您穿秋裤吗?
笑过之余需要很多人深思。
为什么很多比中国发达的国家都不穿?难道他们不怕冷?
我想不是的,是从小锻炼的,学校的硬性规定?
在中国,冬天经常看见外国人穿的短袖,他们是要风度吗,吸引眼球吗?
再笑笑了之吧。
笑过之余需要很多人深思。
为什么很多比中国发达的国家都不穿?难道他们不怕冷?
我想不是的,是从小锻炼的,学校的硬性规定?
在中国,冬天经常看见外国人穿的短袖,他们是要风度吗,吸引眼球吗?
再笑笑了之吧。
26
3月
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 )
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简介
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 点运算符(.)和"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量
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:
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表达式。
tag来达到类似的目的:
*
!
类似Java 中的switch 语句,
中
而偶数行时输出“!”。
---------------------------------------------
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月
出现这个问题是因为我使用的是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目录的构件路径下。再次测试,成功通过。
其实并不是本身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月
/* 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();
}
/* ?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有点多,但都值得注意。
Web.xml struts配置文件路径错误 servlet路径错误
struts-config.xml 与action对应错误
hibernate.cfg.xml 主要是把所有的映射的mapping的错误
XXXXXXXXX.hbm.xml 与表的对应,与字段的对应,与pojo里的对应
最后还有读取hibernate配置文件路径的问题。
这几天大概碰到的这些问题,ms有点多,但都值得注意。
13
3月
今天搞页面效果,怎么都没办法把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
}
打开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月
为了顺利的完成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");
}
?>
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月
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; i if(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的。
先写这么多吧,眼睛有点花了。。
初看这个文件很乱,但大的门户都喜欢这样,让别人看不懂,甚至看不下去。下面我就一个个的把他拆分。
从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; i
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的。
先写这么多吧,眼睛有点花了。。






