tomcat配置虚拟主机
2008-12-13 17:38

一、网站系统的组成

只要在一台计算机上安装了WEB服务器软件,从功能上讲,这台计算机就可以称为WEB服务器。一个网站的规模可大可小,功能可多可少,最简单的网站只需要一台Web服务器即可对外提供网页浏览服务。复杂的网站包括多台WEB服务器组成的群集系统、负载均衡设备、具有缓存功能的代理服务器(可以有多级,甚至包括放置在服务器端的缓存系统)、数据库系统等,如图2.2所示。

 


2.2

www.sina.com网站系统采用的基本上就是图2.2所示的架构,不同地区的人们在访问www.sina.com站点时,浏览器实际上所访问的服务器是不一样的,例如,吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器,湖北省的用户访问的服务器实际是sina放在湖北地区的代理服务器。各地区的浏览器访问www.sina.com站点的过程如图2.3所示。

 


2.3

为了能够让浏览器透明地访问到WEB站点,让用户感觉不到是在访问区域代理服务器,在DNS系统中需要将www.sina.com主机名指向所有的区域代理服务器的IP地址。在浏览器访问www.sina.com站点中的页面而向DNS服务器请求解析www.sina.com主机名时,DNS服务器根据访问者的地理位置信息返回他附近的区域代理服务器的IP地址,这样,浏览器的访问请求将发送给该区域代理服务器。只有当区域代理服务器中没有浏览器要访问的页面时,区域代理服务器才去从真正的www.sina.com站点服务器上获取该页面并进行缓存,以后该区域的其他浏览器就都可以就近从区域代理服务器中访问到该页面了,从而大大提高了访问效率和减少了网络流量。

 

 

二、基于主机名的虚拟主机

WEB浏览器与WEB服务器建立连接后,除了将请求URL中的资源路径发送给WEB服务器外,还会将URL中的主机名部分作为HTTP请求消息的Host头发送给WEB服务器。例如,在浏览器地址栏中输入http://www.it315.org,浏览器发送给www.it315.org主机上的WEB服务器的请求消息内容如下:

       GET / HTTP/1.1<回车>

       Host: www.it315.org<回车>

       <回车>

WEB服务器接收到浏览器的访问请求消息后,根据Host头字段中所设置的主机名,就知道该选择哪个WEB站点来进行响应,因此,可以使用不同的主机名来作为区分同一个WEB服务器上的不同站点的标识信息。

TomcatServer.xml配置文件中有一个<Host>元素,一个<Host>元素用于建立一个WEB站点,使用多个<Host>元素则可以建立多个WEB站点。<Host>元素的父级元素为<Engine>元素,嵌套在同一个<Engine>元素中的多个<Host>元素的name属性不能相同,<Host>元素的name属性指定WEB站点所对应的主机名称。TomcatServer.xml配置文件中初始设置的<Host>元素内容如下:

<Host name="localhost" appBase="webapps" …>

</Host>

<Host>元素中的appBase属性指定了一个路径,该路径将作为嵌套在它里面的<Context>元素的docBase属性中设置的相对路径的基准路径。

Tomcat接收到访问请求时,将比较请求消息中的Host头字段的值与<Host>元素的name属性值,并以匹配的<Host>元素所创建的WEB站点来响应。如果Server.xml文件中没有与请求消息的Host头字段匹配的<Host>元素,Tomcat将以默认的WEB站点来响应。只要<Engine>元素的defaultHost属性设置为嵌套在它里面的某个<Host>元素的name属性值,该<Host>元素所创建的WEB站点就成了该引擎的默认WEB站点。例如,TomcatServer.xml文件中的<Engine>元素的默认设置如下:

<Engine name="Standalone" defaultHost="localhost" debug="0">

       <Host name="localhost" appBase="webapps" …>

      

       </Host>

</Engine>

上面的这段配置信息说明,该引擎的默认WEB站点为嵌套在<Engine>元素中的name属性为“localhost”的<Host>元素所创建的WEB站点。

在同一台计算机上建立了多个基于主机名的虚拟主机后,WEB浏览器要访问其中的某个虚拟主机的资源时,在访问URL中必须采用主机名,而不能采用IP地址。这是因为WEB浏览器要将URL中的主机名部分作为HTTP请求消息的Host头发送给WEB服务器,如果URL中的主机名部分使用的是IP地址,那么,浏览器发出的请求消息中的Host头字段的值就是这个IP地址,而在同一台计算机上建立的多个基于主机名的虚拟主机共享同一个IP地址,在Host头字段使用IP地址根本就无法区分不同的站点。

