posts - 4,comments - 2,trackbacks - 0
Tomcat是jsp/servlet container,对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器,如IIS和Apache服务器。
我是以Tomcat5.0.16,apache_2.0.55Http Server,mod_jk-apache-2.0.55.so jk插件进行集成。
一、基本原理
Tomcat的两个常用连接器,
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。  
第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。

查看conf/server.xml文件,
<Service name="Catalina">
    
<Connector acceptCount="100" connectionTimeout="20000" port="8080" redirectPort="8443" disableUploadTimeout="true">
    
</Connector>
    
<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler">
    
</Connector>
    
<Engine defaultHost="localhost" name="Catalina">
      
<Host appBase="webapps" name="localhost">
        
<Logger className="org.apache.catalina.logger.FileLogger" suffix=".txt" prefix="localhost_log." timestamp="true"/>
      
</Host>
      
<Logger className="org.apache.catalina.logger.FileLogger" suffix=".txt" prefix="catalina_log." timestamp="true"/>
      
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
    
</Engine>
  
</Service>
根据以上Service,可以tomcat的安装目录找到conf/Catalina/localhost目录,里面的XML文件为配置该service所有的Context,一个xml文件对应一个context配置。
打开admin.xml,
<Context privileged="true" path="/admin" displayName="Tomcat Administration Application" docBase="../server/webapps/admin">
  
