一、servlet快速入门
1、新建的web项目工程,并导入Servlet依赖:(这里也要导入Tomcat服务器依赖,因为Servlet需要依赖于Tomcat才能运行,也就是说Servlet是在Maven环境下的Web项目中创建的)
因为这是在Maven环境下做的web项目,玩的就是Servlet 肯定要把Servlet依赖导入该项目了,就和Mybatis一样, 用Mybatis玩项目 就肯定把Mybatis依赖导入进来了~
创建步骤:看tomcat笔记中如何创建Maven环境的web项目
注意:
因为这里我们是以Maven新建的web-demo工程,之所以这个工程能导入很多包就是Maven管理项目的功劳, 当我们本地仓库没有该包的时候 就会去阿里云仓库帮我们下载该包供项目使用, 因此我们每次以Maven创建的项目都调一下本地仓库地址
2 & 3、创建:定义一个类,实现servlet接口 & 配置 加注解 配置Servlet的访问路径 :
注意: 加@Overide注解 报红的话:记得快速导入 在pom.xml文件当中导入注解依赖
4、访问:启动tomcat服务器,浏览器输入地址,访问该Servlet:
注意:这里我们也不用再重新配置tomcat到idea当中了,因为我们已经下载过插件,Tomcat服务器已经集成到idea当中了(如果tomcat服务器没有集成到idea当中 就需要先把tomcat服务器集成到idea当中 【方便作用】)
我们创建一个新工程或模块的时候:要注意有没有配置Maven (尽量该项目用自己的本地仓库或阿里云仓库 设置一下 ) 和 Tomcat服务器集成到idea当中(没有的话就看前面的笔记 配置到该工程当中)
启动tomcat服务器:
客户端访问服务器当中部署的web-demo项目中的 /demo1 路径下的资源:
二、Servlet 执行流程
改正:Servlet不是ServletDemo1,ServletDemo1只不过是实现的Servlet的一个类,本质上我们操作的是Servlet中的方法(只不过Servlet接口不能new对象 但被一个类重写全部的方法后就可以了 注意下面标注的Servlet:这里的Servlet就代表代码中的:ServletDemo1 是错误的 )
三、Servlet 生命周期
改正:Servlet就是实现Servlet的类 是错误的,就是Servlet,因为我们操作的就是Servlet中的方法,只不过Servlet是接口
我们下面对Servlet当中的方法进行演示详解:
1、init()方法:
* 作用:初始化对象的方法,完成一些如加载配置文件、创建连接等初始化工作,该方法只调用一次
* 1、调用时机:默认情况下,Servlet被第一次访问(请求)时,Tomcat服务器帮我们new ServletDemo2 对象* 调用Servlet中的init方法 ( 这里ServletDemo2 只不过是Servlet的一个过渡载体,因为Servlet是接口不能new对象)
* 2、调用次数:只调用1次,再访问该Servlet时就不会再调用该init方法
测试演示:
演示当我们服务器启动时就创建Servlet对象初始化init()方法:(也就是服务器启动后就把对象创建号并且调用了init方法 不再通过浏览器(客户端)访问一次后再调用了,增加了效率)
2、service()方法:
* 作用: 提供服务的作用,当浏览器访问Servlet的时候,都会调用Servlet中的service()方法对请求进行处理
* 调用次数:多次 ( 访问一次服务器当中的Servlet,就会调用一次Servlet当中的service方法 )
服务器开启状态的时候假设我们访问6次 演示如下:
3、destroy()方法:
* 销毁方法
* 1、调用时机:内存释放的时候或者服务器关闭的时候 Servlet对象会被销毁,就会调用该方法释放资源
* 2、调用次数: 一次 (因为对象只创建一次 new一次)
如果想演示destroy()销毁方法:需要是正常关闭tomcat服务器,正常关闭演示如下:(优化后的idea强制关闭也能显示destroy方法中的内容)
四、Servlet方法介绍 & 体系结构
后两个方法介绍:
package com.it.heima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* Servlet后两个方法介绍
*/
@WebServlet(urlPatterns = "/demo3",loadOnStartup = 1)
public class ServletDemo3 implements Servlet {
/**
* 定义一个全局变量 把ServletConfig对象赋给这个全局变量当中 然后供getServletConfig方法使用返回
*/
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig =servletConfig; // 把对象引用赋给全局变量引用
System.out.println("init .....");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(" hello world~ ");
}
@Override
public void destroy() {
System.out.println("destroy .....");
}
/**
* 这个方法一般我们返回 null 或者 空字符串 即可
* @return null or ""
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 这个方法是来获取ServletConfig对象的 ServletConfig这个对象是init()方法中的参数
* init()方法是被Tomcat服务器对象调用的,并且把ServletConfig 对象参数传入 init()方法当中
* 因此我们这个方法当中如果想返回 init()方法当中的对象(参数) 就需要写一个全局变量 把init()方法当中的对象赋上去
* 然后在这个 getServletConfig 方法当中返回即可 [ 如果不设定一个全局变量 肯定访问不到了 不设定的话那个对象只能在init()参数当中 ]
*
* @return
*/
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
}
会发现以上的方法当中我们最常用的也就是Servlet()方法 但是我们自定义的类实现Servlet接口的时候必须要重写接口当中的全部方法(5个) 显然有点麻烦, 所以我们下面学习Servlet 体系结构:就是专门对service方法的封装
Servlet 体系结构:
演示如下:
把注释搞懂,就知道了为什么用HttpServlet这个类 封装 Servlet接口中的service方法:
package com.it.heima.web;
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;
/**
* 这里就相当于单独对Servlet当中的service()方法的一个封装
* 等会会介绍HttpServlet的原理, 为什么要这样写service()方法
* 就是因为当用户端(浏览器)访问我们的服务器当中的Servlet资源的时候,其实service()方法当中也做了很多
* 对用户端数据的解析,解析是get请求还是post请求, get请求做什么逻辑,post请求做什么逻辑 要写很多
* 所以这里HttpServlet这个类就是对Servlet当中的service()方法的一个封装
* 当用户是以get请求方式请求服务器当中部署的资源的时候 就走HttpServlet类当中的doGet()方
* 法
* 当用户是以post请求方式请求服务器当中部署的资源的时候 就走HttpServlet类当中的doPost
* ()方法 这样就方便了很多
* 如果是在Servlet接口当中service()方法当中做处理客户端是以get还是post方式请求浏览器当中
* 的数据的话,还要做判断是否是get请求,是的话怎么怎么样.... 是否是post请求.... 太麻烦
* HttpServlet这个类直接搞成了两个分支 一个get请求分支 一个post请求分支 方便了很多
*/
@WebServlet("/demo4") // 访问路径
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get .....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(" post .....");
}
}
假设我们把这个web-demo项目部署到服务器当中,然后对"/demo4"路径进行访问 :
注意:直接在浏览器当中访问相对应的路径,这种默认是get请求方式 (就是说用户是以get请求方式请求)
接下来我们演示post请求方式请求项目当中的"/demo4"的资源:
我们需要写个表单 请求方式为post请求:
这里的a.html表单页面也相当于一个普通的浏览器(用户端)只不过这个页面是写出来的
提交后以post请求方式请求(这里的请求方式也可以写成get请求,写成get请求后就输出的是get.....了 ,因为调用的是doGet()方法了, 上面已经验证过了 ):
开启服务器进行访问a.html页面:下面的操作和get请求时一样的
原生的在Servlet接口中的service()方法当中的处理客户端的get和post请求:
因此我们用到了HttpServlet类进行封装该Servlet接口中的service()方法,进行处理客户端的get或者post请求
五、Servlet urlPattern配置
1、一个Servlet,可以配置多个urlPattern(访问路径)
演示如下:
客户端访问服务器当中部署的web-demo项目中的demo5路径下的资源演示如下(浏览器默认get请求方式 所以调用doGet()方法下的资源 ):
2、urlPattern配置规则
通常就是用精确匹配规则
精确匹配:
客户端访问该路径下资源(默认get请求):
目录匹配:也就是说客户端在输入URL的时候:/user/ 后面写什么都可以 都能访问到该路径下的资源
注意:如果我们有两个资源 一个是精确路径 为:/demo5/select 另一个资源是目录匹配路径为 :
/demo5/* 那么客户端如果想访问项目中的 /demo5/select 资源的话 会访问这两个中的哪个资源呢: 答案就是 /demo5/select 路径下的资源 (遵守最小范围规则,范围越小越访问)
六、WEB.XML配置Servlet
注:xml: 是web.xml
演示如下:
web.xml中配置Servlet中的访问路径:
这里面配的 /demo13 就相当于我们在资源上面 @WebServlet("/demo13") 访问路径 意义是一样的
服务器开启后把该项目部署到服务器当中 然后浏览器(客户端)访问该路径下的资源演示:
服务器开启并把项目部署到服务器:(用的是tomcat服务器插件 忘记的话看tomcat笔记)
客户端访问项目中上面写的 /demo13 路径下的资源: