world_eyes

记录点滴的地方

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  10 随笔 :: 3 文章 :: 1 评论 :: 0 Trackbacks

2011年3月9日 #

  在Android的应用程序开发中,通常使用的是Java语言,除了要熟悉Java语言的基础外,还需要了解Android提供的Java扩展功能。

一、重要包描述

Android.app:提供高层的程序模型、提供基本的运行环境。

Android.content:包含对各种的设备上的数据进行访问和发布的类。

Android.database:通过内容提供者浏览和操作数据库。

Android.graphics:底层的图形库,包含画布、颜色过滤、点、矩形,可以将它们直接绘制到屏幕上。

Android.location:定位和服务的相关类。

Android.media:提供了一些管理音频视频的媒体接口的相关类。

Android.net提供了关于网络访问的类,超过通常的java.net.*接口。

Android.os:提供了系统服务,消息传输,IPC机制。

Android.opengl:提供了OpenGL的工具。

Android.provider:提供类访问Android的内容提供者。

Android.telephony:提供与拨打电话相关的API交互

Android.view:提供基本的用户界面接口框架。

Android.util:涉及工具性的方法,例如时间日期型的操作。

Android.webkit:默认浏览器操作接口。

Android.widget:包含各种U元素,在应用程序的屏幕中使用。

二、Android的相关文件类型概述

Java文件---应用程序源文件

Android的应用必须使用Java来开发。

Class文件---Java编译后的目标文件。

不想J2SE,java编译成class文件就直接可以运行,Android平台上的class 文件不能直接在Android平台上运行。由于google使用了自己的Dalvik来运行应用,所以这里的class也肯定不能在Android Dalvik上运行,Androidclass文件实际上只是编译过程的中间目标文件,需要链接成Dex文件才能运行在Dalvik上。

Dex文件---Android平台上的可执行文件。

Dalvik执行的并非是Java字节码,而是另一种字节码:dex格式的字节码(Java字节码->dex字节码)。Dalvik可以执行许多VM而不会占用太多的Resource.

APK 文件---Android上的安装文件

APKAndroid安装包的扩展名,一个Android安装包包含了与某个应用程序相关的所有文件,APK文件将AndroidMainfest.xml文件、应用程序代码(DEX)文件、资源文件和其他文件打成一个压缩包。一个工程只能打进一个.apk文件。

 

三、Android ADB工具的使用

ADBAndroid提供的一个通用调试工具,借助这个工具,我们管理手机模拟器的状态。

1.ADB功能操作

快速更新设备或手机模拟器的代码,如应用或Android系统升级。

在设备上运行shell命令

管理设备或手机模拟器上的预定接口

在设备或手机模拟器上复制、粘贴文件

2.ADB的常用操作

安装应用到模拟器

adb install app.apk

Android没有提供一个卸载应用的命令,只能手动删除:

Adb shell

Cd data/app

Rm.app.apk

进入设备或模拟器的shell

Adb shell

通过以上命令,可以进入设备或模拟器的shell环境中,在这个shell中,你可以执行各种Linux的命令,另外如果只想执行一条shell命令,可以采用以下方式:

Adb shell[command]

如:

Adb shell emesg

会打印出内核的调试信息

发布端口

可以设置任意的端口号,作为主机箱模拟器或设备的请求端口。如:

Adb forward tcp 5555 tcp8000

复制文件

复制一个文件或目录到设备或模拟器上;

Adb push

如:

Adb push test.txt/tmp/test.txt

Adb pull

如:

Adb pull /Android/lib/libwebcore.os

搜索/等待模拟器、设备实例

取得当前运行的模拟器、设备的实例列表及每个实例的状态或等待正在运行的设备

Adb devices 

Adb wait-for-device

查看debug报告

Adb bugreport

记录无线通信日志

无线通信日志非常多,在运行时没必要记录,可以通过命令设置记录

Adb shell

Logcat -b radio

获取设备ID和序列号

Adb get-product 

Adb get-serialno

访问数据库SQLite3

Adb shell

Sqlite3

posted @ 2011-03-09 10:25 world_eyes 阅读(339) | 评论 (0)编辑 收藏

2010年6月8日 #

转载来的,遇到这样问题的朋友应该不多,我是配置好环境了,也装了个PHP的CMS测试过了,PHPMYADMIN运行也正常,但是运行另外一套 PHP网站程序就出现HTTP 500服务器内部错误,还好找到了解决办法!

感谢Oliver分享,原文 地址:http://tech.flyingcat.cn/?p=212

在IIS + PHP的环境下安装phpmyadmin或wordpress的时候经常会发生一个奇怪的现象,例如:phpmyadmin安装的web文件夹根目录的话 打开显示HTTP 500服务器内部错误,但将网站放到一个子目录下就没问题。
这个问题的原因在于phpmyadmin和wordpress等程序的index.php文件中都用到了require(./xxx.php)这样的语 句。

解决办法1
把里面的require(./xxx.php)改成 require(xxx.php)。

解决办法2
给网站的上级目录赋予iis用户读权限。

posted @ 2010-06-08 10:19 world_eyes 阅读(8777) | 评论 (1)编辑 收藏

2010年6月4日 #

经常有朋友在安装某种小软件后,IE主页被篡改,而你在ie选项里改回来后,再打开又时主页又变成了另外一个网址。这说明这个流氓软件在注册表里还 有别的 窠,这些可能位置都有哪些呢?我们根据有限经验,先列出最重要的这几条,期待朋友们补充更多的发现。点击开始-运行-输入regedit回车,依次找到如 下位置——当然,笔者推荐使用Registry Workshop软件,可以直接粘 贴以下地址回车,并将该地址添加到收藏夹,以后旧的不用再找,新的也可见者收藏。

1、internet选项对应的注册表值:

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page

这项的值和ie选项里的主页是同步的,可以先试试。convert swf to avi

2、绑定ie主程序运行参数:

HKEY_CLASSES_ROOTApplicationsiexplore.exeshellopencommand

这项的正常值是”C:Program FilesInternet ExplorerIEXPLORE.EXE” %1,流氓软件将自己的网址附加在后面当作一个运行参数,那么打开ie主程序时就会自动跳转到该网址,这招够狠。

3、 绑定ie窗体控件ieframe.dll主页命令:

