admin管理员组

文章数量:1033043

JavaWeb后端入门6—Servlet

1. 概述

Servlet是一个运行在Web服务器上的Java程序,用于处理从Web客户端发送的请求并对请求做出响应。

2. 使用Servlet

  • 编写一个Java类实现Servlet接口
  • 配置Servlet

3. 入门代码

①创建包和类

②实现Servlet接口

代码语言:javascript代码运行次数:0运行复制
package com.itheima.servlet.demo1;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/*
 * Servlet入门程序
 * */
public class HelloServlet implements Servlet{
	@Override
	/*
	 * 用来处理客户请求,并对请求做出响应的方法
	 * */
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO 自动生成的方法存根
		//想页面输出Hello Servlet字符串
		res.getWriter().println("Hello Servlet!!!");
	}	
	@Override
	public void destroy() {
		// TODO 自动生成的方法存根		
	}
	@Override
	public ServletConfig getServletConfig() {
		// TODO 自动生成的方法存根
		return null;
	}
	@Override
	public String getServletInfo() {
		// TODO 自动生成的方法存根
		return null;
	}
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO 自动生成的方法存根		
	}		
}

③在web.xml配置这个类

代码语言:javascript代码运行次数:0运行复制
  <!--  配置Servlet -->
	<servlet>
		<!-- 配置Servlet名称 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- 配置Servlet类的全路径 -->
		<servlet-class>com.itheima.servlet.demo1.HelloServlet</servlet-class>
	</servlet>
	<!-- 配置servlet映射 -->
	<servlet-mapping>
		<!-- 配置Servlet名称 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- 配置访问路径 -->
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>

4. Servlet执行流程

5. Servlet的实现关系

基本的实现关系

代码语言:javascript代码运行次数:0运行复制
Servlet接口
    |
GenericServlet类     
    |
HTTPServlet类        是一个与协议相关的Servlet,专门用来处理HTTP协议的请求

通常一般都会让Servlet继承HttpServlet,然后重写doGet和doPost方法,往往请求要处理的代码都是一直的,所以需要让doGet和doPost相互调用简化编程。

6. Eclipse中使用Servelet模板

①在包下新建Servlet

②自动继承HTTPServlet,输入Servlet名,点击下一步

③输入类名和URL,下一步

④选择要继承的方法,完成

7. Servlet的生命周期

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

Servlet何时创建:Servlet在第一次被访问的时候实例化,同时init方法会执行。实例化以及init方法只会执行一次,任何一次从客户端发来的请求,Servlet的service的方法就会被执行。

Servlet何时销毁:当Servlet从服务器移除或者服务器关闭的时候,Servlet对象被销毁,里面的的story方法就会执行,将其回收。

代码演示 不演示了

8. Servlet的启动时加载

Servlet对象时第一次被访问的时候被创建的,init方法执行。

如果在init方法中做了一些比较耗时的操作,比如加载了一些配置文件,呢么第一个用户第一次访问Servlet时,就需要等待。

web.xml中的<servlet>标签中加入<load-on-startup>标签

数字越小,优先级越高

代码语言:javascript代码运行次数:0运行复制
<servlet>
  	<servlet-name>ServletDemo2</servlet-name>
  	<servlet-class>com.itheima.servlet.demo1.ServletDemo2</servlet-class>
  	<!-- 启动时加载 -->
  	<load-on-startup>1</load-on-startup>
  </servlet>