<Logger className="org.apache.catalina.logger.FileLogger" suffix=".txt" prefix="localhost_admin_log." timestamp="true"/>
</Context>
可以看到,配置了一个/admin的context,其docBase为/server/webapps/admin。
二、集成目标
我们对tomcat和http 服务器进行集成的目标就是:让http服务器在80端口进行监听,如果碰到访问静态的html/图片文件访问,直接由http服务器进行处理。如果碰到jsp/servlet等访问,则通过jk插件,转发到tomcat监听的8009端口,由tomcat处理。
三、实施步骤
1、安装apache http server, tomcat. 从略。
2、安装jk插件。
把mod_jk-apache-2.0.55.so拷贝到http server的/modules目录即可。
3、配置apache htpp server,打开conf/httpd.conf文件,
(1)修改Website根目录,
找到DocumentRoot,改为你想放置网站根目录的地方
DocumentRoot "D:/java/Tomcat5.0/webapps/ROOT"
(2)加载jk插件及配置属性
#加载模块
LoadModule jk_module modules/mod_jk-apache-
2.0.55.so
#工作属性文件
JkWorkersFile conf/workers.properties
#日志存放
JkLogFile logs/mod_jk2.log
#日志等级
JkLogLevel info
#日期格式
JkLogStampFormat 
"[%a %b %d %H:%M:%S %Y]"
#日志格式
JkRequestLogFormat 
"%w %V %T"
#Url转发到tomcat
JkMount /*.jsp worker1
JkMount /*.page worker1
4、新建conf/workers.properties
#让mod_jk模块知道Tomcat
workers.tomcat_home
=D:\java\Tomcat5.0
  
#让mod_jk模块知道j2sdk
workers.java_home
=D:\java\j2se

#所配置的Tomcat列表
worker.list
=worker1

#工作端口,若没占用则不用修改
worker.worker1.port
=8009  
  
#Tomcat服务器的地址
worker.worker1.host
=localhost
  
#类型
worker.worker1.type
=ajp13
5、配置tomcat
安装tomcat后,会发现webapps已经有许多目录,其中已有一个Root为tomcat默认的"/"context.
将tomcat webapps下的一些不需要的目录删去,把Root下的文件删除,并把你需要配置的网站内容拷贝到此目录下。
找到conf/Catalina/localhost目录,删除一些没用的xml文件,有些xml文件是tomcat启动时按照webapps的目录自动产生的context。
四、开发时配置
在进行开发时,如果我们使用的是tomcat,我们可以采用此种方法进行配置。
1、通过http://localhost:6060/index.jsphttp://localhost/index.jsp访问效果是一样的,
http://localhost/aBigPicture.gif的访问可能比直接访问tomcat要快多了。
2、进入http://localhost:6060/admin,默认user:admin,password为空,
查看service下面的context,最好把当前开发的web的context的reloadable设置为true,我们所做的修改tomcat会自动重新加载,不用重启tomcat就能立即看到新的变化。
3、在eclipse中将网站的源代码发布到tomcat中有两种方法,
一种是采用eclipse自带的depoly功能,将web发布到webapps/ROOT目录,或任一目录,对应的只是修改conf/Catalina/localhost的xml文件。
另一种方法是采用ant,一个xml文件用于全发布(clean,compile,java,copy),另一个xml文件则只发布修改的(compile,copy)。
小项目用第一种方便,每次修改了源代码,只需刷新一下,eclipse就自动帮你depoly到目的地;
当采用第二种时,每次小修改时,需要运行一次ant,把修改的内容重新拷贝并发布过去;如果发布的内容很脏时,有时需全发布(clean,compile,java,copy)。

配置httpd.conf和workers.properties的详细内容,请参考:
http://tomcat.apache.org/connectors-doc/
posted @ 2006-04-06 19:44 Steven Liu 阅读(626) | 评论 (0)编辑 收藏

问题描述:
已有如下代码,

< body  onLoad ="MM_timelinePlay('Timeline1')" >


</ body >
即document.body.onload事件已经绑定了一个函数。
现需要onload时激活另外一个函数,如enetgetMsg(),如何处理?

解决方案:
alert(document.body.onload.toString())
弹出窗口的内容为:
function anonymous()
{
  MM_timelinePlay('Timeline1')
}
可见,当对onload绑定一个函数时,javascript自定义了一个函数,在该自定义函数体内调用了该绑定函数。
解决方法一:
重新写一函数,
function bodyOnload(){
MM_timelinePlay('Timeline1');
enetgetMsg();
}
<body onLoad="bodyOnload()">
解决方法二:
利用javascript重定义函数的功能,
newBodyload="enetgetMsg();";
if(document.body.onload)
{
eval(document.body.onload.toString().replace('anonymous()','oldBodyload()'));
document.body.onload
=new Function("oldBodyload();"+newBodyload);
}

else document.body.onload=new Function(newBodyload);
显然,第二种方法更好,因为这种方法实现时不必关心以前这个事件绑定了多少个函数,不需修改原先的代码,透明地增加一个函数。(decorate模式:透明地增加功能
posted @ 2006-04-06 15:59 Steven Liu 阅读(785) | 评论 (2)编辑 收藏
前段时间参加一个linux/C++项目,碰到一些问题,现逐步整理出来。
我使用的RHEL的内核版本是2.6.9
-11EL。
问题描述:

1 、在 RHEL4.0 盘中自带了 MySQL4.10 的数据库,客户端的为 3.25 版本。在安装时,选择安装此数据库,装完后却发现不能用 L ,可能是因为链接库的问题。

2 、下载 MySQL4.16 的安装文件,包括 shared server client ,安装完成后,发现还是不能用 L

冒昧猜测:
RHEL4.0中自带的mysql根本就不能用,并且误导众多人不相信自带的东西不能用。

建议安装
MySQL
之前,将原先已安装的任何有关 MySQL 的包进行清除。

主要针对以下两种 MySql 包进行清除:

1 RHEL4.0 自带的 MySql 包,即使在安装 RHEL4.0 的时候,没有选择安装 Mysql ,也会默认安装 Mysql3.23 的客户端。因此在安装之前,应予以清除。

查看已安装的:

>rpm –qa| grep mysql

然后删除每个已安装的包,

>rpm –e mysql-client-3.25***

如果系统提示此包有被别的包使用,这时需要先删除这个依赖包,然后再一步步地往上删除。请具体情况具体分析,多看屏幕提示 J

2 、删除一些自已安装的 rpm 包。

查看已安装的:

>rpm –qa|grep MySQL

同样地,然后一个个地删除已安装的包,

>rpm –e MySQL-server*****


采用编译
MySQL
源码的形式安装 MySQL ,这样比较具有通用性。
感悟:编译源代码安装软件是最过硬的安装方法,有时这是很好的解决方案。当然代价是安装过程比较烦琐。

下载 MySQL 的源代码,这里假设下载的是 mysql-VERSION.tar.gz 这样的一个包,具体的 VERSION 代表具体的版本:

1 、为 ‘mysqld’ 增添一个登陆用户和组。如果前面已安装过mysql,可能已存在组和用户。

shell> groupadd mysql
shell> useradd -g mysql mysql

2 、将源码解压后一个目录,最好把源码放到 tmp 目录,解到此目录中。具体解包,可以采用 RHEL4 中的图形操作解压缩方法,不必打命令。

shell> gunzip < mysql-VERSION.tar.gz | tar -xvf –

3 、进入已解压缩的目录

shell> cd mysql-VERSION

4 、配置安装, /usr/local/mysql 为安装路径

shell> ./configure --prefix=/usr/local/mysql

5 、编译与安装

shell> make

shell> make install

6 、拷贝选项模板文件

shell> cp support-files/my-medium.cnf /etc/my.cnf

7 、安装数据库

shell> cd /usr/local/mysql

shell> bin/mysql_install_db
8 、更改文件夹读写权限

shell> chown -R root .

shell> chown -R mysql var

shell> chgrp -R mysql .

9 、启动 mysql

shell> bin/mysqld_safe &
posted @ 2006-03-31 17:57 Steven Liu 阅读(892) | 评论 (0)编辑 收藏

公司最近接到一个小项目,帮一个学院做一个网站。经理安排了我们两个人做,时间只有两周。BTW,我们公司有自己的CMS产品,所谓的做网站只是基于这个进行功能定制和扩充。
我刚从其它项目退下来,这个项目不熟悉,经理要我做部分模块,然后由那人负责集成。
我们两个人接到任务后,你做你的,我做我的,这其间经理也没过问过。我们俩都以为这项目处于瘫痪状态,因为一直没有收到客户的明确需求,不知道要确切要上些啥。
这星期一我请假了,没来公司。星期二一到公司,经理问我的模块做得怎样了?我心里直笑,我那点小东西早搞定了。星期二、星期三自己仍然漫不经过地把自己做得那点东西改改。
星期四了,经理要求看成果了,说是星期五要到客户里去演示。我跟那个兄弟一看这架式,赶快合并。弄了半天,首页没排齐。经理是个老好人,也没发什么火,只是叫我们俩合起来把它弄好。
我这边做的时候mysql安装的时候设置的编码是gbk,而他那边做的时候mysql安装的时候设置的编码是latin-1,我的数据库集成到他那边的mysql去的话,糟糕,全是乱码。
急……还好,找到了资料,知道了mysql支持数据库级别的编码设置,把自己机器上的mysql改为latin-1,然后重新建数据库

CREATE   DATABASE  `forum`  DEFAULT   CHARACTER   SET  gbk COLLATE gbk_chinese_ci;
再测试,yeah,乱码问题解决。
心里暗想,把我数据库导到他的机子里,竟然不行!
Mysql服务器设置(latin-1),建了一个数据库设置为gbk------>迁移到另一台mysql上面怎么办?
最后在他机子上重建数据库解决。
那兄弟家较远,先回了;经理也先回了。最后我一个人忙到快11点,才好不容易把页面排版,集成的问题搞定。BTW,那兄弟人品好,做人到位,好学。所以为他做点不,心里很乐意。
经理今天叫我们到会议室,聊了快二个小时。感觉还有点道理,小记一下。
1、分工后,只有两人以上参与,自己要交流。事实:我俩感情是好,可是交流的都是生活上的事,技术上的交流也是泛泛而谈,偏偏对这种小项目的事,我俩都不怎的爱交流。
2、要有计划。预则立啊,这道理很浅显。事实:我俩都漫不经心,没有把这项目太当回事,更不要说计划。
3、要有主次之分。网站最重要的是美观。首页都对不齐,其它的再好也没用。
4、微软的“多小多原则”。小版本,多发布,多阶段。带bug的软件是可以发布,关键是主要的地方要拿得出手。这一句意义最大,做软件不要钻牛角尖,太钻技术细节,结果弄得结点到了时首页还没对齐。
结论:
1、做软件不要懒,该整理的时候一定要整理。
2、做软件不要省,该配置的时候一定要配置,两个人开发也一定要配版本管理。
3、做软件要注意宏观。
posted @ 2006-03-31 17:07 Steven Liu 阅读(276) | 评论 (0)编辑 收藏