??xml version="1.0" encoding="utf-8" standalone="yes"?>
let me see the model:
BeanUtilities.java
code:
package skyey.snow.*;
import java.util.*;
import javax.servlet.http.*;
import org.apache.commons.beanutils.BeanUtilities;
/*Some utilities to populate beand, usually based on incoming request parameters. Requires three packages
*from the Apache Commons libarary: beanutils,collection and logging.To obtain these packages,see
*http://jakarta.apache.org/commons/.Also,the book's source code archive (see http://www.coreservlets.com/)
*contains links to all URLs mentioned in the book,including to the specific sections of the Jakarta Commons package.
*<p>
*Note that this class in the skeyey.snow.beans package,so must be installed in ..../package/beans/.
*/
public class BeanUtilities
{
/** Examines all of the request parameters to see if any catch a bean property(i.i.,a setXXX method)in the project.
*If so,the request parameter values is passed to that method.If the method expects an int,Integer,double,Double,or any
*of the other primitive or wrapper types,parsing and conversion is done automatically.If the request parameter value is *malformed(cannot be converted into the expected type),numeric properties are assigned zero and boolean properties
*are assigned false:no exception is thrown.
*/
public static void populateBean(Object formBean,HttpServletRequest request)
{
populateBean(formBean,request.getParameterMap());
/**Populates a bean beased on a Map: Map keys are the bean property names;Map values are the bean property values.
*Type conversion is performed automatically as described above.
*/
}
public static void populateBean(Object bean,Map propertyMap)
{
try
{
BeanUtilities.populate(bean,propertyMap);
}
catch(Exception e)
{// Empty catch.The two possible exceptions are java.lang.IllegalAccessException and java.lang.reflect.
//InvocationTargetExcepton.In both cases,just skip the bean operation.
}
}
}
]]>
在不同页面或者用户之间传输数?
对于在不同页面之间传输数据可以由以下的这些办法来实现: 1.把数据存在Session?2.通过Cookie;3.通过隐含表单把数据提交到下一个页?4.通过ServeltContext对象;5.通过Application对象;如果在不同的用户之间传输数据,常用的方法是:1.ServletContext对象;2.通过Application对象;3.通过文gpȝ或者是数据?
eg:
和Session不同的是,Cookie是存在于客户端的.׃客户端可能考虑安全因素会禁止用Cookies,q样使用Cookie时可能会遇到ȝ.例如:
<%@page contnetType="text/html;charset=gb2312" language="java" import="java.sql.*,javax.servlet.*,javax.servlet.http.* com.mypackage.doing.*" errorPage="" %>
<%
Cookie cookie=new Cookie("lastLoginTime",new java.util.Date().toLocaleString());
Response.addCookie(cookie);
%>
p样就已经在客L讄了Cookie,你可以在<a href="getCookie.jsp">q个面中来dq个Cookie
<!--getCookie.jsp-->
<%@page contentType="text/html;charset=gb2312" language="java" import="java.sql.*,javax.servlet.*,javax.servlet.http.*,com.mypackage,doing.*" errorPage=""%
<%
Cookie[] cookies=request.getCookies();
for(int i=0;i<cookies.length;i++)
{
Cookie c=cookies[i];
String name=c.getName();
if(name.equals("lastLoginTime"))
out.println("您上ơ的d旉?"+c.getValue());
}
%>
在不同的面之间传输数据,则可以用一个简单的聊天室来说明.
创徏错误面
E序在运行是隑օ会出现错误和异常.当处理JSP面?遇到的异常分Z个基本类?
A.~译时候出?BR> B.q行时出?BR>如果~译时候出错那么会产生内部错误.(错误代码500).如果是在JSP~译完后发生错误,那就是运行时的错?如果我们不对错误面q行处理那么Ҏ不同的服务器׃出现非常不友好的界面.
国际化问?BR> 要考虑一个真正意义的全球资源,WEB览器的内容会对每个接收到的用户来说都是易读?所以要考虑?q个问题.q有一个就是中文ؕ码的问题,至于q个你可以用一个编码函数来解决.例如:
eg:
<%
String trans(String chi)
{
String result=null;
byte temp[];
try
{
temp=chi.getBytes("iso-8859-1");
result=new String(temp);
}
catch(UnsupportedEncodingException e)
{
System.out.println("e.toString()");
}
}
%>
JSP中的文g操作
JSP中上传文?/FONT>
<body>
<form name="form1" action="login.jsp" method="post">
<p>Please input your name that you wanna registered:
<input type="text" name="name" value="abc"><br>
<p>Sendding by this button:
<input type="submit" name="submit" value="Sendding">
</form>
</body>
</html>
然后提交到login.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<%@ import page="java.util.*" %>
<html>
<head>
<title>login.jsp</title>
</head>
<body>
<%!
Hashtable hashtable=new Hashtable();
public synchronized void putName(String s)
{
hashtable.put(s,s);
}
%>
<%
String name=request.getParameter("name");
if(name==null)
{
name="";
}
byte b[]=name.getBytes("ISO-8859-1");
name=new String(b);
if(!(hashtable.containsKey(name)))
{
putName(name);
out.print("<br>"+"你已l注册成?);
out.print("<br>"+"你注册的名字?+name);
}
else
{
out.print("<br>"+"该名字已l存在,h换个名字?);
}
%>
</body>
</html>
元素?/SPAN> |
属?/SPAN> |
解释 |
server |
port |
指定一个端口,q个端口负责监听关闭tomcat的请?/SPAN> |
shutdown |
指定向端口发送的命o字符?/SPAN> | |
service |
name |
指定service的名?/SPAN> |
Connector(表示客户端和service之间的连?/SPAN>) |
port |
指定服务器端要创建的端口Pq在q个端口监听来自客户端的h |
minProcessors |
服务器启动时创徏的处理请求的U程?/SPAN> | |
maxProcessors |
最大可以创建的处理h的线E数 | |
enableLookups |
如果?/SPAN>trueQ则可以通过调用request.getRemoteHost()q行DNS查询来得到远E客L的实际主机名Q若?/SPAN>false则不q行DNS查询Q而是q回?/SPAN>ip地址 | |
redirectPort |
指定服务器正在处?/SPAN>httph时收C一?/SPAN>SSL传输h后重定向的端口号 | |
acceptCount |
指定当所有可以用的处理h的线E数都被使用Ӟ可以攑ֈ处理队列中的h敎ͼ过q个数的h不予处?/SPAN> | |
connectionTimeout |
指定时的时间数(以毫Uؓ单位) | |
Engine(表示指定service中的h处理机,接收和处理来?/SPAN>Connector的请?/SPAN>) |
defaultHost |
指定~省的处理请求的L名,它至与其中的一?/SPAN>host元素?/SPAN>name属性值是一L |
Context(表示一?/SPAN>web应用E序Q通常?/SPAN>WAR文gQ关?/SPAN>WAR的具体信息见servlet规范) |
docBase |
应用E序的\径或者是WAR文g存放的\?/SPAN> |
path |
表示?/SPAN>web应用E序?/SPAN>url的前~Q这栯求的url?/SPAN>http://localhost:8080/path/**** | |
reloadable |
q个属性非帔R要,如果?/SPAN>trueQ则tomcat会自动检应用程序的/WEB-INF/lib ?/SPAN>/WEB-INF/classes目录的变化,自动装蝲新的应用E序Q我们可以在不重?/SPAN>tomcat的情况下改变应用E序 | |
host(表示一个虚拟主?/SPAN>) |
name |
指定L?/SPAN> |
appBase |
应用E序基本目录Q即存放应用E序的目?/SPAN> | |
unpackWARs |
如果?/SPAN>trueQ则tomcat会自动将WAR文g解压Q否则不解压Q直接从WAR文g中运行应用程?/SPAN> | |
Logger(表示日志Q调试和错误信息) |
className |
指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口 |
prefix |
指定log文g的前~ | |
suffix |
指定log文g的后~ | |
timestamp |
如果?/SPAN>trueQ则log文g名中要加入时_如下?/SPAN>:localhost_log. | |
Realm(表示存放用户名,密码?/SPAN>role的数据库) |
className |
指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 |
Valve(功能?/SPAN>Logger差不多,?/SPAN>prefix?/SPAN>suffix属性解释和Logger 中的一?/SPAN>) |
className |
指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValvecd以记录应用程序的讉K信息 |
directory |
指定log文g存放的位|?/SPAN> | |
pattern |
有两个|common方式记录q程L名或ip地址Q用户名Q日期,W一行请求的字符ԌHTTP响应代码Q发送的字节数?/SPAN>combined方式?/SPAN>common方式记录的值更?/SPAN> |
它代表整个容?是Tomcat实例的顶层元?由org.apache.catalina.Server接口来定?它包含一?SERVICE>元素.q且它不能做ZQ何元素的子元?
1>className指定实现org.apache.catalina.Server接口的类.默认gؓorg.apache.catalina.core.StandardServer
2>port指定Tomcat监听shutdown命o端口.l止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命o.该属性是必须?
3>shutdown指定l止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字W串.该属性必设|?/P>
该元素由org.apache.catalina.Service接口定义,它包含一?ENGINE>元素,以及一个或多个
W一?SERVICE>处理所有直接由Tomcat服务器接收的web客户h.
W二?SERVICE>处理所有由Apahce服务器{发过来的Web客户h
1>className 指定实现org.apahce.catalina.Service接口的类.默认为org.apahce.catalina.core.StandardService
2>name定义Service的名?/P>
每个Service元素只能有一个Engine元素.元素处理在同一?SERVICE>中所?CONNECTOR>元素接收到的客户h.由org.apahce.catalina.Engine接口定义.
1>className指定实现Engine接口的类,默认gؓStandardEngine ?ENGINE>可以包含如下元素 1>className指定实现Host接口的类.默认gؓStandardHost ?HOST>元素中可以包含如下子元素 1>className指定实现Context的类,默认为StandardContextc?BR>2>path指定讉KWeb应用的URL入口,注意/myweb,而不是myweb了事 Connector元素 Connector元素q属?BR>1>className指定实现Connector接口的类
2>defaultHost指定处理客户的默认主机名,?ENGINE>中的
3>name定义Engine的名?/P>
它由Host接口定义.一个Engine元素可以包含多个
2>appBase指定虚拟L的目?可以指定l对目录,也可以指定相对于
3>autoDeploy如果此项设ؓtrue,表示Tomcat服务处于q行状态时,能够监测appBase下的文g,如果有新有web应用加入q来,会自q发布这个WEB应用
4>unpackWARs如果此项讄为true,表示把WEB应用的WAR文g先展开为开攄录结构后再运?如果设ؓfalse直接运行ؓWAR文g
5>alias指定L别名,可以指定多个别名
6>deployOnStartup如果此项设ؓtrue,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.如果Web应用中的server.xml没有相应?CONTEXT>元素,采用Tomcat默认的Context
7>name定义虚拟L的名?/P>
它由Context接口定义.是用最频繁的元?每个
的一个相对应的Context代表web应用自n.servlet容器为第一个web应用创徏一?BR>ServletContext对象.
3>reloadable如果q个属性设为true, Tomcat服务器在q行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文g的改q?如果监视到有class文g被更?服务器自重新加蝲Web应用
3>cookies指定是否通过Cookies来支持Session,默认gؓtrue
4>useNaming指定是否支持JNDI,默认gؓ了true
?CONTEXT>元素中可以包含如下元?BR>
由Connector接口定义.
W一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTPh;W二个Connector元素定义了一个JD Connector,它通过8009端口接收由其它服务器转发q来的请?
2>enableLookups如果设ؓtrue,表示支持域名解析,可以把IP地址解析Z机名.WEB应用中调用request.getRemoteHostҎq回客户Z机名.默认gؓtrue
3>redirectPort指定转发端口.如果当前端口只支持non-SSLh,在需要安全通信的场?把客户h转发至SSL的redirectPort端口
HttpConnector元素的属?BR>1>className实现Connector的类
2>port讑֮Tcp/IP端口,默认gؓ8080,如果?080Ҏ80,则只要输?A href="http://localhost/">http://localhost卛_
因ؓTCP/IP的默认端口是80
3>address如果服务器有二个以上ip地址,此属性可以设定端口监听的ip地址.默认情况?端口会监听服务器上所有的ip地址
4>bufferSize讑֮q口创建的输入的~存大小.默认gؓ2048byte
5>protocol讑֮Http协议,默认gؓHTTP/1.1
6>maxThreads讑֮在监听端口的U程的最大数?q个g军_了服务器可以同时响应客户h的最大数?默认gؓ200
7>acceptCount讑֮在监听端口队列的最大客戯求数?默认gؓ10.如果队列已满,客户必须{待.
8>connectionTimeout定义建立客户q接时的时?如果?1,表示不限制徏立客戯接的旉
JkConnector的属?BR>1>className实现Connector的类
2>port讑֮AJP端口?BR>3>protocol必须讑֮为AJP/1.3
]]>
本文档提供关于Tomcat的基信息.主要内容如下:
Tomcat二进制版本安?BR>与Tomcat相关的脚本的主要内容
与server.xml相关的主要内?Tomcat的主要配|文?BR>如何讄Tomcat与宿主web服务器一起工作的说明
如何应用Tomcat配置一个现实中的web站点
希望此文档以新用户可以开始用Tomcat.如找不到某方面的内容?按以下顺?
查找Tomcat faq
查找Tomcat包宓?BR>向Tomcat用户邮g列表发出问题
如此疑问的答案不存在,我们鼓励把对疑问的解{放入Tomcat faq或此文档.如对此文档有意见或徏?请发送到Tomcat的邮件列?
Getting Started
Tomcat是一个带有jsp环境的servlet容器.servlet容器是一个根据用L行ؓ可以理和激zservlet的运行时的shell.
_略地可以将servlet容器分ؓ如下几类:
独立的servlet容器
内置有web服务器的一部分.指当使用ZJava的web服务器的情Ş,例如servlet容器是JavaWebServer的一个部? 独立的servlet容器是Tomcat的默认模?
大多数的web服务器ƈ非基于Java,因此,我们可以得出如下两种容器的模?
q程内的servlet容器
servlet容器作ؓweb服务器的插g和Java容器的实?Web服务器插件在内部地址I间打开一个JVM(java virtual machine)使Java容器得以在内部运?如有某个需要调用servlet的请?,插g取得对此请求的控制q将他传?使用JNI)lJava容器.q程内容器对于多U程,单进E的服务器非常合适ƈ且提供很好的q行速度,但~性有所不.
q程外的servlet容器
servlet容器q行于web服务器之外的地址I间且作为web服务器的插g和Java容器的实现的l合.web服务器插件和Java容器 JVM使用IPC机制(通常是TCP/IP)q行通讯.当一个调用servlet的请求到达时,插g取得对此请求的控制q将其传?使用IPC{?lJava容器,q程外容器的反应旉或进E外容器引擎不如q程内容?但进E外容器引擎在许多其他可比的范围内更?伸羃?E_性等).
Tomcat既可作ؓ独立的容?主要是用于开发与调试)又可作ؓ对现有服务器的附?当前支持Apache,IIS和Netscape服务?.即Q何时候配|Tomcat你都必须军_如何应用?如选择W二或第三种模式,你还需要安装一个web服务器接?
Tomcat与Jserv有何区别?Tomcat是Jserv?
q是个常见的误解.Jserv是Servlet API2.0兼容q与Apache一起用的容器.Tomcat是一个完全重写的q与Servlet API2.2和JSP1.1兼容的容?
Tomcat使用了一些ؓJserv而写的代?特别是Jserv的Apache接口,但这是唯一的相同之?
怎样安装Tomcat的二q制版本?
非常?只需:
下蝲 zip/tar.gz M压羃文g,从http://jakarta.apche.org/download/binindex.html?
解压~此文g到某目录(?foo).会生成一子目?名ؓ”tomcat?
转换到”tomcat”目录设|一新的环境变量(TOMCAT_HOME)指向你安装的tomcat的目?BR>WIN32q_,键入:
“set TOMCAT_HOME=foo\tomcat?BR>Unixq_:
如是bash/sh环境, 键入:”TOMCAT_HOME=foo/tomcat;export TOMCAT_HOME?BR>如是tcsh环境, 键入:”setenv TOMCAT_HOME foo/tomcat?BR>讄环境变量JAVA_HOME指向你JDK的目?然后dJAVA解释器到你的PATH环境变量.
好了!现在可以q行TOMCATq作Z个独立的Servlet容器(模式一)
启动与关闭Tomcat
使用”bin”目录中的脚本启动与关闭Tomcat.
启动:
uinx:bin/startup.sh
win32:bin\startup
关闭:
unix:bin/shutdown.sh
win32:bin\shutdown
Tomcat目录l构
假设你已Tomcat解压,你已得到下列目录l构:
目录?-描述
bin
包含启动/关闭脚本
conf
包含不同的配|文?
包括 server.xml(Tomcat的主要配|文?和ؓ不同的Tomcat配置的web应用讄~省值的文gweb.xml
doc
包含各种Tomcat文档
lib
包含Tomcat使用的jar文g.unixq_此目录下的Q何文仉被加到Tomcat的classpath?
logs
Tomcat摆放日志文g的地?
src
ServletAPI源文?先别高兴,q些只有些必dServlet容器内实现的I接口和抽象c?
webapps
包含web目CZ
此外你可以Tomcat会创建如下目?
work
Tomcat自动生成,攄Tomcatq行时的临时文g(如编译后的JSP文g).如在Tomcatq行时删除此目录.JSP面不能运?
classes
你可以创建此目录来添加一些附加的cdc\径中.M你加到此目录中的c都可在Tomcat的类路径中找到自w?
Tomcat的脚?BR>Tomcat是一个JavaE序,因此在设|好几个环境变量后即可用命o行的方式q行.然而设|Tomcat使用的每个环境变量和如下的命令行参数乏味且易?因此,Tomcat开发组提供了一些脚本启动和关闭Tomcat变得L.
注意:q些脚本仅仅是个便利的方法去启动和关闭Tomcat.你可修改他们来定制CLASSPATH,环境变量如PATH,LD_LIBRARY_PATH,{等,只要是生成一个正的命o行即?
q些脚本是什么呢?下表列出对一般用h重要的脚?
tomcat
主脚?讄合适的环境变量,包括CLASSPATH,TOMCAT_HOME和JAVA_HOME和用适合的命令行参数启动Tomcat
startup
在后台启动Tomcat.”tomcat start”命令的替换方式
shutdown
关闭Tomcat.”tomcat stop”命令的替换方式
对用h重要的脚本是tomcat(tomcat.bat/tomcat.sh).其他Tomcat相关的脚本作Z个简单的面向单Q务的指向Tomcat脚本(讄不同的命令行参数{?的入?
仔细考察tomcat.bat/tomcat.sh,它按以下步骤q行:
在Unix下的步骤Q?/P>
如未指定,推测 TOMCAT_HOME
如未指定,推测 JAVA_HOME
讄CLASS_PATH包含:
1.${TOMCAT_HOME}/classes目录(如果存在)
2.${TOMCAT_HOME}/lib的一切内?/P>
3.${JAVA_HOME}/lib/tools.jar(此jar文g包含工具javac,我们需要javac处理jsp文g.
q行带有讑֮Java环境变量的命令行参数的java命o,调入tomcat.home,和org.apache.tomcat.startup.Tomcat 作ؓ启始c?同时也传递命令行参数到org.apache.tomcat.startup.Tomcat ,例如:
执行start/stop/run {的操作
此Tomcatq程使用指向server.xml的\?
例如server.xml攄于etc/server_1.xmlq且用户意图在后台启动apache,?入如下命令行:
bin/tomcat.sh start –f /etc/server_1.xml
在Win32下的步骤Q??
由此可见,win32版的tomcat.bat与Unix版的几乎一?其在它不推TOMCAT_HOME和JAVA_HOME的?q且不将所有的jar文g攑օc\径中.
Tomcat的配|文?/P>
Tomcat的配|基于两个配|文?
1.server.xml - Tomcat的全局配置文g
2.web.xml - 在Tomcat中配|不同的关系环境
q一部分讲q如何用这些文?我们不会包含web.xml的内部机?q些内部机制深入CServlet API的细?因此,我们讨论涵盖servler.xml内容及web.xml在Tomcat关系环境中的用法.
server.xml
server.xml是Tomcat的主配置文g.完成两个目标:
1 提供Tomcatlg的初始配|?
2 说明Tomcat的结?含义,使得Tomcat通过实例化组件完成v动及构徏自n, 如在server.xml所指定?/P>
下表描述server.xmlU的重要元素:
元素及其描述
Server
server.xml文g中最重要的元?Server定义了一个Tomcat服务?一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素cd
Logger
此元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余U别(描述此日志?和包含日志文件的路径.通常有servlet的Logger(ServletContext.log()?,JSP和Tomcatq行时的Logger.
ContextManager
ContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配|及l构.ContextManager有几个随同提供的Ҏ?
1. 用来U录调试信息的调试?
2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动.
3. 工作目录的名?/P>
ContextInterceptor&RequestInterceptor
q些侦听?interceptors)侦听具体发生在ContextManager中的事g.例如,ContextInterceptor侦听Tomcat的启动及l止事g,RequestInterceptor监视在它服务q程中用戯求需要通过的不同阶D?Tomcat的管理员不必知道太多关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实C个”全局”型的操?例如安全性及每个h日志)
Connector
Connector表示一个到用户的联?不管是通过web服务器或直接到用h览器(在一个独立配|中).Connector负责理Tomcat的工作线E和 ??q接C同用L端口?h/响应.Connector的配|包含如下信?
1.句柄c?/P>
2.句柄监听的TCP/IP端口
3.句柄服务器端口的TCP/IP的backlog.
E后我们在此文档中描述如何配置Connector.
Context
每个Context提供一个指向你攄你Web目的Tomcat的下属目录。每个Context包含如下配置Q?/P>
1. Context攄的\?可以是与ContextManagerȝ录相关的路径.
2.U录调试信息的调试?/P>
3.可重载的标志.开发Servlet?重蝲更改后的Servlet,q是一个非怾利的Ҏ?你可以调试或用Tomcat试C码而不用停止或重新启动Tomcat.要打开重蝲,把reloadable设ؓ真即?q虽p旉但可所发生的变?更重要的?鉴于,在一个装载类对象装入一个新的servlet?c装载触发器可能会掷Z些错?为避免这些问?你可以设|可重蝲为假,q将停止重蝲功能.
从另一个目录中启动Tomcat
作ؓ~省值将使用TOMCAT_HOME/conf/server.xml作ؓ配置文g.~省配置用TOMCT_HOME作ؓ关系环境的基.
使用 ?f/你的/目录/server.xml”选项你可改变q种情况,使用另一个服务器配置文g和设|关pȝ境管理器的目录属性你需要在ȝ录内讄以下几个文g:
Ø 一?webapps/目录(如果你已生成) ?所有war文g奖杯界压倒此目录而且所有子目录作为关pȝ境添?
Ø conf/目录 - 你可保存一个特D的web.xml文g和其他配|文?/P>
Ø logs/ - 所有日志文件将代替TOMCAT_HOME/logs/U录到此目录?/P>
Ø work/ - 关系环境的工作目?/P>
如server.xml中的ContextManager.home属性有兌,关联到到当前工作目?
web。xml
关于web。xml和web目l构Q包括目录服务及配置Q的详细描述可在Servlet API Spec的第9Q?0Q?4章中扑ֈ?/P>
然而有一个与Tomcat有关的小“特性“与web.xml有关。Tomcat可以让用户通过缺省的web.xml攑օconf目录中来定义所有关pȝ境的web.xml的缺省?建立一个新的关pȝ境时,Tomcat使用~省的web.xml文g作ؓ基本讄和应用项目特定的web.xml(攑֜应用目的WEB-INF/web.xml文g)来覆盖这些缺省?
讄Tomcat与Apache Web 服务?/P>
服务?/P>
到现在ؓ?我们未讨Z为服务器扩展的Tomcat,只讨Z作ؓ独立q行的服务器.但有一些问题需要说?
1. 当处理静态页面时,Tomcat不如Apacheq?
2. Tomcat不象Apache一样可配置.
3. Tomcat不象Apache一样强?
4. 有很多网站已在某一特定web server上投入了很长旉,例如,使用CGI脚本/Server API模组/perl/php…我们不能假设这些遗留下来的东西都会被丢?
Z以上原因,一个现实的|站使用一个Web服务?如Apache,为网站的静态页面请求提供服?q用Tomcat作ؓ一个Servlet/JSP插g.
我们不准备深入的讨论每个不同的配|?我们?
1. 늛Web服务器的基本行ؓ
2. 解释需要何U配|?/P>
3. 在Apache上的实例
Web 服务器操?/P>
单说来,web服务器L{待来自客户端的HTTPh。当h到达Ӟ服务器会提供一切必要的内容来满xh。加入一个Servlet容器某种E度上会改变此行为。但服务器仍需处理如下因素Q?/P>
载入servlet容器接口库ƈ初始化(处理h之前Q?/P>
当收C个请求时Q检查是否属于某ServletQ如是,则接口库接收此请求ƈ处理?/P>
另一斚wQ接口库需要知道他服务某U请求,通常是基于请求的URL的某U模式和此h导向何处?/P>
当用h要设|用虚拟主机的配置Ӟ事情会变得更加复杂,或者想多个开发者在一个服务器上进行开发但使用不同的Servlet容器的JVMs。以下我们将讨论q两个问题?/P>
必需q行的配|?/P>
应该考虑的是最明显的配|是servlet URLh对servlet容器中的servleth表示的责仅R很明显Q你必须知道传递什么到Servlet容器。我们仍需提供附加的配|项目到web-server或servlet-container的结合体?
l 考虑到Tomcatq程是否可取得,我们仍需提供配置和Tomcat正在监听的TCP/IP L?端口受?/P>
l 需要告知web服务器接口库的位|(因此我们可以在v始时装入Q?/P>
l 需要设|接口内部信息如日志记录在何处和如何纪录,{等?/P>
所有此cM息必d现在web服务器配|里或被接口使用的私有配|文件中。下面将讲述如何在Apache中如何实现这些配|?/P>
Apache上的实现
q一部分演示如何配置Apache与Tomcat一起工作;q试图解释深入到可能会用到的配置规范。在jserv 安装上可找到其他信息?
板桥里h jdon.com 2001/10
1.Tomcat~省的jsp文g必须攄在examples目录?Njsp文g只能攑֜examples下吗Q?BR>2. 讉Kjsp只能用xxxx.com:8080讉K?
本文讨论如何l合Tomcat和Apache及其他脚本程序如PHP混合使用情况,如果一台服务器只运行jsp,那解军_法很?只要?EM>server.xml?080端口Ҏ80可?或将apache中的httpd.conf?0Ҏ8080也可?可以参? Using Apache Tomcat 4
Tomcat 3.23中很好做,相关文章介绍不少,Tomcat 4.0׃一样了,本hl过试验,摸烦册两个问题的简单方?q种方式可以和apachel合在一?假设域名L是sign.jdon.com 可以实现http://sign.jdon.com/讉K所有JSP文g,q一l果是很多朋友希望达到的,我下面介l一?
分两? 配置server.xml ?配置httpd.conf:
配置server.xml
首先介绍一下tomcat conf下的server.xml 我们的动作主要是在这里面操作:
server.xml有两部分l成:
1. service=Tomcat-Standalone q是Tomcat标准启动服务,使用端口8080讉K
2. service=Tomcat-Apache q是和apache整合部分,使用80008端口讉K ,同时需要在httpd.conf中加载mod_webapp.so
在上面两个serviceD中加入(在哪个service加入取决于你需要是以sign.jdon.com:8080 q是以sign.jdon.com/讉K):
我们是想以后者访?在service=Tomcat-Apache中加?
<Host name="虚拟L域名" debug="0" appBase="应用基本目录" unpackWARs="true"> <Context path="容器URL路径" docBase="容器目录" debug="0" reloadable="true"> <Logger className="org.apache.catalina.logger.FileLogger" prefix="自己的log文g?" suffix=".txt" timestamp="true"/> </Context> </Host> |
1. reloadable="true"保你每ơ上传bean或servlet到WEB-INF/classes?pȝ自动装蝲最新的.
2. docBase="" 是你自己jsp目录的实际位|?Q如果是winNT, 可以是c:/jserv
3. Logger 是用来将/jserv的启动状态单独输Z个log文g?q里是localhost_jserv_log,q个文g在Tomcat 的logs目录下。可以用来监视你?jserv启动了没有?/P>
4.Ơ缺servlet或bean是放|在自己目录下的WEB-INF/classes中,你将eamples目录下的WEB-INF原封不动的拷贝过来,省事。你要修改这?׃改web.xml q些 上面推荐的英文文章中有介l?
我的server.xml是这?
<Service name="Tomcat-Apache"> <Connector className="org.apache.catalina.connector.warp.WarpConnector" <!-- Replace "localhost" with what your Apache "ServerName" is set to --> <!-- Global logger unless overridden at lower levels --> <!-- Because this Realm is here, an instance will be shared globally --> <!--下面是我加入?-> </Engine> </Service> |
配置httpd.conf
讑֮sign.jdon.com 对应我的目录/home/bqlr/sign/ sign.jdon.com是虚拟主机名,我的部vҎ可以为特定虚拟主机域名提供JSP功能:
在自qapache 的conf下的httpd.conf加入:
LoadModule webapp_module libexec/mod_webapp.so AddModule mod_webapp.c WebAppConnection conn warp sign.jdon.com:8008 <VirtualHost 61.119.57.108> |
1.本方法是适合apache 1.3版本?适合glibc2.1 我在RedHat 7.2 7.1 7.0 6.2 6.1都测试通过
2.如果你的linux安装的是glibc2.1 p自己下蝲mod_webapp.src自己~译Q编译前Q要先安装其目录下的APR.
q里是我~译好正在用的 mod_webapp.so ,可以下蝲直接copy到apache的libexec目录?/P>
3.使用httpd configtest 试httpd.conf可否启动,如果出现无效LoadModule提示 是因Z的apache没有使用module=so~译,重新~译apache |络上其他有介绍.
4.?home/bqlr/sign下安装WEB-INF/classes目录 最单的办法是copy -R tomcat/wepapps/examples/WEB-INF ?home/bqlr/sign?以后自己~译的bean或servlet攑֜q个目录?以后我有I?我公布我的jsp/bean的编ED?
最?重新启动Tomcat ?apache 你可以用sign.jdon.com讉K所有的Jsp 和servlet?
本文档提供关于Tomcat的基信息.主要内容如下:
Tomcat二进制版本安?BR>与Tomcat相关的脚本的主要内容
与server.xml相关的主要内?Tomcat的主要配|文?BR>如何讄Tomcat与宿主web服务器一起工作的说明
如何应用Tomcat配置一个现实中的web站点
希望此文档以新用户可以开始用Tomcat.如找不到某方面的内容?按以下顺?
查找Tomcat faq
查找Tomcat包宓?BR>向Tomcat用户邮g列表发出问题
如此疑问的答案不存在,我们鼓励把对疑问的解{放入Tomcat faq或此文档.如对此文档有意见或徏?请发送到Tomcat的邮件列?
Getting Started
Tomcat是一个带有jsp环境的servlet容器.servlet容器是一个根据用L行ؓ可以理和激zservlet的运行时的shell.
_略地可以将servlet容器分ؓ如下几类:
独立的servlet容器
内置有web服务器的一部分.指当使用ZJava的web服务器的情Ş,例如servlet容器是JavaWebServer的一个部? 独立的servlet容器是Tomcat的默认模?
大多数的web服务器ƈ非基于Java,因此,我们可以得出如下两种容器的模?
q程内的servlet容器
servlet容器作ؓweb服务器的插g和Java容器的实?Web服务器插件在内部地址I间打开一个JVM(java virtual machine)使Java容器得以在内部运?如有某个需要调用servlet的请?,插g取得对此请求的控制q将他传?使用JNI)lJava容器.q程内容器对于多U程,单进E的服务器非常合适ƈ且提供很好的q行速度,但~性有所不.
q程外的servlet容器
servlet容器q行于web服务器之外的地址I间且作为web服务器的插g和Java容器的实现的l合.web服务器插件和Java容器 JVM使用IPC机制(通常是TCP/IP)q行通讯.当一个调用servlet的请求到达时,插g取得对此请求的控制q将其传?使用IPC{?lJava容器,q程外容器的反应旉或进E外容器引擎不如q程内容?但进E外容器引擎在许多其他可比的范围内更?伸羃?E_性等).
Tomcat既可作ؓ独立的容?主要是用于开发与调试)又可作ؓ对现有服务器的附?当前支持Apache,IIS和Netscape服务?.即Q何时候配|Tomcat你都必须军_如何应用?如选择W二或第三种模式,你还需要安装一个web服务器接?
Tomcat与Jserv有何区别?Tomcat是Jserv?
q是个常见的误解.Jserv是Servlet API2.0兼容q与Apache一起用的容器.Tomcat是一个完全重写的q与Servlet API2.2和JSP1.1兼容的容?
Tomcat使用了一些ؓJserv而写的代?特别是Jserv的Apache接口,但这是唯一的相同之?
怎样安装Tomcat的二q制版本?
非常?只需:
下蝲 zip/tar.gz M压羃文g,从http://jakarta.apche.org/download/binindex.html?
解压~此文g到某目录(?foo).会生成一子目?名ؓ”tomcat?
转换到”tomcat”目录设|一新的环境变量(TOMCAT_HOME)指向你安装的tomcat的目?BR>WIN32q_,键入:
“set TOMCAT_HOME=foo\tomcat?BR>Unixq_:
如是bash/sh环境, 键入:”TOMCAT_HOME=foo/tomcat;export TOMCAT_HOME?BR>如是tcsh环境, 键入:”setenv TOMCAT_HOME foo/tomcat?BR>讄环境变量JAVA_HOME指向你JDK的目?然后dJAVA解释器到你的PATH环境变量.
好了!现在可以q行TOMCATq作Z个独立的Servlet容器(模式一)
启动与关闭Tomcat
使用”bin”目录中的脚本启动与关闭Tomcat.
启动:
uinx:bin/startup.sh
win32:bin\startup
关闭:
unix:bin/shutdown.sh
win32:bin\shutdown
Tomcat目录l构
假设你已Tomcat解压,你已得到下列目录l构:
目录?-描述
bin
包含启动/关闭脚本
conf
包含不同的配|文?
包括 server.xml(Tomcat的主要配|文?和ؓ不同的Tomcat配置的web应用讄~省值的文gweb.xml
doc
包含各种Tomcat文档
lib
包含Tomcat使用的jar文g.unixq_此目录下的Q何文仉被加到Tomcat的classpath?
logs
Tomcat摆放日志文g的地?
src
ServletAPI源文?先别高兴,q些只有些必dServlet容器内实现的I接口和抽象c?
webapps
包含web目CZ
此外你可以Tomcat会创建如下目?
work
Tomcat自动生成,攄Tomcatq行时的临时文g(如编译后的JSP文g).如在Tomcatq行时删除此目录.JSP面不能运?
classes
你可以创建此目录来添加一些附加的cdc\径中.M你加到此目录中的c都可在Tomcat的类路径中找到自w?
Tomcat的脚?BR>Tomcat是一个JavaE序,因此在设|好几个环境变量后即可用命o行的方式q行.然而设|Tomcat使用的每个环境变量和如下的命令行参数乏味且易?因此,Tomcat开发组提供了一些脚本启动和关闭Tomcat变得L.
注意:q些脚本仅仅是个便利的方法去启动和关闭Tomcat.你可修改他们来定制CLASSPATH,环境变量如PATH,LD_LIBRARY_PATH,{等,只要是生成一个正的命o行即?
q些脚本是什么呢?下表列出对一般用h重要的脚?
tomcat
主脚?讄合适的环境变量,包括CLASSPATH,TOMCAT_HOME和JAVA_HOME和用适合的命令行参数启动Tomcat
startup
在后台启动Tomcat.”tomcat start”命令的替换方式
shutdown
关闭Tomcat.”tomcat stop”命令的替换方式
对用h重要的脚本是tomcat(tomcat.bat/tomcat.sh).其他Tomcat相关的脚本作Z个简单的面向单Q务的指向Tomcat脚本(讄不同的命令行参数{?的入?
仔细考察tomcat.bat/tomcat.sh,它按以下步骤q行:
在Unix下的步骤Q?/P>
如未指定,推测 TOMCAT_HOME
如未指定,推测 JAVA_HOME
讄CLASS_PATH包含:
1.${TOMCAT_HOME}/classes目录(如果存在)
2.${TOMCAT_HOME}/lib的一切内?/P>
3.${JAVA_HOME}/lib/tools.jar(此jar文g包含工具javac,我们需要javac处理jsp文g.
q行带有讑֮Java环境变量的命令行参数的java命o,调入tomcat.home,和org.apache.tomcat.startup.Tomcat 作ؓ启始c?同时也传递命令行参数到org.apache.tomcat.startup.Tomcat ,例如:
执行start/stop/run {的操作
此Tomcatq程使用指向server.xml的\?
例如server.xml攄于etc/server_1.xmlq且用户意图在后台启动apache,?入如下命令行:
bin/tomcat.sh start –f /etc/server_1.xml
在Win32下的步骤Q??
由此可见,win32版的tomcat.bat与Unix版的几乎一?其在它不推TOMCAT_HOME和JAVA_HOME的?q且不将所有的jar文g攑օc\径中.
Tomcat的配|文?/P>
Tomcat的配|基于两个配|文?
1.server.xml - Tomcat的全局配置文g
2.web.xml - 在Tomcat中配|不同的关系环境
q一部分讲q如何用这些文?我们不会包含web.xml的内部机?q些内部机制深入CServlet API的细?因此,我们讨论涵盖servler.xml内容及web.xml在Tomcat关系环境中的用法.
server.xml
server.xml是Tomcat的主配置文g.完成两个目标:
1 提供Tomcatlg的初始配|?
2 说明Tomcat的结?含义,使得Tomcat通过实例化组件完成v动及构徏自n, 如在server.xml所指定?/P>
下表描述server.xmlU的重要元素:
元素及其描述
Server
server.xml文g中最重要的元?Server定义了一个Tomcat服务?一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素cd
Logger
此元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余U别(描述此日志?和包含日志文件的路径.通常有servlet的Logger(ServletContext.log()?,JSP和Tomcatq行时的Logger.
ContextManager
ContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配|及l构.ContextManager有几个随同提供的Ҏ?
1. 用来U录调试信息的调试?
2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动.
3. 工作目录的名?/P>
ContextInterceptor&RequestInterceptor
q些侦听?interceptors)侦听具体发生在ContextManager中的事g.例如,ContextInterceptor侦听Tomcat的启动及l止事g,RequestInterceptor监视在它服务q程中用戯求需要通过的不同阶D?Tomcat的管理员不必知道太多关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实C个”全局”型的操?例如安全性及每个h日志)
Connector
Connector表示一个到用户的联?不管是通过web服务器或直接到用h览器(在一个独立配|中).Connector负责理Tomcat的工作线E和 ??q接C同用L端口?h/响应.Connector的配|包含如下信?
1.句柄c?/P>
2.句柄监听的TCP/IP端口
3.句柄服务器端口的TCP/IP的backlog.
E后我们在此文档中描述如何配置Connector.
Context
每个Context提供一个指向你攄你Web目的Tomcat的下属目录。每个Context包含如下配置Q?/P>
1. Context攄的\?可以是与ContextManagerȝ录相关的路径.
2.U录调试信息的调试?/P>
3.可重载的标志.开发Servlet?重蝲更改后的Servlet,q是一个非怾利的Ҏ?你可以调试或用Tomcat试C码而不用停止或重新启动Tomcat.要打开重蝲,把reloadable设ؓ真即?q虽p旉但可所发生的变?更重要的?鉴于,在一个装载类对象装入一个新的servlet?c装载触发器可能会掷Z些错?为避免这些问?你可以设|可重蝲为假,q将停止重蝲功能.
从另一个目录中启动Tomcat
作ؓ~省值将使用TOMCAT_HOME/conf/server.xml作ؓ配置文g.~省配置用TOMCT_HOME作ؓ关系环境的基.
使用 ?f/你的/目录/server.xml”选项你可改变q种情况,使用另一个服务器配置文g和设|关pȝ境管理器的目录属性你需要在ȝ录内讄以下几个文g:
Ø 一?webapps/目录(如果你已生成) ?所有war文g奖杯界压倒此目录而且所有子目录作为关pȝ境添?
Ø conf/目录 - 你可保存一个特D的web.xml文g和其他配|文?/P>
Ø logs/ - 所有日志文件将代替TOMCAT_HOME/logs/U录到此目录?/P>
Ø work/ - 关系环境的工作目?/P>
如server.xml中的ContextManager.home属性有兌,关联到到当前工作目?
web。xml
关于web。xml和web目l构Q包括目录服务及配置Q的详细描述可在Servlet API Spec的第9Q?0Q?4章中扑ֈ?/P>
然而有一个与Tomcat有关的小“特性“与web.xml有关。Tomcat可以让用户通过缺省的web.xml攑օconf目录中来定义所有关pȝ境的web.xml的缺省?建立一个新的关pȝ境时,Tomcat使用~省的web.xml文g作ؓ基本讄和应用项目特定的web.xml(攑֜应用目的WEB-INF/web.xml文g)来覆盖这些缺省?
讄Tomcat与Apache Web 服务?/P>
服务?/P>
到现在ؓ?我们未讨Z为服务器扩展的Tomcat,只讨Z作ؓ独立q行的服务器.但有一些问题需要说?
1. 当处理静态页面时,Tomcat不如Apacheq?
2. Tomcat不象Apache一样可配置.
3. Tomcat不象Apache一样强?
4. 有很多网站已在某一特定web server上投入了很长旉,例如,使用CGI脚本/Server API模组/perl/php…我们不能假设这些遗留下来的东西都会被丢?
Z以上原因,一个现实的|站使用一个Web服务?如Apache,为网站的静态页面请求提供服?q用Tomcat作ؓ一个Servlet/JSP插g.
我们不准备深入的讨论每个不同的配|?我们?
1. 늛Web服务器的基本行ؓ
2. 解释需要何U配|?/P>
3. 在Apache上的实例
Web 服务器操?/P>
单说来,web服务器L{待来自客户端的HTTPh。当h到达Ӟ服务器会提供一切必要的内容来满xh。加入一个Servlet容器某种E度上会改变此行为。但服务器仍需处理如下因素Q?/P>
载入servlet容器接口库ƈ初始化(处理h之前Q?/P>
当收C个请求时Q检查是否属于某ServletQ如是,则接口库接收此请求ƈ处理?/P>
另一斚wQ接口库需要知道他服务某U请求,通常是基于请求的URL的某U模式和此h导向何处?/P>
当用h要设|用虚拟主机的配置Ӟ事情会变得更加复杂,或者想多个开发者在一个服务器上进行开发但使用不同的Servlet容器的JVMs。以下我们将讨论q两个问题?/P>
必需q行的配|?/P>
应该考虑的是最明显的配|是servlet URLh对servlet容器中的servleth表示的责仅R很明显Q你必须知道传递什么到Servlet容器。我们仍需提供附加的配|项目到web-server或servlet-container的结合体?
l 考虑到Tomcatq程是否可取得,我们仍需提供配置和Tomcat正在监听的TCP/IP L?端口受?/P>
l 需要告知web服务器接口库的位|(因此我们可以在v始时装入Q?/P>
l 需要设|接口内部信息如日志记录在何处和如何纪录,{等?/P>
所有此cM息必d现在web服务器配|里或被接口使用的私有配|文件中。下面将讲述如何在Apache中如何实现这些配|?/P>
Apache上的实现
q一部分演示如何配置Apache与Tomcat一起工作;q试图解释深入到可能会用到的配置规范。在jserv 安装上可找到其他信息?