Tomcat&Servlet
一、tomcat
1.1、资源分类

1.2、web服务器
服务器:安装了服务器软件的计算机
服务器软件:接收用户的请求,处理请求,做出响应
web服务器软件:接收用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。
1.2.1、下载:http://tomcat.apache.org/
1.2.2、安装:解压压缩包即可。注意:安装目录建议不要有中文和空格
1.2.3、卸载:删除目录即可
1.2.4、tomcat目录结构
Wtpwebapps 使用 eclipser 配置 Tomcat 产生的文件夹

1.2.5、启动
  bin/startup.bat ,双击运行该文件即可
访问:
  浏览器输入:http://localhost:8080 回车访问本地。
1.2.6、可能遇到的问题:
1、黑窗口一闪而过:
  原因: 没有正确配置JAVA_HOME环境变量
  解决方案:正确配置JAVA_HOME环境变量
2、启动报错:
  1)暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
  netstat -ano
  2)温柔:修改自身的端口号
  conf/server.xml
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" URIEncoding=“UTF8” />在tomcat8.0之前,需要指定 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。 -->好处:在访问时,就不用输入端口号|
1.2.7、关闭:
1、正常关闭:
  bin/shutdown.bat
  ctrl+c
2、强制关闭:
  点击启动窗口的
1.3、Tomcat配置CATALINA_HOME  -->也可不配置


如果tomcat端口被占用,解决办法:
1、修改F:\TomCat\apache-tomcat-9.0.12\conf\server.xml
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
2、关闭端口号对应的进程方法:
cmd-->netstat -ano -->找到pid-->任务管理器-->显示pid-->关闭进程 netstat -an|findStr ”8080“
二、配置
部署项目方式
2.1、方式一
1、开放目录部署方式(直接将项目放到webapps目录下即可。)
  把应用直接复制到F:\TomCat\apache-tomcat-9.0.12\webapps下。
2、简化部署:把应用打成war包。
   war包会自动解压缩    -->主要掌握。因为去配置server.xml文件存在危险性。
附注:
  到WebConetnt的路径下,使用打包命令:jar -cvf(create visiable file) day07_03_myApp(打成的war包的名称,war在webapps的文件夹下回自动解压).war .(.表示所有文件)  
然后就可通过  http://localhost:8080/day07_03_ day07_03_myApp/1.html来访问了  
打war包命令:jar -cvf MyApp.war .
把war包直接复制到F:\TomCat\apache-tomcat-9.0.12\webapps下,应用自动解压
2.1、方式二
配置conf/server.xml文件
在<Host>标签体中配置
<Context docBase="D:\hello" path="/hehe" />
docBase:项目存放的路径
path:虚拟目录   网络访问的虚拟目录名  
虚拟目录:为了放在其他的盘符下也可以使用。(不建议使用,因为需要重启服务器)==>以后不会使用这种方式部署项目。
真实目录:D:\day07_04_myApp1
虚拟目录:/day07_04_myApp1
<Context docBase="D:\day07_04_myApp1" path="/day07_04_myApp1" />
注:这种方式配置的是tomcat的核心配置文件server.xml。会影响到其他的项目的配置。==>需要重启服务器。
2.2.1、配置TomCat中的Server.xml配置文件
2.2.2、添加Contextè路径和真实文件之间的映射。
2.3、方式三
在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
<Context docBase="D:\hello" />
 虚拟目录:xml文件的名称。==》一个web项目一个xml文件。
==》最推荐的一种方式。好处可以进行热部署。(将xml文件改名,不必重启服务器就可以将项目取消)
<?xml version="1.0" encoding="UTF-8"?> <Context docBase="D:\day07_04_myApp1"/>

访问:http://localhost:8080/myAPP
A.文件名就是代表应用的虚拟路径名
  扫描的顺序:server.xml配置文件(config/Catalina/localhost/xx.xml)webapps
附注:
热部署:可以动态修改配置文件。
IDEA自动生成的war包位置。
tomcat是java编写的需要先找到java_home。(在catalina.ba中有使用到java_home)
静态项目和动态项目
目录结构
java动态项目的目录结构:
-- 项目的根目录
  -- WEB-INF目录:
  -- web.xml:web项目的核心配置文件
  -- classes目录:放置字节码文件的目录
  -- lib目录:放置依赖的jar包

三、配置默认端口、默认应用、默认主页
默认端口
<Connector port="80" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
默认应用:把配置的虚拟目录的配置文件名改为ROOT.xml即可。
在webappps更改文件夹名为Root无效。
默认主页:修改应用的xml文件
 
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>day07_03_myApp1</display-name> <welcome-file-list> <!-- welcome-file 1.html 默认主页 找不到的话依次往下找 --> <welcome-file>1.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
四、Servlet
Servlet:  server applet
  运行在服务器端的小程序
  Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
  自定义一个类,实现Servlet接口,复写方法。