即使在URL中指定的是主机名时,WEB浏览器还是要先获得该主机名所对应的IP地址,然后再使用这个IP去连接WEB服务器。所以,在建立基于主机名的虚拟主机时,除了要在Tomcatserver.xml文件中进行设置外,还需要在整个网络系统中建立主机名与IP地址的映射关系,即必须将主机名添加到名称解析系统,以便WEB浏览器能够从名称解析系统中查询出主机名所对应的IP地址。建立主机名与IP地址的映射关系的惯用方式有两种:一是使用客户机本地的Hosts 文件,二是使用DNS(Domain Name System,域名系统)服务器。Hosts 文件和DNS的作用都是允许用户使用“友好”的、文本格式的主机名称,而不是数字格式的IP地址来访问网络中的计算机。Hosts文件可用于小型的Intranet(企业内部网),网络中的所有计算机上都需要使用Hosts文件。DNS通常用于大型的网络,特别是Internet上对外提供服务的计算机都是通过DNS来建立其主机名与IP地址的映射关系。客户机首先在本地的Hosts文件中查找主机名称所映射的IP地址,如果没有找到,再去查询DNS服务器。为了简单起见,这里仅介绍一下Hosts文件。对于Windows 2000系统,Hosts 文件位于操作系统根目录(取决操作系统所在的分区,通常是c:\winnt)下的System32\Drivers\Etc子目录中,默认情况下,该文件中有如下一行内容:

       127.0.0.1       localhost

这行文本的作用就是将IP地址(127.0.0.1)映射成主机名(localhost),这也就是在IE浏览器地址栏中可以使用localhost访问本地WEB服务器的原因。如果要增加更多的主机名与IP地址的映射,可以在Hosts文件中增加更多的行,然后参照上面这行内容的格式在每行中填写IP地址和相应的主机名。

:动手体验:使用Tomcat建立基于主机名的虚拟主机

1)用UltraEdit打开<Tomcat主目录>/conf目录下的Server.xml文件,使用“查找”菜单查找内容为“</Host>”的行,紧接该行下面增加一对<Host></Host>标签。参照前面的<Host>标签的属性设置情况,设置新增的<Host>标签的属性,并在它里面嵌套一个设置该WEB站点根目录的<Context>元素,最终的内容如下:

       <Host name="site1" debug="0" appBase="d:\VirtualHost1">

              <Context path="" docBase="." debug="0"/>

       </Host>

这样,将创建一个新的WEB站点。上面的<Context>元素的docBase属性值被设置为一个点(.),即表示使用<Host>元素的appBase属性中所设置的路径作为这个<Context>所映射的目录。

2)在上面新增的<Host></Host>标签对下面再增加一对<Host></Host>标签,并将它设置为如下形式:

       <Host name="site2" debug="0" appBase="d:\VirtualHost2">

              <Context path="" docBase="." debug="0"/>

       </Host>

这又创建了一个新的WEB站点,该站点的主机名称为site2,根目录对应的本地文件系统目录为d:\VirtualHost2

3)在d:盘下创建名称为VirtualHost1VirtualHost2两个目录,并在这两个目录中分别创建一个名为test.html的文件,在d:\VirtualHost1\test.html文件中写入如下一行内容:

    这是d:\VirtualHost1目录中的test.html文件

d:\VirtualHost2\test.html文件中写入如下一行内容:

    这是d:\VirtualHost2目录中的test.html文件

4)保存修改后的Server.xml文件,重新启动Tomcat WEB服务器程序。打开一个新的命令行窗口中,并在这个命令行窗口中执行如下命令:

telnet 127.0.0.1 8080

接着在连接成功的telnet程序命令窗口中,输入如下内容:

       GET /test.html HTTP/1.1<回车>

       Host:<空格>site1<回车>

       <回车>

这时在telnet程序窗口中可以看到,WEB服务器返回内容的正文部分为d:\VirtualHost1\test.html文件中的内容。接着WEB服务器返回内容的下边,输入如下内容:

       GET /test.html HTTP/1.1<回车>

       Host:<空格>site2<回车>

       <回车>

telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分为d:\VirtualHost2\test.html文件中的内容。接着WEB服务器返回内容的下边,输入如下内容:

       GET /test.html HTTP/1.1<回车>

       Host:<空格><回车>

       <回车>

telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分为d:\test\test.html文件中的内容。接着WEB服务器返回内容的下边,再次输入如下内容:

       GET /test.html HTTP/1.1<回车>

       Host:<空格>xxx<回车>

       <回车>

telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分仍然为d:\test\test.html文件中的内容。

上面的整个交互过程如图2.34所示,Tomcat根据第1次和第2次请求中所指定Host头的值,查找Server.xml文件中与之相匹配的<Host>元素的name属性值,并以匹配的<Host>元素所设置的WEB站点来响应;在第3次和第4次请求中所指定Host头的值,在Server.xml文件中没有与之对应的<Host>元素的name属性值,Tomcat将以默认的WEB站点来响应。

 


2.34

5)在Windows 2000系统中,用记事本程序打开c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行内容:

       127.0.0.1       localhost

紧接这行文本的下面,用它复制出两行文本,并将这两行文本中的localhost分别修改成site1site2,这样,就使用Hosts文件为当前计算机设置了多个主机名。如果要用site1site2这个两主机名访问其他计算机上的WEB站点,则应将127.0.0.1修改成其他计算机的实际IP地址。保存Hosts文件后,在命令行窗口中执行“ping site1”和“ping site2”命令,查看该主机名是否被正确解析到了相应的IP地址上。建立site1site2与计算机IP地址的映射后,在IE浏览器地址栏中输入http://localhost:8080/test.htmlhttp://site1:8080/test.htmlhttp://site2:8080/test.html,可以看到浏览器将显示出各自站点中的test.html网页文件的内容。

可见,使用主机名的方式在同一台WEB服务器上创建多个虚拟主机后,在WEB浏览器中使用主机名访问Web服务器时,Web服务器将选择与该主机名关联的WEB站点进行响应。通过这种方式,多个WEB站点可以共享同一个IP地址和相同的端口号,唯一不足的就是WEB浏览不能通过IP地址去访问这些WEB站点。基于主机名的虚拟主机是目前Internet上的大多数虚拟主机业务提供商所通常采用的方式。只要找出几个小型公司或个人的网站,如果在WEB浏览器地址栏中输入“http://主机名”可以访问到该WEB站点,接着在命令行窗口中执行“ping 主机名”,查看到该域名对应的IP地址,然后在WEB浏览器地址栏中输入“http://IP地址”时,却无法访问这个WEB站点了,那么,这个WEB站点就是一个基于主机名的虚拟主机,它与其他一些WEB站点共享一台WEB服务器,而不是自己独享一台WEB服务器。

 

注意:当使用安全套接字层 (SSL) 时,不能使用主机头字段来实现虚拟主机,这是因为使用SSLHTTP请求有加密保护。主机头字段是加密内容的一部分,不能被解释和路由到正确的站点。

posted @ 2009-09-16 20:17 勒紧皮带向前冲 阅读(290) | 评论 (0)编辑 收藏
 

从网上找的IE和FF下都兼容的加入收藏的代码

 1很早就发现传统的加入IE收藏夹的代码在Firefox下是无效的。
 2
 3
 4<a href="javascript:window.external.AddFavorite('http://www.9enjoy.com','9Enjoy')">添加到收藏夹</a>
 5
 6
 7今天浏览im286,发现讨论两者兼容的代码,调试后,发现可行:)
 8
 9第一段:
10
11
12<script>
13function addfavorite()
14{
15  if (document.all)
16  {
17     window.external.addFavorite('http://www.9enjoy.com','9Enjoy');
18  }

19  else if (window.sidebar)
20  {
21     window.sidebar.addPanel('9Enjoy''http://www.9enjoy.com'"");
22  }

23}
 
