Servlet入门入门讲解小白必看
学习目标
初步的了解Servlet的基本知识
学习内容
- 快速入门
- Servlet执行流程
- Servlet生命周期
- Servlet方法介绍
- Servlet体系结构
- Servlet urlPattern配置
- XML配置方式编写Servlet(了解)
学习知识点
Servlet快速入门
1、创建web项目,导入Servlet依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
其中的内容先copy使用
scope标签中的provided依赖环境是在编译环境和测试环境有效在运行环境无效。web项目打包成war包不会报错,因为tomcat中有servlet的jar包
2、创建:定义一个类,继承(implements) Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
输出的这句话后期可以作为测试使用
public class ServletDemo1 implements Servlet {
public void service(){}
}
3、配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1")
public class ServletDemo01 implements Servle{}
//此时注解中的/demo1,有对应的key值,key是value
// 有一个键值对,并且键是key时value可以省略
4、访问:启动Tomcat,浏览器输URL访问该Servlet
http://localhost:8080/web-demo/demo1
Servlet执行流程
http://localhost:8080/web-demo/demo1
- http://localhost:8080——>Apache TomCat的web服务器
- web-demo——>web项目(web-demo)
- demo1——>注解中value的值;
通过web服务器调用service()方法,每当访问该Servlet时都会在服务器面板上输出前面在其中输入的一句话
1、Servlet由谁创建?Servlet方法由谁调用?
Servlet由web服务器创建,Servlet方法由web服务器调用。
服务器怎么知道servlet中一定有service方法?
因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而servlet接口中有service方法
Servlet生命周期
- 对象的生命周期指一个对象从被创建到被销毁的整个过程。
- Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
@WebServlet(urlPattents = "/demo",loadOnStartup = 1)
此处使用了urlPattents,因为在WebServlet.class中有
String[] value() default {};
String[] urlPatterns() default {};
因为有两个键值对,可以用urlPattents代替value增加了阅读效率
loadOnStartup代表的是优先级,默认为-1
负整数:第一次被访问时创建Servlet对象
0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
2. 初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只会调用一次
/**
* 完成初始化的方法
* 1、调用时机:默认情况下Servlet第一次被访问的时候,调用
* 2、调用次数:1次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init....");
}
3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
/**
* 提供服务
* 1、调用时机:每一次Servlet被访问时
* 2、调用次数:多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world");
}
4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
/**
* 销毁方法
* 1、调用时机:在Servlet被销毁的时候
*(内存释放时,服务器被关闭时,Servlet会被销毁)
* 2、调用次数:1次
*/
@Override
public void destroy() {
System.out.println("destroy...") ;
Servlet方法介绍
javaee7_api.CHM百度网盘提取链接 提取码:0160
初始化方法,在Servlet被创建时执行,只执行一次(已介绍)
void init(ServletConfig config)
提供服务方法,每次Servlet被访问,都会调用该方法(已介绍)
void service(ServletRequest req, ServletResponse res)
销毁方法,当servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet(已介绍)
void destroy()
获取ServletConfig对象
ServletConfig getServletConfig()
获取Servlet信息
String getServletlnfo()
getServletlnfo()方法
@Override
public ServletConfig getServletConfig() {
return null;
//可以返回null可以返回"" (空字符串)
}
getServletConfig()方法
@Override
public ServletConfig getServletConfig() {
return null;
}
在init()方法中里面的参数是返回的是ServletConfig类型
此刻的需求是在getServletConfig()方法中使用init()方法的局部变量,只需要将init()局部变量作用域提升,提升到成员变量的位置,将来的作用域整个类里面都可以使用
class类中增加
private ServletConfig config;
在init()方法中需要进行赋值
//添加
this.config = config;
//当前局部变量config的值赋值给成员变量config
赋值后在getServletConfig()方中返回即可
return config;
Servlet体系结构
Servlet——>Servlet体系根接口
Genericservlet——>Servlet抽象类
Httpservlet——>对HTTP协议封装的Servlet实现类
我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet
@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...");
}
}
doGet()方法
在浏览器上访问URL:http://localhost:8080/web-demo/demo4,相当与是get请求,会输出get…
doPost()方法,在webapp中创建一个html文件,里面写一个form表单,method指定为post方式
<form action="/web-demo/demo4" method="post">
<input type="text" name="username">
<input type="submit">
</form>
在input中输入然后提交
在idea界面会出现post…,说明调用了doPost()方法
思考
1、HttpServlet中为什么要根据请求方式的不同,调用不同方法?
post和get请求请求参数的位置不同
1、post提交的请求参数在请求体里
2、get提交的请求参数在请求行中
2、如何调用
在service()方法中不同的请求方式,进行分别的处理
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//根据请求方式的不同,进行分别的处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1、获取请求方式
String method = request.getMethod();
//2、判断请求方式是get还是post
if ("GET".equals(method)){
//get方式的处理逻辑
}else if ("POST".equals(method)){
//post方式的处理逻辑
}
}
可以另外写个MyHttpServlet文件,在里面写方法,以后可以直接调用
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
}
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//根据请求方式的不同,进行分别的处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1、获取请求方式
String method = request.getMethod();
//2、判断请求方式是get还是post
if ("GET".equals(method)){
//get方式的处理逻辑
doGet(servletRequest,servletResponse);
}else if ("POST".equals(method)){
//post方式的处理逻辑
doPost(servletRequest,servletResponse);
}
}
如果是直接copy的话,在MyHttpServlet上面不要加@WebServlet注解,会产生冲突
新写一个ServletDemo5不需要重新写,直接继承MyHttpServlet
例如:
@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet{
@Override
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("get...");
}
@Override
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("post");
}
}
用上面的方法验证依旧可以在IDE上得出输出结果
自己写MyHttpServlet,通过继承的方式重写doGet()和doPost()方法,将1.html中的form表单中的action改成/web-demo/demo5进行验证
我们自己写的MyHttpServlet实现了 对HTTP协议的封装,并且根据不同的请求方式,完成了方法的分发
总结:获取请求方式,然后做不同的逻辑判断
HttpServlet使用步骤
- 继承HttpServlet
- 重写doGet和doPost方法
HttpServlet原理
- 获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
Servlet urlPattern配置
Servlet想要被访问,必须配置其访问路径(urlPattern)
-
1、urlPattern配置规则
-
@WebServlet(urlPatterns={"/demo1","/demo2"})
2、urlPattern配置规则
-
精准匹配
- 目录匹配
-
精确匹配的优先级高于目录匹配
- 扩展名匹配
- 任意匹配
![在这里插入图片描述](https://img-blog.csdnimg.cn/c400cd26127c4be7958b2f0435430eeb.png)
/* 的优先级高于 /
/ 和 /****区别:
当我们的项目中的Servlet配置了“/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet>
当我们的项目中配置了“/ *”,意味着匹配任意访问路径
XML配置方式编写Servlet(了解)
Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持XML 配置文件的配置方式
步骤:
- 编写Servlet类
- 在web.xml中配置该Servlet
老版本的,不推荐使用,可以直接使用注解
<!--
Servlet 全类名
-->
<servlet>
<servlet-name>demo7</servlet-name>
<servlet-class>zpd.web.ServletDemo7</servlet-class>
</servlet>
<!--
Servlet 访问路径
-->
<servlet-mapping>
<servlet-name>demo7</servlet-name>
<url-pattern>/demo7</url-pattern>
</servlet-mapping>
Java新人,正努力学习中,向大牛看齐,有错误请提出,谢谢