部署TomCat项目的方式
1、直接将项目放到webapps目录下即可
/hello:项目的访问路径–>虚拟目录
简化部署:将项目打成一个war包,在将war包放置到webapps目录下
war包会自动解压缩
2、配置conf/server.xml文件
在标签中配置
<Context docDase="D:\hello" path="/hehe"/>
docBase:项目存放的路径
path:虚拟目录
3、在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
<Context docDase="D:\hello" />
虚拟目录:xml文件的名称
静态项目和动态项目
目录结构
Java动态项目的目录结构
---项目的根目录
---WEB-INF目录:
---web.xml:web项目的核心配置文件
---classes目录:放置字节码文件的目录
---lib目录:放置依赖的jar包
将Tomcat集成到IDEA中,并创建Java EE 项目,部署项目
Servlet:server applet
概念:运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
将来我们自定义一个类,实现Servlet接口,复写方法
快速入门
1、创建一个JavaEE项目
2、定义一个类,实现servlet接口
3、实现接口中的抽象方法
4、配置Servlet
我们需要使用浏览器通过URL来访问新创建的Java类,就需要将Java类在web.xml文件中映射成为对应的资源路径,也可理解为URL后面加的东西。
Java类
package com.example.day06_tomcat;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//提供服务的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("zgDaren!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xml
<?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>demo1</servlet-name>
<servlet-class>com.example.day06_tomcat.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
</web-app>
问题:当我们定义了一个Java类,但我们并没有创建对象,我们也没有调用方法,自己就被执行了
servlet执行原理
1、当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径(demo01)
2、查找web.xml文件,是否有对应的<url-pattern>
标签体内容
3、如果有,则在找到对应的<servlet-class>全类名
4、tomcat会将字节码文件加载进内存,并且创建其对象
5、调用其方法
servlet生命周期(5个方法)
1、被创建:执行init方法 ,只执行一次
Servlet什么时候被创建?
指定Servlet的创建时机,在web.xml文件中的<servlet>
标签下进行配置
第一次被访问时创建<load-on-startup>
为负数,其默认为-1
在服务器启动时加载<load-on-startup>
为正数或0
Servlet的init方法只执行一次,说明一个servlet在内存中只存在一个对象,servlet是单例的
多个用户同时访问时,可能会存在线程安全问题所以尽量不在servlet中定义成员变量,可在service中定义,即使定义了成员变量,也不要修改获取值
2、提供服务:执行service方法,执行多次
每次访问servlet时,service方法都会被调用一次
3、被销毁:执行destroy方法,只执行一次
servlet被销毁时执行,服务器正常关闭,servlet被销毁
只有正常关闭时,才会执行destory方法
destroy方法在servlet销毁之前执行,释放资源
Java类
package com.example.day06_tomcat;
import javax.servlet.*;
import java.io.IOException;
/*
* Servlet的方法
* */
public class ServletDemo02 implements Servlet {
/*
* 初始化方法
* 在servlet被创建时执行,只会执行一次
* */
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
/*
* 获取ServletConfig对象
* ServletConfig:Servlet的配置对象*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
* 提供服务方法
* 每一次servlet被访问时执行,执行多次*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}
/*
* 获取Servlet的一些信息,版本,作者*/
@Override
public String getServletInfo() {
return null;
}
/*
* 销毁方法
* 在服务器正常关闭时执行,执行一次*/
@Override
public void destroy() {
}
}
web.xml
<?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>demo1</servlet-name>
<servlet-class>com.example.day06_tomcat.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.example.day06_tomcat.ServletDemo02</servlet-class>
<!--指定Servlet的创建时机
1、第一次被访问时创建<load-on-startup>为负数,其默认为-1
2、在服务器启动时加载<load-on-startup>为正数或0-->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
</web-app>
servlet注解配置
1、创建一个JavaEE项目,选择servlet的版本在3.0以上,可以不创建web.xml
2、定义一个类,实现servlet接口
3、实现接口中的抽象方法
4、在类上使用@webServlet注解,进行配置
@WebServlet("资源路径")
@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")
package cn.zg.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet4.0来了...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
== 切换项目时,一定要先关闭tomcat服务器,设置好后在重新启动,不然就会出现端口被占用的情况,如果端口被占用则在cmd窗口中netstat -aon|findstr 1099 命令查看到该1099端口的PID,然后结束进程==
IDEA与tomcat相关配置
1、IDEA会为每一个tomcat部署的项目单独建立一份配置文件
在项目中启动tomcat服务器后,查看控制台log:Using CATALINA_BASE: “C:\Users\64359\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\af080da0-49e3-4185-a2c8-ba394708d02c”
2、工作空间项目和tomcat部署的web项目
tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问。
3、断点调试,使用“dubug”启动
Servlet体系结构
Servlet–接口
GenericServlet–抽象类
HttpServlet–抽象类
GenericServlet:将servlet接口中其他方法做了默认空实现,只将service()方法作为抽象
将来定义servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet:对http协议的封装和实现,简化操作
定义类继承HttpServlet
复写doGet/doPost方法
继承HttpServlet的类
package cn.zz.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost...");
}
}
在webapp目录下新建login.html,用来检测post方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demo3" method="post">
<input name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet相关配置
一、urlpartten:Servlet访问路径
1、一个Servlet可以定义多个访问路径:@WebServlet({"/d4","/dd4","/ddd4"})
2、路径定义规则:
a、/xxx
b、/xxx/xxx:多层目录结构
c、*.do:但是前面一定不要写/
HTTP协议
概念:Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式
特点:基于TCP/IP的高级协议
默认端口号:80
基于请求/响应模型的:一次请求对应一次响应
无状态的:每次请求之间相互独立,不能交互数据
历史版本:1.0:每次请求响应都会建立新的连接
1.1:复用连接
请求消息数据格式
请求行
请求方式 请求url 请求协议/版本
GET/login.html HTTP/1.1
请求方式:HTTP协议有7种请求方式,常用的有2种
GET:1、请求参数在请求行中,在url后
2、请求的url长度有限制
3、不太安全
POST:1、请求参数在请求体中
2、请求的url长度没有限制
3、相对安全
请求头
请求头名称:请求头值
常见的请求头:
1、Host:请求的主机
2、User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
可以在服务器端获取该头信息,解决浏览器的兼容性问题
3、Accept:告诉服务器浏览器可以解析啥文件
4、Accept-Language:支持的语言环境
5、Accept-Encoing:可接收的语言格式
6、Referer:http://localhost/login.html
告诉服务器“我”从哪里来
防盗链:
统计工作:
7、Connection:keep-alive(表示可以一直被复用)
3、请求空行
空行:就是用于分隔post请求的请求头和请求体的
4、请求体(请求正文)
get无请求体,post有请求体,封装post请求消息的请求体的