HKEY_CLASSES_ROOTCLSID{871C5380-42A0-1069-A2EA-08002B30309D}shellOpenHomePageCommand

这项的默认值是”C:Program FilesInternet Exploreriexplore.exe”,同样,流氓网址可能附加在后面,拦截主页。

4、绑定ie快捷方式运行目标:

还有一种在注册表里无论如何也搜索不到,却远在天边近在眼前的手段,就是修改了ie 快捷方式属性里的运行目标。注意是快捷方式,不是桌面默认显示的ie图标。正常的ie快捷方式有四种

可以看出上面三个ie快捷方式依次是由桌面ie图标创建、由开始菜单顶端ie图标创建、由系统盘ie主程序创建的(当然如果你隐藏了扩展名,第三个 快捷 方式就没有.exe后缀),flv player 第四种是在开始按钮右边快速启动栏上的“启动Internet Explorer”图标。右键查看这些快捷方式属性

笔者快速启动栏已删除启动ie的图标,搁笔追思,远求而来,故上面窗口略显异域。这两个 快捷方式,目标默认值都是”C:Program FilesInternet Exploreriexplore.exe”,这下病毒又有空可钻了,只要把自己的网址追加到后面,那么你经这个图标打开ie时,就会立即跳到它的网 址,真是无所不用其极。

所以笔者建议,如果主页被篡改并改不回来了,请先右键你 启动ie时所打开的快捷方式,看属性“目标”后面有无追加网址,有则删之;不行的话就去注册表里查看那些可能位置:

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page
HKEY_CLASSES_ROOTApplicationsiexplore.exeshellopencommand
HKEY_CLASSES_ROOTCLSID{871C5380-42A0-1069-A2EA-08002B30309D}shellOpenHomePageCommand

看值的后面有没有“尾巴”,这些网址有时可能是乱码,全部剪掉,swf to mov回 复默认值,主页就改回来 了。这样只是暂时堵住,若想彻底杜绝,请先卸载新安装的流氓软件,以后也莫乱逛网站或接受推荐下载安装那些你以为是发现新天地其实可 能早已臭名昭著的小流氓。当然,如果你熟悉了更多的篡改主页伎俩,就不用有这些顾虑了。笔者再次推荐注册表管理软件Registry Workshop,平时多积累自己的 发现,保持“与毒俱进”,将病毒流氓的伎俩尽收囊中。那么以后就可以高枕无忧了。

posted @ 2010-06-04 18:04 world_eyes 阅读(364) | 评论 (0)编辑 收藏

     Tomcat下,不同的二级域名,Session默认是不共享的,因为Cookie名称为JSESSIONID的Cookie根域是默认是没设置的,访问 不同的二级域名,其Cookie就重新生成,而session就是根据这个Cookie来生成的,所以在不同的二级域名下生成的Session也不一样。 找到了其原因,就可根据这个原因对Tomcat在生成Session时进行相应的修改(注:本文针对Tomcat 6.0)。

     单个web项目运行在tomcat上但是却使用多个子域名,如:

 - site.com
 - www.site.com
 - sub1.site.com
 - sub2.site.com
 - etc.

 

这样会导致session的不能共享,在网络上查找的并却最快的解决办法。

 

解决办法:

Usage:
 - compile CrossSubdomainSessionValve & put it in a .jar file
 - put that .jar file in $CATALINA_HOME/lib directory
 - include a <Valve className="org.three3s.valves.CrossSubdomainSessionValve"/> in
$CATALINA_HOME/conf/server.xml

package org.three3s.valves;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.catalina.*;
import org.apache.catalina.connector.*;
import org.apache.catalina.valves.*;
import org.apache.tomcat.util.buf.*;
import org.apache.tomcat.util.http.*;

/**
 * <p>
 * Replaces the domain of the session cookie generated by Tomcat with a domain
 * that allows that session cookie to be shared across subdomains. This valve
 * digs down into the response headers and replaces the Set-Cookie header for
 * the session cookie, instead of futilely trying to modify an existing Cookie
 * object like the example at 
http://www.esus.be/blog/?p=3. That approach does
 * not work (at least as of Tomcat 6.0.14) because the
 * <code>org.apache.catalina.connector.Response.addCookieInternal</code> method
 * renders the cookie into the Set-Cookie response header immediately, making
 * any subsequent modifying calls on the Cookie object ultimately pointless.
 * </p>
 * 
 * <p>
 * This results in a single, cross-subdomain session cookie on the client that
 * allows the session to be shared across all subdomains. However, see the
 * {
@link getCookieDomain(Request)} method for limits on the subdomains.
 * </p>
 * 
 * <p>
 * Note though, that this approach will fail if the response has already been
 * committed. Thus, this valve forces Tomcat to generate the session cookie and
 * then replaces it before invoking the next valve in the chain. Hopefully this
 * is early enough in the valve-processing chain that the response will not have
 * already been committed. You are advised to define this valve as early as
 * possible in server.xml to ensure that the response has not already been
 * committed when this valve is invoked.
 * </p>
 * 
 * <p>
 * We recommend that you define this valve in server.xml immediately after the
 * Catalina Engine as follows:
 * 
 * <pre>
 * &lt;Engine name=&quot;Catalina&quot;&gt;
 *     &lt;Valve
 * className=&quot;org.three3s.valves.CrossSubdomainSessionValve&quot;/&gt;
 * </pre>
 * 
 * </p>
 
*/
public class CrossSubdomainSessionValve extends ValveBase {
    
public CrossSubdomainSessionValve() {
        
super();
        info 
= "org.three3s.valves.CrossSubdomainSessionValve/1.0";
    }

