tomcat目录结构详细介绍 使用配置文件时session持久化

目录

1. tomcat是什么

2. 目录结构及作用

3. session持久化示例


1. tomcat是什么

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
除tomcat外,web应用服务器还有jetty,weblogic,websphere,undertow等。
注意:有时我们会将web叫做web服务器,实际上tomcat更准确的叫法是应用服务器。 web服务器主要是指专门来处理html,css,图片等静态资源的服务器,必要apache服务器。

2. 目录结构及作用

*bin
bin目录主要要来存放tomcat命令的目录,里面主要有两种类型的文件,一种是以.bat为扩展名的文件,一类是以.sh为扩展名的文件。其中.bat的文件是在windows平台的命令,.sh的文件是在linux平台的文件。
该目录中主要的文件有一下几个:
1) setclasspath 用于设置Java环境变量,如JAVA_HOME,JRE_HOME等 下方图片是文件打开类容  配置Java环境与你在配置计算机Java环境如果一致可不更改 最好也不要改


  • 2) catalina 该文件也是用来配置环境的,如CATALINA_HOME,及tomcat的安装路径,我们可以在此目录设置Java的启动参数,如最大最小堆空间大小:
    例如:

    JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=512m"
    JAVA_OPTS="-server -Xms1024m -Xmx8192m -XX:PermSize=256M -XX:MaxPermSize=1024m -Dfile.encoding=utf-8"
    复制代码

    讲在最后

    另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。

    收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。

    调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

    如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。

    一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

  • PS: IDEA对Java开发调优之后的配置:

  • -Xms2048m
    -Xmx3072m
    -XX:NewRatio=3
    -Xss16m
    -XX:+UseConcMarkSweepGC
    -XX:+CMSParallelRemarkEnabled
    -XX:ConcGCThreads=4
    -XX:ReservedCodeCacheSize=240m
    -XX:+AlwaysPreTouch
    -XX:+TieredCompilation
    -XX:+UseCompressedOops
    -XX:SoftRefLRUPolicyMSPerMB=50
    -Dsun.io.useCanonCaches=false
    -Djava.net.preferIPv4Stack=true
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:-OmitStackTraceInFastThrow
    -Dfile.encoding=utf-8
    复制代码
  • 下面图是catalina 手动配置运行时的内存参数  部署到服务器 越大可接受请求越多 越流畅

  • JVM参数说明
    -server一定要作为第一个参数,在多个CPU时性能佳
    -Xmsjava Heap初始大小。 默认是物理内存的1/64。
    -Xmxjava heap最大值。建议均设为物理内存的一半。不可超过物理内存。
    -Xmnyoung generation的heap大小,一般设置为Xmx的3、4分之一
    -XX:PermSize设定内存的永久保存区初始大小,缺省值为64M。
    -XX:MaxPermSize设定内存的永久保存区最大 大小,缺省值为64M。
    -XX:SurvivorRatio生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,您可以尝试定制生成池设置
    -XX:NewSize新生成的池的初始大小。 缺省值为2M。
    -XX:MaxNewSize新生成的池的最大大小。 缺省值为32M。如果 JVM 的堆大小大于 1GB,则应该使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者将堆的总大小的 50% 到 60% 分配给新生成的池。调大新对象区,减少Full GC次数。
    -XX:+AggressiveHeap会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。 参考
    -Xss每个线程的Stack大小,“-Xss 15120” 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
    -verbose:gc现实垃圾收集信息
    -Xloggc:gc.log指定垃圾收集日志文件
    -XX:userParNewGC可用来设置并行收集【多核CPU】
    -XX:+UseSerialGC在新生代和老年代使用串行收集器
    -XX:+UseParNewGC在新生代使用并行收集器,缩短minor收集的时间
    -XX:+UseParallelGC新生代使用并行回收收集器,更加关注吞吐量【多核CPU】
    -XX:+UseParallelOldGC老年代使用并行回收收集器
    -XX:ParallelGCThreads设置用于垃圾回收的线程数【多核CPU】
    -XX:+UseConcMarkSweepGC新生代使用并行收集器,老年代使用CMS+串行收集器
    -XX:ParallelCMSThreads设定CMS的线程数量
    -XX:+UseG1GC启用G1垃圾回收器

     3) startup 用来给启动tomcat,当双击startup后,tomcat启动,读取catalina脚本配置启动环境,catalina又会调用setclasspath脚本,用来设置jdk需要的环境变量,如果系统没有定义JAVA_HOME环境变量,则在会报错退出。


  • 4) shutdomn 用于停止tomcat服务 

  •  conf

  • 该目录主要用来存放tomcat的配置文件, 重要的配置文件如下:
    1)server.xml 用于配置端口号,虚拟主机,默认加载项目,请求编码等等,是tomcat中最常使用的配置文件 核心配置文件

  • 此个时可用cmd命令进行关闭服务器 区域网也可以

  •  //首先要开启telnet 客户端才能使用否则命令提示无效

  • 开启在  控制面板-卸载程序-启动或关闭windows功能-

  •  cmd命令窗口输入必须以管理员身份运行 网络命令  telnet 127.0.0.1 8005 端口号8005 确定命令

  •  然后输入SHUTDOWN 默认的shutdown参数输入输入时字母时看不见隐藏的 就可关闭本机开启的服务器

  • 2)web.xml 为所有的部署在该tomcat下的web应用通用的配置,与每个web应用的web.xml配合使用。例如:
    DefaultServlet,就算系统中没有配置任何的servlet,tomcat依然可以处理html,js,css等静态资源的请求,就是这个servelt起的作用;
    JspServlet,当请求jsp页面时,则会用到这个servlet。
    session过期时间配置session-timeout参数,也是在这个web.xml中配置的。

  • jsp页面处理 处理servlet  配置

  • 配置本项目的xml文件  设置session默认有效时间20分钟 

  • 3)catalina.policy 这个是tomcat安全相关的配置文件,主要使用安全策略文件可以在tomcat启动是附上 -security

  • 不设置安全设置的话System.exit(0);可直接关闭整个服务器

  • 4) catalina.properties 安全配置,类加载设置,不需扫描的类,字符缓存等配置
    5)context.xml 所有在tomcat中发布的应用都会使用的公用配置,例如:发布的web应用的描述文件的位置及名称,及session持久化配置等。session持久化示例请参考第三部分的示例
    6)tomcat-users.xml
    tomcat的角色(授权用户)配置文件,用于访问tomcat管理应用程序时的安全性设置,用server.xml中引用的默认的用户数据库域(UserDatabase Realm)使用它,所有的凭据都是默认被注释的
    7)tomcat-users.xsd 定义了 tomcat-users.xml 所使用到的标签,即tomcat-user.xml 的结构定义文件

  • lib
    所有的部署在tomcat中的web应用公用的jar包

  • logs
    用于保存tomcat运行时的日志数据,

    • catalina.{yyyy-MM-dd}.log tomcat自己的运行日志
    • localhost.{yyyy-MM-dd}.log 应用初始化日志,包含tomcat的启动和暂停时的运行日志,没有catalina.{yyyy-MM-dd}.log记录的全,只包含一部分
    • localhost_access_log.{yyyy-MM-dd}.txt tomcat访问日志,包括请求时间,资源,返回的状态码
    • manager.{yyyy-MM-dd}.log 是tomcat管理控制台应用的专有日志
    • 在Linux系统中,tomcat将日志记入catalina.out文件,可以使用 tail -f catalina.out 进行跟踪。
  • temp
    存放tomcat在运行期间产生的临时文件,可以清空该目录的文件,但不能删除该目录,可能会引发不可预知的错误。

  • webapps
    tomcat默认的项目部署目录,在默认情况下,如果要发布应用可以直接将应用的war包放入该目录即可完成发布,也可以直接发布未压缩的目录,但要求该目录需要符合web应用规范。

    • doc tomcat文档
    • examples tomcat自带的web应用示例
    • host-manager tomcat主机管理应用程序
    • manager tomcat的管理应用程序
    • ROOT 如果项目部署为ROOT,则在地址栏直接输入:http://ip:port/ 就可以访问,即不用输入应用名
  • work
    用来部署应用中由jsp文件生成的java文件和编译之后的class文件,可以删除,删除后可以迫使tomcat重新生成jsp对用的java和class文件。

  • 其他文件

    • LICENSE tomcat开源许可文件
    • NOTICE tomcat说明文件
    • RELEASE-NOTES 版本说明文件
    • README.md 即 README.txt tomcat帮助文件

