- 第一章 Tomcat 基础
- 一、 web 概念
- 1. 软件架构
- 2.资源分类
- 二、常见的web服务器
- 1、 概念
- 2、常见服务器软件
- 3、Tomcat 历史
- 4、 Tomcat 安装
- 5、Tomcat 目录结构
- 6、Tomcat 启动停止
- 三、Tomcat 架构
- 1、HTTP工作原理
- 2、HTTP服务器请求处理
- 3、Servlet容器工作流程
- 4、Tomcat整体架构
- 四、Tomcat 服务器配置
- server.xml
- 五、手写Tomcat
- 六、创建Javaweb项目
- 1、创建项目
- 2、项目结构
- 3、配置Tomcat
- 第二章 Servlet入门
- 一、Servlet架构
- 二、Servlet任务
- 三、Servlet相关知识
- 1、Servlet加载时机
- 2、Servlet的生命周期
- 3、实现一个servlet
- 1、创建Servlet的三种方式
- 2、配置Servlet的两种方式
- 四、servlet的匹配规则
- 1、四种匹配规则
- 2、匹配顺序
- 3、注意问题
- 五、请求和响应
- 1、请求-request
- (1)request概述
- (2)request获取请求头数据
- (3)request获取请求相关的其它方法
- (4)request获取请求参数
- (5)请求转发
- (6)request域方法
- 2、响应-response
- (1) response概述
- (2)response响应正文
- (3)设置响应头信息
- (4)设置状态码及其他方法
- (5)重定向
- 3、sesion和cookie
- 第三章 jsp入门
- 一、JSP基础语法
- 1、JSP模板元素
- 2、JSP脚本片段
- 3、JSP注释
- 二、JSP原理
- 1、JSP的本质
- 2、_jspService方法
- 3、jsp在服务器的执行流程
- 三、JSP指令
- 1、JSP指令标识的语法格式
- 2、Page指令
- 3、include指令
- 四、JSP标签
- 一、 Jsp标签分类
- 五、九大内置对象
- 六、JSP属性作用域
- 七、静态资源的路径问题
- 八、错误页面、404页面、欢迎页
- 第四章 EL表达式和JSTL标签库
- 一、EL表达式
- 1、特点
- 2、域对象
- 3、支持的运算
- 4、其他的内置对象
- 5、EL表达式的缺陷
- 二、JSTL标签工具类
- 1、基本介绍
- 2、使用方式
- 3、重要标签的使用
- 第五章 Listener、Filter
- 一、概念
- 二、生命周期
- 1、servlet:
- 2、filter:
- 3、listener:
- 三、使用方式
- 第六章 常用模板
第一章 Tomcat 基础 一、 web 概念 1. 软件架构
- C/S: 客户端/服务器端
- B/S: 浏览器/服务器端
- 静态资源: 所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析。如图片、视频。
- 动态资源: 每个用户访问相同资源后,得到的结果可能不一样 , 称为动态资源。动态资源被访问后,需要先转换为静态资源再返回给浏览器通过浏览器进行解析。如:servlet,jsp,php,asp…
- 服务器:安装了服务器软件的计算机
- 服务器软件:接收用户的请求,处理请求,做出响应
- web服务器软件:接收用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
2、常见服务器软件动态服务器:
- webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。(300左右的并发)
静态的服务器:
- nginx(代理,反向代理等)极高的并发
- apache
1) Tomcat 最初由Sun公司的软件架构师 James Duncan Davidson 开发,名称为 “JavaWebServer”。
2) 1999年 ,在 Davidson 的帮助下,该项目于1999年于apache 软件基金会旗下的 JServ 项目合并,并发布第一个版本(3.x), 即是现在的Tomcat,该版本实现了Servlet2.2 和 JSP 1.1 规范 。
3) 2001年,Tomcat 发布了4.0版本, 作为里程碑式的版本,Tomcat 完全重新设计了其架构,并实现了 Servlet 2.3 和 JSP1.2规范。
目前企业中的Tomcat服务器, 主流版本还是 7.x 和 8.x 。
4、 Tomcat 安装下载地址
5、Tomcat 目录结构| 目录 | 目录下文件 | 说明 |
|---|---|---|
| bin | / | 存放Tomcat的启动、停止等批处理脚本文件 |
| startup.bat ,startup.sh | 用于在windows和linux下的启动脚本 | |
| shutdown.bat ,shutdown.sh | 用于在windows和linux下的停止脚本 | |
| conf | / | 用于存放Tomcat的相关配置文件 |
| Catalina | 用于存储针对每个虚拟机的Context配置 | |
| context.xml | 用于定义所有web应用均需加载的Context配置,如果web应用指定了自己的context.xml ,该文件将被覆盖 | |
| catalina.properties | Tomcat 的环境变量配置 | |
| catalina.policy | Tomcat 运行的安全策略配置 | |
| logging.properties | Tomcat 的日志配置文件, 可以通过该文件修改Tomcat 的日志级别及日志路径等 | |
| server.xml | Tomcat 服务器的核心配置文件 | |
| tomcat-users.xml | 定义Tomcat默认的用户及角色映射信息配置 | |
| web.xml | Tomcat 中所有应用默认的部署描述文件, 主要定义了基础Servlet和MIME映射。 | |
| lib | / | Tomcat 服务器的依赖包 |
| logs | / | Tomcat 默认的日志存放目录 |
| webapps | / | Tomcat 默认的Web应用部署目录 |
| work | / | Web 应用JSP代码生成和编译的临时目录 |
双击 bin/startup.bat 文件 启动 双击 bin/shutdown.bat 文件 停止 访问:http://localhost:8080三、Tomcat 架构 1、HTTP工作原理
HTTP协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP是基于TCP/IP协议来传递数据的(HTML文件、图片、查询结果等),HTTP协议不涉及数据包(Packet)传输,主要规定了客户端和服务器之间的通信格式。
浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理,所谓的服务端程序就是你写的Java类,一般来说不同的请求需要由不同的Java类来处理。
图1 , 表示HTTP服务器直接调用具体业务类,它们是紧耦合的
图2,HTTP服务器不直接调用业务类,而是把请求交给容器来处理,容器通过Servlet接口调用业务类。因此Servlet接口和Servlet容器的出现,达到了HTTP服务器与业务类解耦的目的。而Servlet接口和Servlet容器这一整套规范叫作Servlet规范。Tomcat按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。作为Java程序员,如果我们要实现新的业务功能,只需要实现一个Servlet,并把它注册到Tomcat(Servlet容器)中,剩下的事情就由Tomcat帮我们处理了。
3、Servlet容器工作流程当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法,Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的Servlet,如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化,接着调用Servlet的service方法来处理请求,把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端。
我们现在知道了Tomcat要实现两个核心功能:
1) 处理Socket连接,负责网络字节流与Request和Response对象的转化。
2) 加载和管理Servlet,以及具体处理Request请求。
因此Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。
大致图解为:
Tomcat 服务器的配置主要集中于 tomcat/conf 下的 catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。
server.xmlserver.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器(Catalina)的所有配置。
Server:
Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.StandardServer
...
属性说明:
port : Tomcat 监听的关闭服务器的端口。
shutdown: 关闭服务器的指令字符串。
Connector:
Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进
行优化。
属性说明:
1) port: 端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector 使用。
2) protocol : 当前Connector 支持的访问协议。 默认为 HTTP/1.1 。
3) connectionTimeOut : Connector 接收链接后的等待超时时间, 单位为毫秒。 -1 表示不超时。
4) URIEncoding : 用于指定编码URI的字符编码, Tomcat8.x版本默认的编码为 UTF-8 。
servlet就是一个java程序,用来处理请求和响应。
一、Servlet架构 二、Servlet任务处理请求request,生成响应response
三、Servlet相关知识 1、Servlet加载时机在默认情况下,当Web客户第一次请求访问某个Servlet时,Web容器会创建这个Servlet的实例。当设置了web.xml中的子元素后,Servlet容器在启动Web应用时,将按照指定顺序创建并初始化这个Servlet。设置的数值大于0即可。
2、Servlet的生命周期HelloServlet com.langsin.servlet.HelloServlet 2
- init():Servlet进行初始化
- service():Servlet处理客户端的请求
- destroy():Servlet结束,释放资源
在调用destroy()方法后,Servlet由JVM的垃圾回首器进行垃圾回收
init()方法:
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化在Servlet生命周期中init()方法只被调用一次。
当用户调用一个Servlet时,Servlet容器就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,init()方法简单的创建或加载一些数据,这些数据将会被用在Servlet的整个生命周期。
service()方法:
service()方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service()方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service()方法检查HTTP 请求类型(GET、POST(增加)、PUT(修改)、DELETE 等),并在适当的时候调用doGet()、doPost()等方法。
destroy()方法:
destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。destroy()方法可以让Servlet关闭数据库连接、停止后台、把cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用destroy()方法之后,Servlet对象被标记为垃圾回收。
总结:
- 在首次访问某个Servlet时,init()方法会被执行,而且也会执行service()方法。
- 再次访问时,只会执行service()方法,不再执行init()方法。
- 在关闭Web容器时会调用destroy()方法。
当服务器接收到一个请求,就要有一个servlet去处理这个请求,所以完成一个servlet通常需要两步走。
- 写一个java程序定义一个servlet
- 配置一下servlet确定这个servlet要处理哪一个请求
(1)实现javax.servlet.Servlet接口。
(2)继承javax.servlet.GenericServlet类
(3)继承javax.servlet.http.HttpServlet类(常用)
(1)使用web.xml文件配置Servlet
user com.controller.UserServlet user /user.do
(2)使用注解进行Servlet配置
@WebServlet("/user.do")
四、servlet的匹配规则
1、四种匹配规则
(1) 精确匹配
中配置的项必须与url完全精确匹配。 user /user.do
(2) 路径匹配
以“/”字符开头,并以“bb是精确匹配,合法,这里的*不是通配的含义
" @WebFilter(" public class JDBCUtils { // 1. 声明静态数据源成员变量 private static DataSource ds; // 2. 创建连接池对象 static { // 加载配置文件中的数据 InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); Properties pp = new Properties(); try { pp.load(is); // 创建连接池,使用配置文件中的参数 ds = DruidDataSourceFactory.createDataSource(pp); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } // 3. 定义公有的得到数据源的方法 public static DataSource getDataSource() { return ds; } // 4. 定义得到连接对象的方法 public static Connection getConnection() throws SQLException { return ds.getConnection(); } // 5.定义关闭资源的方法 public static void close(Connection conn, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException e) {} } if (conn != null) { try { conn.close(); } catch (SQLException e) {} } } // 6.重载关闭方法 public static void close(Connection conn, Statement stmt) { close(conn, stmt, null); } }
Util-Jedis
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public final class JedisUtil {
private static JedisPool jedisPool;
static {
//读取配置文件
InputStream is = JedisPool.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro = new Properties();
//关联文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
public static void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}



