一.tomcat是什么?
1.起源:Tomcat是Apache的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
2.特点:免费开放,适用于中小企业,与IIS等web服务器一样具有html处理功能,tomcat相当于一个servlet和jsp的容器,但处理html的能力不如Apache服务器。
3.注意:除了tomcat外,web服务器还有jetty,weblogic,websphere,undertow等,有时我们会将tomcat叫web服务器,实际更准确的叫法是应用服务器,web服务器主要是指专门处理html,css,图片等静态资源的服务器,必要apacche服务器。
二.tomcat目录的作用
bin目录主要要来存放tomcat命令的目录,里面主要有两种类型的文件,其中.bat的文件是在windows平台的命令,.sh的文件是在linux平台的文件。
1.setclasspath用于设置java环境,JAVA_HOME,JRE_HOME等
2.catalina也用于配置环境,CATALINA_HOME,我们可以设置最大最小堆空间大小。
例如:
JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=512m"
3.startup启动,tomcat启动,读取catalina脚本配置启动环境,catalina又会调用setclasspath脚本,用来设置jdk需要的环境变量,如果没有定义JAVA_HOME环境变量,则报错退出。
4.shutdomn用于停止tomcat服务。
conf目录主要用来存放tomcat的配置文件
1.server.xml用于配置端口号,虚拟主机,默认加载项目,请求编码等等,是tomcat中最常使用的配置文件
2.web.xml为所有的部署在该tomcat下的web应用通用的配置,与每一个web应用的web.xml配合使用。
3.context.xml所有在tomcat中发布的应用都会是用的公用配置,例如:发布的web应用的描述文件的位置及名称,及session持久性配置等。
lib:所有部署在tomcat中web应用公用的jar包
logs用于保存tomcat运行时的日志数据
1.catalina.{yyyy-mm-dd}.log tamcat自己的运行日志
2.localhost.{yyyy-mm-dd}.log 应用初始化日志,包含tamcat的启动和暂停时的运行日志,没有catalina.{{yyyy-mm-dd}.log记录的全,只包含一部分
3.localhost_access_log{yyyy-mm-dd}.txt tomcat访客日志,包括请求时间,资源,返回的状态码访客
4.manager.{yyyy-mm-dd}.log 是tomcat管理控制台应用的专有日志
5.在Linux系统中,tomcat将日志记入catalina.out文件,可以使用tail-f catalina.out进行跟踪
temp
存放tomcat在运行期间产生的临时文件,可以清空该目录的文件,但不能删除该目录,可能会引发不可预知的错误
webapps
tamcat默认的项目部署目录,在默认情况下,如果要发布应用可以直接将应用的war包放入该目录即可完成发布,也可以直接发布未压缩的目录,但要求该目录需要符合web应用规范。
1.doc tomcat 文档
2.examples tomcat自带的web应用事例
3.host-manager tomcat主机管理应用程序
4.manager tomcat的管理应用程序
5.ROOT 如果项目部署为ROOT,则在地址栏直接输入:http://ip:port/就可以访问,即不用输入应用名
work
用来部署应用中由jsp文件生成的java文件和编辑之后的Class文件,可以删除,删除后可以迫使tomcat重新生成jsp对用的java和Class文件
session持久化
session持久化主要是在context.xml文件中进行配置的,context.xml文件可以出现两个位置上,其作用域不同,配置方式一致;
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!--
maxIdleSwap: 自上次访问session以来,session数据应被保存到stroe中的时间间隔,该值应该大于等于maxIdleBackup参数的值
maxIdleBackup: 自上次访问会话后,会话有资格保留到会话存储区之前的时间间隔(秒),-1为默认值,表示禁用
saveOnRestart: 重启是是否持久化session
maxActiveSession:session总数大于该参数设置的值时,会将超出部分空闲的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>
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);
}
}
}