    @Override
    
public void invoke(Request request, Response response) throws IOException, ServletException {
        
// this will cause Request.doGetSession to create the session cookie if
        
// necessary
        request.getSession(true);

        
// replace any Tomcat-generated session cookies with our own
        Cookie[] cookies = response.getCookies();
        
if (cookies != null) {
            
for (int i = 0; i < cookies.length; i++) {
                Cookie cookie 
= cookies[i];
                
// System.out.println("CrossSubdomainSessionValve: Cookie name is "
                
// + cookie.getName());
                if (Globals.SESSION_COOKIE_NAME.equals(cookie.getName())) replaceCookie(request, response, cookie);
            }
        }

        
// process the next valve
        getNext().invoke(request, response);
    }

    
/**
     * Replaces the value of the response header used to set the specified
     * cookie to a value with the cookie's domain set to the value returned by
     * <code>getCookieDomain(request)</code>
     * 
     * 
@param request
     * 
@param response
     * 
@param cookie
     *            cookie to be replaced.
     
*/
    
protected void replaceCookie(Request request, Response response, Cookie cookie) {
        
// copy the existing session cookie, but use a different domain
        Cookie newCookie = new Cookie(cookie.getName(), cookie.getValue());
        
// System.out.println("CrossSubdomainSessionValve: CookiePath is " +
        
// cookie.getPath());
        if (cookie.getPath() != null) newCookie.setPath(cookie.getPath());
        String domain 
= getCookieDomain(request);
        
if (!".piaoyoo.com".equals(domain)) domain = request.getServerName();
        
// System.out.println("CrossSubdomainSessionValve: CookieDomain is " +
        
// domain);
        newCookie.setDomain(domain);
        newCookie.setMaxAge(cookie.getMaxAge());
        newCookie.setVersion(cookie.getVersion());
        
// System.out.println("CrossSubdomainSessionValve: CookieComment is " +
        
// cookie.getComment());
        if (cookie.getComment() != null) newCookie.setComment(cookie.getComment());
        newCookie.setSecure(cookie.getSecure());

        
// if the response has already been committed, our replacement strategy
        
// will have no effect
        if (response.isCommitted()) System.out.println("Error CrossSubdomainSessionValve: response was already committed!");

        
// find the Set-Cookie header for the existing cookie and replace its
        
// value with new cookie
        MimeHeaders headers = response.getCoyoteResponse().getMimeHeaders();
        
for (int i = 0, size = headers.size(); i < size; i++) {
            
if (headers.getName(i).equals("Set-Cookie")) {
                MessageBytes value 
= headers.getValue(i);
                
if (value.indexOf(cookie.getName()) >= 0) {
                    StringBuffer buffer 
= new StringBuffer();
                    ServerCookie.appendCookieValue(buffer, newCookie.getVersion(), newCookie.getName(), newCookie.getValue(),
                            newCookie.getPath(), newCookie.getDomain(), newCookie.getComment(), newCookie.getMaxAge(), newCookie
                                    .getSecure());
                    
// System.out.println("CrossSubdomainSessionValve: old Set-Cookie value: "
                    
// + value.toString());
                    
// System.out.println("CrossSubdomainSessionValve: new Set-Cookie value: "
                    
// + buffer);
                    
// System.out.println("-----------------------------");
                    value.setString(buffer.toString());
                }
            }
        }
    }

    
/**
     * Returns the last two parts of the specified request's server name
     * preceded by a dot. Using this as the session cookie's domain allows the
     * session to be shared across subdomains. Note that this implies the
     * session can only be used with domains consisting of two or three parts,
     * according to the domain-matching rules specified in RFC 2109 and RFC
     * 2965.
     * 
     * <p>
     * Examples:
     * </p>
     * <ul>
     * <li>foo.com => .foo.com</li>
     * <li>www.foo.com => .foo.com</li>
     * <li>bar.foo.com => .foo.com</li>
     * <li>abc.bar.foo.com => .foo.com - this means cookie won't work on
     * abc.bar.foo.com!</li>
     * </ul>
     * 
     * 
@param request
     *            provides the server name used to create cookie domain.
     * 
@return the last two parts of the specified request's server name
     *         preceded by a dot.
     
*/
    
protected String getCookieDomain(Request request) {
        String cookieDomain 
= request.getServerName();
        String[] parts 
= cookieDomain.split("\\.");
        
if (parts.length >= 2) cookieDomain = parts[parts.length - 2+ "." + parts[parts.length - 1];
        
return "." + cookieDomain;
    }

    
public String toString() {
        
return ("CrossSubdomainSessionValve[container=" + container.getName() + ']');
    }
}



posted @ 2010-06-04 17:17 world_eyes 阅读(1669) | 评论 (0)编辑 收藏


一台服务器几乎所有网站打开网页 甚至HTML网页 都出现了

<i*f*r*a*m*e src="http://xxx.xx.htm" height=0 width=0></<i*f*r*a*m*e>
这种样式的代码 有的在头部 有的在尾部 部分杀毒软件打开会报毒

打开HTML或ASP PHP页面 在源码中怎么也找不到这段代码

分析原因

首先怀疑ARP挂马,用防ARP的工具又没有发现有arp欺骗

而且arp欺骗一般不会每次都被插入代码,而是时有时无

而且使用http://127.0.0.1 或者http://localhost 访问的时候也可以找到这段代码

arp欺骗的可能排除。

然后就想到可能是JS被篡改,或者是其它的包含文件,查找后没有发现被改的页面 连新建的HTML页面浏览的时候也会被插入这段代码,那就只能是通过IIS挂上去的了。

备份iis数据然后重装iis,代码消失,将备份的iis恢复,问题又来了。


仔细寻找,问题应该出在IIS的配置文件上,打开配置文件,没有发现那段代码。

那很有可能是调用了某个文件,这个怎么查啊,忽然想起了大名鼎鼎的Filemon

本地载了一个上传到服务器上,,打开Filemon,数据太多了,过滤掉一些没有用的

只留下iis的进程,数据还是很多,看来服务器上的站点还是挺多人在访问的。

关掉所有站点,建了一个测试站点anky 目录为D:\www\ 在下面建了一个空白页面test.htm

访问一下这个页面代码被插进来了,再看一下Filemon 奇怪怎么读取C:\Inetpub\wwwroot\iisstart.htm

打开C:\Inetpub\wwwroot\iisstart.htm一看,里面就躺着

<<i*f*r*a*m*e src="http://xx.xxx.jj.htm" height=0 width=0></<i*f*r*a*m*e>

把代码删除了留空,访问test.htm 正常了,把C:\Inetpub\wwwroot\iisstart.htm删除了再访问

test.htm 出现 “读取数据页脚文件出错”问题就出这里了,看来是调用了

这个文件。


把C:\Inetpub\wwwroot\iisstart.htm清空就正常了,这样怎么行,解决问题当然要连根拔掉。

continue

有没有可能是扩展造成的,到扩展中检查了一遍全部都是正常的

当然 通过ISAPI 挂马的也是存在的

左想右想最后还是觉得配置文件有问题

打开配置文件,配置文件在%windir%\system32\inetsrv\Metabase.xml

用记事本打开,查找iisstart.htm 找到一行,开始以为是默认站点,后来一想不对啊

默认站点都删除了,再仔细一看这句代码为

DefaultDocFooter="FILE:C:\Inetpub\wwwroot\iisstart.htm"

删除掉这一行,问题彻底解决了。

==========================================================================
现象:不管是访问服务器上的任何网页,就连404的页面也会在<html>后加入
<<i*f*r*a*m*e SRc=http://xxx.xxx.com/k.htm width=1 height=1 frameborder=0></<i*f*r*a*m*e>,挂马的位置在html标记左右,上面这段恶意代码,它会每隔几秒 加入代码,也就是说在输出具体的东西之前就被挂了,有时有有时又没有,不是网页源代码问题,也没有在网页源代码中加入恶意代码,即使重装服务器,格式化重 分区过第一个硬盘,放上去网站没多久一样再会出现这种情况。


首先就排除了网站被入侵的可能,因为首页能加在那个位置只能是title的地方,用js控制也不大可能.然后去看了php.ini的设置也没有任何的异 常,而且这个插入的代码有的时候出现有的时候不出现,说明不是网站的问题了.打开同服务器的其他网站也有这个情况发生,而且状况一一样.检查并且搜索挂马 的关键字之后确定不是网站程序的问题.

那么剩下的要么是IIS自己出了问题,要么是网络的问题,因为数据是处理没有问题(这个由程序输出,而且即使是html都会出问题),经过一个一个排查, 最后基本可以确定就是arp欺骗欺骗数据报走向,然后中间人修改一些定义的关键字.因为是网络层次有问题(所以重做系统是没有用的).


目的:通过arp欺骗来直接挂马
优点:可以直接通过arp欺骗来挂马.

通常的arp欺骗的攻击方式是在同一vlan下,控制一台主机来监听密码,或者结合ssh中间人攻击来监听ssh1的密码.
但这样存在局限性:
1.管理员经常不登陆,那么要很久才能监听到密码
2.目标主机只开放了80端口,和一个管理端口,且80上只有静态页面,那么很难利用.而管理端口,如果是3389终端,或者是ssh2,那么非常难监听 到密码.

优点:
1.可以不用获得目标主机的权限就可以直接在上面挂马
2.非常隐蔽,不改动任何目标主机的页面或者是配置,在网络传输的过程中间直接插入挂马的语句.
3.可以最大化的利用arp欺骗,从而只要获取一台同一vlan下主机的控制权,就可以最大化战果.


原理:arp中间人攻击,实际上相当于做了一次代理。

正常时候: A---->B ,A是访问的正常客户,B是要攻击的服务器,C是被我们控制的主机
arp中间人攻击时候: A---->C---->B
B---->C---->A
实际上,C在这里做了一次代理的作用

那么HTTP请求发过来的时候,C判断下是哪个客户端发过来的包,转发给B,然后B返回HTTP响应的时候,在HTTP响应包中,插入一段挂马的代码,比 如<爱生活,爱猫扑>...之类,再将修改过的包返回的正常的客户A,就起到了一个挂马的作用.在这个过程中,B是没有任何感觉的,直接攻击 的是正常的客户A,如果A是管理员或者是目标单位,就直接挂上马了.

什么是ARP?

英文原义:Address Resolution Protocol 
中文释义:(RFC-826)地址解析协议 局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。所谓“地址解析”就是主机在
发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址以保证通信的顺利进 行。 

注解:简单地说,ARP协议主要负责将局域网中的32为IP地址转换为对应的48位物理地址,即网卡的MAC地址,比如IP地址为192.168.0.1 网卡MAC地址为00-03-0F-FD-1D-2B。整个转换过程是一台主机先向目标主机发送包含IP地址信息的广播数据包,即ARP请求,然后目标主 机向该主机发送一个含有IP地址和MAC地址数据包,通过MAC地址两个主机就可以实现数据传输了。 

应用:在安装了以太网网络适配器的计算机中都有专门的ARP缓存,包含一个或多个表,用于保存IP地址以及经过解析的MAC地址。在Windows中要查 看或者修改ARP缓存中的信息,可以使用arp命令来完成,比如在Windows XP的命令提示符窗口中键入“arp -a”或“arp -g”可以查看ARP缓存中的内容;键入“arp -d IPaddress”表示删除指定的IP地址项(IPaddress表示IP地址)。arp命令的其他用法可以键入“arp /?”查看到。
============================================================================
解决方案如下:

联系机房,用拨网线的排除法,找出同路由内中了类似47555病毒的机器,隔离。杀毒。

其他机器,遇到这种情况,重装系统是没用的。

Asion注:  ARP和挂马 有很深的学问

来源:http://i.mop.com/Noisa/blog/2008/03/13/6264338.html

posted @ 2010-06-04 16:04 world_eyes 阅读(619) | 评论 (0)编辑 收藏

2009年4月11日 #

微软关于IE、Firefox、Opera和Safari的JavaScript兼容性研究曾经发表过一份草案,可以点击下载《JScript Deviations from ES3 以下为网上的一些搜集和整理(FF代表Firefox)

