详细讲解C++ 类的继承

一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事,就是指在公开场合,但是在类内部可以的

一、引言

在C++中,类是提供封装的逻辑单位,类的每一个对象都包含有描述其自身状态的数据集合,并且通过接收特定的消息来处理这个数据集合。如果程序设计 人员能够通过增加、修改或替换指定类的部分内容的方法对该类进行剪裁,就可以适应不同的应用,从而在很大程度上增强了数据封装的价值,而接下来要讨论的继 承就完全可以实现这种操作。

二、与继承有关的基本概念

继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用 继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个 类。

当一个类被其他的类继承时,被继承的类称为基类(可不是鸡肋^_^),又称为父类。

继承其他类属性的类称为派生类,又称为子类。

一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。

三、单重继承、多重继承与继承链

从一个基类派生的继承称为单继承,换句话说,派生类只有一个直接基类。单继承声明语句的常用格式为:

class 派生类名: 访问控制关键字 基类名
{
数据成员和成员函数声明
};

与此相对地,从多个基类派生的继承称为多继承或多重继承,也就是说,一个派生类有多个直接基类。在某些面向对象的语言(如Java)中不支持类间的 多重继承而只支持单重继承,即一个类至多只能有一个直接父类,因此实现类似的功能需要借助接口等其他机制。而在C++中提供了多重继承的语法支持,使得问 题变得简单了许多。多重继承声明语句的常用格式为:

class 派生类名: 访问控制关键字 基类名1, 访问控制关键字 基类名2,...
{
数据成员和成员函数声明
};

除了多重继承之外,一个派生类继承多个基类还有一种方法,就是把派生类作为基类再次供别的类继承,产生多层次的继承关系。例如类A派生类B,类B派 生类C,则称类A是类B的直接基类,类B是类C的直接基类,类A是类C的间接基类。类的层次结构也叫做继承链。还是上面的例子,当建立类C的对象时,类A 的构造函数最先被调用,接下来被调用的是类B的构造函数,最后是类C的构造函数。析构函数的调用顺序正好相反。当一个派生类继承有层次的类时,继承链上的 每个派生类必须将它需要的变量传递给它的基类。

四、公有派生和私有派生

在继承声明语句中,访问控制关键字用于说明在基类定义中所声明的成员和成员函数能够在多大范围内被派生类所访问。访问控制关键字可为public, private或protected。如果访问控制关键字为public,则称派生类从基类公有继承,也称公有派生。如果访问控制关键字为 private,则称派生类从基类私有继承,也称私有派生。现在笔者将公有继承和私有继承的具体区别列表如下。

通过上表,我们可以将两种派生的特点总结如下:

基类成员 基类private成员 基类public成员
派生方式 private public private public
派生类成员 不可见 不可见 可见 可见
外部函数 不可见 不可见 不可见 可见

(1)无论哪种派生方式,基类中的private成员在派生类中都是不可见的。也就是说,基类中的private成员不允许外部函数或派生类中的任何成员访问。

(2)public派生与private派生的不同点在于基类中的public成员在派生类中的访问属性:
public派生时,基类中的public成员相当于派生类中的public成员。
private派生时, 基类中的public成员相当于派生类中的private成员。

因此,private派生确保基类中的方法只能被派生类的对象的方法间接使用,而不能被外部使用。public派生使派生类对象与外部都可以直接使用基类中的方法,除非这些方法已经被重新定义。

五、保护成员与保护派生

如果想做到基类成员只由有派生血缘关系的成员访问,而不被无血缘关系的对象成员访问,无论用公有派生还是私有派生都无法做到。因为基类成员中的私有 成员是别的类(包括派生类)成员不能访问的,而基类中的公有成员在public派生时,不仅可以由派生类对象成员访问,也可以由外部函数访问;而在 private派生时,基类中的公有成员虽然允许派生类对象中的成员访问,不允许外部访问,可是再派生出下一级时,由于基类的所有成员已经被私有化,其它 类成员也不可再访问。实现只许有派生血缘关系的对象成员访问的方法,是在基类中使用具有另一种访问属性的成员——protected成员。

