Tomcat

tomcat Server.xml及其启动顺序

August 16, 2017
Java, Web, Tomcat

欲仙又欲死。阿里巴巴真是一朵大奇葩。 一个写死的回调地址就能浪费我两天的时间去搞,还没有搞定。此坑绵绵无绝期。 一个sso的回调地址,写死的,要强行将应用部署到ROOT里中去。 在tomcat中有一个配置文件经常被用到,conf/server.xml。这个配置文件描述了如何启动tomcat server。 tomcat是servlet的容器,也就是能够运行servlet的一个程序。作为一个http服务的程序,可以监听端口,处理请求等。 配置文件结构 # <Server> <Listener /> <GlobaNamingResources> </GlobaNamingResources <Service> <Connector /> <Engine> <Logger /> <Realm /> <host> <Logger /> <Context /> </host> </Engine> </Service> </Server> 对我们来说,内层的Service才是有操作意义的部分。主要的部分简介如下: 元素 说明 service 提供服务的主体,默认的名字是Catalina Connector 客户端与服务端之间的连接,包括端口,协议版本,超时时间,等。 Engine 请求的处理机,接收和处理Connector的请求, 与host的联系比较大 Context 表示一个应用 host 表示一个虚拟主机 Tomcat Server处理一个http请求的过程 # 假设来自客户的请求为:http://localhost:8080/wsota/wsota_index.jsp 在这里有一幅图我觉得非常清晰的说明了这个过程,但是其本身跟这个毫无关系。 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为"“的Context去处理) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet Context匹配到URL PATTERN为.jsp的servlet,对应于JspServlet类 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法 Context把执行完了之后的HttpServletResponse对象返回给Host Host把HttpServletResponse对象返回给Engine Engine把HttpServletResponse对象返回给Connector Connector把HttpServletResponse对象返回给客户browser Context # 来看最重要的Context, 一般我们为每个应用做的定制化的东西都是依靠这个来做的,就比如我们要把war包部署成一个默认的应用。 ...

web.xml

August 1, 2017
Java, Web, Tomcat

其作用就是配置一个web程序的基本功能。容器在启动一个web项目的时候先读取这个配置文件,在配置文件读取无误后开始按照配置启动剩余的服务。 加载顺序 # <context-param> -> <listener> -> <filter> -> <servlet> 容器会创建一个ServletContext,整个项目都会共用这个上下文。而<context-param>的内容以键值对的形式存在这个上下文中。 然后对读取<listener>,并实例化listener类,并初始化。 listener类中会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,系统调用Listener的该方法,在这个方法中获得: ServletContext application = ServletContextEvent.getServletContext(); context-param的值 = application.getInitParameter("context-param的键"); 得到这个context-param的值之后,你就可以做一些操作了。 举例:你可能想在项目启动之前就打开数据库,那么这里就可以在<context-param>中设置数据库的连接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调用contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。 所以归根结底,这个<context-param>就是用来存一些配置数据的地方。 比如:定义一个管理员email地址用来从程序发送错误,或者与你整个应用程序有关的其他设置。使用自己定义的设置文件需要额外的代码和管理;直接在你的程序中使用硬编码(Hard-coding)参数值会给你之后修改程序带来麻烦,更困难的是,要根据不同的部署使用不同的设置;通过这种办法,可以让其他开发人员更容易找到相关的参数,因为它是一个用于设置这种参数的标准位置。 web-app # 根元素,不用多说 display-name # 应用的名称,这个在tomcat的维护信息中会出现。 session # <session-config> <session-timeout>120</session-timeout> </session-config> listener # <!--****************************监听器配置*********************************--> <!-- Spring的log4j监听器 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 监听器用来监听各种事件,比如:application和session事件,所有的监听器按照相同的方式定义,功能取决去它们各自实现的接口,常用的Web事件接口有如下几个: ServletContextListener:用于监听Web应用的启动和关闭; ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变; ServletRequestListener:用于监听用户的请求; ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变; HttpSessionListener:用于监听用户session的开始和结束; HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。 listener类是实现了以下两个接口中任何一个接口的简单java类:javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener,如果想让你的类监听应用的启动和停止事件,你就得实现ServletContextListener接口;想让你的类去监听Session的创建和失效事件,那你就得实现HttpSessionListener接口。 有两种为应用配置listener的方式: 使用@WebListener修饰Listener实现类即可。 在web.xml文档中使用<listener>进行配置。 在下一节配置spring的加载类的时候会给出例子。 spring相关配置 # 配置spring,必须需要<listener>,<context-param>如果有就去加载配置的路径,没有就默认是/WEB-INF/applicationContext.xml。 <!-- spring config --> <!-- if this node is not exist, --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-configuration/*. ...

tomcat

July 12, 2017
Web, Java, Tomcat

日志 # Tomcat的日志系统还算很完善的。来看一下,当你的应用出现问题的时候要去哪里找原因吧。 apache-tomcat/logs/ |_ catalina.2017-07-12.log |_ catalina.out |_ host-manager.2017-07-12.log |_ localhost.2017-07-12.log |_ localhost_access_log.2017-07-12.txt |_ manager.2017-07-10.log |_ 对应的App应用的log文件夹,取决与你项目用的日志工具。 catalina.out 这里的数据都是代码输出到标准输出流的重定向,所以你的SOUT都在这里。 localhost.DATE.log 是你的应用抛出的错误,如页面运行错误,servlet错误等,常用查错工具。 其实目前我也就用过以上两种日志,可能用法还是不太对,入门的时候查日志感觉日志乱的要死。其实这个也不影响使用就是很影响心情,找错误一般可以直接搜索字符串定位就好了。但是我自己感觉还是要在项目开发之前就做好日志的规划工作,什么时候要打log什么时候不打,log的格式是怎样的。心情必须照顾! tomcat 安装到发布应用 # 这一部分非常简单。 安装 # 下载tomcat-core代码包,并解压。 到其bin/目录下,linux执行./startup.sh, windows执行startup.bat脚本。 前提是需要配置JDK到环境变量。 打开http://IP:8080 查看效果。 发布应用 # 将你的应用编译打包成一个war包,然后copy到其webapps文件夹下,通过http://IP:8080/NameOfWar访问。 如何开发Java Web?你需要了解:servlet、SpringMVC、maven、javaBean等。 tomcat 源码梳理 # 打算看一下源码是怎么玩的,也有可能看不下去,坑先挖上…