Servlet的概述 Servlet的生命周期 Servlet的相关的配置

时间:2022-12-23 07:55:42
Servlet
是Java所提供的一门用于开发动态WEB资源的技术,也是JavaEE的规范之一
开发步骤
创建一个WEB项目
在WEB项目中创建一个类,让该类去实现Servlet接口(继承Servlet接口的实现类)
在web.xml文件中进行相关的配置
发布WEB项目至WEB服务器


使用Eclipse直接创建Servlet


Servlet的生命周期
出生
第一次访问Servlet时由WEB服务器创建对象
第一次访问Servlet时进行初始化,并调用方法init()
活着
每次访问Servlet都会调用他的service方法
死亡
当WEB服务器关闭的时候会销毁Servlet的对象
当WEB服务器关闭的时候会调用destory()方法

Servlet的线程安全问题
如果有多个客户端并发的访问同一个Servlet,WEB服务器会为每一个客户端的请求创建一个线程,在线程中调用Servlet的service方法,
如果多个线程并发的访问同样的数据,那这个时候就有可能会出现线程的安全问题

解决方案
把有可能会出现问题的代码扔到同步代码块里面
让Servlet去实现一个接口,SingleThreadModel
尽量减少使用成员变量

Servlet的一些配置细节
servlet-mapping
除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层
同一个Servlet我们可以配置多个映射路径
配置Servlet映射路径时可以使用通配符(*),使用通配符只有两种格式
格式1
*.扩展名,比如*.do
不能以正斜杠开头
格式2
可以使用正斜杠开头,也需要使用/*来结尾
不能在*后面加上扩展名
load-on-startup
tomcat启动的时候直接创建Servlet的对象


ServletConfig对象
在Servlet的配置文件中,可以使用init-param标签可以为Servlet配置一些初始化参数,
可以使用ServletConfig对象来获取这些初始化参数


ServletContext对象
WEB服务器启动的时候,会为每一个WEB应用程序创建一个对应的ServletContext对象,他代表了当前的WEB应用,也称之为是WEB应用的上下文
作用
获取WEB应用的初始化参数
让多个Servlet实现数据的共享,域对象
域对象:有范围的Map,让数据在整个应用所共享
获取当前WEB应用的绝对路径
转发
将请求转发给另外一个WEB资源,可以是Servlet,JSP,HTML
只能转发到内部资源
共享请求和响应对象
地址栏中的路径不会发生变化
在转发之后响应的内容会被取消
包含
用于在响应中包含其他的WEB资源
只能转发到内部资源
共享请求和响应对象
地址栏中的路径不会发生变化
包含前后可以继续的响应其他内容


JavaWeb开发中常用的路径
绝对路径
物理路径,在磁盘中的路径,以盘符开头
比如D:\java\apache-tomcat-7.0.65\webapps\myServlet
相对路径
不以盘符开头,相对于某个路径
不以正斜杠开头
直接写路径和资源名称
相对于当前路径,和当前WEB资源在同一个路径下
以正斜杠开头
服务器端
Servlet映射路径,转发路径和包含路径  (web.xml 转发,包含)  /资源位置
正斜杠代表的当前WEB应用的根路径
客户端
a,img,form location.href 标签的src属性   /项目名称/资源路径
正斜杠代表的WEB服务器的根路径,如果我们要访问某个应用下的WEB自已,需要手动的加上应用的名称

【Servlet的概述】
什么是Servlet:
* 就是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.
* Servlet就是SUN公司提供的一个动态网页开发技术.
Servlet的作用:
* 用来处理从客户端浏览器发送的请求,并且可以对请求作出响应
使用Servlet:
* 编写一个类实现Servlet接口.
* 将编写的这个类配置到服务器中.
Servlet的入门:
* 编写类:
public class ServletDemo1 implements Servlet{

	@Override
	/**
	 * 为用户处理请求和响应的方法.
	 */
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		res.getWriter().println("Hello Servlet...");
	}
...
}
* 配置:
  <!-- 配置Servlet -->
  <servlet>
  	<!-- Servlet的名称 -->
  	<servlet-name>test1</servlet-name>
  	<!-- SErvlet的全路径 -->
  	<servlet-class>com.demo.a_servlet.ServletDemo1</servlet-class>
  </servlet>
  
  <!-- Servlet的映射 -->
  <servlet-mapping>
  	<!-- Servlet的名称 -->
  	<servlet-name>test1</servlet-name>
  	<!-- Servlet的访问路径 -->
  	<url-pattern>/ServletDemo1</url-pattern>
  </servlet-mapping>
* 访问:
http://localhost:8080/test/ServletDemo1

Servlet的概述 Servlet的生命周期 Servlet的相关的配置

Servlet的访问流程】

Servlet的概述 Servlet的生命周期 Servlet的相关的配置


【使用ServletRequest接收参数】

Servlet的概述 Servlet的生命周期 Servlet的相关的配置