24</script>
25<a href="#" onclick="addfavorite()">把本博客加入收藏</a>
26
27
28
29下面一段更严谨,IE6,IE7,FF均通过。
30
31
32<html>
33<head>
34<title>加入收藏</title>
35<script language="JavaScript" type="text/javascript">
36function JSAddFavorite()
37{
38
39       if ( window.sidebar && "object" == typeof( window.sidebar ) && "function" == typeof( window.sidebar.addPanel ) )
40
41       {
42
43               //  firefox
44
45               window.sidebar.addPanel( '9Enjoy, 'http://www.9enjoy.com/', '' );
46
47       }

48
49       else if ( document.all && "object" == typeof( window.external ) )
50
51       {
52
53               //  ie
54
55               window.external.addFavorite( 'http://www.9enjoy.com/''9Enjoy' );
56
57       }

58
59}

60
61</script>
62</head>
63
64<body>
65<a href="javascript:JSAddFavorite();" title="加入收藏">加入收藏</a>
66</body>
67<html>
68-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注,我使用以上代码在FF上并未执行成功。
这个是我的代码
 1<script language="javascript">
 2    function JSAddFavorite(){
 3        if(window.sidebar && "object" == typeof(window.sidebar) && "function"==typeof(window.sidebar.addPanel)){
 4            //firefox
 5            window.sidebar.addPanel("收藏标记","http://www.xxxx.com");
 6        }

 7        else if(document.all && "object" == typeof(window.external)){
 8            //ie
 9            window.external.addFavorite("http://www.xxxx.com","收藏标记");
10        }

11    }

12    window.setTimeout("JSAddFavorite",60*1000);
13</script>
如上,在FF上执行不成功。不知怎么回事?有知道的兄弟评论下。
posted @ 2009-09-15 23:27 勒紧皮带向前冲 阅读(351) | 评论 (0)编辑 收藏
 
[转]jsp获取客户端ip和mac地址
2009年04月10日 星期五 16:02

最近做一个安全系统,需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户端ip和mac地址的两个方法,留存。

1.获取客户端ip地址( 这个必须从客户端传到后台):
   jsp页面下,很简单,request.getRemoteAddr() ;
   因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换
   public String getMyIP() {
        try {
            FacesContext fc = FacesContext.getCurrentInstance();
            HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest();
            return request.getRemoteAddr();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

2.获取客户端mac地址
    调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:

    public String getMACAddress(String ip){
        String str = "";
        String macAddress = "";
        try {
            Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
            InputStreamReader ir = new InputStreamReader(p.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
            for (int i = 1; i < 100; i++) {
                str = input.readLine();
                if (str != null) {
                    if (str.indexOf("MAC Address") > 1) {
                        macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace(System.out);
        }
        return macAddress;
    }

posted @ 2009-09-14 12:14 勒紧皮带向前冲 阅读(2084) | 评论 (0)编辑 收藏
 

Tomcat6.0配置(虚拟目录的设置+多域名绑定)

Tomcat6.0配置(虚拟目录的设置+多域名绑定)

优点:tomcat6.0可以自动更新类和页面,当然如果修改了配置文件,或者web.xml和lib,则需要重启tomcat才可以.
配置更方便,开设站点只需修改一个conf文件。

Step 1 JDK安装
----------------------------------------------------------------------------------
1.1 点击jdk-6u1-windows-i586-p.exe文件安装Jdk,选择目录(假使E:\jdk1.6),一路回车,安装完成
1.2 添加JAVA环境变量(我的电脑右键->属性->高级->环境变量->系统变量)
        CLASSPATH   设置变量值 .;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar
        JAVA_HOME   设置变量值 C:\Program Files\Java\jdk1.6.0
        PATH        设置变量值 .;%JAVA_HOME%;%JAVA_HOME%/bin;(原来里面有内容的话 最后加入就行)
1.3 在DOS命令行状态下测试Java是否成功安装,敲入java -version可以查看版本
     c:\>java -version
     java version "1.6.0_01"
     Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
     Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
1.4 测试HelloWorld,新建一个HelloWorld.java的文件,内容如下
     public class HelloWorld {
        public static void main(String arg[]) {
           System.out.println("Hello World!这是Java测试程序,说明你已成功安装了Java -- Jarry!");
        }
     }
     在命令行输入javac HelloWorld.java,编译一下,然后再执行java HelloWorld,就能看到正常的输出了。
     出现错误一般是环境变量或大小写等有问题,仔细检查就没有问题了。     


Step 2 Tomcat安装
----------------------------------------------------------------------------------
2.1 点击apache-tomcat-6.0.10.exe文件安装Tomcat,选择目录(假使d:\Tomcat)安装完成后
2.2 添加TOMCAT环境变量(我的电脑右键->属性->高级->环境变量->系统变量)
         TOMCAT_HOME   设置变量值 d:/Tomcat
2.3 从程序菜单或是服务里启动Tomcat,然后你在浏览器输入http://localhost:8080/就可以看到Tomcat欢迎页面。
     正常情况下都会成功,如果启动失败,请检查jakarta_service_日期.log日志,通过它一般可以解决问题。

     比如出现类似报错:
     [947 prunsrv.c] [error] Failed creating java
     看一下系统盘windows/system32/下是否丢失msvcr71.dll文件,如果缺失,需要从别的机器拷贝一个过来。

     打开浏览器 进入http://localhost:8080/,当看见Tomcat小猫的图标了,这样表示安装成功。

    至此,JSP服务器就搭建完成了,用于学习和测试没有问题了,如果想要更高级的配置,可以往下面继续看。

Tomcat 6与Tomcat 5或者之前版本不一样的就是,首页没有显示具体的版本,猫猫也变大了些。
没有admin管理页面了,admin在Tomcat 5.5来默认都没有了,不过可以下载admin包。
而Tomcat 6.0没有看见admin包,不过这并不要紧,一般情况下也不需要admin包。

Tomcat 6.0默认也没有开启servlet、禁止目录浏览。这需要去conf/下配置web.xml文件。
修改listings为true即可以目录浏览,

            <param-name>listings</param-name>
            <param-value>true</param-value>
            <!-- false disable listings -->
            <!-- <param-value>false</param-value>-->         

开启servlet直接访问功能,把这两段注释打开。

    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

<servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
   

2.4 部署一个新项目chengqun,去conf/下配置server.xml

   <Context path="/chengqun" docBase="d:\tomcat\webapps\chengqun"></Context>
   
    chengqun是你程序的目录    重启Tomcat,访问http://127.0.0.1:8080/chengqun就可以访问了

 

 

======================================================================================================================
域名绑定与虚拟目录设置:
server.xml 的修改方式如下:

(一)多域名绑定

1.如果你要绑定网站,首先是要把tomcat的默认访问端口8080,修改成80

原始:
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

修改后:
<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

其实这里就是把port:8080,修改成port:80就可以了,其他的参数不变

2.接下来就是重点了哈哈...
单个域名绑定:
原始:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>
当然这里我把注释代码统统删除掉了,省的碍眼


修改后:
<Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="d:\wwwroot\chengqun"></Context>
</Host>


<Host name="chengqun1.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun1"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="d:\wwwroot\chengqun1"></Context>
</Host>

 

多域名绑定:
<Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
<Alias>chengqun.202.71one.com</Alias>
<Alias>chengqun1.202.71one.com</Alias>
<Alias>chengqun2.202.71one.com</Alias>
<Context path="/" docBase="d:\wwwroot\chengqun"></Context>
</Host>

这里面的参数还有很多,我也不是很清楚,不过这样做确实可以实现多域名绑定哈哈.而且网站页面修改了只要直接覆盖就可以了,tomcat可以自动更新类和页面,当然如果修改了web.xml或lib,则需要重启tomcat才可以.


(二)虚拟目录
(1)
<Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
<Context path="/chengqun" docBase="d:\wwwroot\chengqun"></Context>
</Host>
其中,Host标记是用来配置虚拟主机的,就是可以多个域名指向一个tomcat,格式只要参考默认的就

可以了。

<context>是Host标记的子元素吧,表示一个虚拟目录,它主要有两个属性,path就相当于虚拟目录名字,

而 docbase则是具体的文件位置。在这里我的虚拟路径名称为chengqun,实际上我的程序也就是html、jsp、

servlet都 放在了d:\wwwroot\chengqun这个目录下了。

这样我就可以通过 chengqun.202. com/chengqun 访问我的这个虚拟目录了。

另外一种方法是:

<Host name="chengqun.202. com" debug="0" appBase="d:\wwwroot\chengqun"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="d:\wwwroot\chengqun"></Context>
</Host>
这样设置以后,输入域名可以访问这个站点程序了(Context path="/"这里不同)
(2)
没有指定默认站点,所以直接输入IP的时候,无法访问。如何让输入ip就可以访问指定的站点呢?
    修改server.xml的 <Engine name="Catalina" defaultHost="chengqun.202. com">
这样就可以实现了输入ip访问chengqun.202. com这个站点的程序了!

posted @ 2009-09-14 11:34 勒紧皮带向前冲 阅读(2239) | 评论 (0)编辑 收藏
 
今天由于客户对功能提出新要求。采用js操作iframe解决问题。特记录其中遇到的问题。
用Js控制iframe内表单提交
代码如下:
 1<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
 2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3<html>
 4  <head>    
 5    <title>c.jsp</title>
 6    
 7    <meta http-equiv="pragma" content="no-cache">
 8    <meta http-equiv="cache-control" content="no-cache">
 9    <meta http-equiv="expires" content="0">    
10    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
11    <meta http-equiv="description" content="This is my page">    
12
13    <script type="text/javascript">
14    <!--
15        function reg(){
16        jsi.document.all.username.value="xxx";
17        jsi.document.all.userid.value="xxx>";
18        jsi.document.all.flag.value="xxx";
19          jsi.document.forms["jsf"].submit();        
20          window.open("http://js.51baojian.net","_blank");  
21          setTimeout("",3000);
22          window.location.href="http://jss.51baojian.net";
23    }

24    -->
25    </script>
26  </head>
27  
28  <body onload="reg();">
29    <table cellpadding="0" cellspacing="0" border="0">
30        <tr><td>
31            页面进入中..
32            <iframe id="jsi" name="jsi" frameborder="0"
33                    src="b.jsp" height="0" width="0"
34            ></iframe>
35        </td></tr>        
36    </table>
37  </body>
38</html>
b.jsp代码为:
1
2<form id="jsf" name="jsf" action="url">
3    <input type="hidden" name="username" value="">
4    <input type="hidden" name="userid" value="">
5    <input type="hidden" name="flag" value="">                
6</form>
7
注意:
页面加载时,遇到iframe就直接跳过去,加载下面的内容,然后再回来加载iframe,当然也可以理解成遇到iframe又开了一个线程来加载iframe,但是因为涉及到新的IO操作比较耗时,所以如果在iframe下写了js操作的话,会提示错误。可以采用onload来触发js操作执行。
在注意:(知道的就不要看了)

onload指整个页面加载完成后再执行init()函数,而不是当页面加载到<body>时就开始执行。

同样,onunload指整个页面卸载完成(关闭)后。

posted @ 2009-08-20 14:19 勒紧皮带向前冲 阅读(3599) | 评论 (0)编辑 收藏
 
hibernate hql distinct
2008-08-03 14:15
hibernate hql distinct
在 hibernate的reference 中提到过hql是可以直接使用distinct的

--
关键字distinct与all 也可以使用,它们具有与SQL相同的语义.
select distinct cat.name from Cat cat
select count(distinct cat.name), count(cat) from Cat cat
--

所以,我就尝试使用
select distinct c.* from Column c, 在hql中,使用 * 必须要用到别名的
查询出的结果是 null来的.
在mysql 中,这种写法是没有错的,..然后我再试了一下
select distinct c from Column c , 这样得出的结果是非null,是正确的.
posted @ 2009-08-17 17:16 勒紧皮带向前冲 阅读(9505) | 评论 (1)编辑 收藏
 

HQL是个中立的语言,即它跟任何数据库都没关系,你如果使用HQL的话通过数据库方言都会翻译成相应的数据库的SQL语句,包括[排序,子查询,调用SQL中的函数].
  HQL中关键字是不区分大小写的,但是属性和类型是区分大小写的。
   1>.简单属性查询
      1>).单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致。如:
          session = HibernateUtils.getSession();
          session.beginTransaction();
           
          //返回结果集属性列表,元素类型和实体类中相应的属性类型一致
           List students = session.createQuery("select name from Student").list();
           for (Iterator iter=students.iterator(); iter.hasNext();) {
                  String name = (String)iter.next();
                  System.out.println(name);
           }
      session.getTransaction().commit();
      2>).多个属性查询,返回的集合元素是对象数组,数组元素的类型和对
          应的属性在实体类中的类型一致,数组的长度取决于select中属性的个数。如:
          List students = session.createQuery("select id, name from Student").list();
         for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
          }
      3>).如果认为返回数组不够对象化,可以采用HQL动态实例化Student对象,
          但是Strudent类中必须提供相应的构造函数。如:
          List students = session.createQuery("select new Student(id, name) from Student").list();
          for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getId() + "," + student.getName());
          }
    2>.实体对象查询
       1>).返回Student对象的集合,可以忽略select,表可以使用别名,别名可以用as也可以不用。如:
          List students = session.createQuery("from Student s").list();
          //List students = session.createQuery("from Student as s").list();
         for (Iterator iter=students.iterator(); iter.hasNext();) {
                 Student student = (Student)iter.next();
                 System.out.println(student.getName());
           }
       2>).返回Student对象的集合,使用select查询实体对象,必须采用别名。如:
          List students = session.createQuery("select s from Student as s").list();
          for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                 System.out.println(student.getName());
          }
       3>).不支持select * from .....这样的查询语句。如:下面的语句是错误的
           List students = session.createQuery("select * from Student").list();
       4>).list和iterator的区别?
           我们知道,session.createQuery()得到个Query,而从Hibernate API中我们可
           以发现Query有两个方法list()和iterator()用于返回结果集。它们的区别在
           于:
           *list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
           *iterator在默认情况下利用缓存数据,但如果缓存中不存在数据有可能出现N+1问题
        5>).N+1问题
            在默认情况下,使用query.iterator()查询,有可能出现N+1问题
            1: 首先发出一条查询对象id列表的sql语句
            N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据
               id发出相应的sql语句
            如:
            Iterator iter = session.createQuery("from Student").iterate();
        while(iter.hasNext()) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }
    3>.条件查询
       1>).可以采用拼字符串的方式传递参数。如:
               List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
               for (Iterator iter=students.iterator(); iter.hasNext();) {
                      Object[] obj = (Object[])iter.next();
                       System.out.println(obj[0] + "," + obj[1]);
                }
       2>).可以使用?方式传递参数,参数的索引从0开始;传递的参数值如果是字符型的,不用
           单引号引起来;可以使用方法链编程。如:
            List students = session.createQuery("select s.id, s.name from Student s where s.name like ?")
                                                .setParameter(0, "%1%")
                                                .list();
           for (Iterator iter=students.iterator(); iter.hasNext();) {
                       Object[] obj = (Object[])iter.next();
                       System.out.println(obj[0] + "," + obj[1]);
           }
       3>).可以使用 :参数名称 的方式传递参数值。如:
              List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")
                                                   .setParameter("myname", "%1%")
                                                   .list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                         Object[] obj = (Object[])iter.next();
                         System.out.println(obj[0] + "," + obj[1]);
             }
       4>).如果传递多个参数,可以使用setParameterList方法。如:
           List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)")
                                                .setParameterList("myids", new Object[]{1, 2, 3, 4, 5})
                                               .list();
           for (Iterator iter=students.iterator(); iter.hasNext();) {
                   Object[] obj = (Object[])iter.next();
                   System.out.println(obj[0] + "," + obj[1]);
           }
       5>).在HQL中可以使用数据库的函数,像mysql中的date_format。如:
             List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?")
                                                  .setParameter(0, "2008-02")
                                                  .list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                     Object[] obj = (Object[])iter.next();
                      System.out.println(obj[0] + "," + obj[1]);
               }
       6>).查询某个日期段的数据。如:
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           //查询2008-01-10到2008-02-15创建的学生
           List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
                                               .setParameter(0, sdf.parse("2008-01-10 00:00:00"))
                                               .setParameter(1, sdf.parse("2008-02-15 23:59:59"))
                                               .list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                     Object[] obj = (Object[])iter.next();
                      System.out.println(obj[0] + "," + obj[1]);
                }

    4>.Hibernate也支持直接使用sql查询。如:
          List students = session.createSQLQuery("select * from t_student").list();
          for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
          }
    5>.外置命名查询,主要完成hql语句和程序的解耦合.
       1>).在映射文件中采用<query>标签来定义HQL语句。如:
            <query name="searchStudents">
                <![CDATA[
                      SELECT s FROM Student s where s.id<?
                 ]]>
            </query>
       2>).在程序中采用session.getNamedQuery()方法得到HQL查询串。如:
              List students = session.getNamedQuery("searchStudents")
                                                   .setParameter(0, 10)
                                                   .list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                     Student student = (Student)iter.next();
                     System.out.println(student.getName());
               }
     6>.查询过滤器
       1>).在影射文件中定义过滤器参数。如:
        <filter-def name="filtertest">
                <filter-param name="myid" type="integer"/>
        </filter-def>   
       2>).在类的影射中使用这些参数。如:
         <filter name="filtertest" condition="id &lt; :myid"/><!--&lt;转义字符"<"-->
       3>).在程序中启用过滤器。如:
         session.enableFilter("filtertest")
                     .setParameter("myid", 10);   
         List students = session.createQuery("from Student").list();//会在该session中所有的查询后自动加上过滤器中的条件
         for (Iterator iter=students.iterator(); iter.hasNext();) {
               Student student = (Student)iter.next();
               System.out.println(student.getName());
         }
       参见:Student.hbm.xml,FilterQueryTest.java
     7>.分页查询
        1>).setFirstResult()从0开始
        2>).setMaxResults每页显示多少条数据。如:
              List students = session.createQuery("from Student")
                                                   .setFirstResult(1)
                                                   .setMaxResults(2)
                                                   .list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                     Student student = (Student)iter.next();
                     System.out.println(student.getName());
             }
     8>.对象导航查询
        Hibernate支持对象的,因此可以用对象导航查询。如:
        Student类总有Classes类型的属性classes,而Classes类有name属性。我们通过classes的name来查询student:
        List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
        for (Iterator iter=students.iterator(); iter.hasNext();) {
             String name = (String)iter.next();
             System.out.println(name);
       }
     9>.连接查询
        1>).内连接:只是把两边都有的记录查出来,可以省略inner,并且只要影射文件中已经设好了表之间的关系,无须用on表示查询条件。如:
           //List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
           List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
           for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
           }
        2>).外左连接:把左边表的所有记录都显示出来。如:
             List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
             for (Iterator iter=students.iterator(); iter.hasNext();) {
                  Object[] obj = (Object[])iter.next();
                  System.out.println(obj[0] + "," + obj[1]);
             }
        3>).外右连接:把右边表的所有记录都显示出来。如:
             List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                   Object[] obj = (Object[])iter.next();
                   System.out.println(obj[0] + "," + obj[1]);
             }
     10>.统计查询
        1>).count。如:
            Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();//返回的是单条记录
            System.out.println(count);
        2>).group by。如:
            List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
                    "group by c.name order by c.name").list();
           for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + ", " + obj[1]);
           }
     11>.DML风格的操作(尽量少用,因为缓存不同步)
        update和delete只会更新数据库中的数据,而缓存中不会改,此时如果取得该数据还是缓存中的,而不会是更新后的,因此缓
        存中的数据就成了脏数据了。如果批量更新的话,还会给内存带来很大压力。如:
        session.createQuery("update Student s set s.name=? where s.id < ?")
                    .setParameter(0, "李四")
                    .setParameter(1, 5)
                    .executeUpdate();


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangfeitarena/archive/2009/04/17/4086334.aspx

