JavaWeb学习--Servlet的创建方法、Servlet的生命周期(重要)
目录
方式三:继承HttpServlet类, 专门处理http请求
(一)什么是Servlet
Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据;
处理请求;
完成响应。
WEB开发,客户端与服务器: 一问一答 请求-响应
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
(二)Servlet实现方式
在实际开发中, Servlet需要程序员进行开发
实现Servlet有三种方式
实现javax.servlet.Servlet接口
继承javax.servlet.GenericServlet类;
继承javax.servlet.http.HttpServlet类(后期都是这个)
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
方式一:实现javax.sevlet.Servlet接口
1.创建一个java文件,实现Servlet接口
Servlet对象创建,不需要程序员手动创建 new, 而是由Tomcat服务器创建
init(), service(),destroy() 三个方法调用, 由Tomcat服务器调用,称为生命周期方法package com.fs.study.web; import javax.servlet.*; import java.io.IOException; import java.util.Enumeration; /** * Servlet的第一种实现方式: 实现Servlet接口 * Servlet对象创建,不需要程序员手动创建 new, 而是由Tomcat服务器创建 * init(), service(),destroy() 三个方法调用, 由Tomcat服务器调用,称为生命周期方法 */ public class AServlet implements Servlet { private ServletConfig config; /** * 初始化方法, Servlet类的对象创建之后, 调用init() 只执行一次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("Servlet出生..."); this.config = servletConfig; } /** * 获取Servlet相关的配置 * @return */ @Override public ServletConfig getServletConfig() { return this.config; } /** * 服务方法: 处理客户端请求的方法 * 客户端每请求该Servlet一次, service() 方法就执行一次 执行n次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("很高兴为您服务..."); //获取初始化参数:使用ServletConfig对象的方法 System.out.println(this.config.getInitParameter("k1")); //获取所有初始化参数的名字,使用ServletConfig对象的方法 Enumeration<String> initParameterNames = this.config.getInitParameterNames(); while(initParameterNames.hasMoreElements()){ String key=initParameterNames.nextElement(); String value=this.config.getInitParameter(key); } } /** * 返回Servlet描述信息, 无关紧要 * @return */ @Override public String getServletInfo() { return "你好,我是一个Servlet!!"; } /** * 销毁方法, 当该Servlet被销毁之前,即关闭tomcat服务器之后调用该方法 只执行一次 */ @Override public void destroy() { System.out.println("拜拜"); } }
init()初始化方法:Servlet类的对象创建之后, 调用init(),在servlet的生命周期里只执行一次
service()服务方法: 处理客户端请求的方法,客户端每请求该Servlet一次,service() 方法就执行一次,总共执行n次
destroy()销毁方法:当该Servlet被销毁之前,即关闭tomcat服务器之后调用该方法,只执行一次
2. 需要在web.xml中对Servlet进行配置
<!--配置AServlet--> <servlet> <!--给Servlet类取一个名字, 推荐写类名 --> <servlet-name>AServlet</servlet-name> <!--对应Servlet类, 写的Servlet的包.类名--> <servlet-class>com.fs.study.web.AServlet</servlet-class> <!--初始化参数--> <init-param> <param-name>k1</param-name> <param-value>v1</param-value> </init-param> <init-param> <param-name>k2</param-name> <param-value>v2</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <!--通过servlet-name关联servlet标签 --> <servlet-name>AServlet</servlet-name> <!--配置servlet绑定的url: 第一种写法: /url字符串 推荐写 /类名 --> <url-pattern>/AServlet</url-pattern> </servlet-mapping>
在web.xml中配置Servlet的目的其实只有一个,就是把访问路径与一个Servlet绑定到一起,上面配置是把访问路径:“/AServlet”与“com.fs.study.web.AServlet”绑定到一起。
<servlet>
:指定AServlet这个Servlet的名称为AServlet;
<servlet-mapping>
:指定/AServlet访问路径所以访问的Servlet名为AServlet。
<servlet>
和<servlet-mapping>
通过<servlet-name>
这个元素关联在一起了!在Servlet获取初始化参数
3.Servlet的生命周期
所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:
void init(ServletConfig);
void service(ServletRequest,ServletResponse);
void destroy();
Servlet的出生
服务器会在Servlet 第一次被访问时创建Servlet ,或者是在 服务器启动时创建Servlet 。 如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。
在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住, Servlet出生后马上就会调用init()方法,而且一个Servlet的一生 。 这个方法只会被调用一次。这好比小孩子出生后马上就要去剪脐带一样,而且剪脐带一生只有一次。
我们可以把一些对Servlet的初始化工作放到init方法中!
Servlet服务
当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。 服务器接收到一次请求,就会调用service() 方法一次 ,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!
ServletRequest: 请求对象 核心对象
ServletResponse: 响应对象 核心对象
每请求一次, tomcat为该次请求创建一个ServletRequest对象,ServletResponse对象
Servlet的离去
Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。
出生:
服务:
离去:
方式二:继承GenericServlet
GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。GenericServlet类帮我们把其他四个方法都实现类, 只留下一个抽象service() 让我们重写,下面是编写Servlet类继承GenericServlet的源代码:
/** * Serclet第二种实现方式:继承GenericServlet类 */ public class BServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("BServlet 为您服务^_^"); } }
GenericServlet类的源代码:
package javax.servlet; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { private static final long serialVersionUID = 1L; private transient ServletConfig config; public GenericServlet() { } public void destroy() { } public String getInitParameter(String name) { return this.getServletConfig().getInitParameter(name); } public Enumeration<String> getInitParameterNames() { return this.getServletConfig().getInitParameterNames(); } public ServletConfig getServletConfig() { return this.config; } public ServletContext getServletContext() { return this.getServletConfig().getServletContext(); } public String getServletInfo() { return ""; } public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } public void init() throws ServletException { } public void log(String msg) { this.getServletContext().log(this.getServletName() + ": " + msg); } public void log(String message, Throwable t) { this.getServletContext().log(this.getServletName() + ": " + message, t); } public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; public String getServletName() { return this.config.getServletName(); } }
实现了Servlet的init(ServletConfig)方法,把参数config赋给了本类的成员config,然后再调用本类自己的无参的init()方法。
init()
这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化作用就不要再重复init(ServletConfig)方法了,而是应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。
方式三:继承HttpServlet类, 专门处理http请求
http请求中,提交方式: get请求, post请求, put请求, delete请求….
HttpServlet类专门提供处理指定提交方式的方法:
- doGet() 处理get请求
- doPost() 处理post请求
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。
Get请求:
直接在浏览器地址栏输入网址
使用
<a href=""/>
也是get请求使用提交表单
form
, method没有写, 写getpost请求:
使用提交表单
form
, method =“post”
get请求,post请求区别:
- get请求,请求参数通过url传递, post请求: 通过请求体传递参数
- get请求不安全, 有敏感字段, 一定不能使用get, post请求安全一些
- get请求无法传递文件参数, 提交文件必须使用post请求
- get请求参数有大小限制: 4KB, post请求没有限制
Servlet基于xml配置
web3.0版本, 提供注解替换xml配置 @WebServlet(“绑定url”)
原文地址:https://blog.csdn.net/2301_76890677/article/details/144325961
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!