小猫TOMCAT其实很可爱

系统 1830 0

谨以此文送给所有正在使用 TOMCAT 或者打算使用的人们,向 TOMCAT 的所有开发人员致敬!

 

一、 小猫 TOMCAT 其实很可爱

2003 年底,我换公司了,同样也换了 WEBAPP TOMCAT 出现在我的面前(以前使用 weblogic ),我有点茫然,免费的东西真的能用的好么?担心 ING ……(其实是在火星呆太久)出门一打听,原来此猫出自名门- jakarta 项目, 2001 年度最具创新的 java 产品 (Most Innovative Java Product) ,又有 JAVA 的老大 SUN 的力捧(官方推荐的 servlet jsp 容器),以后就靠它吃饭了。不说二话,搞起来先:

1、   安装

TOMCAT 最新版本是 5.0.29 http://jakarta.apache.org/site/binindex.cgi

如果在 WINDOWS 下它可以自动找到你的 JDK 或者 set JAVA_HOME=c:/jdk

LINUX 下需要先解压,然后设置 JAVA_HOME

export JAVA_HOME=/usr/local/jdk

2、   RUN

设置完毕后就可以运行 tomcat 服务器了,进入 tomcat bin 目录, WINDOWS 下用 startup 启动 tomcat linux 下用 startup.sh ,相应的关闭 tomcat 的命令为 shutdown shutdown.sh

启动服务后在浏览器里输入 http://localhost:8080 来测试一下

3、   目录结构

Bin :存放启动和关闭 tomcat 脚本。

Conf :包含不同的配置文件 ,server.xml(Tomcat 的主要配置文件 )

Work :存放 jsp 编译后产生的 class 文件。

Webapp :存放应用程序示例,以后你要部署的应用程序也要放到此目录。

Logs :存放日志文件

Comm./server/shared :这三个文件夹下的 LIB 文件夹放 jar 文件。

1、   配置 server.xml 文件

没有什么好说的,看 TOMCAT 的文档比较有用,这里提供一些主要的东西吧。

元素名

属性

解释

server

port

指定一个端口,这个端口负责监听关闭 tomcat 的请求

shutdown

指定向端口发送的命令字符串

service

name

指定 service 的名字

Connector( 表示客户端和 service 之间的连接 )

port

指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求

minProcessors

服务器启动时创建的处理请求的线程数

maxProcessors

最大可以创建的处理请求的线程数

enableLookups

如果为 true ,则可以通过调用 request.getRemoteHost() 进行 DNS 查询来得到远程客户端的实际主机名,若为 false 则不进行 DNS 查询,而是返回其 ip 地址

redirectPort

指定服务器正在处理 http 请求时收到了一个 SSL 传输请求后重定向的端口号

acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

connectionTimeout

指定超时的时间数 ( 以毫秒为单位 )

Engine( 表示指定 service 中的请求处理机,接收和处理来自 Connector 的请求 )

defaultHost

指定缺省的处理请求的主机名,它至少与其中的一个 host 元素的 name 属性值是一样的

Context( 表示一个 web 应用程序,通常为 WAR 文件,关于 WAR 的具体信息见 servlet 规范 )

docBase

应用程序的路径或者是 WAR 文件存放的路径

path

表示此 web 应用程序的 url 的前缀,这样请求的 url http://localhost:8080/path/****

reloadable

这个属性非常重要,如果为 true ,则 tomcat 会自动检测应用程序的 /WEB-INF/lib /WEB-INF/classes 目录的变化,自动装载新的应用程序,我们可以在不重起 tomcat 的情况下改变应用程序

host( 表示一个虚拟主机 )

name

指定主机名

appBase

应用程序基本目录,即存放应用程序的目录

unpackWARs

如果为 true ,则 tomcat 会自动将 WAR 文件解压,否则不解压,直接从 WAR 文件中运行应用程序

Logger( 表示日志,调试和错误信息 )

className

指定 logger 使用的类名,此类必须实现 org.apache.catalina.Logger 接口

prefix

指定 log 文件的前缀

suffix

指定 log 文件的后缀

timestamp

如果为 true ,则 log 文件名中要加入时间,如下例 :localhost_log. 2001-10-04 .txt

