Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)

2024-06-11 20:12

本文主要是介绍Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Servlet技术(Servlet,ServletConfig,ServletContext)

1.Servlet的概述

Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写。与Java程序的区别是,Servlet 对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器(Tomcat)的支持。

  • Servlet接口的方法(javax.servlet.Servlet)
Servlet,ServletConfig,ServletContext --> GenericServlet
--> HttpServlet(实现Http请求) --> 自定义Servlet
方法声明功能描述
void init(ServletConfig config)Servlet实例化后,Servlet容器调用该方法完成初始化工作
void service (ServletRequest req,ServletResponse resp)负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调用此方法。在service()方法中,可以通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息
void destroy()负责释放Servlet对象占用的资源。当服务器关闭或者Servlet对象被移除时,Servlet对象会被销毁,容器会调用此方法
ServletConfig getServletConfig()用于获取Servlet对象的配置信息,返回Servlet的ServletConfig对象
String getServletInfo()返回一个字符串,其中包含关于Servlet的信息,例如,作者、版本和版权等信息
  • 继承HttpServlet的自定义Servlet
@WebServlet("/TextServlet01")
public class TextServlet01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • Servlet的配置

1.web.xml配置Servlet

:用来定义Servlet的名字

:用来定义Servlet类的位置,包括包名和类名

:用来定义Servlet的映射路径,它有两个属性表示要映射的Servlet的名字,表示要映射的路径,要映射的路径前要加"/",表示相对于Tomcat的位置

<servlet><servlet-name>TextServlet01</servlet-name><servlet-class>com.tyut.TextServlet01</servlet-class>
</servlet><servlet-mapping><servlet-name>TextServlet01</servlet-name><url-pattern>/servlet/TextServlet01</url-pattern>
</servlet-mapping>

2.@WebServlet配置Servlet

@WebServlet 注解用于代替web.xml文件中的等标签,该注解将会在项目部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。可以标注在任意一个继承HttpServlet的类上

属性声明功能描述
String name指定Servlet的name属性,等价于。如果没有显式指定,则该 Servlet的取值即为类的全限定名。
String[] value该属性等价于urlPatterns属性。urlPatterns和value属性不能同时使用,同时存在是忽略value的值。
String[] urlPatterns指定一组Servlet的URL匹配模式。等价于标签。
InitParam[]指定一组Servlet初始化参数,等价于标签。
@WebServlet(name = "TextServlet01", urlPatterns = {"/TextServlet01", "/textServlet01"})
  • Servlet的生命周期

image-20240610202703908

当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。之后访问Servlet,每一个请求作为一个线程,Servlet对象不会再次创建
/*** Servlet的生命周期*/
@WebServlet(name = "TextServlet02", urlPatterns = "/textServlet02")
public class TextServlet02 extends GenericServlet {public void init(ServletConfig servletConfig) {System.out.println("Servlet is called");}public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("hello Servlet!!!");}public void destroy() {System.out.println("Servlet is destroyed");}
}

2.ServletConfig接口

  • ServletConfig基本概述(每个Servlet的配置信息)

在Servlet运行期间,经常需要一些配置信息,可以在@WebServlet注解的属性中配置或者在web.xml中配置。

当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。

  • ServletConfig基本方法
方法声明功能描述
String getInitParameter(String name)根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames()返回一个Enumeration对象,其中包含了所有的初始化参数名
ServletContext getServletContext()返回一个代表当前Web应用的ServletContext对象
String getServletName()返回Servlet的名字

1.通过在每个Servlet中的@WebServlet注解的initParams属性中,通过@WebInitParam(name=“”,value=“”)注解设置Servlet的初始化参数

2.通过ServletConfig方法调用每个Servlet的初始化参数

