菜鸟笔记
提升您的技术认知

Tomcat服务器

静态web与动态web

  • 静态web:HTML,CSS(提供给所有人看的数据几乎不会变)
  • 动态web:提供给所有人看的数据会发生变化,每个人在不同时间,不同地点看到的信息各不相同。

web应用程序及服务器

javaweb:动态web资源开发的技术统称为javaweb

web应用程序:可以提供浏览器访问的程序

注意:

  • 我们能访问到的任何一个页面或资源,都存在这个世界的某一个角落的计算机上,我们通过url进行访问
  • 一个web应用程序由多部分组成(静态web、动态web)
  • web应用程序编写完毕后,若想提供给外界访问,则需要一个服务器进行统一的管理

WEB服务器:服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。 

访问web应用程序内在流程:

客户端发起请求准备访问服务器的某个页面,则web服务器就会去找他有没有这个页面,若找到了则将此页面返回给客户端(通过web服务)

Tomcat服务器

含义:比较流行的web应用服务器(开源,免费,轻量级)

Tomcat的目录结构

  • bin:存放tomcat中可执行文件的目录
  • conf:存放tomcat中配置文件的目录
  • lib:存放tomcat服务器运行时依赖的jar包
  • logs:存放tomcat服务器运行时产生日志文件的目录(记录每次启动关闭的一些信息)
  • temp:存放tomcat服务器产生的临时文件目录(tomcat会自己清理该目录,可以忽略)
  • work:存放tomcat服务器产生的工作文件
  • webapps:tomcat服务器中存放网站的目录

Tomcat服务器的使用

  1. 准备:官网上下载并解压(同时必须配置好JAVA_HOME的环境变量)
  2. 开启服务器:startup.bat
  3. 关闭服务器:shutdown.bat
  4. 测试:先开启tomcat服务器,然后你访问localhost:8080后就可以看到tomcat的主页面 

注意:

  1. 此页面(localhost:8080)对应到了你tomcat的webapps目录里面,如果里面有项目,则可以按照特定的路径直接访问此项目。
  2. 项目必须放在特定的项目目录里才能被访问,此目录被叫做项目名称)

举例:

比如我的webapps里面有browser项目,browser里面有index.html页面和app.html页面

直接访问browser里面的默认index.html页面:​​​​​​http://localhost:8080/browser/

访问browser里面的特定app.html页面:​​​​​​http://localhost:8080/browser/app.html

tomcat端口号以及主机名的修改

注意:在conf文件中server.xml为tomcat服务器的核心配置文件,在这里面可以改访问tomcat服务器的端口名以及主机的名称(主机名通过hosts文件来实现)。

监听关闭端口

<Server port="8005" shutdown="SHUTDOWN">

注意:

  • 当执行shutdown.sh关闭tomcat就是链接8005端口执行SHUTDOWN命令;由此,我们直接用telnet向8005端口执行SHUTDOWN来关闭tomcat,这也是比较正统的关闭方式,如果这个端口没被监听,那么sh脚本就是无效的。
  • 实际上这个端口是可以直接屏蔽不监听的。设置时候将其port值修改为-1就可以。

与其他http服务器集成的端口 

    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443" />

注意:负责和其他的HTTP服务器建立连接。再把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。

浏览器访问tomcat服务器用到的端口

注意:该端口负责建立HTTP连接,在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。 

将其改为8081后重启tomcat访问成功:http://localhost:8081

修改主机名称

hosts文件目录:C:\Windows\System32\drivers\etc

在主机hosts文件内增添映射主机地址:127.0.0.1  www.cjc.com

在tomcat的server.xml文件内配置主机名:www.cjc.com

重启tomcat访问成功:http://www.cjc.com:8080/

当我们输入url(里面有域名)回车后

计算机会检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射

  1. 有:直接返回对应的ip地址
  2. 没有:去DNS服务器找到域名所对应的ip地址

tomcat的context.xml配置文件

每个context标签代表了运行在虚拟主机上的单个Web应用
<Context>
监控资源文件,如果web.xml改变了,则自动重新加载应用
<WatchedResource>WEB-INF/web.xml</WatchedResource>
使用Resource时将数据库的驱动程序copy到tomcat的lib目录下,这一部是要害,假如没有copy 当运行程序的时候后报-找不到驱动-的异常
<Resource name="jdbc/数据库名"                表示指定的jndi名称(这个名称可以随意起)
auth="Container"                             描述当前资源交给容器管理
type="javax.sql.DataSource"                  表示类型为java扩展包下的数据源
maxActive="100"                              连接池支持的最大连接数
maxIdle="30"                                 连接池中最多可空闲maxIdle个连接
maxWait="10000"                              连接池中连接用完时,新的请求等待时间,单位毫秒
username="root"                              表示数据库用户名
password="root"                              表示数据库用户的密码
driverClassName="com.mysql.jdbc.Driver"      表示数据库的驱动类
url="jdbc:mysql://localhost:3306/数据库名"/>  表示数据库URL地址
</Context>