 集合类对象问题
现有代码中存在许多 document.form.item("itemName") 这样的语句,不能在 FF 下运行
解决方法:
改用 document.form.elements["elementName"]
说明:IE下,可以使用()或[]获取集合类对象;Firefox下,只能使用[]获取集合类对象.
解决方法:统一使用[]获取集合类对象.


window.event
现有问题:
使用 window.event 无法在 FF 上运行
解决方法:
FF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
<script language="javascript">
    function gotoSubmit() {
       alert(window.event);    // use window.event
    }
</script>

新代码(可在IE和FF中运行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
<script language="javascript">
   function gotoSubmit(e) {
      e = e? e : (window.event ? window.event : null);
      alert(e);           
  }
</script>

此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。

 

HTML 对象的 id 作为对象名的问题
现有问题:
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 FF 中不能。
解决方法:
用 getElementById("idName") 代替 idName 作为对象变量使用。

用idName字符串取得对象的问题
现有问题:
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在FF 中不能。
解决方法:
用 getElementById(idName) 代替 eval(idName)。

 

变量名与某 HTML 对象 id 相同的问题
现有问题:
在 FF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
解决方法:
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。

 

event.x 与 event.y 问题
现有问题:
在IE 中,event 对象有 x, y 属性,FF中没有。
解决方法:
在FF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。
如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
其它:
event.layerX 在 IE 与 FF 中都有,具体意义有无差别尚未试验。

 

关于frame
现有问题:
在 IE中 可以用window.testFrame取得该frame,FF中不行
解决方法:
在frame的使用方面FF和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
<frame src="/xx.htm" id="frameId" name="frameName" />
那么ie可以通过id或者name访问这个frame对应的window对象
而FF只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
IE: window.top.frameId或者window.top.frameName来访问这个window对象
FF: 只能这样window.top.frameName来访问这个window对象
另外,在FF和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容

 

父结点的问题
在FF中没有 parentElement parentElement.children  而用 parentNode parentNode.childNodes
childNodes的下标的含义在IE和FF中不同,FF使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。当html中节点缺失时,IE和FF对parentNode的解释不同,例如
<form>
<table>
  <input/>
</table>
</form>

FF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点
FF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

 

const 问题
现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
解决方法:
不使用 const ,以 var 代替。

body 对象
FF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

 

URLencoding
在js中如果书写url就直接写&不要写&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般FF无法识别js中的&

 

nodeName 和 tagName 问题
现有问题:
在FF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象有问题
解决方法:
使用 tagName,但应检测其是否为空。

 

元素属性
IE下 input.type属性为只读,但是FF下可以修改
document.getElementsByName() 和 document.all[name] 的问题
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得多个具有相同name的div 元素集合。

 

兼容firefox的 outerHTML,FF中没有outerHtml的方法

if (window.HTMLElement) {
  HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML) {
        var r=this.ownerDocument.createRange();
        r.setStartBefore(this);
        var df=r.createContextualFragment(sHTML);
        this.parentNode.replaceChild(df,this);
        return sHTML;
    });