3. session持久化示例

1)主要配置文件
session持久化主要是在context.xml文件中进行配置的,context.xml文件可以出现在两个位置上,其作用域不同,配置方式一致:

  • tomcat安装目录\conf 目录中的context.xml配置文件,该文件中的配置对部署在该tomcat中的所用应用都有效
  • 所开发的web应用的META-INFO目录中,创建一个context.xml配置文件,放在此处的配置,只对所属的web应用有效
  • Context.xml必须放在META-INF中
    ​​​​​
<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<!-- 
	maxIdleSwap:  自上次访问session以来,session数据应被保存到stroe中的时间间隔,该值应该大于等于maxIdleBackup参数的值
	maxIdleBackup: 自上次访问会话后,会话有资格保留到会话存储区之前的时间间隔(秒),-1为默认值,表示禁用
	saveOnRestart: 重启是是否持久化session
	maxActiveSession:session总数大于该参数设置的值时,会将超出部分空闲的session换出
     directory导出路径session持久化导出文件 
	 -->
	<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true" maxIdleBackup="1" maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" directory="d:/aaa" />
    </Manager>
    
</Context>

2) 示例:

  • 创建web工程
  • 加入tomcat依赖
  • 创建一个Customer实体bean,之后会将该bean放入session,注意:因为session需要进行持久化,所以该bean需要实现两个接口,分别为:HttpSessionActivationListener,Serializable
  • 创建一个servlet,在用户访问该servlet时,将Customer存入session,已测试持久化

具体代码:
Customer:

public class Customer implements HttpSessionActivationListener, Serializable {
	
	private String id;
	private String name;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	
	@Override
	public void sessionDidActivate(HttpSessionEvent event) {
		String name = ((Customer)event.getSession().getAttribute("cust")).getName();
		System.out.println("钝化之后 = " + name);
	}

	@Override
	public void sessionWillPassivate(HttpSessionEvent event) {
		String name = ((Customer)event.getSession().getAttribute("cust")).getName();
		System.out.println("钝化之前 = " + name);
	}

	@Override
	public String toString() {
		return "Custom [hljs-string" style="color: #d69d85; line-height: 160%; box-sizing: content-box;">", name=" + name + "]";
	}	
}

servlet:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		Object cust_obj = req.getSession().getAttribute("cust");		
		if(Objects.isNull(cust_obj)) {
			Customer cust = new Customer();
			cust.setId("cust_001");
			cust.setName("张三");
			System.out.println("将客户信息放入session");
			req.getSession().setAttribute("cust", cust);
		} else {
			System.out.println("客户信息已经放入session");
			String name = ((Customer)req.getSession().getAttribute("cust")).getName();
			System.out.println("从session获取客户信息,name = " + name);
		}
		
	}
}

将web应用部署,运行之后访问servlet,查看指定的目录中是否有session的持久化数据,重新启动web,看session是否会从持久化数据中恢复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值