Servlet建立 生命周期 继承结构 Servlet的配置 ServletConfig ServletContext

本文介绍Servlet的基本配置方法,包括在web.xml中配置Servlet类及URL映射,了解Servlet的生命周期,从初始化到服务再到销毁的过程。同时探讨了ServletConfig与ServletContext的作用及使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<为Servlet配置模版>

1. plugins/com.genuitec.eclipse.wizards.xxx.jar ---- 都是zip格式的
2. 打开Jar包中的Templates文件夹既可以看到Servlet.java源代码,直接修改就可以了

1、Servlet建立 

   ----创建一个JAVA文件,继承自HttpServlet

----覆盖doGet doPast方法

----将JAVAEEjar包设置classpath

---在web.xml中配置java文件位置,并启动服务

2、Servlet生命周期

(1)tomcat启动后,当用户第一次访问Servlet的时候,首先创建一个Servlet对象,创建ServletConfig对象,然后执行Init()方法实例化Servlet

(2)执行service(); 当接收一个HTTP请求,如果Servlet已比实例过的话会直接执行service()方法,Tomcat会将对象HttpServletRequest,HttpServletResponse传进来。

(3)执行dectory()方法; 此方法在服务关闭的时候或应用被移除的时候才会调用

3、Servlet继承结构

|--------Servlet接口 定义了init() service() dectory()方法

 |-------abstract GenericServlet implements Servlet 

实现了Init()方法 空实现了dectory()方法

init();

init(ServletConfig config); Tomcat启动时会执行此有参的init()将ServletConfig对象传进来,并将ServletConfig设为全局的对象,供别的对象调用

dectory(); 对此对象进行了空实现,子类不一定非要重写,如果没有什么任务,也可以选择不重写

abstract service();此方法为抽象方法,因为不知道子类如何实现,所以定义为抽象的。让子类去执行

|-------HttpServlet 

重写了service方法,并对来访的HTTP进行了判断,如果是GET请求而来,那么提供了doGet供子类重写方法,如果是POST方式,那么提供了doPOST供子类重写

4、Servlet的配置

示例:

<servlet>
		<servlet-name>XXX</servlet-name>
		<servlet-class>com.itheima.XXX</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>XXX</servlet-name>
		<url-pattern>/servlet/XXX</url-pattern>
	</servlet-mapping>
(1)多个Servlet-mapping可以指向一个Servlet,不管哪个路径都可以访问到Servlet
<servlet>
		<servlet-name>XXX</servlet-name>
		<servlet-class>com.itheima.XXX</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>XXX</servlet-name>
		<url-pattern>/servlet/XXX</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>XXX</servlet-name>
		<url-pattern>/servlet/YYY</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>XXX</servlet-name>
		<url-pattern>/servlet/ZZZ</url-pattern>
	</servlet-mapping>
	
(2)url-pattern中可以使用*匹配符,但是必须是/开头/*结束或*.后缀的方式。匹配规则:哪个最像匹配哪个,*.后缀优先级最低

	<servlet>
		<servlet-name>MyServlet</servlet-name>
		<servlet-class>com.itheima.MyServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>MyServlet</servlet-name>
		<!-- 这里的×前面不能加任何东西 -->
		<url-pattern>*.du</url-pattern> 
	</servlet-mapping>
	
		<servlet-mapping>
		<servlet-name>MyServlet</servlet-name>
		<url-pattern>/servlet/*</url-pattern> 
	</servlet-mapping>
(3)load-on-startup 加上此标签后,服务器启动后会首先创建Servlet对象 中间的字代码加载的优先级 如果优先级设置一样。那么要看在web.xml中配置的先后顺序创建,此标签在<Servlet>下面

	<servlet>
		<servlet-name>MyServlet</servlet-name>
		<servlet-class>com.itheima.MyServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
(4)缺省Servlet -- 所有其他Servlet都不处理的请求由他处理 ,其实对静态资源的访问就是由缺省Servlet来进行的
<servlet-mapping>
		<servlet-name>MyServlet</servlet-name>
		<url-pattern></url-pattern> 
	</servlet-mapping>
(5)Servlet的线程安全问题

因为涉及到多个用户同时访问Servlet的情况,而多个用户并发访问的时候如果操作同一数据的话,会造成多线程访问数据安全问题,所以建议在Servlet尽量写局部变量,不要写全局变量。如果需要全局变量,只能为线程加snycrchrozied同步块,但是此方法会使用程序运行在客户端访问是感觉执行很慢,甚至出现超时现象

5.ServletConfig
(1)取得this.getServletConfig().getServletContext()

(2)取得当前Servlet名字 this.getServletConfig().getServletName();

(3)取得当前Servlet的所有参数

Enumeration enumeration = this.getServletConfig()
				.getInitParameterNames();

		while (enumeration.hasMoreElements()) {
			System.out.println(enumeration.nextElement());
		}
(3)取得当前Servlet的具体参数

this.getServletConfig().getInitParameter("username");
6.ServletContext  -- 带表当前web应用
生命周期:在服务器启动,web应用加载后,服务器立即创建代表当前web应用的ServletContext对象,这个对象和当前web应用是一一对应的。

  (1) 对象在在整个web应用范围内共享数据   

作用范围: 整个web应用范围。
生命周期:随着web应用的加载而创建,随着web应用的销毁而销毁。
setAttribute(String name ,Object value);
getAttribute(String name);
removeAttribute(String name);

(2)获取web应用的初始化信息

web.xml

		<context-param>
			<param-name>encode</param-name>
			<param-value>utf-8</param-value>
		</context-param>
通过ServletContext对象的 .getInitParameter("encode");getInitParameterNames();可以获取出来

(3)实现请求转发 (请求重定向)


(4)获取资源

由于直接写路径是相对于程序的启动目录,在web环境下写的路径就相对于了tomcat/bin目录了,所以是找不到web应用中的资源。
我们可以使用ServletContext.getRealPath()获取路径,传入相对于当前web应用的路径,此方法会在传入的路径前,拼接当前web应用的硬盘路径,从而得到资源的硬盘路径。
在没有ServletContext的环境下,可以使用类加载器机制获取资源,getResource方法,传入一个相对于类加载目录(WEB-INF/classes)的路径,从而在传入的路径前拼接类加载目录的硬盘路径,从而获取到资源的硬盘路径。
          



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值