9. Servlet的访问路径的配置

  • 完全路径配置 以/开始,比如 /demo
  • 目录匹配 以/开始,以/*结束,如/aaa/*
  • 扩展名匹配 不能以/开始,而是以*开始
代码语言:javascript代码运行次数:0运行复制
<servlet-mapping>
  	<servlet-name>ServletDemo3</servlet-name>
  	<!-- 完全路径匹配 -->
  	<!-- <url-pattern>/ServletDemo3</url-pattern> -->
  	<!-- 目录匹配 -->
  	<!-- <url-pattern>/aaa/*</url-pattern> -->
  	<!-- 扩展名匹配 -->
  	<!-- <url-pattern>*.abc</url-pattern> -->
  </servlet-mapping>

优先级:完全 > 目录 > 扩展名

10. ServletConfig对象

ServletConfig用来获得Servlet的相关的配置对象

  • 获得 :getServletConfig
  • API:获得Servlet的初始化参数、获得ServletContext对象、获得Servlet名称

代码演示

①web.xml中加入以下

代码语言:javascript代码运行次数:0运行复制
  <servlet>
    <description></description>
    <display-name>ServletDemo4</display-name>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.servlet.demo1.ServletDemo4</servlet-class>
    <!-- 配置Servlet初始化参数 -->
    <init-param>
    	<param-name>username</param-name>
    	<param-value>root</param-value>
    </init-param>
    <init-param>
    	<param-name>password</param-name>
    	<param-value>abc</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <url-pattern>/ServletDemo4</url-pattern>
  </servlet-mapping>

②java内容

代码语言:javascript代码运行次数:0运行复制
package com.itheima.servlet.demo1;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ServletConfig对象演示
 */
public class ServletDemo4 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获得初始化参数API
		//获得ServletConfig对象
		ServletConfig config = this.getServletConfig();
		String username = config.getInitParameter("username");
		String password = config.getInitParameter("password");
		System.out.println(username+" "+password);
		//2.获得所有初始化参数名称
		Enumeration<String> names =  config.getInitParameterNames();
		while (names.hasMoreElements()) {
			String name =  names.nextElement();
			String value = config.getInitParameter(name);
			System.out.println(name+" "+value);						
		}
		//3.获得Servlet名称
		String servletname =  config.getServletName();
		System.out.println(servletname);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

11. ServletContext对象

ServletContext是Servlet的上下文对象,对Servlet之前和之后的内容都可以查询。这个对象每个Web项目只有一个。服务器启东市为每个web项目创建一个单独的ServletContext对象

11.1 获取web信息

因为一个web项目只有一个ServletContext对象,所以这个对象对整个项目的信息都是了解的。

方法:

  • 获取文件的MIME类型 getMimeType( )
  • 获取web项目请求工程名 getContentPath( )
  • 获取web项目的初始化参数 getInitParameter ( ) 、 getInitParameterName ( )

代码:

web.xml配置全局初始化参数

代码语言:javascript代码运行次数:0运行复制
  <!-- 全局初始化参数配置 -->
  <context-param>
  	<param-name>username</param-name>
  	<param-value>abc</param-value>
  </context-param>
    <context-param>
  	<param-name>password</param-name>
  	<param-value>GuessMyPasswordBitch</param-value>
  </context-param>

Demo5.javadoGet部分:

代码语言:javascript代码运行次数:0运行复制
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获得ServletContext
		ServletContext servletContext =  this.getServletContext();
		//1.获取文件MIME类型		
		String mimeType = servletContext.getMimeType("a.mp4");
		System.out.println(mimeType);
		//2.获得请求路径的工程名:
		String path = servletContext.getContextPath();
		System.out.println(path);
		//3.获得全局初始化参数
		String username = servletContext.getInitParameter("username");
		String password = servletContext.getInitParameter("password");
		System.out.println(username+" "+password);
		Enumeration<String> names = servletContext.getInitParameterNames();
		while (names.hasMoreElements()) {
			String name = (String) names.nextElement();
			String value = servletContext.getInitParameter(name);
			System.out.println(name+"  "+value);
		}
	}
11.2 读取web项目下的文件

之前使用IO流可以读取文件(java项目)。web项目是需要发布到tomcat下才能访问,获取web项目下的文件如果使用传统的IO流就会出现问题。(原因:路径中使用的是相对路径,相对的是jre环境)

传统IO方法(test1)和ServletContext方法(test2)如下:

代码语言:javascript代码运行次数:0运行复制
package com.itheima.servlet.demo1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *web项目中的读取文件
 */
