对于Weblogic可以自学了解
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由java语言编写,需要运行在jvm虚拟机中。之所以Java的应用领域非常广泛,就是因为有JVM虚拟机的存在,如何操作系统或内核上只要运行了JVM虚拟机,那么就能够运行Java程序。Tomcat中提供了servlet、jsp代码所需的类库
JVM由C语言开发实现,既为Java程序提供运行环境,也提供诸多类库
Java技术的方向:J2SE、J2EE(在J2SE基础上添加了企业级组件)
servlet在JVM之上实现了CGI协议,扩展了JDK,因此能够通过CGI协议响应用户的请求,servlet是服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的HTML页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机
jsp风格的代码使得Java程序可以嵌入到HTML页面中
http://www.cnblogs.com/zhouyuqin/p/5143121.html
Java的JDK有两种,一是openJDK,另外一个是oracleJDK
(一)RPM包安装Tomcat
Tomcat RPM安装
(先安装JDK + 再安装Tomcat)
1:升级系统自带的JDK(也可以使用oracle的JDK)
yum install -y java-
1.8.
0-openjdk-devel
2:由于Java开发的程序都需要运行在Java环境,因此一般只要是Java开发的程序,在安装JDK的同时,也需要将Java虚拟机导出到环境变量JAVA_HOME中,Java的虚拟机程序:/usr/bin/java
vi /etc/profile.d/java.sh 添加
export JAVA_HOME=
/usr/bin
. /etc/profile.d/java.sh
3:Tomcat相关程序介绍
tomcat.noarch: Servlet/JSP 引擎
tomcat-
lib.noarch:Tomcat运行所依赖的库
tomcat-admin-webapps.noarch:web 应用程序的管理工具,可以在web页面管理APP
tomcat-webapps.noarch:应用程序示例,可以通过
8080端口访问web页面
安装上述程序包
(对于RPM包安装的Tomcat而言,Tomcat的应用默认在/var/lib/tomcat/webapps目录下)
yum install -y tomcat.noarch tomcat-
lib.noarch tomcat-admin-webapps.noarch tomcat-webapps.noarch
启动Tomcat
(一般在生成环境中,使用普通用户启动Tomcat,因此需要修改Tomcat安装目录的属主和catalina.sh的属主为tomcat用户即可
)
systemctl start tomcat
.service
访问Tomcat的web页面
http:
//192.168.43.10:8080
(二)二级制包安装Tomcat
(不仅有二进制包还有Java的源码包)
安装Tomcat
需先准备Java环境,在配置文件中只能指定
export JAVA_HOME=
/usr
1:下载二级制包
wget http:
//mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz
2:解压,且创建连接文件
tar xf apache-tomcat-8.0.47.tar.gz -C /usr/
local
ln -s /usr/
local/apache-tomcat-8.0.47 /usr/
local/tomcat
3:编辑/etc/profile.
d/tomcat.
sh文件,导出CATALINA_BASE(Tomcat的工作目录)境变量
vi /etc/profile.
d/tomcat.
sh 添加:
CATALINA_BASE=/usr/
local/tomcat (CATALINA_BASE是tomcat引用实例的工作目录)
PATH=
$CATALINA_BASE/bin:
$PATH
export PATH CATALINA_BASE
4:启动Tomcat
catalina.
sh start
5:访问Tomcat的web页面
http:
//192.168.43.11:8080
6:简要介绍Tomcat安装目录
[root@7 ~]# ll /usr/
local/tomcat/
总用量 100
bin:二进制程序脚本目录
conf:配置文件目录
lib:类库目录
LICENSE
logs:日志目录
NOTICE
RELEASE-
NOTES
RUNNING.txt
temp:临时文件目录
webapps:应用程序目录
work:工作目录
7:配置文件介绍
[root@7 ~]# ll /usr/
local/tomcat/
conf/
总用量 216
Catalina
catalina.policy:Tomcat默认策略
catalina.properties:Java属性的配置文件
context.xml:为配置webapp提供默认配置
logging.properties:
server.xml:Tomcat的主配置文件
tomcat-users.xml:认证配置恩家
tomcat-users.xsd:
web.xml:每一个位于webapp都有一个web.xml配置文件,用于配置webapp
8:/usr/
local/tomcat/webapps目录介绍
Tomcat自带的应用程序都存放在/usr/
local/tomcat/webapps目录中,在Tomcat启动时,会自动读取webapps里面的应用程序
[root@7 ~]# ll /usr/
local/tomcat/webapps/
总用量 8
docs
examples
host-manager
manager
ROOT
9:jsp项目默认的文件组织结构(以ROOT应用程序为例)
[root@7 ~]# ll /usr/
local/tomcat/webapps/ROOT/
总用量 184
asf-logo-wide.svg
bg-button.png
bg-middle.png
bg-nav-item.png
bg-nav.png
bg-upper.png
favicon.ico:图标
index.jsp:JSP首页文件
RELEASE-
NOTES.txt
tomcat.css
tomcat.gif
tomcat.png
tomcat-power.gif
tomcat.svg
WEB-
INF:定义ROOT应用程序自身的配置,由web.xml定义
META-
INF:定义ROOT应用程序的自身配置,由context.xml定义
classes:类库文件
lib:jar包形式的类库文件
(三)使用tomcat 的管理功能 Manager APP Host Manager
- 当用户访问Tomcat的首页的时候,在页面上有一个
Manager App
的按钮,此功能需要用户在/usr/local/tomcat/conf/tomcat-users.xml目录创建一个用户,且给用户授权为manager-gui角色
授权manager-gui角色的操作如下
1:编辑/usr/
local/tomcat/
conf/tomcat-users.xml文件,在没有注释的内容中添加:
<role rolename=
"manager-gui" />
<user username=
"tomcat" password=
"tomcat" roles=
"manager-gui" />
2:停止Tomcat应用,在启动Tomcat应用
catalina.
sh stop
catalina.
sh start
3:再次访问http:
//192.168.43.11:8080,且点击Manager App按钮,输入tomcat用户名,输入tomcat密码,即可登入
- 当用户访问Tomcat的首页的时候,在页面上有一个
Host Manager
的按钮,此功能需要用户在/usr/local/tomcat/conf/tomcat-users.xml目录创建一个用户,且给用户授权为admin-gui角色
授权admin-gui角色的操作如下
1:编辑/usr/
local/tomcat/
conf/tomcat-users.xml文件,在没有注释的内容中添加:
<role rolename=
"admin-gui" />
<user username=
"tomcat" password=
"tomcat" roles=
"admin-gui" />
2:停止Tomcat应用,在启动Tomcat应用
catalina.
sh stop
catalina.
sh start
3:再次访问http:
//192.168.43.11:8080,且点击Host Manager按钮,输入tomcat用户名,输入tomcat密码,即可登入
(四)对于Tomcat的Server.xml配置文件简要说明
Server.xml配置文件格式
//顶层类元素,可以包括多个Service,每一个server指定一个tomcat的应用实例,监听于8005端口且运行shutdown指令
<Server>
//顶层类元素,可包含一个Engine,多个Connecter,connector用于接受用户的请求,将用户的请求交给Engine,才能被处理,运行Java代码
<Service>
//连接器类元素,代表通信接口,接受用户的请求,tomcat接收的请求有两类,一类是浏览器的直接请求(使用较少),另一类是Nginx或Httpd的反代请求(使用较多)
<Connector>
//容器类元素,为特定的Service组件处理客户请求,要包含多个Host提供站点,Engine是servlet引擎,通常需要通过defaultHost属性定义一个默认的虚拟主机
<Engine>
<Host>
//容器类元素,为特定的虚拟主机组件处理客户请求,可包含多个Context
//容器类元素,为特定的Web应用处理所有的客户请求,
<Context>
</Context>
</Host>
</Engine>
</Connector>
</Service>
</Server>
Server.xml 实例说明
<?xml version='1.0' encoding='utf-8'?>
# 这是server类, 指定一个tomcat的应用实例
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type=
"org.apache.catalina.UserDatabase"
description=
"User database that can be updated and saved"
factory=
"org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname=
"conf/tomcat-users.xml" />
</GlobalNamingResources>
请在原配置文件中直接修改,否则可能会报错
# 这是service类
<Service name="Catalina">
# 这是http连接器,响应用户请求
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout=
"20000"
redirectPort=
"8443" />
# 这是ajp连接器,响应用户请求
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
# 这是Engine,解析用户请求,请求指定默认的虚拟主机为localhost
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName=
"UserDatabase"/>
</Realm>
# 这是默认的虚拟主机localhost
<Host name="localhost" appBase="webapps"
unpackWARs=
"true"
autoDeploy=
"true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix=
"localhost_access_log."
suffix=
".txt"
pattern=
"%h %l %u %t "%
r" %
s %
b" />
</Host>
# 这里是第一个自定义的虚拟主机
<Host name="www.uplooking.com" appBase="/app/java"
unpackWARs=
"true"
autoDeploy=
"true">
</Host>
# 这里是第二个自定义的虚拟主机
<Host name="www.home.com" appBase="/app/home"
unpackWARs=
"true"
autoDeploy=
"true">
# 这里是用来定义虚拟主机的日志的,通常而言,日志格式需要格式化输出,使得tomcat的日志与httpd的日志一样,可以放在ELK中进行处理
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="uplooking_log" suffix=".log" pattern="%h %l %u %t %r %s %b %D %
{Cookie}
i %
{User-Agent}
i %
{a}
r/">
# 这里的Context组件中定义的path路径就相当于一个URI的映射,访问的目录为/data/app,这里需要注意的是在/data/app目录中,不能把资源放在ROOT目录下,只能放在/data/app目录下。也就是说浏览器访问的URL为:192.168.43.10:8080/app,访问文件系统上的资源是/data/app目录下的资源
<Context path="/
app"
docBase=
"/data/app"
reloadable=
"true">
# 这里指定了访问控制的规则,deny表示拒绝访问
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192\.168\.23\.2"/>
</Context>
</Host>
</Engine>
</Service>
</Server>
一般的虚拟主机实例(也可以认为是tomcat的应用实例)所映射的文件系统路径包括下面这些文件
classes、META-INF、WEB-INF、
lib、index.jsp
修改完配置文件,创建配置文件中华指定的路径,mkdir -pv /app/java,/app/home ,/data/app
先用catalina.sh configtest检查配置文件,再catalina.sh stop 再catalina.sh start重启服务加载配置文件
在/etc/hosts文件中将www.uplooking.com和www.home.com对应的主机加上
在/app/java ,/app/home下分别创建ROOT目录,然后创建/app/java/ROOT/index.jsp文件
在windows系统下的hosts文件将站点目录写入,在web服务器上访问创建的index.jsp文件即可
(五)LNMT(Nginx、Tomcat、MySQL)
常见的Java后台程序架构图
LNMT架构扩展
(Amoeba请自学,MySQL读写分离器,且下述架构由自己独立完成
)- 这里为什么在Tomcat之前需要架设Httpd呢?
由于Nginx作为前端反向代理服务器,能够接收大量的用户请求。因此,如果基于Nginx的upstream指令,将后端的静态web服务器定义为一个组,动态web服务器定义为一个组,那么tomcat在需要响应大量的动态请求。为了缓解tomcat保持长连接的压力,通常在tomcat的主机上也配置httpd服务,因此动态请求先有httpd服务器响应,在通过httpd的反代功能,将动态请求反向代理给tomcat。(温馨提示:如果是小架构,怎么方便怎么来)
对于Nginx实现动静分离简单介绍
# 在Nginx的配置文件中将静态与动态的文件进行分离
location
~* \.(html|js|css|jpg) {
proxy_pass http://staice-servers;
}
location
~* \.(jsp)$ {
proxy_pass http://dynamic-servers;
}
再说httpd作为二层反代将动态请求反向代理给tomcat
前言: 对于httpd反向将动态请求反向代理给tomcat的解决方案有三种
第一种:httpd调用proxy_module、proxy_http_module模块将动态请求反代给tomcat的
http连接器
第二种:httpd调用proxy_module,proxy_ajp_module模块将动态请求反代给tomcat的ajp连接器
第三种:httpd调用mod_jk模块将动态请求反代给tomcat的ajp连接器(很少用了)
①:在httpd的配置文件中将请求反向代理至tomcat主机
- 在/etc/httpd/conf.d/http_tomcat.conf配置文件中,添加如下配置
<VirtualHost *:80>
# 指定虚拟主机的主机名
ServerName node.uplooking.com
# 将正向代理关闭
ProxyRequests
OFF
# 指定在请求头加上via首部信息
ProxyVia
ON
# 指定httpd将客户端请求的虚拟主机名发送给后端的tomcat服务器,能够实现不同的请求发往tomcat中定义的不同的虚拟主机,例如:www.uplooking.com 与 www.home.com都解析到同一个IP地址,那么将会使得tomcat能够识别到底是哪一个host来响应
ProxyPreserveHost
ON
# 允许所有的反代
<Proxy *>
Require
all granted
</Proxy>
# 将请求反向代理给后端的服务器,一般httpd和tomcat在同一台物理服务器上
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 允许所有的客户端访问
<Location />
Require
all granted
</Location>
</VirtualHost>
②:在httpd的配置文件中将请求反向代理至tomcat主机
- 在/etc/httpd/conf.d/ajp_tomcat.conf配置文件中,添加如下配置
# 基于ajp的反代
<VirtualHost *:80>
ServerName node.uplooking.com
ProxyRequests
OFF
ProxyVia
ON
ProxyPreserveHost
ON
<Proxy *>
Require
all granted
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
<Location />
Require
all granted
</Location>
</VirtualHost>
(六)细节扩展
以上架构缩小版本
MySQL的主从请求自己实现,最好是做成MHA分布式架构
细节说明
在Tomcat容器的管理页面使用Java开发的war包,部署一个shop商城程序,再将show.sql导入到MySQL库中,首先测试在本地可以访问,再测试使用Nginx反代客户端请求到httpd服务器,httpd服务器再反代请求到Tomcat服务器,最后tomcat响应用户的请求。
浏览器请求的URL是:http://
192.168
.43
.9/shop
nginx:
192.168
.43
.9
httpd1+tomcat1:
192.168
.43
.10
httpd2+tomcat2:
192.168
.43
.11
Nginx配置文件示例
(没做过多的修改,只是测试使用)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/
*.conf;
events {
worker_connections
1024;
}
http {
log_format main
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile
on;
tcp_nopush
on;
tcp_nodelay
on;
keepalive_timeout
65;
types_hash_max_size
2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/
*.conf;
upstream webservers {
server node1.uplooking.com:
80;
server node2.uplooking.com:
80;
}
server {
listen
80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/
*.conf;
location / {
root /data/web;
index index.html index.htm;
}
location
~* \.(jsp|jpg|png|css|js|html)$ {
proxy_pass http://webservers;
}
location /shop {
proxy_pass http://webservers;
}
error_page
404 /
404.html;
location = /40x.html {
}
error_page
500
502
503
504 /50x.html;
location = /50x.html {
}
}
httpd1配置文件示例
<VirtualHost *:80>
# 指定虚拟主机的主机名
ServerName node1.uplooking.com
# 将正向代理关闭
ProxyRequests
OFF
# 指定在请求头加上via首部信息
ProxyVia
ON
# 指定httpd将客户端请求的虚拟主机名发送给后端的tomcat服务器,能够实现不同的请求发往tomcat中定义的不同的虚拟主机,例如:www.uplooking.com 与 www.home.com都解析到同一个IP地址,那么将会使得tomcat能够识别到底是哪一个host来响应
ProxyPreserveHost
ON
# 允许所有的反代
<Proxy *>
Require
all granted
</Proxy>
# 将请求反向代理给后端的服务器,一般httpd和tomcat在同一台物理服务器上
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 允许所有的客户端访问
<Location />
Require
all granted
</Location>
</VirtualHost>
httpd2配置文件示例
<VirtualHost *:80>
ServerName node2.uplooking.com
ProxyRequests
OFF
ProxyVia
ON
ProxyPreserveHost
ON
<Proxy *>
Require
all granted
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8089/
<Location />
Require
all granted
</Location>
</VirtualHost>
tomcat1部署说明
只是部署了一个测试页面
tomcat2部署说明
部署了一个
war格式的
java源码程序,需要连接数据库,数据库需要的
shop
.sql已经准备好,之后给数据库授权即可完成,用户为
:root, 密码为
:123456
(七)细节扩展
以脚本的形式启动Tomcat, 可以临时指定
创建一个/etc/init.d/tomcat脚本,脚本如下
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 64 36
# description: The Apache Tomcat servlet/JSP container.
# 指定JAVA_HOME环境变量
JAVA_HOME=/usr
# 指定CATALINA_HOME环境变量,如果指定CATALINA_BASE也可以
CATALINA_HOME=/usr/
local/tomcat
# 导出环境变量
export JAVA_HOME CATALINA_HOME
case
$1
in
start)
# 使用exec去执行脚本,目的在于将exec执行的脚本替代当前脚本所返回的结果,因此,就可以查看到是否catalina.sh运行成功
exec
$CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec
$CATALINA_HOME/bin/catalina.sh stop;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
sleep 2
exec
$CATALINA_HOME/bin/catalina.sh start ;;
configtest)
exec
$CATALINA_HOME/bin/catalina.sh configtest ;;
*)
exec
$CATALINA_HOME/bin/catalina.sh * ;;
esac
启动tomcat
service tomcat
start
(八)LNAMP集群
对于之前的缩小版架构模型而言,一个httpd服务器只将请求反代给一台Tomcat服务器,其实,在生成环境中可以反代给多态tomcat服务器。那么架构中的httpd + tomcat 就变成了这样的架构模型
(官方详细参考文档:http://httpd.apache.org/docs/2.4/howto/reverse_proxy.html)
这里为了方便httpd:192.168.43.9, tomcat1:192.168.43.10,tomcat2:192.168.43.11
这里还是分两种情况给大家演示
①:httpd服务器反代给Tomcat的
http协议连接器
②:httpd服务器反代给Tomcat的ajp协议连接器
①:创建一个httpd的虚拟主机配置文件,例如:/etc/httpd/conf.d/balance_proxy1.conf,配置内容如下(其实下面的配置内容还可以基于IP做会话绑定)
# 这个标签相当于Nginx的upstream模块
<proxy balancer://webservers>
# 指定后端调度的主机,loadfactor表示做基于权重的调度
BalancerMember http://192.168.43.10:8080 loadfactor=1
BalancerMember http://192.168.43.11:8080 loadfactor=2
# 指定轮询调度算法
ProxySet lbmethod=byrequests
</proxy>
# 使用虚拟主机做为反代
<VirtualHost *:80>
Servername www.uplooking.com
# 这个指令表示客户端响应报文中会有经过某个主机进行响应的首部,添加一个via首部
Proxyvia
on
# 首先关闭正向代理
ProxyRequests
OFF
# 这个指令表面,将用户请求的主机名传递到后端主机上去, 这里是www.uplooking.com
ProxyPreserveHost
on
# 授权代理的访问权限
<Proxy *>
Require
all granted
</Proxy>
# 将所有的请求访问后端的服务器
ProxyPass / balancer://webservers/
# 当后端主机使用rewrite响应代理服务器时,代理服务器会修改响应的IP为自己的IP,从而实现了无论是后端主机直接响应代理请求,还是后端主机通过重定向方式响应代理请求,都会使得客户端的请求能够被后端主机响应到
ProxyPassReverse / balancer://webservers/
# 授权用户的访问权限
<Location />
Require
all granted
</Location>
# 启用一个负载均衡的管理web界面接口
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require
all granted
</Location>
</VirtualHost>
浏览器访问:http://192.168.43.9/balancer-manager可以看到管理页面
②:创建一个httpd的虚拟主机配置文件,例如:/etc/httpd/conf.d/balance_proxy2.conf,配置内容如下
# 这个标签相当于Nginx的upstream模块
<proxy balancer://webservers>
# 指定后端调度的主机,loadfactor表示做基于权重的调度
BalancerMember ajp://192.168.43.10:8080 loadfactor=1
BalancerMember ajp://192.168.43.11:8080 loadfactor=2
# 指定轮询调度算法
ProxySet lbmethod=byrequests
</proxy>
# 使用虚拟主机做为反代
<VirtualHost *:80>
Servername www.home.com
# 这个指令表示客户端响应报文中会有经过某个主机进行响应的首部,添加一个via首部
Proxyvia
on
# 首先关闭正向代理
ProxyRequests
OFF
# 这个指令表面,将用户请求的主机名传递到后端主机上去, 这里是www.uplooking.com
ProxyPreserveHost
on
# 授权代理的访问权限
<Proxy *>
Require
all granted
</Proxy>
# 将所有的请求访问后端的服务器
ProxyPass / balancer://webservers/
# 当后端主机使用rewrite响应代理服务器时,代理服务器会修改响应的IP为自己的IP,从而实现了无论是后端主机直接响应代理请求,还是后端主机通过重定向方式响应代理请求,都会使得客户端的请求能够被后端主机响应到
ProxyPassReverse / balancer://webservers/
# 授权用户的访问权限
<Location />
Require
all granted
</Location>
# 启用一个负载均衡的管理web界面接口
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require
all granted
</Location>
</VirtualHost>
(九)Tomcat的Java程序作会话保持
官方参考文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
准备两个jsp的会话检测代码
<html>
<head>
<title>Tomcat1
</title>
</head>
<body>
<h1>
<font color="red">
Tomcat1.uplooking.com
</font>
</h1>
<table align="centre" border="1">
<tr>
<td>Session ID
</td>
<%
session.setAttribute("ez.com","ez.com");
%>
<td>
<%=
session.getId()
%></td>
</tr>
<tr>
<td>Created on
</td>
<td>
<%=
session.getCreationTime()
%></td>
</tr>
</table>
</body>
</html>
<html>
<head>
<title>Tomcat2
</title>
</head>
<body>
<h1>
<font color="blue">
Tomcat2.uplooking.com
</font>
</h1>
<table align="centre" border="1">
<tr>
<td>Session ID
</td>
<%
session.setAttribute("ez.com","ez.com");
%>
<td>
<%=
session.getId()
%></td>
</tr>
<tr>
<td>Created on
</td>
<td>
<%=
session.getCreationTime()
%></td>
</tr>
</table>
</body>
</html>