    HTMLElement.prototype.__defineGetter__("outerHTML",function() {
        var attr;
        var attrs=this.attributes;
        var str="<"+this.tagName.toLowerCase();
        for (var i=0;i<attrs.length;i++) {
            attr=attrs[i];
            if(attr.specified)
                str+=" "+attr.name+'="'+attr.value+'"';
        }

        if(!this.canHaveChildren)
            return str+">";
        return str+">"+this.innerHTML+"</"+this.tagName.toLowerCase()+">";
        });

   HTMLElement.prototype.__defineGetter__("canHaveChildren",function() {
     switch(this.tagName.toLowerCase()) {
         case "area":
         case "base":
         case "basefont":
         case "col":
         case "frame":
         case "hr":
         case "img":
         case "br":
         case "input":
         case "isindex":
         case "link":
         case "meta":
         case "param":
         return false;
     }
     return true;
   });
}


自定义属性问题
说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;FF下,只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性.

 
event.srcElement问题
说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.
解决方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)来代替IE下的event.srcElement或者Firefox下的event.target.


window.location.href问题
说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.
解决方法:使用window.location来代替window.location.href.


模态和非模态窗口问题
说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能.
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口
如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口. 例如:var parWin = window.opener; parWin.document.getElementById("Aqing").value = "Aqing";

 

事件委托方法
IE:document.body.onload = inject; //Function inject()在这之前已被实现
FF:document.body.onload = inject();
如果要加传递参数,可以做个闭包
(function(arg){

   document.body.onload=function(){inject(arg);};

})(arg)

innerText在IE中能正常工作,但是innerText在FireFox中却不行.
解决方法:
if(navigator.appName.indexOf("Explorer") > -1){
    document.getElementById('element').innerText = "my text";
} else{
    document.getElementById('element').textContent = "my text";
}


FF中类似 obj.style.height = imgObj.height 的语句无效
解决方法:
obj.style.height = imgObj.height + 'px';


IE,FF以及其它浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChile方法也不管用
解决方法:
//向table追加一个空行:
var row = otable.insertRow(-1);
var cell = document.createElement("td");
cell.innerHTML = " ";
cell.className = "XXXX";
row.appendChild(cell);


样式部分
-----------------------------------------------------------------------------------------------------------
cursor:hand VS cursor:pointer
FF不支持hand,但ie支持pointer
解决方法: 统一使用pointer

padding 问题
padding 5px 4px 3px 1px FireFox无法解释简写,
必须改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;

消除ulol等列表的缩进时
样式应写成:list-style:none;margin:0px;padding:0px;
其中margin属性对IE有效,padding属性对FireFox有效

CSS透明
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)
FF:opacity:0.6

CSS圆角
IE:不支持圆角
FF: -moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius- bottomright:4px;

CSS双线凹凸边框
IE:border:2px outset;
FF: -moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;

posted @ 2009-04-11 18:25 world_eyes 阅读(209) | 评论 (0)编辑 收藏

2009年4月1日 #

环境:debian4 apache2.0.63

1:apache 安装

./configure --prefix=/usr/local/apache2
make
make install

2:基本apache操作


cd /usr/local/apache2/bin
sudo ./apachectl start
sudo ./apachectl stop
sudo ./apachectl restart
sudo ./apachectl configtest

3:编译安装mod_rewrite

cd apache下载源目录
find ./ -name mod_rewrite.c
进入 mod_rewrite.c 目录

sudo /usr/local/apache2/bin/apxs -i -a -c mod_rewrite.c

参数说明:

-i : 执行安装操作,将so 安装到 modules目录

-a: 在httpd.conf中激活该模块

-c: 执行编译操作

##将/* 及/*/*的请求都转向到 /new/index.htm , 同时浏览器显示的是前者的链接。
RewriteEngine On
RewriteRule ^/.*(/(.*))?$ /new/index.htm [L,PT]

附:RewriteRule 参数

RewriteRule Pattern Substitution [flags]

Pattern是一个作用于当前URL的perl兼容的正则表达式。"当前URL"是指该规则生效时刻的URL的值。它可能与被请求的URL截然不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。

Substitution是当原始URL与Pattern相匹配时,用来替代(或替换)的字符串。除了纯文本,还可以包含:
对Pattern的反向引用($N)
对最后匹配的RewriteCond的反向引用(%N)
规则条件测试字符串(%{VARNAME})中的服务器变量
映射函数调用(${mapname:key|default})