Realm( 表示存放用户名,密码及 role 的数据库 )

className

指定 Realm 使用的类名,此类必须实现 org.apache.catalina.Realm 接口

Valve( 功能与 Logger 差不多,其 prefix suffix 属性解释和 Logger 中的一样 )

className

指定 Valve 使用的类名,如用 org.apache.catalina.valves.AccessLogValve 类可以记录应用程序的访问信息

directory

指定 log 文件存放的位置

pattern

有两个值, common 方式记录远程主机名或 ip 地址,用户名,日期,第一行请求的字符串, HTTP 响应代码,发送的字节数。 combined 方式比 common 方式记录的值更多

 

2、   管理

TOMCAT 管理能力很强大,进入 http://localhost:8080/ ,自己慢慢管吧。实践出真知,我喜欢这样搞:

^_^ ,一切尽在掌握 http://localhost:8080/manager/html

 

一、 让数据库连接池转起来

作为一个 J2EE 程序员大家手上可能会有现成的 JDBC 数据库连接池,其实这没有太大的必要,因为象 weblogic ……企业级 WEBAPP 都有自己的连接池,大家不要费力直接使用吧,效率也很不错,再也不用羡慕 .NET ADO 了(以前作 MS 从来不担心数据连接, ADO 确实用起来很爽),如果想实现一个 JDBC connection pool 的注意事项有:

1. 有一个简单的函数从连接池中得到一个 Connection

2. close 函数必须将 connection 放回 数据库连接池。

3. 当数据库连接池中没有空闲的 connection 数据库连接池必须能够自动增加 connection 个数。

4. 当数据库连接池中的 connection 个数在某一个特别的时间变得很大,但是以后很长时间只用其中一小部分,应该可以自动将多余的 connection 关闭掉。

5. 如果可能,应该提供 debug 信息报告没有关闭的 new Connection

网上有各种各样的连接池代码,抄过来改改吧,嘿嘿~

 

这里介绍如何配置 TOMCAT 的连接池,以 SQLSERVER 为例:

步骤 1 :安装 SQLSERVER JDBC 驱动

SQLSERVER JDBC 驱动其实就是三个 JAR 文件, msbase.jar/mssqlserver.jar/msutil.jar ,将这三个文件拷贝到你的 /tomcat_home/common/lib 目录下去就可以了。

步骤 2 :修改 server.xml 文件

具体代码如下:

<Context path="test" docBase="F:\yourroot" debug="5" reloadable="true" crossContext="true">

       <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_DBTest_log." suffix=".txt" timestamp="true"/>

       <Resource name="jdbc/SqlServerDB" auth="Container" type="javax.sql.DataSource"/>

       <ResourceParams name="jdbc/SqlServerDB">

              <parameter>

              <name>factory</name>

              <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

       </parameter>

       <!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.-->

       <parameter>

              <name>maxActive</name>

              <value>50</value>

       </parameter>

       <!-- Maximum number of idle dB connections to retain in pool.        Set to 0 for no limit.-->

       <parameter>

              <name>maxIdle</name>

              <value>20</value>

       </parameter>

       <!-- Maximum time to wait for a dB connection to become available        in ms, in this example 0.5 seconds. An Exception is thrown if    this timeout is exceeded. Set to -1 to wait indefinitely. -->

       <parameter>

              <name>maxWait</name>

              <value>500</value>

       </parameter>

       <!-- msSQL dB username and password for dB connections -->

       <parameter>

              <name>username</name>

              <value>sa</value>

       </parameter>

      

       <parameter>

              <name>password</name>

              <value>sa</value>

       </parameter>

       <!-- Class name for SQLServer2000 JDBC driver -->

       <parameter>

              <name>driverClassName</name>

              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>

       </parameter>

       <!-- The JDBC connection url for connecting to your MS SQL Server dB.The autoReconnect=true argument to the url makes sure that the mm.Sql Server JDBC Driver will automatically reconnect if mysqld closed the connection. mysqld by default closes idle connections after 8 hours.-->

       <parameter>

              <name>url</name>

              <value>jdbc:microsoft:sqlserver://10.0.254.11:1433;databaseName=yourdb</value>

       <!--must use &amp; not use   & -->

       </parameter>

       </ResourceParams>

       </Context>

