Servlet基础笔记
主要是怕哪天电脑挂了 这些笔记翻不到了 所以在这个网站上挂着 是为了自己留着 不需要评论 不需要转发
概念
Servlet就是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议. Servlet就是SUN公司提供的一个动态网页开发技术.
当客户端请求静态资源时,Web服务器会自己处理并返回,当客户端请求动态资源时,Web服务器会把请求转交给扩展程序来处理,并将扩展程序的处理结果返回给客户端。
Servlet的作用:
用来处理从客户端浏览器发送的请求,并且可以对请求作出响应
src目录是放置代码的地方 在项目发布到服务器以后就不存在了
Tomcat是一个web容器 它可以放很多Servlet
快速入门:
1 创建JavaEE项目
2 定义一个类,实现Servlet接口
3 实现接口中的抽象方法
4 配置Servlet (WEB-INF–>web.xml)
快速入门:
1. 创建JavaEE项目
2. 定义一个类,实现Servlet接口
public class ServletDemo1 implements Servlet
3. 实现接口中的抽象方法
4. 配置Servlet
在web.xml中配置:
<!--配置Servlet -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>demo1</servlet-name>
<!-- SErvlet的全路径 -->
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<!-- Servlet的映射 -->
<servlet-mapping>
<!-- Servlet的名称 -->
<servlet-name>demo1</servlet-name>
<!-- Servlet的访问路径 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理:
当用户发送了一个请求到Tomcat服务器
如果这个请求是静态资源就根据请求路径去找对应的资源文件
如果找到就返回 如果找不到就返回404
如果这个请求是一个动态资源(Servlet)
从内存中找到url-pattern对应的路径
如果没有就返回404
如果有根据 解析对应的
解析完再去解析servlet标签下面的
解析到之后使用反射创建Servlet对象
再然后调用Servlet的service()方法
Servlet的生命周期:Servlet从创建到销毁的过程.
1 被创建:执行init方法 只执行一次。
2 提供服务: 执行Service方法 执行多次
3 被销毁: 执行destroy方法 只执行一次
- Servlet在默认情况下第一次访问就会被创建。如果想修改 可以通过修改配置文件来选择Servlet的创建时机。在web.xml下执行下面代码
在Servlet标签下配置以下内容:
<!--指定Servlet创建时机-->
<!--第一次被访问时创建 写-1就行(负数)-->
<load-on-startup>-1</load-on-startup>
<!--在服务器启动时呗创建 写0就行(正数)-->
<load-on-startup>1</load-on-startup>
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象(Servlet是单例的)所以多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
-
提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次。 -
被销毁:执行destroy方法,只执行一次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
只有服务器正常关闭时,才会执行destroy方法。
(可以理解为交代遗言,先交代再被销毁)
destroy方法在Servlet被销毁之前执行,一般用于释放资源
package com.itheima.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo1 implements Servlet {
/**
* 初始化方法 重要方法
* 在Servlet被创建的时候执行,只会执行一次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
/**
* 获取ServletConfig对象的
* ServletConfig是Servlet的配置对象
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
*提供服务的方法 重要方法
* 每一次Servlet被访问都会执行,执行多次
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
/**
* 获取Servlet的信息 比如版本、作者 我们一般不会用这个方法
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法 重要方法
* 在服务器被正常关闭时执行,只执行一次
*/
@Override
public void destroy() {
}
}
Servlet3.0:
- Servlet3.0 注解配置
@webservlet("/demo")
- 好处:
- 支持注解配置。可以不需要web.xml了。
- 步骤:
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类,实现Servlet接口
- 复写方法
- 在类上使用@WebServlet注解,进行配置
- @WebServlet(“servlet的资源路径”)
@WebServlet("/demo2")
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet 执行");
}
IDEA与tomcat的相关配置
1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件
* 查看控制台的log:Using CATALINA_BASE: "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"
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协议的一种封装,简化操作
不管是哪一种方式实现的Servlet 如果有请求必然执行service()
方法
如果是继承自HttpServlet 重写doGet()
doPost()
Servlet相关配置(urlpartten:Servlet访问路径)
-
一个Servlet可以定义多个访问路径 :
@WebServlet({"/d4","/dd4","/ddd4"})
-
路径定义规则:
/xxx
:完全路径匹配(最常用) ("/demo1" “/user/demo1”) http://localhost:8080/day14/demo1/xxx/*
: 目录匹配 /目录/*代表着通配符,所以也就是说在/目录后 输入什么都能进去*.do
:扩展名匹配
-
优先级
完全路径匹配 > 目录匹配 > 扩展名匹配
/user/demo1
/user/*
*.do
(千万别写成/*.do)
http://localhost:8080/day14/user/demo1
错误的写法 :/*.do
*
这种东西的优先级很低 只有其他都找不到了才会用这种东西