[flags]标记作为RewriteRule指令的第三个参数,是一个包含以逗号分隔的下列标记的列表:


'chain|C'(链接下一规则)
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹配,则其 后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除".www"(此处不应该出现".www")。
'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(设置cookie)
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如'.apache.org',可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
'env|E=VAR:VAL'(设置环境变量)
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可以在其后 许多情况下被间接引用,通常是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后继的RewriteCond指令的CondPattern参数中通 过%{ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
'forbidden|F'(强制禁止URL)
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
'gone|G'(强制废弃URL)
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
'handler|H=Content-handler'(强制指定内容处理器)
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由"cgi-script"处理器处理。
'last|L'(结尾规则)
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL('/')为实际存在的URL(比如:'/e/www/')。
'next|N'(从头再来)
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于Perl 中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
'nocase|NC'(忽略大小写)
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,'A-Z'和'a-z'没有区别。
'noescape|NE'(在输出中不对URI进行转义)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符('%', '$', ';'等)会被转义为等值的十六进制编码('%25', '%24', '%3B'等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:

RewriteRule /sqnote/(.*) /bar?arg=P1\%3d$1 [R,NE]


可以使'/sqnote/zed转向到一个安全的请求'/bar?arg=P1=zed'。
'nosubreq|NS'(不对内部子请求进行处理)
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
'proxy|P'(强制为代理)
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
注意:要使用这个功能,必须已经启用了mod_proxy模块。
'passthrough|PT'(移交给下一个处理器)
此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,这个小小的修改使得RewriteRule指令的输 出能够被(从URI转换到文件名的)Alias, ScriptAlias, Redirect等指令进行后续处理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。举一个能说明其含义的例子: 如果要将/abc重写为/def, 然后再使用mod_alias将/def转换为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi


如果省略了PT标记,虽然将uri=/abc/...重写为filename=/def/...的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
'qsappend|QSA'(追加查询字符串)
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
'redirect|R [=code]'(强制重定向)
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个外部重定 向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即可(或使 用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将"/~"重写为"/u/",或始终对/u/user加上斜杠,等等。
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使用 'L'标记。
'skip|S=num'(跳过后继规则)
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和'chain|C'标记是不同的!

posted @ 2009-04-01 10:53 world_eyes 阅读(1875) | 评论 (0)编辑 收藏

2009年1月17日 #

 日期转化一

为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007-01-03 14:33:34 ,要转化为其他格式,要用到DateTime.ToString的方法(String, IFormatProvider),如下所示:

using System;
using System.Globalization;
String format="D";
DateTime date=DataTime,Now;
Response.Write(date.ToString(format, DateTimeFormatInfo.InvariantInfo));

结果输出
Thursday, June 16, 2005

参数format格式详细用法:

格式字符 关联属性/说明
d ShortDatePattern
D LongDatePattern
f 完整日期和时间(长日期和短时间)
F FullDateTimePattern(长日期和长时间)
g 常规(短日期和短时间)
G 常规(短日期和长时间)
m、M MonthDayPattern
r、R RFC1123Pattern
s 使用当地时间的 SortableDateTimePattern(基于 ISO 8601)
t ShortTimePattern
T LongTimePattern
u UniversalSortableDateTimePattern 用于显示通用时间的格式
U 使用通用时间的完整日期和时间(长日期和长时间)
y、Y YearMonthPattern

下表列出了可被合并以构造自定义模式的模式。这些模式是区分大小写的;例如,识别“MM”,但不识别“mm”。如果自定义模式包含空白字符或用单引号括起来的字符,则输出字符串页也将包含这些字符。未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制。

格式模式 说明
d 月中的某一天。一位数的日期没有前导零。
dd 月中的某一天。一位数的日期有一个前导零。
ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
dddd 周中某天的完整名称,在 DayNames 中定义。
M 月份数字。一位数的月份没有前导零。
MM 月份数字。一位数的月份有一个前导零。
MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
MMMM 月份的完整名称,在 MonthNames 中定义。
y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。
yyyy 包括纪元的四位数的年份。
gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。
h 12 小时制的小时。一位数的小时数没有前导零。
hh 12 小时制的小时。一位数的小时数有前导零。
H 24 小时制的小时。一位数的小时数没有前导零。
HH 24 小时制的小时。一位数的小时数有前导零。
m 分钟。一位数的分钟数没有前导零。
mm 分钟。一位数的分钟数有一个前导零。
s 秒。一位数的秒数没有前导零。
ss 秒。一位数的秒数有一个前导零。
f 秒的小数精度为一位。其余数字被截断。
ff 秒的小数精度为两位。其余数字被截断。
fff 秒的小数精度为三位。其余数字被截断。
ffff 秒的小数精度为四位。其余数字被截断。
fffff 秒的小数精度为五位。其余数字被截断。
ffffff 秒的小数精度为六位。其余数字被截断。
fffffff 秒的小数精度为七位。其余数字被截断。
t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项的第一个字符(如果存在)。
tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项(如果存在)。
z 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数没有前导零。例如,太平洋标准时间是“-8”。
zz 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数有前导零。例如,太平洋标准时间是“-08”。
zzz 完整时区偏移量(“+”或“-”后面跟有小时和分钟)。一位数的小时数和分钟数有前导零。例如,太平洋标准时间是“-08:00”。
: 在 TimeSeparator 中定义的默认时间分隔符。
/ 在 DateSeparator 中定义的默认日期分隔符。
% c 其中 c 是格式模式(如果单独使用)。如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字符。
\ c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,请使用“\\”。

只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符;例如,

DateTime.ToString( "d") 返回 DateTime 值;“d”是标准短日期模式。
DateTime.ToString( "%d") 返回月中的某天;“%d”是自定义模式。
DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天;“d”是自定义模式。

比较方便的是,上面的参数可以随意组合,并且不会出错,多试试,肯定会找到你要的时间格式
如要得到2005年06月 这样格式的时间
可以这样写:
date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo)

日期转化二

DateTime dt = DateTime.Now;
Label1.Text = dt.ToString();//2005-11-5 13:21:25
Label2.Text = dt.ToFileTime().ToString();//127756416859912816
Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816
Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25
Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日
Label6.Text = dt.ToLongTimeString().ToString();//13:21:25
Label7.Text = dt.ToOADate().ToString();//38661.5565508218
Label8.Text = dt.ToShortDateString().ToString();//2005-11-5
Label9.Text = dt.ToShortTimeString().ToString();//13:21
Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25

Label1.Text = dt.Year.ToString();//2005
Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00
Label3.Text = dt.DayOfWeek.ToString();//Saturday
Label4.Text = dt.DayOfYear.ToString();//309
Label5.Text = dt.Hour.ToString();//13
Label6.Text = dt.Millisecond.ToString();//441
Label7.Text = dt.Minute.ToString();//30
Label8.Text = dt.Month.ToString();//11
Label9.Text = dt.Second.ToString();//28
Label10.Text = dt.Ticks.ToString();//632667942284412864
Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864

Label1.Text = dt.ToString();//2005-11-5 13:47:04
Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04
Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04
Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
Label10.Text = dt.CompareTo(dt).ToString();//0
Label11.Text = dt.Add(?).ToString();//问号为一个时间段

Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False
Label2.Text = dt.Equals(dt).ToString();//True
Label3.Text = dt.GetHashCode().ToString();//1474088234
Label4.Text = dt.GetType().ToString();//System.DateTime
Label5.Text = dt.GetTypeCode().ToString();//DateTime

Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25
Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06
Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05
Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05
Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日
Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日
Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06
Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06
Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT

Label1.Text = string.Format("{0:d}",dt);//2005-11-5
Label2.Text = string.Format("{0:D}",dt);//2005年11月5日
Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23
Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23
Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23
Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23
Label7.Text = string.Format("{0:M}",dt);//11月5日
Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23
Label10.Text   string.Format("{0:t}",dt);//14:23
Label11.Text = string.Format("{0:T}",dt);//14:23:23
Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23
Label14.Text = string.Format("{0:Y}",dt);//2005年11月
Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23
Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt);  

C#比较两时间大小

1、比较时间大小的实验
    string st1="12:13";
    string st2="14:14";
    DateTime dt1=Convert.ToDateTime(st1);
    DateTime dt2=Convert.ToDateTime(st2);
    DateTime dt3=DateTime.Now;
    if(DateTime.Compare(dt1,dt2)>0)
     msg.Text=st1+">"+st2;
    else
     msg.Text=st1+"<"+st2;
    msg.Text+="\r\n"+dt1.ToString();
    if(DateTime.Compare(dt1,dt3)>0)
     msg.Text+="\r\n"+st1+">"+dt3.ToString();
    else
     msg.Text+="\r\n"+st1+"<"+dt3.ToString();
2、计算两个时间差值的函数,返回时间差的绝对值:
         private string DateDiff(DateTime DateTime1,DateTime DateTime2)
         {
             string dateDiff=null;
             try
             {
                 TimeSpan ts1=new   TimeSpan(DateTime1.Ticks);
                 TimeSpan ts2=new   TimeSpan(DateTime2.Ticks);
                 TimeSpan ts=ts1.Subtract(ts2).Duration();
                 dateDiff=ts.Days.ToString()+"天"
                         +ts.Hours.ToString()+"小时"
                         +ts.Minutes.ToString()+"分钟"
                         +ts.Seconds.ToString()+"秒";
             }
             catch
             {
             }
             return dateDiff;
         }
3、实现计算DateTime1-36天=DateTime2的功能
    TimeSpan ts=new TimeSpan(40,0,0,0);
    DateTime dt2=DateTime.Now.Subtract(ts);
    msg.Text=DateTime.Now.ToString()+"-"+ts.Days.ToString()+"天\r\n";
    msg.Text+=dt2.ToString();



由于工作需要,学习了一段时间的donet。觉得跟java各有千秋
posted @ 2009-01-17 15:41 world_eyes 阅读(382) | 评论 (0)编辑 收藏

Window 窗口对象
--返回值:它打开的窗口对象。
----var newWindow = open('','_blank');
--属性
----name 窗口的名称,由打开它的连接(<a target="...">)或框架页(<frame name="...">)或某一个窗口调用的 open() 方法(见下)决定。一般我们不会用这个属性。
----status 指窗口下方的“状态栏”所显示的内容。通过对 status 赋值,可以改变状态栏的显示。
----opener 用法:window.opener;返回打开本窗口的窗口对象。注意:返回的是一个窗口对象。如果窗口不是由其他窗口打开的,在 Netscape 中这个属性返回 null;在 IE 中返回“未定义”(undefined)。undefined 在一定程度上等于 null。注意:undefined 不是 JavaScript 常数,如果你企图使用“undefined”,那就真的返回“未定义”了。
----self 指窗口本身,它返回的对象跟 window 对象是一模一样的。最常用的是“self.close()”,放在<a>标记中:“<a href="javascript:self.close()">关闭窗口</a>”。
----parent 返回窗口所属的框架页对象。
----top 返回占据整个浏览器窗口的最顶端的框架页对象。
--方法
----open() 打开一个窗口。用法:open(<URL字符串>, <窗口名称字符串>, <参数字符串>);
------参数字符串
--------top=# 窗口顶部离开屏幕顶部的像素数
--------left=# 窗口左端离开屏幕左端的像素数
--------width=# 窗口的宽度
--------height=# 窗口的高度
--------menubar=... 窗口有没有菜单,取值yes或no
--------toolbar=... 窗口有没有工具条,取值yes或no
--------location=... 窗口有没有地址栏,取值yes或no
--------directories=... 窗口有没有连接区,取值yes或no
--------scrollbars=... 窗口有没有滚动条,取值yes或no
--------status=... 窗口有没有状态栏,取值yes或no
--------resizable=... 窗口给不给调整大小,取值yes或no
----close() 关闭一个已打开的窗口。
----blur() 使焦点从窗口移走,窗口变为“非活动窗口”。
----focus() 是窗口获得焦点,变为“活动窗口”。不过在 Windows 98,该方法只能使窗口的标题栏和任务栏上的相应按钮闪烁,提示用户该窗口正在试图获得焦点。
----scrollTo() 用法:[<窗口对象>.]scrollTo(x, y);使窗口滚动,使文档从左上角数起的(x, y)点滚动到窗口的左上角。
----scrollBy() 用法:[<窗口对象>.]scrollBy(deltaX, deltaY);使窗口向右滚动 deltaX 像素,向下滚动 deltaY 像素。如果取负值,则向相反的方向滚动。
----resizeTo() 用法:[<窗口对象>.]resizeTo(width, height);使窗口调整大小到宽 width 像素,高 height 像素。
----resizeBy() 用法:[<窗口对象>.]resizeBy(deltaWidth, deltaHeight);使窗口调整大小,宽增大 deltaWidth 像素,高增大 deltaHeight 像素。如果取负值,则减少。
----alert() 用法:alert(<字符串>);弹出一个只包含“确定”按钮的对话框,显示<字符串>的内容,整个文档的读取、Script 的运行都会暂停,直到用户按下“确定”。
----confirm() 用法:confirm(<字符串>);弹出一个包含“确定”和“取消”按钮的对话框,显示<字符串>的内容,要求用户做出选择,整个文档的读取、Script 的运行都会暂停。如果用户按下“确定”,则返回 true 值,如果按下“取消”,则返回 false 值。
----prompt() 用法:prompt(<字符串>[, <初始值>]);弹出一个包含“确认”“取消”和一个文本框的对话框,显示<字符串>的内容,要求用户在文本框输入一些数据,整个文档的读取、Script 的运行都会暂停。如果用户按下“确认”,则返回文本框里已有的内容,如果用户按下“取消”,则返回 null 值。如果指定<初始值>,则文本框里会有默认值。
--事件
----onload
----onunload
----onresize
----onblur
----onfocus
----onerror

document 文档对象 描述当前窗口或指定窗口对象的文档。它包含了文档从<head>到</body>的内容。
--用法:document (当前窗口) 或 <窗口对象>.document (指定窗口)
--属性:
----cookie 关于 cookie 请参看“使用框架和 Cookies”一章。
----lastModified 当前文档的最后修改日期,是一个 Date 对象。
----referrer 如果当前文档是通过点击连接打开的,则 referrer 返回原来的 URL。
----title 指<head>标记里用<title>...</title>定义的文字。在 Netscape 里本属性不接受赋值。
----fgColor 指<body>标记的 text 属性所表示的文本颜色。
----bgColor 指<body>标记的 bgcolor 属性所表示的背景颜色。
----linkColor 指<body>标记的 link 属性所表示的连接颜色。
----alinkColor 指<body>标记的 alink 属性所表示的活动连接颜色。
----vlinkColor 指<body>标记的 vlink 属性所表示的已访问连接颜色。
--方法
----open() 打开文档以便 JavaScript 能向文档的当前位置(指插入 JavaScript 的位置)写入数据。通常不需要用这个方法,在需要的时候 JavaScript 自动调用。
----write(); writeln() 向文档写入数据,所写入的会当成标准文档 HTML 来处理。writeln() 与 write() 的不同点在于,writeln() 在写入数据以后会加一个换行。这个换行只是在 HTML 中换行,具体情况能不能够是显示出来的文字换行,要看插入 JavaScript 的位置而定。如在<pre>标记中插入,这个换行也会体现在文档中。
----clear() 清空当前文档。
----close() 关闭文档,停止写入数据。如果用了 write[ln]() 或 clear() 方法,就一定要用 close() 方法来保证所做的更改能够显示出来。

forms[]; Form 表单对象
--用法
----document.forms[] 是一个数组,包含了文档中所有的表单(<form>)。要引用单个表单,可以用 document.forms[x],但是一般来说,人们都会这样做:在<form>标记中加上“name="..."”属性,那么直接用“document.<表单名>”就可以引用了。
--属性
----name 返回表单的名称,也就是<form name="...">属性。
----action 返回/设定表单的提交地址,也就是<form action="...">属性。
----method 返回/设定表单的提交方法,也就是<form method="...">属性。
----target 返回/设定表单提交后返回的窗口,也就是<form target="...">属性。
----encoding 返回/设定表单提交内容的编码方式,也就是<form enctype="...">属性。
----length 返回该表单所含元素的数目。
--方法
----reset() 重置表单。这与按下“重置”按钮是一样的。
----submit() 提交表单。这与按下“提交”按钮是一样的。
--事件
----onreset
----onsubmit

Javascript文档对象结构

浏览器对象  navigator
屏幕对象  screen
窗口对象  window
 历史对象   history
 地址对象   location
 框架对象   frames[]; Frame
 文档对象   document
  连接对象    anchors[]; links[]; Link
  Java小程序对象   applets[]
  插件对象    embeds[]
  图片对象     images[]; Image
  表单对象    forms[]; Form
   按钮对象     Button
   复选框对象    Checkbox
   表单元素对象    elements[]; Element
   隐藏对象     Hidden
   密码输入区对象    Password
   单选域对象    Radio
   重置按钮对象    Reset
   选择区(下拉菜单、列表)对象  Select
    选择项对象     options[]; Option
   提交按钮对象    Submit
   文本框对象    Text
   多行文本输入区对象   Textarea

posted @ 2009-01-17 15:38 world_eyes 阅读(1675) | 评论 (0)编辑 收藏

2008年12月16日 #

    由于项目中需要autocomplete,且项目中一直使用jquer的框架。所以继续选用jquery 的插件jquery-autocomplete,看到jquery-autocomplete自带的demo感觉很是容易但是在使用中却没有想象中的那么顺手。

     关于Jquery-autocomplete处理response中是Json对象时当成字符串处理。查了一些资料终于找到处理方法先看代码:
  $("#fromCity").autocomplete("../searchCity.do", {
     multiple: true, 
     width:150, 
     max:50,  
     max:50, 
     multipleSeparator: '',
     dataType: 'json',  
//加入对返回的json对象进行解析函数,函数返回一个数组    
     parse: function(data) {
       var rows = [];
       for(var i=0; i<data.length; i++){
        rows[rows.length] = {
          data:data[i].nameEn +"-"+data[i].nameCn,
          value:data[i].cityCode,
          result:data[i].nameCn
          };
        }
     return rows;
       },
     formatItem: function(row, i, n) {
        return row;     
    }
  });

同时给隐藏域赋值:
$("#hinpfromCity").result(function(event, data, formatted) {
    var hidden = $("#fromCity");
    hidden.val(data.substring(data.length-4,data.length-1));
   });

 就是在出来绑定中添加一个对返回的json对象进行解析函数。

posted @ 2008-12-16 22:57 world_eyes 阅读(3664) | 评论 (0)编辑 收藏

仅列出标题