学习Servlet (Servlet的实现方式1)
目录
前言
实现javax.servlet.Servlet接口
步骤
0 创建web项目
1 导入 jar包编辑
2 创建Servlet类实现这个接口
可能遇到的问题:
0 发现:大家看到这里是不是有些疑惑:没有创建AServlet对象
1 但现在问题来了,这里url 是怎么访问到对应的Servlet类呢?
2 那应该怎么指定首页呢?
3 服务器启动成功后,怎么看Servlet 是否被创建呢?
4 xml配置文件中添加初始化参数,怎么写到控制台中(了解)
小结
前言
上一篇简单的介绍了,Servlet的含义和作用。本篇博客,介绍Servlet 的第一种实现方式
核心是掌握第三种创建方式:继承javax.servlet.http.HttpServlet类;
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;
它们三者的关系是
如图所示:
GenericServlet类,HttpServlet类 都是Servlet接口的实现类
HttpServlet类作为子类 是继承GenericServlet类这个抽象类的
实现javax.servlet.Servlet接口
通过下面的理解,知道
Servlet对象创建,不需要手动创建,由服务器自动创建,销毁的时候,由服务器自动销毁
init(), service(), destroy()都由服务器自动调用,:称为生命周期方法 。但是,在服务器关闭的时候,不会调用destroy()方法
步骤
0 创建web项目
如有不会的可以看我的博客:
【IDEA创建Web项目(详细版) - CSDN App】https://blog.csdn.net/m0_74124657/article/details/142434089?sharetype=blog&shareId=142434089&sharerefer=APP&sharesource=m0_74124657&sharefrom=link
我写的html网页
1 导入 jar包
我放在百度网盘,大家自行获取 。通过百度网盘分享的文件:Servlet创建
链接:https://pan.baidu.com/s/1sQ8o6yB-0qVtzxZ42xaUaA
提取码:9dcr
2 创建Servlet类实现这个接口
总的代码如下:
package fs;import javax.servlet.*;
import java.io.IOException;
/*
Servlet 第一个创建方法:实现 Servlet 接口
Servlet对象创建,不需要手动创建,由服务器自动创建,销毁的时候,由服务器自动销毁
init(), service(), destroy()都由服务器自动调用,:称为生命周期方法 。但是,在服务器关闭的时候,不会调用destroy()方法*/
public class AServlet implements Servlet {/*** 初始化方法,在服务器启动的时候,会自动调用init方法,只会调用一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("AServlet出生了....");}/*** 获取Servlet的相关配置* @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 服务方法:处理客户端请求的方法* 客户端请求多少次,该方法就会执行多少次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("很高兴为你服务");}/*** 获取Servlet的描述信息:不重要* @return*/@Overridepublic String getServletInfo() {return "我是。。。。。。。。。。。。。";}/*** 回收方法,服务器关闭的时候,会自动调用该方法,只会调用一次*/@Overridepublic void destroy() {System.out.println("AServlet被回收了");}
}
具体介绍每一个方法的作用:
- init方法:创建Servlet对象 第一个调用的方法,完成初始化
- service 方法:具体执行方法:当客户端请求多少次,该方法就执行了多少次
- getServletConfig()方法:添加Servlet配置
- destroy():回收方法,当服务器关闭时,会调用该方法,释放在内存中因Servlet创建占用的资源
可能遇到的问题:
- 大家看到这里是不是有些疑惑:没有创建AServlet对象
- 但现在问题来了,这里url 是怎么访问到对应的Servlet类呢?
- 那应该怎么指定首页呢?
- 服务器启动成功后,怎么看Servlet 是否被创建呢?
- xml配置文件中添加初始化参数,怎么写到控制台中(了解)
0 发现:大家看到这里是不是有些疑惑:没有创建AServlet对象
之间我们学习Java时,知道new 一个 就行。这里之所以没有使用关键字 new
原因:当我们启动tomcat 时,在浏览器中通过url通过访问Servlet 会自动创建一个Servlet 对象
1 但现在问题来了,这里url 是怎么访问到对应的Servlet类呢?
解决办法: 在xml配置文件中添加
具体代码如下:
第一个标签:表示你创建的类名和类路径
第一个标签:你要关联的类和通过url路径 访问这个指定类 如下面这个 /a
<!-- 配置AServlet--> <!-- 给Servlet起一个名字,推荐类名--><servlet><servlet-name>AServlet</servlet-name> <!-- 对应在AServle中的路径:包名.类名--><servlet-class>fs.AServlet</servlet-class></servlet><servlet-mapping><servlet-name>AServlet</servlet-name><url-pattern>/a</url-pattern></servlet-mapping>
前期工作完成了,现在开始启动服务器
出现如上图所示:表示服务器启动成功!,之后你指定的的浏览器,会向你展示第一个界面
我称之为首页(欢迎界面)。默认的首页为 index.html 。
如果你没有创建 会报一个404 表示找不到首页。这并不是说你出现了问题,不用担心。
2 那应该怎么指定首页呢?
解决办法:打开编辑配置,看到url 后添加 ,完成后点击确定
3 服务器启动成功后,怎么看Servlet 是否被创建呢?
向浏览器中添加url 路径去访问Servlet 类 。我们知道之前我们在xml配置文件中指定 /a 指定我们创建的AServlet类
IDEA控制台发现,AServlet对象创建成功
4 xml配置文件中添加初始化参数,怎么写到控制台中(了解)
xml配置文件中
使用键值对的方式,表示初始化参数 key-value
<servlet><servlet-name>AServlet</servlet-name> <!-- 对应在AServle中的路径:包名.类名--><servlet-class>fs.AServlet</servlet-class><init-param> <!-- 初始化参数--><param-name>key</param-name><param-value>value</param-value></init-param></servlet>
我们知道
代码如下
如果我在init()方法中,获得ServletConfig 对象 是比较简单的。原因是 当我们访问Servlet 时,服务器会自动创建ServletConfig 对象
但如果我想要在service 方法中 获得ServletConfig 对象,再调用方法读取初始化参数
步骤如下
- 我们需要一个成员变量存储ServletConfig 对象
- 使用 getServletConfig() 获得 ServletConfig 对象/ 直接使用这个成员变量也行
我是写在service方法中并且使用 getServletConfig() 获得 ServletConfig 对象
总的代码如下
package fs;import javax.servlet.*; import java.io.IOException; import java.util.Enumeration;/* Servlet 第一个创建方法:实现 Servlet 接口 Servlet对象创建,不需要手动创建,由服务器自动创建,销毁的时候,由服务器自动销毁 init(), service(), destroy()都由服务器自动调用,:称为生命周期方法 。但是,在服务器关闭的时候,不会调用destroy()方法*/ public class AServlet implements Servlet {private ServletConfig config;/*** 初始化方法,在服务器启动的时候,会自动调用init方法,只会调用一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("AServlet出生了....");this.config = servletConfig;}/*** 获取Servlet的相关配置* @return*/@Overridepublic ServletConfig getServletConfig() {return this.config;}/*** 服务方法:处理客户端请求的方法* 客户端请求多少次,该方法就会执行多少次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("很高兴为你服务");System.out.println(this.getServletConfig().getInitParameter("key"));System.out.println("-----------------------------------------------");Enumeration<String> init = this.getServletConfig().getInitParameterNames();while (init.hasMoreElements()){String key = init.nextElement();String value = this.getServletConfig().getInitParameter(key);System.out.println(key+"--"+value);}}/*** 获取Servlet的描述信息:不重要* @return*/@Overridepublic String getServletInfo() {return "我是。。。。。。。。。。。。。";}/*** 回收方法,服务器关闭的时候,会自动调用该方法,只会调用一次*/@Overridepublic void destroy() {System.out.println("AServlet被回收了");} }
启动服务器
并且你访问几次AServlet ,就会调用几次 service方法
我现在多次刷新浏览器,发现
现在关闭服务器,调用destroy方法 ,Servlet对象就不存在,并且释放在内存中的空间
小结
本篇主要介绍了第一种创建Servlet 对象的方式。剩下的两种创建方式,我会在下篇博客详细介绍