Tomcat服务器
下载 - https://tomcat.apache.org/download-80.cgi
tomcat的版本需要和jdk的版本保持一致即可.
Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目
轻量级的服务器,免费并且开源,支持静态资源和java后端资源的部署的.
属于web容器/服务器,别称servlet容器,jsp容器
目录结构
webapps - 部署后端项目的目录
bin - 可执行文件
1. startup.bat - 启动服务器 2. shutdown.bat - 停止服务器
conf - 配置文件
3-1. server.xml - 端口号
3-2. tomcat-users.xml
lib - tomcat运行依赖的jar - tomcat支持servlet程序以及jsp程序的执行.
4-1. servler-api.jar
4-2. jsp相关jar jsp-api.jar
logs - tomcat运行时记录日志
temp - 临时目录 - 随时清空的
work - 工作目录
配置端口号
默认的端口号是8080,需要conf/server.xml中进行配置
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
环境变量配置
Tomcat是采用java语言开发的,前提是计算机成功配置jdk
系统变量
新建 - 变量名:CATALINA_HOME 变量值:tomcat解压之后的根目录
Path - 编辑 - %CATALINA_HOME%\bin
关闭所有的窗口[包括终端]
启动运行
- 打开终端 - startup
- 打开浏览器 - localhost:8081
idea中配置tomcat
新建一个非maven的web工程
![]()
修改上下文路径
![]()
Servlet程序
servlet - server applet - 运行在服务器端的java程序.
在mvc框架[本身不是一门具体的技术,一套思想] - servlet担任的角色 - C - 控制器
三种具体的实现
写一个类去实现javax.servlet.Servlet[I]
写一个类去继承了.javax.servlet.GenericServlet[C] - 支持通用协议的servlet
GenericServlet[C] 实现了 Servlet[I]
写一个类去继承javax.servlet.http.HttpServlet[C] - 专门支持http协议的servlet
HttpServlet 继承了 GenericServlet
Servlet配置
xml配置
web.xml中进行配置,每个servlet的实例都是由tomcat来实例化的.
<?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_4_0.xsd" version="4.0"> <!-- 配置servlet--> <servlet> <!-- servlet-name必须要保证唯一性.--> <servlet-name>FirstServlet</servlet-name> <servlet-class>tech.aistar.controller.day01.FirstServlet</servlet-class> </servlet> <!-- 配置映射路径--> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/day01/first</url-pattern> </servlet-mapping> </web-app>
浏览器url:http://localhost:8081/servlet-j03s/day01/first
url - 统一资源定位器,服务器上的每个资源都应拥有唯一的url,组成部分
- 当启动tomcat服务器的时候,它会加载web.xml文件 - web.xml文件已经在内存中.
- http协议 - 无状态的协议.server是不能够识别出俩次请求来自于同一个客户端的.
- localhost - 服务器所在主机的ip地址.
- 8081 - 端口号,一个端口号对应一个服务器[软件]
- servlet-j03s - 项目的上下文路径[同一个服务器上的项目的上下文路径应该是唯一的]
- /day01/first - 资源的映射路径
精确匹配的过程
- /day01/first到web.xml文件中去找url-pattern是/day01/first的,如果找不到,报错一个HTTP状态404.
- 如果找到了,继续取出url-pattern标签的上一个兄弟标签servlet-name标签体中的值 - FirstServlet
- 到所有的servlet标签中去寻找是否存在servlet-name是否为FirstServlet
- 如果存在,继续取出servlet-class - [servlet程序对应的类的全限定名]
- 底层反射构造出该servlet程序的实例
注解配置
package tech.aistar.controller.day01;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 本类用来演示:
* GenericServlet 实现了 Servlet接口
*
* 1. GenericServlet - 已经实现了除了service方法的其余的四个方法
* 2. GenericServlet必然会存在抽象的service方法
* 3. GenericServlet抽象类
*
* @author: success
* @date: 2021/10/12 3:16 下午
*/
@WebServlet(urlPatterns = "/day01/two")
public class TwoServlet extends GenericServlet {
/**
* service方法才是真正来接受来自于客户端的请求
* 已经响应客户端请求的业务方法
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}
}
Servlet生命周期
init,service[doGet,doPost],destroy方法
第一阶段 - Servlet何时被实例化
1. 如果配置了<load-on-startup>0</load-on-startup> 如果配置了0或者正数,意味着启动tomcat的时候,就会立即初始化该servlet实例,并且利用该实例立即去调用init方法. 如果值一样,根据上下的配置顺序.如果值不一样.数值越小,优先级越高. 2. 如果没有配置 当请求第一次到达的时候,tomcat容器会初始化该servlet的实例.然后利用该实例立即去调用init方法 init方法仅仅只会执行1次.
第二阶段
来自于client端的请求永远是永远是先到达service方法.如果本servlet中没有重写service方法
那么会自动进入到父类HttpServlet中的service方法,根据请求的方式来决定调用doGet方法还是doPost方法.
再在重写之后的doGet方法或者doPost方法中来处理请求和响应.
第三阶段
当我们关闭tomcat的时候,会调用destroy方法.
get请求和post请求区别
(1).get请求一般用于获取数据,post请求一般用于需要发数据到后台时使用
(2).get请求的参数,会放在url上,所以安全性,隐私性会比较差,post请求的参数会放在request.body中,比较的安全
(3).get请求不受到刷新,回退的影响,post请求则会在网页回退或者刷新后,重新进行发送
(4).get请求会被缓存,post请求不会被缓存
(5).get请求会被记录在浏览器的历史记录中,post请求则不会被记录
(6).get请求可以被收藏为标签,post不能被收藏为标签
(7).get请求只能进行url编码,post请求则支持多种编码
(8).get请求通常通过url地址栏请求,post通常通过表单发送数据请求
(9). post请求url长度理论上没有限制,get请求有限制[不同的浏览器不一样]
中文乱码的处理
post请求乱码问题怎么解决
//post请求处理中文乱码问题 - 接受参数之前
req.setCharacterEncoding("utf-8");
转发和重定向
- 转发发生在服务器端的跳转
- 共享request作用域中的数据
- 地址栏不变
- 重定向发生在客户端的跳转
- 至少2次请求,不能获取request作用域中的数据
- 地址栏是会发生变化的
- 可以重定向到其他站点
三大作用域
- request作用域 - HttpServletRequest,一次请求,一次响应.
- session作用域 - HttpSession - 一次会话期间,浏览器开启,浏览器关闭
- application作用域 - ServletContext - 服务器开启 - 服务器关闭 - 整个应用期间
映射路径的匹配方式
精确匹配
模糊匹配
@WebServlet(urlPatterns = "/day02/*")
后缀匹配
结论: 精确匹配>模糊匹配>后缀
HttpServletRequest
- extends javax.servlet. ServletRequest[I]
- 所有的请求的信息都被封装到了HttpServletRequest对象中
HttpServletResponse
- extends javax.servlet. ServletResponse[I]
- 所有的响应给客户端的信息全部封装到这个对象中了.
URL和URI
- URI:Uniform Resource Identifier,统一资源标识符 上下文路径+映射路径[唯一的,对应唯一一个资源,标识资源的]
- URL:Uniform Resource Location 统一资源定位符
URI是包含URL
URI,是统一资源标识符,用来唯一的标识一个资源。而URL是统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源
Cookie
api: javax.servlet.http.Cookie[C]
可以用来存放少量的信息,每个cookie存储的量不能超过4kb
Cookie可以在server端创建并且发送给客户端[浏览器]
保存在客户端
Cookie的value可以用来唯一标识一个客户端,所以cookie通常可以用来作为session的跟踪机制
4-1. cookie是如何管理session
4-2. 会话跟踪的技术有哪些?
cookie对象拥有name和value[单个]和一些可操作的选项[比如设置cookie的过期时间]
The servlet sends cookies to the browser by using the
HttpServletResponse.addCookie(javax.servlet.http.Cookie)
method,通过响应头信息将cookie发送给client[brower]每个浏览器为每个web server最多只能保存20个cookie
每个浏览器最多支持保存300个cookie
客户端是通过请求头信息将cookie再次发送给server端,由server端进行解析 -
HttpServletRequest.getCookies()
method.
Session会话跟踪机制
诞生背景:session为什么要进行管理?
原因:通过http协议发送的请求,http协议无状态的协议 - server不能够判断后续的多次请求是来自于同一个客户端[server本身不标识客户端.]
何时才会创建session空间
1-1. 当后端代码中第一次出现req.getSession();
1-2. 第一次访问jsp文件,只要设置成false,就不会创建session空间.
<%@ page contentType="text/html;charset=UTF-8" language="java" session="true" %>
当第一次请求到达req.getSession();的时候,tomcat服务器会创建一个Session空间,并且给这个空间分配一个唯一的id
接着创建了cookie,这个cookie中存放了这个空间的id,并且通过响应头信息将这个cookie发送到client端,并且保存在client
后续的请求会带上存储sessionid的cookie一起发送到server端.由tomcat解析cookie中的session空间的id,然后将这个client联系到这个client对应的session空间