context.xml与server.xml文件的区别:

本身context作为server的host标签内的一个context标签,但是server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。

webapps目录 

webapps=>项目名目录=>WEB-INF(classes,lib,web.xml)

注意:

  1. 项目名目录必须存在
  2. 在项目名称目录里面具体的内容与WEB-INF平级。
  3. WEB-INF这个目录下的资源是受保护的,浏览器不能直接访问
  4. WEB-INF名字不可更改(更改后就可以访问里面内容),但是大小写可以更改(更改后不可以访问里面内容)

WEB-INF里面有3个文件及目录classes、lib、web.xml,其中作用如下:

  • classes:用于存放编译后的class文件(即java程序)
  • lib:用于存放web应用所依赖的jar包
  • web.xml:用于存放web应用相关的一些配置信息

Tomcat配置数据库连接池

前言

在tomcat容器中配置数据库连接池有2种形式,一种直接在server.xml或context.xml文件中进行连接池的配置(希望tomcat内多个项目共用一个数据库时使用该配置),另一种直接在具体的web项目(META-INF目录下的context.xml文件)中进行数据库连接池的配置(每个项目有单独的数据库时使用该配置)

tomcat数据库连接池的设计结构

理解:首先必须提供sql数据库,在连接池之中需要保存若干个连接对象(这些对象是可以动态扩充的,但并不是无限扩充),所有的连接池需要被javax.sql.DataSource接口实例所管理,他所描述的就是数据接口,而数据库连接池中的每一个连接都在数据源的管理之中,而DataSource被JNDI所管理

JNDI:即java的命名及目录接口,其就相当于一个map集合,你可以根据Map中的key的名称查询到对应的value(DataSource的接口实例)

tomcat数据库连接池实践 

具体原理

通过JNDI名称找到DataSource->通过DataSource找到Connection->Connection关闭表示归还连接

具体实践

创建一个web项目

创建servlet(DataAll)类用于数据库连接池测试

@WebServlet(name = "GetData")
public class DataAll extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        try {
            //使用jndi获取连接对象
            //1初始化上下文,context为数据库连接池的上下文对象(context.xml文件)
            Context context = new InitialContext();
            //获取与逻辑名相关联的数据源对象——传入参数:java:comp/env/+jndi名称
            DataSource lookup = (DataSource)context.lookup("java:comp/env/jdbc/db");
            //从连接池中获取连接
            connection=lookup.getConnection();
            String name="小昭";
            Integer age=45;
            String sql="select * from emp where name=? or age=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1, name);
            preparedStatement.setObject(2, age);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                //这里的i表示该行的列数
                for (int i=1;i<9;i++){
                    System.out.println(resultSet.getObject(i));;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                resultSet.close();
                preparedStatement.close();
                connection.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

配置web.xml映射规则

    <servlet>
        <servlet-name>DataAll</servlet-name>
        <servlet-class>cn.tedu.DataAll</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DataAll</servlet-name>
        <url-pattern>/getData</url-pattern>
    </servlet-mapping>

配置tomcat程序

我配的tomcat程序为localhost的8080端口,然后虚拟项目名用的是jndi

向tomcat的lib目录中放入mysql的驱动包(因为我用的是mysql数据库)

配置tomcat中conf目录下的context.xml文件(当然也可以选择配置单个项目的数据库连接池,那么就在项目的META-INF目录下添加context.xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<!--每个context标签代表了运行在虚拟主机上的单个Web应用-->
<Context>
	<!--监控资源文件,如果web.xml改变了,则自动重新加载应用-->
	<WatchedResource>WEB-INF/web.xml</WatchedResource>
	<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
	<!--使用Resource时将数据库的驱动程序copy到tomcat的lib目录下,这一部是要害,假如没有copy 当运行程序的时候后报-找不到驱动-的异常-->
	<Resource name="jdbc/db"
			  auth="Container"
			  type="javax.sql.DataSource"
			  maxActive="100"
			  maxIdle="30"                                
			  maxWait="10000"                              
			  username="root"                              
			  password="root"                              
			  driverClassName="com.mysql.jdbc.Driver"
		      url="jdbc:mysql://localhost:3306/db"/>  
</Context>

注意:Resource标签可以设置多个,每一个都相当于一个数据源,该数据源中存放着多个连接对象,而数据源被JNDI所管理,可以通过jndi名称找到对应的数据源

完成后访问:http://localhost:8080/jndi/getData

结果:数据库查询成功。