protected成员是一种血缘关系内外有别的成员。它对派生对象而言,是公有成员,可以访问;对血缘关系外部而言,与私有成员一样被隐藏。

此外,除了允许使用private与public两种派生方式之外,C++还允许使用protected派生方式。现在将三种访问属性不同的成员经三种派生后在派生类中访问属性的变化情况总结如下表,是对上一表格的增进和补充。

派生方式 基类的public成员 基类的protected成员 基类的private成员 派生方式引起的访问属性变化概括
private派生 变为private成员 变为private成员 不可见 基类中的非私有成员都成为派生类中的私有成员
protected派生 变为protected成员 变为private成员 不可见 基类中的非私有成员在派生类中的访问属性都降一级
public派生 仍为public成员 仍为protected成员 不可见 基类中的非私有成员在派生类中的访问属性保持不变

需要注意的是,基类的private成员无论经过何种派生,在派生类中都是不可见的。

六、友元类和友元函数

(1)友元函数

通常,类的私有成员只能由本类的成员访问,外部函数只能访问类的成员函数,再由成员函数访问类的私有成员。但是,如果在某个类定义中用friend 声明了一个外部函数(也许是其他类的一个成员)后,这个外部函数便可以例外地访问该类的任何私有成员。用friend声明了的外部函数称为这个类的友元函 数。

当友元函数是另一个类的成员函数时,应当注意以下几点:

A:友元函数作为一个类的成员函数时,除应当在它所在的类定义中声明之外,还应当在另一个类中声明它的友元关系,声明语句的格式为:

friend 函数类型 函数所在类名::函数名(参数列表);

B:友元函数在引用本类对象的私有成员时无需本类对象的引用参数,但在引用生命它是友元的类的对象中的私有成员时必须有友元类对象的引用参数。

C:一个类的成员函数作另一个类的友元函数时,必须先定义,而不是仅仅声明它。

使用友元函数直接访问对象的私有成员,可以免去再调用类的成员函数所需的开销。同时,友元函数作为类的一个接口,对已经设计好的类,只要增加一条声 明语句,便可以使用外部函数来补充它的功能,或架起不同类对象之间联系的桥梁。然而,它同时也破坏了对象封装与信息隐藏,使用时需要谨慎小心。

(2)友元类

也可以把一个类而不仅仅是一个函数声明为另一个类的友元类。这时,只需先声明它而不一定需要先定义。

应当注意,友元关系是单向的,并且只在两个类之间有效。即使类X是类Y的友元,类Y是否是类X的友元也要看类X中是否有相应的声明。即友元关系不具有交换性。若类X是类Y的友元,类Y是类Z的友元,也不一定就说明类X是类Z的友元,即友元关系也不具有传递性。

当一个类要和另一个类协同工作时,使一个类成为另一个类的友元类是很有用的。这时友元类中的每一个成员函数都成为了对方的友元函数。

摘自:http://blog.csdn.net/ecitnet/archive/2008/01/23/2060431.aspx

java连接mysql数据库实例(测试无误)

