2020-04-27:Tomcat&Servlet

168 阅读9分钟

今日内容

1. web相关概念回顾
2. web服务器软件:Tomcat
3. Serlet入门学习

一、web相关概念回复

1. 软件架构
    1. C/S架构: 客户端/服务器端
    2. B/S架构: 浏览器/服务器端
        浏览器通过域名找到服务器:请求
        资源返回给浏览器的过程:  响应
    
2. 资源分类
    1. 静态资源:所有用户访问后,得到的效果都是一样的,称为静态资源。
        * 如:html,css,javascript...
        静态资源被请求后,可以直接返回给浏览器。
        每个浏览器都内置的有静态资源的解析引擎。
    2. 动态资源:每个用户访问相同资源后得到的结果可能不一样。
        * 如: servlet,jsp,php,asp...
        动态资源被请求后,先转成静态资源,在返回给客户端浏览器。
    
3. 网络通信三要素
    浏览器要请求服务器首先要知道服务器的ip地址;
    然后还有知道请求服务器上的哪一个软件:端口;
    1. IP:电子(计算机)设备在网络中的唯一标识。通过ip地址找到网络中那台唯一的计算机。
    2. 端口:应用程序在计算机中的唯一表示。0~65536。
    3. 传输协议:规定了数据(传输)通信的规则。
        1. 基础协议
            1. tcp:安全协议,三次握手,速度慢。
            2. udp:不安全协议,速度快。

二、web服务器软件

* 服务器:就是安装了服务器软件的计算机(一般是性能很高的计算机)。
* 服务器软件:接收用户的请求,处理请求,做出响应。
* web服务器软件:接收用户的请求,处理请求,做出响应。
    * 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。
    * 也称为web容器:动态资源不能直接运行,依赖web服务器软件。即动态资源只能运行在服务
      器软件中。
* 常见的java相关的web服务器软件:
    1. webLogic: oracle公司,大型的javaEE服务器,支持所有的javaEE规范,收费的。
        * javaEE:java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范。
    2. webSphere:IBM公司,大型的javaEE服务器,支持所有的javaEE规范,收费的。
    3. JBOSS:JBOSS公司的,大型的javaEE服务器,支持所有的javaEE规范,收费的。
    4. Tomcat:Apache基金组织,中小型的javaEE服务器,仅仅支持少量的javaEE规范。
       如:servlet/jsp,开源的免费的。

三、学习Tomcat:web服务器软件。

1.下载:https://tomcat.apache.org/download-80.cgi
2.安装:解压压缩包即可。
    * 注意:安装目录不要有中文和空格。
    * 目录结构:

3.删除解压后的文件。
4.启动
    * bin目录下
        * windows: startup.bat
        * linux: startup.sh
    * 访问:
        * 自己访问自己tomcat这个web服务器软件上的web项目
            1 http://127.0.0.1:8080/ :127.0.0.1代表本机,8080是tomcat的默认端口号
            2 http://localhost:8080/ : localhost代替127.0.0.1
        * 其他人访问我的tomcat这个web服务器软件上的web项目
            1. 找到我的电脑的ip地址:cmd-->ipconfig-->ipv4:http://192.168.1.103/
            2. http://192.168.1.103:8080/
    * 可能遇到的问题:
        1. 黑窗口一闪而过
            * 原因:没有正确配置JAVA_HOME环境变量。
        2. 启动报错:8080端口号被占用了。
            1. 暴力:关闭占用端口号的进程。
               先找到占用8080端口号的进程的PID(进程状态字)
               在任务管理器中找到对应PID的进程,右键结束。
            2. 温柔:修改自身的端口号。
               修改conf文件夹目录下的server.xml文件。
               注意:
                  一般会将Tomcat的默认端口号修改为80,80端口号是http协议的默认端口号。
                  好处:在访问时,就不用再输入端口号。http://localhost/  
                      因为http协议默认的是80端口,不写端口默认的是80端口。而且市面上大部分
                      网站都是默认端口号80

5.关闭:
    1. 正常关闭
        * 双击bin目录下的shutdowm.bat批处理文件。
        * 或者在窗口中:ctrl+c
    2. 强制关闭
        * 点击启动窗口的 x 
6.配置
    * 部署项目的方式:
        1. 直接将项目放到webapps目录下即可
            * http://localhost:8080/hello/hello.html
                /hello:项目的访问路劲-->虚拟目录。
                /hello.html:资源名称
            * 简化部署:将项目打成一个war包,再将war包放置到webapps目录下。
                war包会自动的解压缩。
            * 缺点:虚拟路径和项目名称必须一致,而且必须在webapps目录下,不灵活。
        2. 配置conf/server.xml文件
            在<Host>标签体中配置这么一段内容。
            <Host>
                <Context docBase="D:\hello" path="/hehe123aaa" />
            </Host>
            * docBase:项目存放路劲
            * path:虚拟目录。
            * 此时在访问http://localhost:8080/hehe123aaa/hello.html
            * 缺点:不安全。
                因为server.xml是配置整个Tomcat web服务器软件的,所以如果为了某一个项目
                而去专门配置该文件,会导致整个Tomcat的配置改变,进而影响后续的项目部署。
                
        3. 在conf\Catalina\localhost创建一个任意名称的xml文件。在文件中编写:
            <Context docBase="D:\hello" />
            现在的虚拟目录就是:xml文件的名称。
            这是最推荐的一种方式。
    
    * 静态项目和动态项目
        * 目录结构
            * java动态项目的目录结构:
                -- 项目的根目录
                    -- WEB-INF目录:
                        -- web.xml:web项目的核心配置文件
                        -- classes目录:防止字节码文件的目录
                        -- lib目录:放置原来的jar包

    * 将tomcat集成到IDEA中,并且创建javaEE的项目,部署项目。