/*** ServletConfig方法练习*/
@WebServlet(name = "ServletConfigText",urlPatterns = "/textServlet03",initParams = {@WebInitParam(name = "encoding", value = "UTF-8"), @WebInitParam(name = "name", value = "tyut")})
public class TextServlet03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();ServletConfig sc = getServletConfig();//方法一:获取ServletConfig的内容String name = sc.getInitParameter("name");String encoding = sc.getInitParameter("encoding");out.write("name=" + name +  " encoding=" + encoding + "<br>");//方法二:获取ServletConfig的内容Enumeration<String> initParameterNames = sc.getInitParameterNames();while (initParameterNames.hasMoreElements()) {String param = initParameterNames.nextElement();String initParameter = sc.getInitParameter(param);out.write(param + ":" + initParameter + "<br/>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

3.ServletContext接口

  • ServletContext基本概述

当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用。ServletContext对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。

  • 获取web应用初始化参数

1.通过再web.xml中配置web应用的初始化参数

<!--配置web应用程序的初始化参数--><context-param><param-name>school</param-name><param-value>tyut</param-value></context-param><context-param><param-name>address</param-name><param-value>taiyuan</param-value></context-param>

2.通过ServletContext方法实现对web应用程序初始化参数的调用

方法声明功能描述
String getInitParameter(String name)根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames()返回一个Enumeration对象,其中包含了所有的初始化参数名
@WebServlet("/TextServlet04")
public class TextServlet04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();ServletContext sc = getServletContext();/* 1.获取web应用程序初始化参数 *///方法一:String school = sc.getInitParameter("school");String address = sc.getInitParameter("address");out.write("school=" + school + "<br/>" + "address=" + address + "<br/>");//方法二:Enumeration<String> names = sc.getInitParameterNames();while (names.hasMoreElements()) {String s = names.nextElement();out.write(s + "=" + sc.getInitParameter(s) +"<br/>");}}
  • 实现多个Servlet数据共享(域对象)

一个Web应用中的所有Servlet共享同一个ServletContext对象,ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。

方法声明功能描述
Enumeration getAttributeNames()获取域对象名字的Enumeration对象
Object getAttribute(String name)根据域对象的名字获取域对象的值
void removeAttribute(String name)根据域对象的名字删除域对象
void setAttribute(String name, Object value)添加域对象
@WebServlet("/TextServlet04")
public class TextServlet04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/* 2.实现Servlet之间的数据共享 */List<String> cart = new ArrayList<String>();cart.add("apple");cart.add("orange");sc.setAttribute("cart", cart);sc.setAttribute("food", "beef");}
}@WebServlet("/TextServlet05")
public class TextServlet05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();ServletContext sc = getServletContext();List<String> cart = (List<String>) sc.getAttribute("cart");System.out.println(cart);sc.removeAttribute("food");String food = (String) sc.getAttribute("food");System.out.println(food);}
}
  • 读取web应用下的资源文件

ServletContext接口定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径

方法说明功能描述
Set getResourcePaths(String path)返回一个Set集合,集合中包含资源目录中子目录和文件的路径名称。参数path必须以正斜线(/)开始,指定匹配资源的部分路径
String getRealPath(String path)返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,“/”表示当前Web应用的根目录,如果Servlet容器不能将虚拟路径转换为文件系统的真实路径,则返回null
URL getResource(String path)返回映射到某个资源文件的URL对象。参数path必须以正斜线(/)开始,“/”表示当前Web应用的根目录
InputStream getResourceAsStream(String path)返回映射到某个资源文件的InputStream输入流对象。参数path传递规则和getResource()方法完全一致
/*** ServletContext实现下载web应用下的资源文件*/
@WebServlet("/TextServlet06")
public class TextServlet06 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();//获取资源的绝对路径ServletContext sc = getServletContext();String path = sc.getRealPath("/WEB-INF/tyut.properties");System.out.println(path);//获得文件的流对象InputStream in = sc.getResourceAsStream("/WEB-INF/tyut.properties");Properties pros = new Properties();pros.load(in);System.out.println(pros.getProperty("name"));System.out.println(pros.getProperty("hobby"));}
}

这篇关于Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052177

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B