public class ServletDemo6 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//传统方式
		test1();
		//ServletContext方式
		test2();
	}	
		private void test2() throws IOException{
			//使用ServletContext方式
			Properties properties = new Properties();
			//创建一个文件的输入流
			//InputStream is = new FileInputStream("/web01/src/main/java/db.properties");
			InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
			properties.load(is);
			//获取数据
			String driverClassName = properties.getProperty("driverClassName");
			String url = properties.getProperty("url");
			String username = properties.getProperty("username");
			String password = properties.getProperty("password");
			//输出
			System.out.println(driverClassName);
			System.out.println(url);
			System.out.println(username);
			System.out.println(password);
		}
	
	private void test1() throws FileNotFoundException, IOException {
		//传统方式
		Properties properties = new Properties();
		//创建一个文件的输入流
		InputStream is = new FileInputStream("/web01/src/main/java/db.properties");
		properties.load(is);
		//获取数据
		String driverClassName = properties.getProperty("driverClassName");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password");
		//输出
		System.out.println(driverClassName);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

11.3 作为域对象存取数据

  • 域对象概述

将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。

  • ServletContext作为域对象的API
代码语言:javascript代码运行次数:0运行复制
setAttribute:存入数据
getAttribute:取得数据
removeAttribute:移除数据
  • ServletContext作为域对象的作用范围

服务器启动的时候为每个Web项目创建一个单独的ServletContext对象。当Web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。想ServletContext中保存的数据会一直存在(只有在服务器关闭的时候,对象被销毁,否则ServletContext会一直存在)

范围:整个Web应用(只要有一个地方存储,其他地方都可以调用)

  • 代码演示

新建ServletDemo7

代码语言:javascript代码运行次数:0运行复制
/**
 * ServletContext的域对象演示
 */
public class ServletDemo7 extends HttpServlet {

	@Override
		public void init() throws ServletException {
			// 当ServletDemo7被创建时,初始化一个值。
		this.getServletContext().setAttribute("name", "张三");
			
		}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = (String) this.getServletContext().getAttribute("name");
		System.out.println("姓名:"+name);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

新建 ServletDemo8

代码语言:javascript代码运行次数:0运行复制
/**
 * ServletContext的域对象演示
 */
public class ServletDemo8 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = (String) this.getServletContext().getAttribute("name");
		System.out.println("姓名:"+name);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

当浏览器访问localhost:8080/web01/ServletDemo7localhost:8080/web01/ServletDemo8 时都能获取到以下内容:

代码语言:javascript代码运行次数:0运行复制
姓名:张三

12. Servlet域对象的总结—数据访问范围

12.1 请求范围(ServletRequest

  • 何时创建和销毁
    • 创建:当用户向服务器发送一次请求,服务器创建一个Request对象
    • 销毁:服务器对这次请求做出了相应,服务器就会销毁这个Request对象
  • 如何存取数据
    • 存数据Void setAttribute(String name, Object value);
    • 取数据Object getAttribute(String name);
  • 作用范围
    • 一次请求(转发就是一次请求)。

12.2 会话范围(HttpSession

  • 何时创建和销毁
    • 创建:服务器端第一次调用getSession( )方法的时候
    • 销毁:三种情况
      • Session过期(默认过期时间30分钟,tomcat/conf/web.xml可以修改)
      • 非正常关闭服务器(terminate或者服务器直接拔电源)。正常关闭服务器时,Session会保存在tomcat/work/Catalina/localhost/工程名 下
      • 手动调用session.invalidate()
  • 如何存取数据
    • 存数据Void setAttribute(String name, Object value);
    • 取数据Object getAttribute(String name);
  • 作用范围
    • 一次会话,多个请求。

12.3 应用范围(ServletContext

  • 何时创建和销毁
    • 创建:服务器启动时创建,为每一个单独的web项目创建一个单独的ServletContext对象
    • 销毁:服务器关闭或项目从服务器移除时。
  • 如何存取数据
    • 存数据Void setAttribute(String name, Object value);
    • 取数据Object getAttribute(String name);
  • 作用范围
    • 整个应用(项目任何位置都可以获得)。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-08 ,如有侵权请联系 cloudcommunity@tencent 删除服务器后端入门servlet对象

JavaWeb后端入门6—Servlet

1. 概述

Servlet是一个运行在Web服务器上的Java程序,用于处理从Web客户端发送的请求并对请求做出响应。

2. 使用Servlet

  • 编写一个Java类实现Servlet接口
  • 配置Servlet

3. 入门代码

①创建包和类

②实现Servlet接口

代码语言:javascript代码运行次数:0运行复制
package com.itheima.servlet.demo1;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/*
 * Servlet入门程序
 * */
public class HelloServlet implements Servlet{
	@Override
	/*
	 * 用来处理客户请求,并对请求做出响应的方法
	 * */
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO 自动生成的方法存根
		//想页面输出Hello Servlet字符串
		res.getWriter().println("Hello Servlet!!!");
	}	
	@Override
	public void destroy() {
		// TODO 自动生成的方法存根		
	}
	@Override
	public ServletConfig getServletConfig() {
		// TODO 自动生成的方法存根
		return null;
	}
	@Override
	public String getServletInfo() {
		// TODO 自动生成的方法存根
		return null;
	}
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO 自动生成的方法存根		
	}		
}

③在web.xml配置这个类

代码语言:javascript代码运行次数:0运行复制
  <!--  配置Servlet -->
	<servlet>
		<!-- 配置Servlet名称 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- 配置Servlet类的全路径 -->
		<servlet-class>com.itheima.servlet.demo1.HelloServlet</servlet-class>
	</servlet>
	<!-- 配置servlet映射 -->
	<servlet-mapping>
		<!-- 配置Servlet名称 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- 配置访问路径 -->
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>

4. Servlet执行流程

5. Servlet的实现关系

基本的实现关系

代码语言:javascript代码运行次数:0运行复制
Servlet接口
    |
GenericServlet类     
    |
HTTPServlet类        是一个与协议相关的Servlet,专门用来处理HTTP协议的请求

通常一般都会让Servlet继承HttpServlet,然后重写doGet和doPost方法,往往请求要处理的代码都是一直的,所以需要让doGet和doPost相互调用简化编程。

6. Eclipse中使用Servelet模板

①在包下新建Servlet

②自动继承HTTPServlet,输入Servlet名,点击下一步

③输入类名和URL,下一步

④选择要继承的方法,完成

7. Servlet的生命周期

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

Servlet何时创建:Servlet在第一次被访问的时候实例化,同时init方法会执行。实例化以及init方法只会执行一次,任何一次从客户端发来的请求,Servlet的service的方法就会被执行。

Servlet何时销毁:当Servlet从服务器移除或者服务器关闭的时候,Servlet对象被销毁,里面的的story方法就会执行,将其回收。

代码演示 不演示了

8. Servlet的启动时加载

Servlet对象时第一次被访问的时候被创建的,init方法执行。

如果在init方法中做了一些比较耗时的操作,比如加载了一些配置文件,呢么第一个用户第一次访问Servlet时,就需要等待。

web.xml中的<servlet>标签中加入<load-on-startup>标签

数字越小,优先级越高

代码语言:javascript代码运行次数:0运行复制
<servlet>
  	<servlet-name>ServletDemo2</servlet-name>
  	<servlet-class>com.itheima.servlet.demo1.ServletDemo2</servlet-class>
  	<!-- 启动时加载 -->
  	<load-on-startup>1</load-on-startup>
  </servlet>

9. Servlet的访问路径的配置

  • 完全路径配置 以/开始,比如 /demo
  • 目录匹配 以/开始,以/*结束,如/aaa/*
  • 扩展名匹配 不能以/开始,而是以*开始
代码语言:javascript代码运行次数:0运行复制
<servlet-mapping>
  	<servlet-name>ServletDemo3</servlet-name>
  	<!-- 完全路径匹配 -->
  	<!-- <url-pattern>/ServletDemo3</url-pattern> -->
  	<!-- 目录匹配 -->
  	<!-- <url-pattern>/aaa/*</url-pattern> -->
  	<!-- 扩展名匹配 -->
  	<!-- <url-pattern>*.abc</url-pattern> -->
  </servlet-mapping>

优先级:完全 > 目录 > 扩展名

10. ServletConfig对象

ServletConfig用来获得Servlet的相关的配置对象

  • 获得 :getServletConfig
  • API:获得Servlet的初始化参数、获得ServletContext对象、获得Servlet名称

代码演示

①web.xml中加入以下

代码语言:javascript代码运行次数:0运行复制
  <servlet>
    <description></description>
    <display-name>ServletDemo4</display-name>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.servlet.demo1.ServletDemo4</servlet-class>
    <!-- 配置Servlet初始化参数 -->
    <init-param>
    	<param-name>username</param-name>
    	<param-value>root</param-value>
    </init-param>
    <init-param>
    	<param-name>password</param-name>
    	<param-value>abc</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <url-pattern>/ServletDemo4</url-pattern>
  </servlet-mapping>

②java内容

代码语言:javascript代码运行次数:0运行复制
package com.itheima.servlet.demo1;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ServletConfig对象演示
 */
public class ServletDemo4 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获得初始化参数API
		//获得ServletConfig对象
		ServletConfig config = this.getServletConfig();
		String username = config.getInitParameter("username");
		String password = config.getInitParameter("password");
		System.out.println(username+" "+password);
		//2.获得所有初始化参数名称
		Enumeration<String> names =  config.getInitParameterNames();
		while (names.hasMoreElements()) {
			String name =  names.nextElement();
			String value = config.getInitParameter(name);
			System.out.println(name+" "+value);						
		}
		//3.获得Servlet名称
		String servletname =  config.getServletName();
		System.out.println(servletname);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

11. ServletContext对象

ServletContext是Servlet的上下文对象,对Servlet之前和之后的内容都可以查询。这个对象每个Web项目只有一个。服务器启东市为每个web项目创建一个单独的ServletContext对象

11.1 获取web信息

因为一个web项目只有一个ServletContext对象,所以这个对象对整个项目的信息都是了解的。

方法:

  • 获取文件的MIME类型 getMimeType( )
  • 获取web项目请求工程名 getContentPath( )
  • 获取web项目的初始化参数 getInitParameter ( ) 、 getInitParameterName ( )

代码:

web.xml配置全局初始化参数

代码语言:javascript代码运行次数:0运行复制
  <!-- 全局初始化参数配置 -->
  <context-param>
  	<param-name>username</param-name>
  	<param-value>abc</param-value>
  </context-param>
    <context-param>
  	<param-name>password</param-name>
  	<param-value>GuessMyPasswordBitch</param-value>
  </context-param>

Demo5.javadoGet部分:

代码语言:javascript代码运行次数:0运行复制
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获得ServletContext
		ServletContext servletContext =  this.getServletContext();
		//1.获取文件MIME类型		
		String mimeType = servletContext.getMimeType("a.mp4");
		System.out.println(mimeType);
		//2.获得请求路径的工程名:
		String path = servletContext.getContextPath();
		System.out.println(path);
		//3.获得全局初始化参数
		String username = servletContext.getInitParameter("username");
		String password = servletContext.getInitParameter("password");
		System.out.println(username+" "+password);
		Enumeration<String> names = servletContext.getInitParameterNames();
		while (names.hasMoreElements()) {
			String name = (String) names.nextElement();
			String value = servletContext.getInitParameter(name);
			System.out.println(name+"  "+value);
		}
	}
11.2 读取web项目下的文件

之前使用IO流可以读取文件(java项目)。web项目是需要发布到tomcat下才能访问,获取web项目下的文件如果使用传统的IO流就会出现问题。(原因:路径中使用的是相对路径,相对的是jre环境)

传统IO方法(test1)和ServletContext方法(test2)如下:

代码语言:javascript代码运行次数:0运行复制
package com.itheima.servlet.demo1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *web项目中的读取文件
 */
public class ServletDemo6 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//传统方式
		test1();
		//ServletContext方式
		test2();
	}	
		private void test2() throws IOException{
			//使用ServletContext方式
			Properties properties = new Properties();
			//创建一个文件的输入流
			//InputStream is = new FileInputStream("/web01/src/main/java/db.properties");
			InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
			properties.load(is);
			//获取数据
			String driverClassName = properties.getProperty("driverClassName");
			String url = properties.getProperty("url");
			String username = properties.getProperty("username");
			String password = properties.getProperty("password");
			//输出
			System.out.println(driverClassName);
			System.out.println(url);
			System.out.println(username);
			System.out.println(password);
		}
	
	private void test1() throws FileNotFoundException, IOException {
		//传统方式
		Properties properties = new Properties();
		//创建一个文件的输入流
		InputStream is = new FileInputStream("/web01/src/main/java/db.properties");
		properties.load(is);
		//获取数据
		String driverClassName = properties.getProperty("driverClassName");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password");
		//输出
		System.out.println(driverClassName);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

11.3 作为域对象存取数据

  • 域对象概述

将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。

  • ServletContext作为域对象的API
代码语言:javascript代码运行次数:0运行复制
setAttribute:存入数据
getAttribute:取得数据
removeAttribute:移除数据
  • ServletContext作为域对象的作用范围

服务器启动的时候为每个Web项目创建一个单独的ServletContext对象。当Web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。想ServletContext中保存的数据会一直存在(只有在服务器关闭的时候,对象被销毁,否则ServletContext会一直存在)

范围:整个Web应用(只要有一个地方存储,其他地方都可以调用)

  • 代码演示

新建ServletDemo7

代码语言:javascript代码运行次数:0运行复制
/**
 * ServletContext的域对象演示
 */
public class ServletDemo7 extends HttpServlet {

	@Override
		public void init() throws ServletException {
			// 当ServletDemo7被创建时,初始化一个值。
		this.getServletContext().setAttribute("name", "张三");
			
		}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = (String) this.getServletContext().getAttribute("name");
		System.out.println("姓名:"+name);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

新建 ServletDemo8

代码语言:javascript代码运行次数:0运行复制
/**
 * ServletContext的域对象演示
 */
public class ServletDemo8 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = (String) this.getServletContext().getAttribute("name");
		System.out.println("姓名:"+name);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

当浏览器访问localhost:8080/web01/ServletDemo7localhost:8080/web01/ServletDemo8 时都能获取到以下内容:

代码语言:javascript代码运行次数:0运行复制
姓名:张三

12. Servlet域对象的总结—数据访问范围

12.1 请求范围(ServletRequest

  • 何时创建和销毁
    • 创建:当用户向服务器发送一次请求,服务器创建一个Request对象
    • 销毁:服务器对这次请求做出了相应,服务器就会销毁这个Request对象
  • 如何存取数据
    • 存数据Void setAttribute(String name, Object value);
    • 取数据Object getAttribute(String name);
  • 作用范围
    • 一次请求(转发就是一次请求)。

12.2 会话范围(HttpSession

  • 何时创建和销毁
    • 创建:服务器端第一次调用getSession( )方法的时候
    • 销毁:三种情况
      • Session过期(默认过期时间30分钟,tomcat/conf/web.xml可以修改)
      • 非正常关闭服务器(terminate或者服务器直接拔电源)。正常关闭服务器时,Session会保存在tomcat/work/Catalina/localhost/工程名 下
      • 手动调用session.invalidate()
  • 如何存取数据
    • 存数据Void setAttribute(String name, Object value);
    • 取数据Object getAttribute(String name);
  • 作用范围
    • 一次会话,多个请求。

12.3 应用范围(ServletContext

  • 何时创建和销毁
    • 创建:服务器启动时创建,为每一个单独的web项目创建一个单独的ServletContext对象
    • 销毁:服务器关闭或项目从服务器移除时。
  • 如何存取数据
    • 存数据Void setAttribute(String name, Object value);
    • 取数据Object getAttribute(String name);
  • 作用范围
    • 整个应用(项目任何位置都可以获得)。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-08 ,如有侵权请联系 cloudcommunity@tencent 删除服务器后端入门servlet对象

本文标签: JavaWeb后端入门6Servlet