* String getParameter(String name);---用于接收一个名称对应一个值的数据.

* String[] getParameterValues(String name);---用于接收一个名称对应多个值的数据.

* Map getParameterMap();---用于接收表单中的所有的数据,Mapkey是表单提交的参数名称,Mapvalue是提交参数的值.

* Enumeration getParameterNames()---用于获取表单中提交的所有的参数的名称.


Servlet的实现的关系】

Servlet:接口

   |

GenericServlet:通用的Servlet

   |

HttpServlet:HttpServlet

* 编写一个类继承HttpServlet,重写doGetdoPost方法.

* 配置


1.1.1.1 Servlet的生命周期:(*****)

Ø 生命周期:就是一个对象从创建到销毁的过程.

Ø Servlet生命周期:Servlet从创建到销毁的过程.

* 何时创建:用户第一次访问Servlet创建Servlet的实例

* 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.

Ø 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servletinit方法就会执行.

任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.

service方法内部根据请求的方式的不同调用doXXX的方法.

(get请求调用doGet,post请求调用doPost).

Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,

那么destroy方法就会执行.

1.2.4.2Servlet的相关的配置:
【启动时创建Servlet】
Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:
* <load-on-startup>2</load-on-startup>  --- 传入正整数,整数越小,被创建的优先级就越高.
【url-pattern的配置】
url-pattern配置方式共有三种:
1.完全路径匹配	:以 / 开始				例如:	/ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
2.目录匹配		:以 / 开始 需要以 * 结束.	例如: /* ,/aaa/* ,/aaa/bbb/*
3.扩展名匹配		:不能以 / 开始 以 * 开始的. 例如: *.do , *.action 
***** 错误的写法	: /*.do

有如下的配置:
  <servlet>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.a_servlet.ServletDemo4</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <url-pattern>/ServletDemo4</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ServletDemo5</servlet-name>
    <servlet-class>com.itheima.a_servlet.ServletDemo5</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo5</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ServletDemo6</servlet-name>
    <servlet-class>com.itheima.a_servlet.ServletDemo6</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo6</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

如果访问地址:
http://localhost:8080/day/ServletDemo4		:第一个
http://localhost:8080/day/aaa.do			:第二个
***** 完全路径匹配 > 目录匹配 > 扩展名匹配
1.2.4.3开发中的路径的编写:
相对路径:都是需要找位置相对关系.不能以 / 开始的.
* ./ 当前路径  ../上一级目录
* 使用相对路径访问:
    * http://localhost:8080/day/demo4-url/demo1.html
    * http://localhost:8080/day/ServletDemo6
绝对路径:不需要找位置相对关系. 以 / 开始的.
* 绝对路径中分为客户端路径和服务器端路径:
    * 客户端路径一定要加工程名.	/day/ServletDemo6
    * 服务器端路径不需要加工程名.	/ServletDemo6
Servlet的概述 Servlet的生命周期 Servlet的相关的配置

 ServletContext:重要

ServletContext的作用:

* 1.用来获得全局初始化参数.

* 2.用来获得文件的MIME的类型.

* 3.作为域对象存取数据.

ServletContext是一个域对象.

    * 作用范围:整个web工程.

    * 创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象.

    * 销毁:服务器关闭的时候,或者项目从服务器中移除的时候. 

* 4.用来读取web项目下的文件.


配置全局初始化参数:
  <context-param>
  	<param-name>username</param-name>
  	<param-value>root</param-value>
  </context-param>
    <context-param>
  	<param-name>password</param-name>
  	<param-value>123</param-value>
  </context-param>

代码:
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = this.getServletContext().getInitParameter("username");
		String password = this.getServletContext().getInitParameter("password");
		
		System.out.println(username+"    "+password);
		
		Enumeration<String> e = this.getServletContext().getInitParameterNames();
		while(e.hasMoreElements()){
			String name = e.nextElement();
			String value = this.getServletContext().getInitParameter(name);
			System.out.println(name+"    "+value);
		}

【功能二:获得文件的MIME的类型】

* 获得文件的MIME的类型.

代码实现:
	/**
	 * 获得文件的MIME的类型
	 */
	private void test2() {
		String type = this.getServletContext().getMimeType("1.html");
		System.out.println(type);
	}
【功能三:作为域对象存取数据】
范围:整个web项目.而且全局的对象.
创建:服务器启动的时候,服务器为每个web项目创建一个单独的ServletContext对象.
销毁:服务器关闭的时候销毁ServletContext.
【功能四:读取web项目下的文件】
类加载器读取文件:(扩展)
	public static void readFile() throws IOException{
		// 使用类的加载器来读取文件.
		// 类的加载器用来加载class文件,将class文件加载到内存.
		InputStream is = ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
		Properties properties = new Properties();
		properties.load(is);
		
		String driverClass = properties.getProperty("driverClass");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password");
		
		System.out.println(driverClass);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
Servlet的概述 Servlet的生命周期 Servlet的相关的配置