【JavaWeb】Servlet详解
创始人
2024-05-30 06:56:13
0

文章目录

  • 1. 前置知识
  • 2.servlet生命周期
    • 2.1 默认情况下,服务器启动时,servlet对象并没有被创建
    • 2.2 用户执行一次请求
    • 2.3用户执行第二次请求
    • 2.4 3,4,5,6....次请求
    • 2.5 关闭服务器
  • 3.servlet方法解析
  • 4.适配器模式改造servlet
    • 4.1不使用servlet模式
    • 4.2使用适配器模式
  • 5.GenericServlet
  • 6.ServletConfig详解
  • 7.ServletConfig接口有四个方法
  • 8.ServletContext
  • 9.HttpServlet

1. 前置知识

  • 服务器启动时,servlet对象是否被创建出来?
package com.sdnu.javaweb;import jakarta.servlet.*;import java.io.IOException;/*** 实现servlet接口** @author Beyong* @date 2023/03/03 20:44**/
public class AServlet implements Servlet {public AServlet() {System.out.println("A的无参构造方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}
package com.sdnu.javaweb;import jakarta.servlet.*;import java.io.IOException;/*** 实现Servlet** @author Beyong* @date 2023/03/03 20:49**/
public class BServlet implements Servlet {public BServlet() {System.out.println("B的无参构造方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

aServletcom.sdnu.javaweb.AServletaServlet/abServletcom.sdnu.javaweb.BServletbServlet/b

在这里插入图片描述
在控制台发现没有执行构造方法,说明服务器启动的时候,构造方法没有执行。

  • 如何使得服务器启动的时候,创建servlet对象
    在这里插入图片描述
    在代码中添加
数字

数字越小,则优先级越高。

2.servlet生命周期

package com.sdnu.javaweb;import jakarta.servlet.*;import java.io.IOException;/*** 实现servlet接口** @author Beyong* @date 2023/03/03 20:44**/
public class AServlet implements Servlet {public AServlet() {System.out.println("A的无参构造方法");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("AServlet'init method execute");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("AServlet'service method execute");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("AServlet'destroy method execute ");}
}

2.1 默认情况下,服务器启动时,servlet对象并没有被创建

2.2 用户执行一次请求

在这里插入图片描述
结论:

  • 用户在第一次请求的时候,Servlet对象被实例化,AServlet的构造方法被执行,并且执行的是无参构造。
  • AServlet对象被创建出来后,AServlet马上执行init方法
  • 第一次请求时,init方法执行后,马上执行service方法

2.3用户执行第二次请求

控制台输出:

AServlet’service method execute

2.4 3,4,5,6…次请求

后面的请求,Servlet对象并没有创建,而是使用之前的创建好的Servlet对象,调用该对象的方法。

  • servlet对象是单例的,但是servlet类不符合单例模式(假单例)。

  • 无参构造方法只执行一次,init方法也只执行一次,即第一次。

  • 只要用户发送请求,service必然执行。

2.5 关闭服务器

在这里插入图片描述
服务器在关闭前,执行servlet对象的destroy方法,destroy方法执行结束后,AServlet对象的才会被销毁,AServlet对象内存才会释放。

3.servlet方法解析

  • 构造方法
    javaweb不建议手动编写构造方法,因为手动编写构造方法容易导致错误,所以init方法很有必要。
  • init
    很少有,使用在初始化的时候,使用初始化数据连接池,线程池。
  • service
    一定要有,处理用户的请求。
  • destroy
    进行资源关闭。

4.适配器模式改造servlet

4.1不使用servlet模式

接口

package com.sdnu.javaweb.adapter;/*** 接口* @author Beyong* @date 2023/03/04 11:08**/
public interface MyInterface {void m1();void m2();void m3();void m4();void m5();void m6();void m7();void core();
}

UserService:

package com.sdnu.javaweb.adapter;/*** 用户** @author Beyong* @date 2023/03/04 11:10**/
public class UserService implements MyInterface{@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}@Overridepublic void core() {System.out.println("UserService'core method execute!!!");}
}

CustomerService:

package com.sdnu.javaweb.adapter;/*** CustomerService** @author Beyong* @date 2023/03/04 11:13**/
public class CustomerService implements MyInterface{@Overridepublic void m1() {}@Overridepublic void m2() {System.out.println("Customer'm2 method execute");}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}@Overridepublic void core() {}
}

不使用适配器模式下,则代码每一个service都要取实现接口。

4.2使用适配器模式

接口:

package com.sdnu.javaweb.adapter2;/*** 接口* @author Beyong* @date 2023/03/04 11:24**/
public interface MyInterface {void m1();void m2();void m3();void m4();void m5();void m6();void m7();void core();
}

用户适配器:

package com.sdnu.javaweb.adapter2;/*** UserService适配器** @author Beyong* @date 2023/03/04 11:26**/
public abstract class UserAdapter implements MyInterface{@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}public abstract void core();
}

顾客适配器:

package com.sdnu.javaweb.adapter2;/*** 客户适配器** @author Beyong* @date 2023/03/04 11:28**/
public abstract class CustomerAdapter implements MyInterface{public abstract void m1();@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}@Overridepublic void m5() {}@Overridepublic void m6() {}@Overridepublic void m7() {}@Overridepublic void core() {}
}

用户:

package com.sdnu.javaweb.adapter2;/*** 普通用户** @author Beyong* @date 2023/03/04 11:34**/
public class UserService extends UserAdapter{@Overridepublic void core() {}
}

顾客:

package com.sdnu.javaweb.adapter2;/*** 顾客** @author Beyong* @date 2023/03/04 11:35**/
public class CustomerService extends CustomerAdapter{@Overridepublic void m1() {}
}

5.GenericServlet

我们写一个通用的GenericServlet

package com.sdnu.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;/*** servlet适配器** @author Beyong* @date 2023/03/04 11:48**/
public abstract class GenericServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse);@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

LoginServlet

package com.sdnu.javaweb.servlet;import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;/*** c的servlet** @author Beyong* @date 2023/03/04 11:49**/
public class LoginServlet extends GenericServlet{@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) {System.out.println("c'service method execute");}
}

web.xml

    loginServletcom.sdnu.javaweb.servlet.LoginServletloginServlet/login

地址:http://127.0.0.1:8080/lifecycle/login
在这里插入图片描述

进一步改造:

package com.sdnu.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;/*** servlet适配器** @author Beyong* @date 2023/03/04 11:48**/
public abstract class GenericServlet implements Servlet {private ServletConfig config;@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;this.init();}/*** 这个init方法供子类重写*/public void init(){}@Overridepublic ServletConfig getServletConfig() {return null;}public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

6.ServletConfig详解

  • 什么是ServletConfig
    ServletConfig是Servlet规范中的一员。
  • Tomcat实现了ServletConfig接口
  • 一个Servlet对应一个ServletConfig
  • Servlet对象是Tomcat创建的,同时创建了ServletConfig.
  • 创建一个Servelt对象,就有一个ServletConfig(Servlet对象信息)。
  • Tomcat解析web.xml文件,将web.xml文件中
 

标签中的配置信息自动包装到ServletConfig对象中去。

  • ServletConfjg有哪些方法?
    getInitParameterNames
    getInitParameter
package com.sdnu.javaweb.servlet;import jakarta.servlet.*;
import sun.plugin2.util.ParameterNames;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;/*** servletConfig测试2** @author Beyong* @date 2023/03/06 13:05**/
public class ConfigServletTest2 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {servletResponse.setContentType("text/html");PrintWriter out = servletResponse.getWriter();ServletConfig config = this.getServletConfig();out.print("servletConfig对象是:" + config.toString());out.print("
");String servletName = config.getServletName();out.print("" + servletName + "");out.print("
");Enumeration initParameterNames = config.getInitParameterNames();while(initParameterNames.hasMoreElements()){String parameterName = initParameterNames.nextElement();String parameterVal = config.getInitParameter(parameterName);out.print(parameterName + "=" + parameterVal);out.print("
");}String driver = config.getInitParameter("driver");out.print(driver);// Enumeration names = this.getInitParameterNames(); // while(names.hasMoreElements()){ // String name = names.nextElement(); // String value = this.getInitParameter(name); // out.print(name + " = " + value); // out.print("
"); // }} }

configTestcom.sdnu.javaweb.servlet.ConfigServletTestconfigTest/testconfigTest2com.sdnu.javaweb.servlet.ConfigServletTest2drivercom.mysql.cj.jdbc.Driverurljdbc:mysql://localhost:3306/sdnuuserrootpasswordroot123configTest2/test2

7.ServletConfig接口有四个方法

  • public String getInitParameter(String name);
  • public Enumeration getInitParameterNames();
  • public ServletContext getServletContext();
  • public String getServletName();
    以上四个方法可以在自己编写的Servlet类中使用this调用,这个Servlet继承了GenericServlet

8.ServletContext

  • ServletContext是接口,是Servlet规范的一员。
  • Tomcat实现了ServletContext接口。
  • ServletContext是服务器创建的,在服务器启动的时候创建,在服务器关闭的时候销毁,对于一个WebApp来说,ServletContext只有一个。
  • ServletContext对象对应整个web.xml。
  • ServletContext接口的方法:
    (1)
Enumeration initParameterNames = application.getInitParameterNames();
String value = application.getInitParameter(name);

以上两个方法获取context-param标签中的name和value

    startIndex2

(2获取应用的根路径

String contextPath = application.getContextPath();

在这里插入图片描述
(3)获取文件的绝对路径

public String getRealPath(String path)

(4)访问日志

public void log(String message);
public void log(String message, Throwable t);

Tomcat服务器的Log目录下都有哪些日志信息?

catalina.2023-02-28.log 服务器的java程序运行的控制信息
localhost.2023-03-07.log ServletContext对象的log方法记录的日志存储到这个文件中
localhost_access_log.2023-02-28.txt 访问日志

  • ServletContext又叫应用域,放到ServletContext中的数据一般是数据量小,所以用户共享的,不经常修改的。

存:public void setAttribute(String name, Object value);
取:public void getAttribute(String name);
删:public void removeAttribute(String name);

User user = new User("jack", "123456");
application.setAttribute("UserObj", user);
Object userObj = application.getAttribute("UserObj");
out.print(userObj);
out.print("
");

9.HttpServlet

jakarta.servlet.Servlet 【接口】
jakarta.servlet.GenericServlet implements Servlet 【抽象类】
jakarta.servlet.http.HttpServlet extends GenericServlet 【类】

以后编写程序继承HttpServlet

在这里插入图片描述

作者:Beyong    
出处:Beyong博客
github地址:https://github.com/beyong2019

本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。

相关内容

热门资讯

氢能正成为六盘水高质量发展新引... 转自:贵州日报 本报讯(记者 尚宇杰 顾冰洁 郭立)5月10日,六盘水氢能示范应用暨美锦华宇煤焦氢二...
川报早读丨9月见 “金熊猫”在... 转自:四川日报 今年是中国与意大利建交55周年,近日,“...
全市防汛抗旱工作会议召开 来源:无锡日报全市防汛抗旱工作会议召开进一步强化风险意识底线思维 严阵以待打好防灾保安主动仗  5月...
老街区 新活力 转自:贵州日报4月19日,黔东南州黎平县肇兴侗寨开展的传统民俗巡游活动,独具魅力。贵州日报天眼新闻记...
微风露台品人生 日落西山,余霞成绮,轻柔的晚风掠过600年古树梢,拂过天坛祈年殿的鎏金宝顶,抚上观坛露台上人们的脸颊...
辽宁:造船业破浪前行 大连船舶重工集团有限公司码头,大型LNG运输船正在建造。 辽宁日报特约记者 王华 摄  近日,“绿色...
王毅同巴基斯坦副总理兼外长达尔... 转自:新华社新华社北京5月10日电 2025年5月10日,中共中央政治局委员、外交部长王毅应约同巴...
贵阳市南明区着力推进国家特殊教... 转自:贵州日报 本报讯(记者 谌贵璇)贵阳市南明区自今年2月获批“国家特殊教育改革实验区”以来,围绕...
推动统一大市场先行区建设 2023年,广东省与国家市场监督管理总局在广州签署合作框架协议,共同建设粤港澳大湾区统一大市场公平竞...
一条越走越宽广的大道 转自:贵州日报 新华社记者 郝薇薇 杨依军又一次飞越亚欧大陆,又一次走进满目春色的莫斯科。在和煦的阳...
匠心守护放心药 转自:辽宁日报 本报记者 许蔚冰 人民大会堂金色穹顶下,姜婷胸前的五一劳动奖章闪耀着光芒。这位来自本...
当多日游只需一张票 正是旅游好时节。广西南宁青秀山公园、贵州安顺黄果树瀑布、湖南张家界国家森林公园等知名5A级景区,不约...
把“中国奶瓶”牢握在手 今年2月份,参加完民营企业座谈会,黑龙江飞鹤乳业有限公司董事长冷友斌倍感振奋。他说,“会议强调要坚定...
咖啡远行记 咖啡是全球第二大饮品。据统计,全球平均每天约消耗22.5亿杯咖啡。从清晨唤醒都市的第一缕醇香到横跨五...
巴基斯坦外交部:巴方对印度侵略... 转自:新华社新华社伊斯兰堡5月10日电(记者杨恺)巴基斯坦外交部10日发表声明说,为了地区和平与稳定...
我省首届中小学人工智能教育活动... 转自:辽宁日报 本报讯 记者白昊报道 5月10日,我省首届中小学人工智能教育活动周在沈阳启动,亮点纷...
沈阳“5G-A”商用一年 网速... 转自:沈阳日报  最近有一些沈阳市民发现自己手机上的信号栏,5G标识后面多了个字母“A”。5G-A是...
“科转沈阳”赋智惠企活动加速科... 转自:沈阳日报  5月9日,2025“科转沈阳”赋智惠企高校院所科技成果路演浑南区专场活动,在浑南科...
辉山街道举办2025年春季高校... 转自:沈阳日报  本报讯(沈阳日报、沈报全媒体记者李莉)5月9日,沈北新区辉山街道与辽宁装备职业技术...
伊朗外长:伊朗坚持和平利用核能... 转自:新华社新华社多哈5月10日电(记者汪强 陈霄)伊朗外长阿拉格齐10日在多哈出席第四届阿拉伯-伊...