步骤三:程序调用

package dbmanage;

 

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Enumeration;

import java.util.Hashtable;

import java.util.Vector;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

 

import util.smartDateFormat;

 

 

public class dbManager {

  /************************************

   * @param static private boolean VERBOSE ;

   * @param Statement theStatement;

   * @param PreparedStatement thePstmt;

   * @param Connection theConnection;

   ************************************/

  final static private boolean VERBOSE = true; // 打印控制台控制

 

  //static Logger logger = Logger.getLogger(dbManager.class.getName());

  private Context initCtx = null;

  private Context ctx = null;

  private DataSource ds = null;

 

  private long timeout = 5000;

 

  private Statement theStatement = null;

  private PreparedStatement thePstmt = null;

 

  /************************************

   * 初试化 initCtx

   * 取得数据源对象

   ************************************/

  public

      dbManager() {

    try {

      initCtx = new InitialContext();

      //init context read config web.xml

      if (initCtx == null) {

        throw new Exception("Initial Failed!");

      }

      ctx = (Context) initCtx.lookup("java:comp/env");

      //find "jdbc/SqlServerDB" object   this configruation in the SERVER.XML of Tomcat

      if (ctx != null) {

        ds = (DataSource) ctx.lookup("jdbc/SqlServerDB");

      }

      if (ds == null) {

        throw new Exception("Look up DataSource Failed!");

      }

    }

    catch (Exception e) {

      log(e, "Can't get the Context!");

    }

  }

 

  /************************************

   * get Connection

   * @return Connection

   ************************************/

  public synchronized

      Connection getConnection() {

    //get connection and set to delay time

    long startTime = new java.util.Date().getTime();

    Connection con = null;

    while (con == null) {

      con = newConnection();

      if (con != null) {

        //log("Create New Connection!");

        break;

      }

      try {

        log(" 连接超时,重新连接,等待 " + timeout + "ms");

        wait(timeout);

      }

      catch (InterruptedException e) {

        log(e, " 连接超时 !");

      }

      if ( (new java.util.Date().getTime() - startTime) >= timeout) {

        log("Connection timeout!");

        break;

      }

    }

    return con;

  }

 

  private

      Connection newConnection() {

    Connection con = null;

    try {

      con = ds.getConnection();

      if (con == null) {

        throw new Exception("Create Connection Failed!");

      }

    }

    catch (Exception e) {

      log("Create Connection Failed!");

      System.out.println(e.getMessage());

    }

    return con;

  }

 

  /************************************

   * release the connection

   * @param conn Connection

   * @param stmt Statement

   * @param pstmt PreparedStatement

   ************************************/

  public synchronized

      void freeConnection(Connection conn,

                          Statement stmt,

                          PreparedStatement pstmt) {

    try {

      //close Statement

      if (stmt != null) {

        stmt.close();

        stmt = null;

        //log("Close Statement......");

      }

      //close   PreparedStatement

      if (pstmt != null) {

        pstmt.close();

        pstmt = null;

        //log("Close PreparedStatement......");

      }

    }

    catch (Exception e) {

      System.out.println(e.getMessage());

    }

    try {

      //close Connection

      if (conn != null) {

        conn.close();

        conn = null;

        //log("Close Connection......");

       }

    }

    catch (SQLException e) {

      log(e, " 释放资源出错 !");

    }

  }

 

 

  /************************************

   * write log file.

   * @param s String

   ************************************/

  private

      void log(String s) {

    if (VERBOSE) {

      System.out.println(new java.util.Date() + ":" + s);

      //logger.info(new java.util.Date()+s);

    }

  }

 

  /************************************

   * write log file.

   * @param ex Object

   ************************************/

  private

      void logerr(Object ex) {

    if (VERBOSE) {

      //System.out.println(new java.util.Date()+":"+s);

      //logger.error(ex);

    }

  }

 

  /************************************

   * write log file.

   * @param e Throwable

   * @param msg String

   ************************************/

  private

      void log(Throwable e, String msg) {

    System.out.println(new java.util.Date() + ": " + msg);

    //logger.info(new java.util.Date() + ": " + msg, e);

  }

……

}

 

