🚌 Web服务器
Web服务器就是我们平时所说的服务器,其实是指安装了服务器软件的计算机
服务器软件
就是一款软件,可以下载,可以安装,也可以卸载
服务器软件有什么作用
- 它可以接受用户发过来的请求,服务器软件接受到了请求可以进行处理,处理完之后可以给用户响应回去
- 它可以部署web项目,我们需要通过浏览器访问的方式,去访问一个web项目中资源
常见的web服务器软件
- WebLogic:是Oracle公司的,大型服务器,收费的,JavaEE服务器,支持所有的JavaEE技术(共13种),JavaEE容器
- Websphere:是IBM公司的,大型服务器,收费的,JavaEE服务器,支持13种JavaEE技术,JavaEE容器
- JBOSS:JBoss公司的,大型服务器,免费的,JBoss核心服务不包括支持servlet/JSP的WEB容器,最最原始服务器,一般使用它,要和其他的服务器服务器绑定使用
- Apache:Apache软件基金会的一个款非常的棒的web服务器,免费的,想要使用它,依然要绑定其他服务器一起使用
- tomcat:Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta ,项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。tomcat支持JavaEE技术中的servlet和jsp技术,servlet和jsp容器。
🚲 Tomcat服务器软件的使用
下载:
安装:解压缩即可
- 注意安装目录不要有中文
- 卸载:删除文件夹
- 开启:在bin目录中,找到startup.bat的应用程序,双击即可
- 浏览器访问http://127.0.0.1:8080/
- 浏览器访问映射http://localhost:8088/
- 关闭
- 正常关闭:shutdown.bat
- 不正常关闭 直接点右上角X
注意:如果双击startup.bat的时候,可能会出现闪退现象,出现一闪而过的原因:
- jdk是按照第一种方式配置的01-环境配置,该方式没有配置Java_Home
- 端口被占用的
- 方法一:换端口,改文件server.xml, Server port=”8005”
- 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号,改完后浏览器不用输入端口号
- 方法二:使用命令
netstat -ano
找到占用端口的软件,把它强制停止
- 方法一:换端口,改文件server.xml, Server port=”8005”
Tomcat文件目录
- bin:用于存放Tomact的可执行文件和脚本文件,如Tomact7.exe、startup.bet
- conf:用于存放Tomact的各种配置文件,如web.xml、server.xml
- lib:用于存放Tomact服务器和所有web应用程序需要访问的JAR文件
- logs:用于存放Tomact的日志文件
- temp:用于存放Tomact运行时产生的临时文件
- webapps:Web应用程序的主要发布目录,通常将要发布的应用程序放在这个目录下
- work:Tomcat的工作目录,存放JSP编译生成的Servlet源文件和字节码文件
🚂 Web项目的部署
部署就是将web项目交给tomcat服务器来进行管理
方式一
- 将web项目放入到tomcat服务器中的webapps文件夹中
- 然后开启tomcat服务器,
- 然后打开浏览器,在地址栏输入:localhost:8080/项目名字/资源文件的名字
简化部署:将web项目打包成war包,放入到tomca七中的webapps中,然后开启tomcat服务器,打开浏览器,输入:localhost:8080/xml文件名/资源文件的名字
如果端口号改成了80,那访问资源的时候,就不需要写端口号,因为http协议默认端口号就是80。
如果主页名改为index.html,那就不需要写主页名字了
怎么打war包,压缩成zip,改后缀
方式二
- 将web项目配置到tomcat服务器中的核心配置文件中server.xml,在host标签中添加:
<Context docBase="C:\Users\apple\Desktop\app" path="/aaa"/>
- docBase属性:web项目真实存放的路径
- path属性:项目的虚拟路径
- 然后打开浏览器,在地址栏输入:localhost:8080/path属性值/资源文件的名字
相较于第一种方式更为灵活,但改了配置文件,不安全,少用
方式三(推荐)
将web项目配置到tomcat服务器中的conf中的catalina中的localhost中,创建一个任意命名的xml文件,在文件中写:
<?xml version="1.0" encoding="utf-8"?>
<Context docBase="C:\Users\apple\Desktop\app"/>
然后打开浏览器,在地址栏输入:localhost:8080/xml文件名/资源文件的名字
注意:当配置文件的名字为ROOT.xml的时候,那我们在访问的时候,是不用写项目的虚拟路径的
🚍 Web项目的分类
静态的web项目
静态web项目是指项目中的资源都是静态的
项目目录结构
app
- html
- demo01.html
- demo02.html
- … …
- css
- style1.css
- style2.css
- js
- aaa.js
- bbb.js
动态的web项目
动态的web项目是指项目中的资源可静可动
项目目录结构
app
- html
- demo01.html
- demo02.html
- … …
- css
- style1.css
- style2.css
- js
- aaa.js
- bbb.js
- WEB-INF
- web.xml 是web项目的核心配置文件
- classes 是一个文件夹 ,里面存储的都是.class文件和配置文件
- lib 是一个文件夹:里面存放的是第三方的jar包
💺 Servlet
servlet是运行在服务器端的小程序
我们可以通过浏览器成功访问一个类的,但是这样的类不是一般的类,而是servlet类,即能够通过浏览器访问到的类就是servlet
如何区别普通类和Servlet类?
- tomcat服务器给我们提供了一个接口,该接口的名字就叫做Servlet,但是我们所学习的Servlet是一个泛指,并不是这个接口,而是泛指的所有的servlet类。也就是Servlet是一个大家族的,Servlet接口下面也会有一些实现类。
- 如果我们自己创建一个类的话,该类是一个普通类。如果该类加入了Servlet大家族之后,就成了Servlet类,只需要实现Servlet接口即可
总结:Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。将来我们自定义一个类,实现Servlet接口,复写方法。
🚥 Servlet详解
实现步骤
- 创建JavaEE项目
- 定义一个类,实现Servlet接口
public class ServletDemo1 implements Servlet
- 实现接口中的抽象方法
- 配置Servlet
在web.xml中配置:
```jsondemo1 cn.itcast.web.servlet.ServletDemo1
<a name="Jn5I2"></a>
## 执行原理
![image.png](https://cdn.nlark.com/yuque/0/2022/png/21490994/1651160516608-66326223-b7ff-4613-9694-220f22134059.png#clientId=uf5c53a84-b71f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=524&id=uadab41ac&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1048&originWidth=2548&originalType=binary&ratio=1&rotation=0&showTitle=false&size=646978&status=done&style=none&taskId=uc885fcf6-f802-4241-baba-9adeb86d5ca&title=&width=1274)
1. 通过地址栏输入:localhost:8080/项目的虚拟路径/servlet的虚拟目录
1. `localhost:8080/day52/servletDemo01`
2. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,得到项目的虚拟路径和servlet的虚拟目录
2. 拿servlet的虚拟目录去web.xml中进行查找,是否有url-pattern匹配值。
2. 如果有,则在找到对应的全类名
2. tomcat会将字节码文件加载进内存,通过反射技术,创建servlet类的对象,
2. 然后调用service()方法
<a name="MRVJ5"></a>
## Servlet中的生命周期方法
> Servlet接口中定义了5个抽象方法
| void init(ServletConfig config) | ServletConfig getServletConfig() | String getServletInfo() | void service(ServletRequest request,ServletResponse response) | void destroy() |
| --- | --- | --- | --- | --- |
1. **被创建:执行init方法,只执行一次 **
Servlet什么时候被创建?
- 默认情况下,第一次被访问时,Servlet被创建
- 可以配置执行Servlet的创建时机。 在标签下配置 <load-on-startup>
```json
第一次被访问时,创建
<load-on-startup>的值为负数
在服务器启动时,创建
<load-on-startup>的值为0或正整数
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能存在线程安全问题。
- 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
- 提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次。
被销毁:执行destroy方法,只执行一次
- Servlet被销毁时执行。服务器关闭时,Servlet被销毁
- 只有服务器正常关闭时,才会执行destroy方法。
- destroy方法在Servlet被销毁之前执行,一般用于释放资源
获取ServletConfig配置对象:getServletConfig()方法
- 获取Servlet的一些信息、版本、作者:getServletInfo()方法
Servlet3.0
好处:支持注解配置。可以不需要web.xml了。
步骤:
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类,实现Servlet接口
- 复写方法
- 在类上使用@WebServlet注解,进行配置
@WebServlet("资源路径")
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相当于<Servlet-name>
String[] value() default {};//代表urlPatterns()属性配置
String[] urlPatterns() default {};//相当于<url-pattern>
int loadOnStartup() default -1;//相当于<load-on-startup>
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
Servlet的体系结构
- Servlet — 接口
- GenericServlet — 抽象类
- HttpServlet — 抽象类
GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet:对http协议的一种封装,简化操作
- 定义类继承HttpServlet
复写doGet/doPost方法
@WebServlet("/demo02")
public class servletDemo02 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...");
}
}
Servlet相关配置(注解配置)
- urlpartten:Servlet访问路径
- 一个Servlet可以定义多个访问路径 :
@WebServlet({"/d4","/dd4","/ddd4"})
- 一个Servlet可以定义多个访问路径 :
- 路径定义规则
/xxx
:路径匹配/xxx/xxx
:多层路径,目录结构/*
通配符写法 优先级是最低的
*.自定义拓展名
:扩展名匹配,如:*/do
🚇 IDEA与tomcat的相关配置
IDEA会为每一个tomcat部署的项目单独建立一份配置文件
- 查看控制台的log:Using CATALINA_BASE: “C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcast”
工作空间项目 和 tomcat部署的web项目
- tomcat真正访问的是“tomcat部署的web项目”,”tomcat部署的web项目”对应着”工作空间项目” 的web目录下的所有资源
- WEB-INF目录下的资源不能被浏览器直接访问。
断点调试:使用”小虫子”启动 dubug 启动