4.2、入门
  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口
     public class ServletDemo1 implements Servlet
  3. 实现接口中的抽象方法
  4. 配置Servlet
 
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>demo02</servlet-name> <servlet-class>com.itheima.web.servlet.ServletDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo02</servlet-name> <url-pattern>/demo02</url-pattern> </servlet-mapping> </web-app>
  servelt本质上就是一个接口。相当于是tomcat来执行它的。tomcat接收到请求在进行执行。
  定义了java类被浏览器访问到(tomcat)的规则。
  需要来实现servlet。写自己的类。相当于多态。
  配置servlet的目的在于让tomcat访问该类。
4.3、执行原理
1、当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径 2、查找web.xml文件,是否有对应的<url-pattern>标签体内容。 3、如果有,则在找到对应的<servlet-class>全类名 4、tomcat会将字节码文件加载进内存,并且创建其对象 5、调用其方法

4.4、servlet的生命周期
Servlet中的生命周期方法:
被创建:执行init方法,只执行一次
Servlet什么时候被创建?
  默认情况下,第一次被访问时,Servlet被创建
  可以配置执行Servlet的创建时机。
  在<servlet>标签下配置
    第一次被访问时,创建<load-on-startup>的值为负数
    在服务器启动时,创建<load-on-startup>的值为0或正整数
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次。
被销毁:执行destroy方法,只执行一次
  Servlet被销毁时执行。服务器关闭时,Servlet被销毁
  只有服务器正常关闭时,才会执行destroy方法。
  destroy方法在Servlet被销毁之前执行,一般用于释放资源
  非正常:黑窗口点x 正常■
五、Servlet3.0
javaee 6 后才支持--servlet3.0
好处:
  支持注解配置。可以不需要web.xml了。
步骤:
  1、创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  2、定义一个类,实现Servlet接口
  3、复写方法
  4、在类上使用@WebServlet注解,进行配置
@WebServlet("资源路径")
 
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
    String name() default "";
    String[] value() default {};
    String[] urlPatterns() default {};
    int loadOnStartup() default -1;
    WebInitParam[] initParams() default {};
    boolean asyncSupported() default false;
    String smallIcon() default "";
    String largeIcon() default "";
    String description() default "";
    String displayName() default "";
}
注意:
  只有一个属性,属性名可以不写。
  两者冲突。web.xml和注解方式不能同时使用。
  "资源路径"--值唯一。
Servlet规范的核心类:
六、IDEA与Tomcat的相关配置
6.1、IDEA会为每一个tomcat部署的项目单独建立一份配置文件
  查看控制台的log:Using CATALINA_BASE:
  C:\Users\gravityZero\.IntelliJIdea2017.3\system\tomcat\_Framework
6.2、工作空间项目和tomcat部署的web项目
  tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
  WEB-INF目录下的资源不能被浏览器直接访问。
6.3、断点调试
tomcat的work目录的作用:

work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录,这也正是为什么它叫work目录而不是cache目录的原因。
jsp,tomcat的工作原理:
  当浏览器访问某个jsp页面时,tomcat会在work目录里把这个jsp页面转换成.java文件,比如将index.jsp转换为index_jsp.java文件,而后编译为index_jsp.class文件,最后tomcat容器通过ClassLoader类把这个index_jsp.class类装载入内存,进行响应客户端的工作。
tomcat会定时扫描容器内的jsp文件,读取每个文件的属性,当发现某个jsp文件发生改变时(文件的最后修改时间与上次稍描时不相同时),tomcat会重新转换、编译这个jsp文件。但是tomcat的扫描是定时的不是实时的,这也正是为什么jsp文件修改后需要几分钟的时间来等修改过的jsp生效。当然为了即刻生效,很多老前辈都会建议在修改jsp页面后立即清除work目录里的文件。(IDEA中访问了修改后的jsp就可生效。)
tomcat容器中,对转换后的java文件(比如:index_jsp.java)的编译最大只支持64k,所以在其他容器中的jsp移植到tomcat容器中时会遇到大jsp文件会发生无法编译的情况,所以建议把jsp中的业务逻辑写入单独的类,在jsp中通过调用这个类的静态方法来执行,并将jsp页面中的js提取出来放到单独的js文件内。
config目录下的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <Context path="/day13_tomcat" docBase="F:\CODE_SPACE\SouceCode\ITHEIMA\Framework\out\artifacts\day13_tomcat_war_exploded" />
指向的是设置的项目输出路径
包含如下

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号