OK ,你现在可以方便的使用连接池了,想要一个得一个,记得要释放哦,连接池的数量总是有限的。

 

 

二、 中文问题照样很简单

每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII , 中国的 GB2312-80 ,日本的 JIS 等,作为该国家 / 区域内信息处理的基础,有着统一编码的重要作用。字符编码集按长度分为 SBCS (单字节字符集), DBCS (双字节字符集)两大类。早期的软件(尤其是操作系统),为了解决本地字符信息的计算机处理,出现了各种本地化版本( L10N ),为了区分,引进了 LANG, Codepage 等概念。但是由于各个本地字符集代码范围重叠,相互间信息交换困难;软件各个本地化版本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来,作一致处理,将特别的本地化处理内容降低到最少。这也就是所谓的国际化( I18N )。各种语言信息被进一步规范为 Locale 信息。处理的底层字符集变成了几乎包含了所有字形的 Unicode

现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础的,在软件运行时根据当时的 Locale/Lang/Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符。在处理过程中需要实现 Unicode 和本地字符集的相互转换,甚或以 Unicode 为中间的两个不同本地字符集的相互转换。这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。

Java 语言内部是用 Unicode 表示字符的,遵守 Unicode V2.0 Java 程序无论是从 / 往文件系统以字符流读 / 写文件,还是往 URL 连接写 HTML 信息,或从 URL 连接读取参数值,都会有字符编码的转换。这样做虽然增加了编程的复杂度,容易引起混淆,但却是符合国际化的思想的。从理论上来说,这些根据字符集设置而进行的字符转换不应该产生太多问题。而事实是由于应用程序的实际运行环境不同, Unicode 和各个本地字符集的补充、完善,以及系统或应用程序实现的不规范,转码时出现的问题时时困扰着程序员和用户。

其实解决 JAVA 程序中的汉字编码问题的方法往往很简单,但理解其背后的原因,定位问题,还需要了解现有的汉字编码和编码转换。相信这样的东西大家都见过了

new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK")

但这样的代码相信不是一个解决的办法,这样会增加程序的复杂度,写数据库,提交表单, URL 中传中文参数,到处都是中文问题!作为一个连走路都要算计最短距离的懒人,当然不愿天天叨念着 new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK") ,然汉战战兢兢的处理各种字符转换的问题,我跋山涉水,翻山越岭,终于找到了完美的解决方式,在 TOMCAT 中只需要简单的配置,引入 2 个文件就可以轻松搞定。

前提条件,每个页面使用

<%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %>

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

地球人都知道的东西。

步骤 1 :添加过滤器

TOMCAT 中找到这 2 个文件 RequestDumperFilter.java SetCharacterEncodingFilter.java ,他们位于 D:\Tomcat 5.0.27 \webapps\jsp-examples\WEB-INF\classes\filters ,加到你的工程文件里去,编译他们。

步骤 2 :配置 WEB.XML

web.xml 里加入这一段

……

<filter>

    <filter-name>Set Character Encoding</filter-name>

    <filter-class>filters.SetCharacterEncodingFilter</filter-class>

    <init-param>

      <param-name>encoding</param-name>

      <param-value>GBK</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>Set Character Encoding</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

……

看到没有?这样你就不用写那些麻烦的转换代码了,当然这样还不足以解决问题。

步骤 3 :修改 server.xml

server.xml 修改 2 个地方

<Connector port="8080"

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               debug="0" connectionTimeout="20000"

               disableUploadTimeout="true" URIEncoding='GBK'/>

<Connector className="org.apache.coyote.tomcat5.CoyoteConnector"

               port="8009" minProcessors="5" maxProcessors="75"

               enableLookups="true" redirectPort="8443"

               acceptCount="10" debug="0" connectionTimeout="0"

               useURIValidationHack="false" protocol="AJP/1.3"

               protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"

               URIEncoding='GBK'/>

OK ,搞定!

 

三、 APACHE TOMCAT 他们俩关系非同一般