posted @ 2009-08-17 11:44 勒紧皮带向前冲 阅读(343) | 评论 (0)编辑 收藏
 

点击“开始”—>“设置”——>“控制面板”—>“任务计划”—>“添加任务计划”—>让后按照任务向导设置即可。

posted @ 2009-06-25 23:42 勒紧皮带向前冲 阅读(237) | 评论 (0)编辑 收藏
 

 

 1<div id="img" style="position:absolute;; width: 200; height: 151"><a href="#" target="_blank"><img src="images/170_19.gif" width="325" height="139" border="0" /></a></div> 2<script language="javascript">
 3 var xPos = 20;
 4var yPos = 10;
 5img.style.left= xPos;
 6img.style.top = yPos;
 7var step = 1;
 8var delay = 30
 9var width,height,Hoffset,Woffset;
10var y = 1;
11var x = 1;
12var interval;
13img.visibility = "visible";function changePos() 
14{
15width = document.body.clientWidth;
16height = document.body.clientHeight;
17Hoffset = img.offsetHeight;
18Woffset = img.offsetWidth;
19if (y) 
20{
21    yPos = yPos + step;
22}

23else 
24{
25    yPos = yPos - step;
26}

27if (yPos < 0
28{
29    y = 1;
30    yPos = 0;
31}

32if (yPos >= (height - Hoffset)) 
33{
34    y = 0;
35    yPos = (height - Hoffset);
36}

37if (x) 
38{
39    xPos = xPos + step;
40}

41else 
42{
43    xPos = xPos - step;
44}

45if (xPos < 0
46{
47    x = 1;
48    xPos = 0;
49}

50if (xPos >= (width - Woffset)) 
51{
52    x = 0;
53    xPos = (width - Woffset);
54}

55img.style.left = xPos + document.body.scrollLeft;
56img.style.top = yPos + document.body.scrollTop;
57}
function start() 
58{
59interval = setInterval('changePos()', delay);
60}
function pause_resume() 
61{
62    clearInterval(interval);
63}

64start();
65
</script>
posted @ 2009-06-16 15:32 勒紧皮带向前冲 阅读(1004) | 评论 (0)编辑 收藏
 
安装完服务器后,放上自己的网站。。测试,晕竟然出现如下错误提示:</P>
Active Server Pages 错误 \'ASP 0131\'

不允许的父路径

/exam/admin/login.asp,行 1

包含文件 \'../include/conn.asp\' 不能用 \'..\' 表示父目录。</P>
特别郁闷,2000 Server 下不会有这个啊。。我到网上找了一下才明白。。</P>
解决方法如下:</P>
Internet 信息服务(IIS)管理器>>网站站点>>属性>>主目录选项卡>>配置》选项》勾上"启用父路径"的复选框即可.

默认不启用启用父路径估计是一项安全设置 :)

posted @ 2009-06-02 14:45 勒紧皮带向前冲 阅读(285) | 评论 (0)编辑 收藏
仅列出标题
共14页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last