四、Servlet入门学习

* 概念:server + applet 运行在服务器端的小程序
    * Servlet就是一个接口,定义了Java类能被浏览器访问到(tomcat识别)的规则。
    * 将来我们自定义一个类,实现Servlet接口,复写其方法。

* 快速入门:
    1. 创建javaEE项目
    2. 定义一个类,实现Servlet接口。
        public class ServletDemo1 implements Servlet
    3. 实现接口中的抽象方法。
    4. 配置Servlet
        在web.xml文件中配置

        ```
        <!--配置Servlet-->
        <servlet>
            <servlet-name>demo1</servlet-name>
            <servlet-class>com.itcast.servlet.ServletDemo1</servlet-class>
        </servlet>

        <!--做映射-->
        <servlet-mapping>
            <servlet-name>demo1</servlet-name>
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>
        ```
    * 注:
        http://localhost:8080/day0427_Tomcat/demo1
        就可以通过上面的url将定义的类中的方法调用并将结果输出到控制台。
        day0427_Tomcatploded2:是虚拟路径
        demo1:是资源路劲

* Servlet的执行原理
    1. 当服务器接收到客户端浏览器的请求后,会解析请求URL路劲,获取访问的Servlet的资源
    路劲。
    2. 通过url:http://localhost:8080/day0427_Tomcat/demo1将类中的方法调用并将结果输出
    到控制台。
    localhost:8080: 找到服务器和Tomcat
    /day0427_Tomcat:通过虚拟路径找到了部署的项目
    /demo1:找到资源名称
        * 找web.xml,发现有一个<url-pattern>/demo1</url-pattern>发现资源路劲一致。
        * 再找到<servlet-name>demo1</servlet-name>发现资源名称一致
        * 最后通过<servlet-class>com.itcast.servlet.ServletDemo1</servlet-class>找到
          全类名。
            1. Tomcat将全类名对应的字节码文件加载进内存,创建它的对象。
                Class.forName();
            2. 创建对象
                cls.newInstance();
            3. 调用方法:因为实现Servlet接口,就一定有service方法。
                service();
                
        所以对象的创建和方法的调用都是由web服务器软件Tomcat执行的。即Servlet的运行要
        依赖于外部的容器Tomcat,依靠其创建对象调用方法。

4.2 Servlet中的生命周期

1. 被创建:执行init方法,只执行一次
    * Servlet什么时候被创建:两种情况
        * 默认情况下,第一次被访问时,Servlet被创建
        * 可以在web.xml中配置执行对应的类的Servlet的创建时机(改变默认情况:只有两种情况)
            1.第一次被访问时创建
            <load-on-startup></load-on-startup>的值为负数,默认值为-1
            2.在服务器启动时创建:对其他Servlet有依赖时
            <load-on-startup></load-on-startup>的值为正数或0

    * Servlet的init方法只执行一次,说明Servlet在内存中只存在一个对象,Servlet是单例的。
        * 多个用户同时访问时,可能存在线程安全问题。
        * 解决:尽量不要在Servlet中定义成员变量。如果不得不定义成员变量,也不要对其修
          改值。
        
2. 提供服务:执行service方法,执行多次
    * 每次访问Servlet时,Service方法都会被调用一次。
3. 被销毁:执行destroy方法,只执行一次。
    * Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
    * 只有服务器正常关闭时,才会执行destroy方法。
    * destroy方法在Servlet被销毁之前执行,用于释放资源。

4.3 Servlet3.0

* 好处:
    * 支持注解配置,可以不用web.xml了。

* 步骤:
    1. 创建JAVAEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@WebServlet注解,进行配置。
        /*urlPatterns = "/demo" : 是资源路径
          或者value = "/demo"
          或者"/demo" : 默认value
        */
        @WebServlet("/demo")

4.4 IDEA和tomcat的相关配置

1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件
    * 产看控制台的log:Using CATALINA_BASE:   "C:\Users\13099\.IntelliJIdea2019.3\system
      \tomcat\_day0419_XML"
      这是当前项目对于tomcat的配置所在目录。
2. 工作空间项目 和 Tomcat部署的web项目
    * Tomcat部署的web项目:docBase的值
        <Context path="/day0427" docBase="E:\Idea_Project\day0419_XML\out\artifacts\
        day0427_Tomcat_war_exploded2" />
    * Tomcat真正访问的是“Tomcat部署的web项目”,Tomcat部署的web项目对应着“工作空间项目 ”
      的web目录下的所有资源。
    * src下的java文件,将来在被编译后,会放到:
        E:\Idea_Project\day0419_XML\out\artifacts\day0427_Tomcat_war_exploded2\WEB-INF\
        classes
    * WEB-INF目录下的资源不能被浏览器直接访问。
        不要讲web资源直接放到WEB-INF目录下。
3. 断点调试: 使用“小虫子”debug启动。