Apache tomcat 都是很优秀的软件,更可贵的是它们是免费的。其实他们 2 个都是 jakarta 项目的重要组成部分。按辈分来讲, TOMCAT APACHE 的儿子, APACHE 的专长是解析静态文件, CGI,PHP ……图片……,儿子当然不能抢了老爹的饭碗,所以 TOMCAT 只有在 J2EE 这个上面发愤图强,其实 TOMCAT 并非不能干他老爹的活,只是稳定性差点而已(偶没有明显的感觉,可能是商业炒作吧),现在大家明白为什么把他们 2 个扯一起了吧,上阵还靠父子兵呢~

2 个家伙整一起有大致有 2 种方法,一种是利用 mod_jk2.so ,一种是利用 mod_jk_ 1.2.5 _2.0.47.dll 。这 2 个东东叫联接器( TOMCAT 就是通过这家伙与 apache 勾搭上的)

1、   利用 mod_jk_ 1.2.5 _2.0.47.dll WINDOWS 下整合

步骤 1 :准备材料

apache 2.0.52

http://apache.te8.com/dist/httpd/binaries/win32/apache_2.0.52-win32-x86-no_ssl.msi

tomcat 5.0.27

http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.19/bin/jakarta-tomcat-5.0.27.exe

JDK (这个不用说了吧 ^_^

mod_jk_ 1.2.5 _2.0.47.dll (关键是这个东东啊,找了我 N 久),据说在下面连接可以下到,最后在我同事那找到的。

http://apache.linuxforum.net/dist/jakarta/tomcat-connectors/jk/binaries/win32/mod_jk_1.2.5_2.0.47.dll

安装 apache\ tomcat\JDK

 

步骤 2 :安装后设置环境变量

设置我的电脑 \ 属性 \ 高级 \ 环境变量 \ 新建系统变量 变量名: JAVA_HOME 变量值: C:\JBuilderX\jdk1.4 ( 指向 JDK 的实际安装路径 ) TOMCAT_HMOM 变量值: Tomcat 5.0.27 lasspath 编辑变量值中加上 …… ;%JAVA_HOME%\bin;%JAVA_HOME%\lib;%TOMCAT_HOME%\bin;.;

测试一下,访问 http://localhost http://localhost:8080 ,默认安装是不会有什么错误的 ^_^

把连接器 mod_jk_ 1.2.5 _2.0.47.dll COPY D:\Apache2\modules\ 下。

 

步骤 3 apache 配置

d:\Apache2\conf 下找到 httpd.conf ,找到 DirectoryIndex ,在 index.html 后添加 index.jsp ;查找“ listen ”用于本机测试时: Listen 127.0.0.1:80 ,我的是这样设置的 Listen *:80

查找 AddDefaultCharset 设置为 AddDefaultCharset off ,这样 APACHE 将以你页面定义的字符集解析页面。

在最后添加如下代码:

<VirtualHost *:80> #localhost 为本机,你可用本机 ip

    ServerAdmin darkxie@hotmail.com # 你的 mail 地址

    DocumentRoot F:/uutang/uutang # 你的项目组根目录

    ServerName dark # 你的服务名,若你的机器有域名,设为域名

    ErrorLog logs/ErrorLog.txt # 错误日志

    CustomLog logs/CustomLog.txt common # 访问日志

    JkMount /servlet/* ajp13 # Apache 支持对 servlet 传送,用以 Tomcat 解析

    JkMount /*.jsp ajp13 # Apache 支持对 jsp 传送,用以 Tomcat 解析

    JkMount /*.do ajp13 # Apache 支持对 struts action 传送,用以 Tomcat 解析

</VirtualHost>

LoadModule jk_module modules/mod_jk_ 1.2.5 _2.0.47.dll

JkWorkersFile "D:/Tomcat 5.0.27 /conf/workers.properties"

JkLogFile "D:/Tomcat 5.0.27 /logs/mod_jk2.log"

JkLogLevel info

 

步骤 4 tomcat 配置

d:\Tomcat5\conf 下新建一个 workers.properties 文件 . 内容如下

workers.tomcat_home=d:\Tomcat5 # mod_jk 模块知道 Tomcat

workers.java_home=d:\jdk1.3   # mod_jk 模块知道 j2sdk

ps=\

worker.list=ajp13 # 模块版本 , 现有 ajp13 , 不要修改

worker.ajp13.port=8009 # 工作端口 , 若没占用则不用修改

worker.ajp13.host=localhost # 主机 , 若上面的 Apache 主机不为 localhost, 作相应修改

worker.ajp13.type=ajp13 # 类型

worker.ajp13.lbfactor=1 # 代理数 , 不用修改

修改 TOMCAT server.xml 文件:

<!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->

    <Connector className="org.apache.coyote.tomcat5.CoyoteConnector"

               port="8009" minProcessors="5" maxProcessors="75"

               enableLookups="true" redirectPort="8443"

               acceptCount="10" debug="0" connectionTimeout="0"

               useURIValidationHack="false" protocol="AJP/1.3"

               protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"

               URIEncoding='GBK'/>

TOMCAT 知道 ajp13 协议, apache tomcat 俩父子间靠这个协议沟通。

测试一下,访问 http://localhost http://localhost:8080 ,看到相同的页面没有?细心点,其实很简单,看看 E 文的帮助,搞定不成问题。

 

2、   利用 mod_jk2.so (也叫 JK2 整合

jk2 是一个 jakarta-tomcat-connectors-jk 2.0.4 -win32-apache2.0.49.zip 文件,主要用的是其中的 mod_jk2.so 。其实利用 mod_jk2.so 整合和利用 mod_jk_ 1.2.5 _2.0.47.dll 整合大同小异,只是换了个联接器而已,现在一步一步整起来~

步骤 1 :没有多说的,安装好 TOMCAT APACHE

下载 jakarta-tomcat-connectors-jk 2.0.4 -win32-apache2.0.49.zip ,解压, mod_jk2 放到 apache 的安装文件夹下的 modules 文件夹中。

步骤 2 apache 配置

/conf 中加入一个 work.properties 文件,其内容如下:

<!-- 这个文件的作用不是很清楚,总之路径设置正确就行了。我的 apache 装在 D:/Apache2 ,根据情况自己修改。 -->

[shm]

file=D:/ /Apache2/logs/shm.file

size=1048576

<!-- 这个 socket channel 是必须的, port host 对应于 tomcat 端的设置。 -->

#The socket channel

[channel.socket:localhost:8009]

port=8009

host=localhost

<!--worker ,必须的。 -->

#define the worker

[ajp13:localhost:8009]

channel=channel.socket:localhost:8009

<!--url mapping ,我的主要是 .jsp struts .do servlet 的话设置成 [uri:/xxx/*] 之类的。 -->

#uri mapping

[uri:/*] # 和第一种方式一样吧 ^_^

[uri:/*.jsp]

[uri:/*.do]

worker=ajp13:localhost:8009

httpd.conf 中,在 LoadModule 那里加入这句:

LoadModule jk2_module modules/mod_jk2.so

在最后加入这句:

JkSet config.file "conf/work.properties"

这是告诉 apache 去哪里找 jk 的配置的,根据具体情况修改。

还要修改一下 DirectoryIndex DirectoryIndex index.html index.html.var index.jsp 查找“ listen ”用于本机测试时: Listen 127.0.0.1:80 ,我的是这样设置的 Listen *:80

当然还有我们的虚拟目录:

<VirtualHost *:80>

    ServerAdmin darkxie@hotmail.com

    DocumentRoot F:/uutang/uutang

    ServerName dark

    ErrorLog logs/ErrorLog.txt

    CustomLog logs/CustomLog.txt common

    #JkMount /servlet/* ajp13

    #JkMount /*.jsp ajp13

     #JkMount /*.do ajp13

</VirtualHost>

 

步骤 3 tomcat 配置

Tomcat 的端口设置为 8080

/conf 文件夹加入 jk2.properties 文件,其内容如下:

# Set the desired handler list

handler.list=apr,request,channelSocket

#

# Override the default port for the socketChannel

channelSocket.port=8009

TOMCAT 自己已经生成了这个文件,找到相关的地方把注视去掉改一下就成。

 

注意:用这种方式整合最好是自己编译 mod_jk2.so 文件,特别是在 unix/linux , 没有环境,制作 mod_webapp.so 没有自己作过。具体方法, 自己去找吧。

小猫TOMCAT其实很可爱


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论