许多刚刚接触数据库的同学都经历过一段痛苦的生活吧!小则1下午,多则N天都看一个小程序发愁,怎么就是连不上了。

  首先下载安装配置MYSQL可以到百度上随便找一个下载地址http://www.onlinedown.net/soft/3573.htm

  然后在去下载MYSQL驱动包。解压后会有一个名字类似mysql-connector-java-5.1.5-bin.jar的文件(讯雷下载地址:http://119.147.41.16/down1?cid=95014987FD948875481E4E71B19CF675A975A1F7&t=2&fmt=&usrinput=mysql5.1&dt=2006000),这里用的是5.1.7版本的

  将这个文件拷贝到%java_home%/lib文件夹下。

  右键我的电脑->属性->高级->环境变量。在classpath的后面加上;%java_home%/lib/mysql-connector-java-5.1.5-bin.jar;

  好了,现在我们已经基本做完了准备工作了。

  打开mysql数据库

  create database studentinfo ;建立一个名为studentinfo的数据库

 

 下面是一段小测试程序

 

import java.sql.*;
            public class Test {
            public static Connection getConnection() throws SQLException ,
            java.lang.ClassNotFoundException{
            String url = "jdbc:mysql://localhost:3306/studentinfo";
            Class.forName("com.mysql.jdbc.Driver");
            String userName = "root";
            String password = "123";
            Connection con = DriverManager.getConnection(url,userName,password);
            return con;
            }
            public static void main(String[] args) {
            try{
            Connection con = getConnection();
            Statement sql = con.createStatement();
            sql.execute("drop table if exists student");
            sql.execute("create table student(id int not null auto_increment,name varchar(20) not null default 'name',math int not null default 60,primary key(id));");
            sql.execute("insert student values(1,'AAA','99')");
            sql.execute("insert student values(2,'BBB','77')");
            sql.execute("insert student values(3,'CCC','65')");
            String query = "select * from student";
            ResultSet result = sql.executeQuery(query);
            System.out.println("Student表数据如下:");
            System.out.println("---------------------------------");
            System.out.println("学号"+" "+"姓名"+" "+"数学成绩");
            System.out.println("---------------------------------");
            int number;
            String name;
            String math;
            while(result.next()){
            number = result.getInt("id");
            name = result.getString("name");
            math = result.getString("math");
            System.out.println(number + " " + name + " " + math);
            }
            sql.close();
            con.close();
            }catch(java.lang.ClassNotFoundException e){
            System.err.println("ClassNotFoundException:" + e.getMessage());
            }catch(SQLException ex){
            System.err.println("SQLException:" + ex.getMessage());
            }
            }
            }

 

 进到dos下状态,执行javac Test.java和java Test即可.

这时候观察一下控制台时候出现了

Student表数据如下:
---------------------------------
学号 姓名 数学成绩
---------------------------------
1 AAA 99
2 BBB 77
3 CCC 65

 

OK搞定

 但是别开心的太早了,其中还有很多小细节,比如说会出现找不到com.mysql.jdbc.Driver...

下面就说一个经常能碰到的问题和解决办法

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
如果出现上面的那个异常,则标明没有找到com.mysql.jdbc.Driver这个文件。这个时候你可以把mysql-connector- java-5.1.5-bin.jar这个文件加入到我们的工程里,在我们的工程右键->首选项->Java BuildPath->Libraries->addExternal Jars把mysql-connector-java-5.1.5-bin.jar加进去。应该就是OK了。如果还是出那个错,SORRY,我也没办法了。

JDBC连接MySQL数据库关键的四个步骤(初学必看)

1、查找驱动程序

  MySQL目前提供的Java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯Java驱动程序,JDBC链接MySQL不需做其他配置。

  2、动态指定classpath

  如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

  3、加载JDBC 连接MySQL

 

  1. try{  
  2.  Class.forName(com.mysql.jdbc.Driver);  
  3.  System.out.println(Success loading Mysql Driver!);  
  4. }catch(Exception e)  
  5. {  
  6.  System.out.println(Error loading Mysql Driver!);  
  7.  e.printStackTrace();  

  4、设置JDBC连接MySQL的URL

 

jdbc:mysql://localhost/databasename[?pa=va][&pa=va] 

FireFox 如何设置不激活新标签

在Firefox浏览器地地址栏输入“about:config"
会出现参数页面.接着在过滤器里输入"browser.tabs",设置以下的布尔值:
"browser.tabs.loadBookmarksInBackground" 双击设置成:“true”
"browser.tabs.loadDivertedInBackground" 双击设置成:“true” 
"browser.tabs.autoHide"双击设置成:“true”

java mysql数据库的连接

例子:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,java.io.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

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

<%   
   String url="jdbc:mysql://localhost:3306/shujukuming";

  try{
    Class.forName("com.mysql.jdbc.Driver");
    Connection dcon=DriverManager.getConnection(url,"root","shujukumima");
    String sql="select * from message;";
 Statement stmt=dcon.createStatement();
 ResultSet rs=stmt.executeQuery(sql);

 if(rs.next())
 {

 int id=rs.getInt("id");
 String name=rs.getString("name");
 String title=rs.getString("title");
 String content=rs.getString("content");
 java.sql.Date messageDate=rs.getDate("messageDate");
%>
  <table width="249" border="1" align="center">
  <tr>
    <td width="111">name:<%=name%></td>
    <td width="122">time:<%=messageDate%></td>
  </tr>
  <tr>
    <td>title:<%=title%></td>
    <td>id:<%=id%></td>
  </tr>
  <tr>
    <td height="82" colspan="2"> <%=content%></td>
  </tr>
</table>
 <% }} catch(Exception e){
         out.print("wrong here");
}%>
摘自:http://zhidao.baidu.com/question/25015915.html

Java连接MySQL数据库

感谢beansoft提供的《MyEclipse 6 Java 开发中文教程》,使我受益匪浅。
1、首先,当然要准备JDBC驱动啦
可以到mysql官方网站下载mysql-connector-java-5.1.6-bin.jar

2、

CREATE TABLE `student` (
  `id` 
int(11NOT NULL AUTO_INCREMENT,
  `username` 
varchar(200NOT NULL,
  `password` 
varchar(20NOT NULL,
  `age` 
int(11DEFAULT NULL,
  
PRIMARY KEY (`id`)
) ENGINE
=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=gbk;

 

/**
 * @(#)JDBCTest.java
 *
 *
 * 
@author keer2345
 * 
@version 1.00 2008/8/11
 
*/

import java.sql.*;

public class JDBCTest {

    public static void main(String[] args) {
        
// 1. 注册驱动
        try {
            Class.forName(
"com.mysql.jdbc.Driver");
        } 
catch(ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        
        
// 声明变量,使用,而后关闭
        Connection conn = null;        //数据库连接
        Statement stmt = null;         //数据库表达式
        ResultSet rs = null;             //结果集
        
        
try {
            
//2. 获取数据库的连接
            conn = DriverManager.getConnection
                (
"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK","root","");
            
            
//3. 获取表达式
            stmt = conn.createStatement();
            
                
// 插入数据
            stmt.executeUpdate("insert into Student (username, password, age) values ('张三','1234',20)");
            
            
//4. 执行SQL
            rs = stmt.executeQuery("select * from Student");
            
            
//5. 现实结果集里面的数据
            while(rs.next()) {
                System.out.println(
"编号=" + rs.getInt(1));
                System.out.println(
"姓名=" + rs.getString("username"));
                System.out.println(
"密码=" + rs.getString("password"));
                System.out.println(
"年龄=" + rs.getString("age"));
                System.out.println(
"---------------");
            }
        }
        
catch (Exception ex) {
            ex.printStackTrace();
        }
        
finally {
            
try {
                
if(rs != null) {
                    rs.close();
                }
                
if(sm != null) {
                    sm.close();
                }
                
if(conn != null) {
                    conn.close();
                }
            } 
catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

摘自:http://www.blogjava.net/keer2345/archive/2009/04/10/221380.html

IP转物理地址的原理(php版)

FW: http://bbs.chinaunix.net/thread-1218708-1-2.html

首先,IP对应的国家是比较好查的,ICANN及其它几个机构都有关于某个IP段所属国家和ISP信息,并且他们基本上都提供了免费查询。但难题在于每个洲的管理机构不同,且数据量庞大,不易收集。将IP对应到某个国家的某个ISP后还要了结到它是分配给哪个地区(城市)的,比如中国电信福建分公司的IP 段会分给厦门、福州等城市,而相对于这个就是比较难找了,可能ISP会有数据库会提供查询,可能也查不到,这些数据的来源就靠平时的积累、用户的贡献了。

当然,现在许多出名的数据库经过几年的发展已经比较完整和详细了,像免费的纯真数据库都有十几万条了,如过向国外的商业网站购买企业级应用的数据库,它的 准确度就有点惊人了。国外的 ip2location.com 提供的数据库就是如此,作为一个英文数据库,它除了对美国等地区的数据比较完整以外,甚至中国的数据的精确程度都不亚于国内的数据库。它还提供了IP对应的经纬度,如果搭配Google 提供的Google Earth 的API,就可以在网页上看到Google Earth了。

就保存的方法来看,一般有一个文件(如纯真的QQwry.dat)或数据库。在数据量庞大(如几十万条)的情况下,用文件保存明显优于数据库,这一点在后面会详解。无论采用哪种方式保存数据,它的一般格式为:

起点IP,终点IP,国家,地区
33996344,33996351,United Kingdom,XXX

某 些比较详细的数据库还有ISP,国家缩略名,对应邮编,甚至该地的经纬度!起点IP,终点IP不是我们常见的 XXX.XXX.XXX.XXX的形式,而是一个8-10位十进制数字构成的。这也是为了便于数据的搜索。该数据由IP转换而成,在PHP中有 ip2long() 函数可以转换,自己也可以写一个相同的函数

1. function dottedquad2long($ip){
2. $ip_arr = split(’\.’,$ip);
3. $iplong = (16777216 * $ip_arr[0]) + (65536 * $ip_arr[1]) + (256 * $ip_arr[2]) + $ip_arr[3];
4. return $iplong;
5. }

在一个文件的数据库中,通常每个数据间用某种间隔符间隔,当要查找一个IP如64.233.189.104,先将该IP转化为十进制数字 1089060200 ,再在文件中多次利用二分法查找该IP对应的区间,约通过10-20次查找,就可以准确地找到对应的位置了。

另外一种利用数据库保存数据的方法相比于文件的查找,PHP做的工作比较简单,但交给MySQL做的任务就比较艰巨了。现在一般的小型的数据库(如我找到的只有国家信息的数据),都有十万余条。要在那么多的数据库中查找一个区间,使用的时间倒不如用文件查找来得快。
关于查找数据在数据库和文件分别所用的时间我在上一篇文章中有提到过,一般来说用文件保存的数据查找速度明显优于数据库。

接下来就是我的完整的IP查询的方法了

数据库信息
数据库 ip 中表 ipdata 里面有:

id
startipnum 起点IP数字 如:33996344
endipnum终点IP数字 如:33996351
areaslug 国家/地区缩写 如:GB
area 国家全名 如: United Kingdom

1. <?php
2.
3. //调用的图片类型,默认gif
4. if($_GET['imgtype'] == ‘png’){
5. $imgtype = ‘png’;
6. }else{
7. $imgtype = ‘gif’;
8. }
9.
10. //分析请求(支持IP,主机查询)
11. if(!$_GET['s']){
12. $ip = $_SERVER["REMOTE_ADDR"];//无请求,查询访问者的IP信息
13. }else{
14. $s = trim(strtolower($_GET['s']));//转换为小写
15. if(ereg(’[a-z]‘,$s) && substr($s ,-1,1) != ‘x’){
16. $ip = gethostbyname($s);//如果是主机,则转换为对应IP
17. }else{
18. if(substr($s ,-1,1) == ‘x’){
19. $ip = str_replace(’x',’0′,$s);//为用户隐私考虑,允许最后一位用英文字符x取代。
20. }else{
21. $ip = $s;
22. }
23. }
24. }
25. $ip = long2ip(ip2long($ip));
26. $sip = sprintf(’%u’,ip2long($ip));
27. //再进一步分析整理出合法的IP地址,并转换为数字形式,便于在数据库中查找
28. $sql = “SELECT * FROM `ipdata` WHERE $sip >= `startipnum` AND $sip <= `endipnum`”;
29. //组织SQL在数据库中查找IP对应的区间
30. $link = mysql_connect(”localhost”, “root”, “”);
31. mysql_select_db(’ip’, $link);
32. $result = mysql_query($sql);
33. while ($row = mysql_fetch_array($result)) {
34. $return = $row;
35. }
36. //进行查询,得出结果
37. if(!$return['areaslug'] || $return['areaslug'] == ‘-h’){//没有结果或结果位置,返回问号的图标
38. header(’Content-type: image/png’);
39. readfile(’icon/png/other.png’);
40. }else{//根据调用格式不同分别调用对应的图标
41. if($imgtype == ‘png’){
42. header(’Content-type: image/png’);
43. readfile(’icon/png/’.strtolower($return['areaslug']).’.png’);
44. }else{
45. header(’Content-type: image/gif’);
46. readfile(’icon/gif/’.strtolower($return['areaslug']).’.gif’);
47. }
48. }
49.
50. ?>

PHP版IP限制程序代码

<?php
error_reporting(7);
session_start();
// 发送字符头信息
if ($headercharset)
 header("Content-Type:text/html; charset=gb2312");
// 加载公共文件
require_once("config.php");
require_once("global.php");
require_once("db_mysql.php");
/***************** 进行客户端能否访问本网站校验 ************/
// 获取客户端IP
if(getenv(’HTTP_CLIENT_IP’)) {
 $client_ip = getenv(’HTTP_CLIENT_IP’);
} elseif(getenv(’HTTP_X_FORWARDED_FOR’)) {
 $client_ip = getenv(’HTTP_X_FORWARDED_FOR’);
} elseif(getenv(’REMOTE_ADDR’)) {
 $client_ip = getenv(’REMOTE_ADDR’);
} else {
 $client_ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
// 分解客户端IP
$cip = explode(".", $client_ip);
// 连接数据库
$db = new DB_Sql();
$err = $db->connect();
/*  限制远程IP访问, PS: 这段代码真晕,呵呵,用了8个if, -_-#  */
// 从数据库中提取存储的要限制的IP地址
$query_str = "SELECT limit_ip FROM us_limitip";
$db->query($query_str);
// 把结果循环提取,一个个进行校验
while ($db->next_record())
{
 $limit_ip = $db->f("limit_ip");
 $lip = explode(".", $limit_ip);
 // 如果限制IP的第一个是*或者是0的话就跳到错误页
 if (($lip[0]==’*') || ($lip[0]==’0′))
  header("Location:../error.php?errid=300");
 // 如果刚好客户端IP等于我们限制IP就跳到错误页
 if ($client_ip==$limit_ip)
  header("Location:../error.php?errid=300");
 // 如果第一组IP一致进行第二组IP的匹配
 if ($cip[0] == $lip[0])
 {
  // 如果第二组限制IP是*就跳到错误页
  if ($lip[1]==’*')
   header("Location:../error.php?errid=300");
  // 第二组IP匹配就进行第三组IP匹配
  if ($cip[1]==$lip[1])
  {
   // 如果第三组限制字符是*就跳到错误页
   if ($lip[2]==’*')
    header("Location:../error.php?errid=300");
   // 如果第三组IP匹配就跳到第三组校验
   if ($cip[2]==$lip[2])
   {
    // 如果第四组限制IP是*或0就跳到错误页
    if (($lip[3]==’*') || ($lip[3]==’0′))
     header("Location:../error.php?errid=300");
   }
  }
 } 
}
// 释放数据库查询结果
$db->free();
/****************** IP校验结束 ******************/
?>

ip范围限制函数

大家如果还有好的建议算法,就联系我!!:)

******************************
function checkip(cinput_ip,cbound_ip)
created by qqdao, qqdao@263.net 2001/11/28
说明:首先需要根据;号循环,然后判断是否含有"-",如果有则进行拆分处理,最后判断是否在范围内
参数: cinput_ip,代检查的ip
    cbound_ip,给定的范围格式为,单个ip,和范围ip,范围ip最后使用”-“分割,如果是“*”则必须放到最后一位
         每个范围后添加":allow"表示允许登陆,添加":refuse"表示拒绝登陆。多个范围用”;“隔开
         例如192.168.1*.*:allow;192.168.1.1:allow;192.168.1.1-10:refuse"
返回值: true/false
更新:2001/12/05  支持allow,refuse支持’*‘,不想对?支持,因为和*差不多
******************************
function checkip(cinput_ip,cbound_ip)
dim csingle_ip,ctemp_ip,cstart_ip,cend_ip
    checkip = false
    csingle_ip=split(cbound_ip,";")

        for i=0 to ubound(csingle_ip)
            if instr(csingle_ip(i),"refuse") <> 0 then    就是拒绝了
                    ctemp_ip = left(csingle_ip(i),instr(csingle_ip(i),":")-1)
           
            if instr(ctemp_ip,"*") <> 0 then  是宽范围
                cstart_ip = left(ctemp_ip,instr(ctemp_ip,"*")-1)
                if left(cinput_ip,len(cstart_ip))=cstart_ip then
                    checkip = false
                    exit function
                end if
                end if

            if instr(ctemp_ip,"-") = 0 then
            cstart_ip = ctemp_ip
            cend_ip   = ctemp_ip
            else
            cstart_ip = left(ctemp_ip,instr(ctemp_ip,"-")-1)
            cend_ip   = left(cstart_ip,instrrev(cstart_ip,".")-1)+"."+mid(ctemp_ip,instr(ctemp_ip,"-")+1)
            end if
    
            if     ip2str(cinput_ip)>=ip2str(cstart_ip) and ip2str(cinput_ip)<=ip2str(cend_ip) then
                checkip = false
                exit function
            end if

        elseif instr(csingle_ip(i),"allow") <> 0 then             允许
                 
                    ctemp_ip = left(csingle_ip(i),instr(csingle_ip(i),":")-1)
          
            if instr(ctemp_ip,"*") <> 0 then          是宽范围
                cstart_ip = left(ctemp_ip,instr(ctemp_ip,"*")-1)
                if left(cinput_ip,len(cstart_ip))=cstart_ip then
                    checkip = true
                end if
                end if

            if instr(ctemp_ip,"-") = 0 then
            cstart_ip = ctemp_ip
            cend_ip   = ctemp_ip
            else
            cstart_ip = left(ctemp_ip,instr(ctemp_ip,"-")-1)
            cend_ip   = left(cstart_ip,instrrev(cstart_ip,".")-1)+"."+mid(ctemp_ip,instr(ctemp_ip,"-")+1)
            end if
    
            if     ip2str(cinput_ip)>=ip2str(cstart_ip) and ip2str(cinput_ip)<=ip2str(cend_ip) then
                checkip =true
            else
                checkip =false
            end if
        end if
       next

end function

******************************
function ip2str(cip)
created by qqdao, qqdao@263.net 2001/11/28
参考动网ip算法
参数:cip ip地址
返回值: 转换后数值
******************************
function ip2str(cip)
    dim str1,str2,str3,str4
    dim cip_temp
    if cip="127.0.0.1" then cip="192.168.0.1"
        str1=left(cip,instr(cip,".")-1)
        cip_temp=mid(cip,instr(cip,".")+1)
        str2=left(cip_temp,instr(cip_temp,".")-1)
        cip_temp=mid(cip_temp,instr(cip_temp,".")+1)
        str3=left(cip_temp,instr(cip_temp,".")-1)
        str4=mid(cip_temp,instr(cip_temp,".")+1)

    if isnumeric(str1)=0 or isnumeric(str2)=0 or isnumeric(str3)=0 or isnumeric(str4)=0 then

    else
            ip2str=cint(str1)*256*256*256+cint(str2)*256*256+cint(str3)*256+cint(str4)-1
    end if

end function

jQuery日期选择器插件date-input

地址:http://jonathanleighton.com/projects/date-input

使用方法:

  1. Include jQuery (I am assuming you already know how to do that)
  2. Include the Date Input plugin:
    <script type="text/javascript" src="jquery.date_input.js"></script>
  3. Include the CSS:
    <link rel="stylesheet" href="date_input.css" type="text/css">
  4. Fields are turned into date inputs by getting a jQuery object of the fields you want, and calling date_input() on then. I find it convenient to give all my date inputs a class of date_input and transform them automatically on DOM load. There is an initialize method which can do this for you, like so:
    $($.date_input.initialize);

    If you want to get a bit more specific, you can do it like this:

    $(function() {
      $("#my_specific_input").date_input();
    });

如果要使用yyyy-mm-dd的格式,只需要在js里指定以下代码即可以了.

$.extend(DateInput.DEFAULT_OPTS, {
  stringToDate: function(string) {
    var matches;
    if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2})$/)) {
      return new Date(matches[1], matches[2] - 1, matches[3]);
    } else {
      return null;
    };
  },

  dateToString: function(date) {
    var month = (date.getMonth() + 1).toString();
    var dom = date.getDate().toString();
    if (month.length == 1) month = "0" + month;
    if (dom.length == 1) dom = "0" + dom;
    return date.getFullYear() + "-" + month + "-" + dom;
  }
});