JavaWeb学习笔记——Servlet、ServletConfig、ServletContext、HTTP请求与响应

Servlet介绍

什么是 Servlet?

  1. Servlet 是 JavaEE 规范之一,规范就是接口
  2. Servlet 是 JavaWeb 三大组件之一,三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
  3. Servlet 是运行在服务器上的一个 java 程序,它可以接收客户端(浏览器)发送过来的请求,并响应数据给客户端。

实现 Servlet接口 实现 servlet 程序

  1. 编写一个类,实现 Servlet 接口
  2. 实现 service 方法,处理请求,响应数据
  3. 在 web.xml 中配置 servlet 程序的访问地址
public class HelloServlet implements Servlet {
/**
* service 方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		System.out.println("Hello Servlet 被访问了");
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- servlet 标签为 Tomcat 配置 Servlet 程序 -->
<servlet>
	<!--servlet-name 标签为 Servlet 程序起一个别名(一般是类名) -->
	<servlet-name>HelloServlet</servlet-name>
	<!--servlet-class 标签是 Servlet 程序的全类名-->
	<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping 标签为 servlet 程序配置访问地址-->
<servlet-mapping>
	<!--servlet-name 标签的作用是告诉服务器,当前配置的地址给哪个 Servlet 程序使用-->
	<servlet-name>HelloServlet</servlet-name>
	<!--url-pattern 标签 配置访问地址 <br/>
	/ 斜杠被服务器解析时,表示地址为:http://ip:port/工程路径
	/hello 表示地址为:http://ip:port/工程路径/hello
	-->
	<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

Servlet 程序的生命周期

  1. 执行 Servlet 构造方法
  2. 执行 init 初始化方法
    第1、2步,是在第一次访问程序的时候被调用。
  3. 执行 service 方法
    第3步,每次访问都会调用。
  4. 执行 destroy 销毁方法
    第4步,在 web 工程停止时调用

GET 和 POST 请求的分发处理

package servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
 * 实现servlet
 * 1、编写一个类实现 Servlet接口
 * 2、实现 service方法,处理请求,并响应数据
 * 3、到 web.xml 中去配置 servlet程序的访问地址
 * @author MCC
 */
public class ServletDemo implements Servlet{
	/**
	 * 1、执行Servlet构造器方法
	 * 2、执行init初始化方法
		第一、二步是在第一次访问时,即创建Servlet程序时被调用。
	 * 3、执行service方法
		第三步,每次访问都会调用。
	 * 4、执行destroy销毁方法
		第四步,在 web工程停止的时候调用
	 */
	public ServletDemo() {
		//1.首先被调用
	}

	@Override
	public void destroy() {
		//4.最后被调用
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}
	
	/**
	 * ServletConfig类的功能:
		1、获取 Servlet程序的别名,即servlet-name的值
		2、获取初始化参数init-param
		3、获取ServletContext对象
		
		有一个Servlet程序,就有一个与其对应的ServletConfig对象
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		//2.第2个被调用
		String servletName = config.getServletName();
		String userName = config.getInitParameter("userName");
		String url = config.getInitParameter("url");
		ServletContext servletContext = config.getServletContext();
		
		System.out.println(servletName);
		System.out.println(userName);
		System.out.println(url);
		System.out.println(servletContext);
	}

	/**
	 * service()是专门用于处理请求和响应的方法
	 */
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		HttpServletRequest hreq = (HttpServletRequest)req;
		String method = hreq.getMethod();
		if(("GET").equals(method)) {
			doGet();
		} else if(("POST").equals(method)) {
			doPost();
		}
	}
	
	public void doGet() {
		System.out.println("实现方式下的get请求");
	}
	
	public void doPost() {
		System.out.println("实现方式下的post请求");
	}
}

继承 HttpServlet类 实现 Servlet 程序

  1. 编写一个类继承 HttpServlet 类
  2. 根据业务需要重写 doGet() 或 doPost() 方法
  3. 在 web.xml 中的配置 Servlet 程序的访问地址
package servlet;

import java.io.IOException;

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

/**
 * Servlet implementation class ServletDemo3
 */
public class ServletDemo3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletDemo3() {
    	
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("eclipse自动生成的servlet的get请求");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("eclipse自动生成的servlet的post请求");
	}

}
<servlet>
  <servlet-name>ServletDemo3</servlet-name>
  <servlet-class>servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>ServletDemo3</servlet-name>
  <url-pattern>/demo3</url-pattern>
</servlet-mapping>

ServletConfig 类

介绍

  1. ServletConfig 类是Servlet 程序的配置信息类
  2. Servlet 程序和 ServletConfig 对象都是由 Tomcat 创建的。
  3. Servlet 程序在被第一次访问的时候创建,一个 Servlet 程序有一个ServletConfig 对象

作用

ServletConfig 类的作用:

  1. 获取 Servlet 程序的 servlet-name 值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象
<!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
<servlet>
	<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
	<servlet-name>HelloServlet</servlet-name>
	<!--servlet-class 是 Servlet 程序的全类名-->
	<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
	<!--init-param 是初始化参数-->
	<init-param>
		<!--是参数名-->
		<param-name>username</param-name>
		<!--是参数值-->
		<param-value>root</param-value>
	</init-param>
	<!--init-param 是初始化参数-->
	<init-param>
		<!--是参数名-->
		<param-name>url</param-name>
		<!--是参数值-->
		<param-value>jdbc:mysql://localhost:3306/test</param-value>
	</init-param>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
	<!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
	<servlet-name>HelloServlet</servlet-name>
	<!--
	url-pattern 标签配置访问地址 <br/>
	/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
	/hello 表示地址为:http://ip:port/工程路径/hello <br/>
	-->
	<url-pattern>/hello</url-pattern>
</servlet-mapping>

注意:若Servlet程序是继承实现的,则重写init方法时,必须引用父类init()方法;
           若Servlet程序是实现接口实现的,则没有上述要求。

实现接口:

@Override
public void init(ServletConfig servletConfig) throws ServletException {
	// 1、获取 Servlet 程序的 servlet-name 值
	System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
	// 2、获取初始化参数 init-param
	System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
	System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
	// 3、获取 ServletContext 对象
	System.out.println(servletConfig.getServletContext());
}

继承:

package servlet;

import java.io.IOException;

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

public class ServletDemo2 extends HttpServlet{

	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("继承方式下的get请求");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("继承方式下的post请求");
	}
	
	/*
	 * 特别注意:如果重写init()方法,必须引用父类init()方法,否则会报空指针异常
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		//必须调用父类init()方法
		super.init(config);
		System.out.println("重写init()方法时必须调用父类init()方法");
	}

}

ServletContext 类

介绍

什么是 ServletContext 类?

  1. ServletContext 是一个接口,表示 Servlet 上下文对象
  2. 一个 web 工程,只有一个 ServletContext 对象
  3. ServletContext 对象是一个域对象。
  4. ServletContext 对象在 web 工程启动时创建,在 web 工程停止时销毁。

域对象

什么是域对象?

  • 域对象,是可以像 Map 一样存取数据的对象,域指的是存取数据的范围。
存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

作用

ServletContext 类的四个作用:

  1. 获取 web.xml 中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式为 /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像 Map 一样存取数据
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
	<param-name>username</param-name>
	<param-value>context</param-value>
</context-param>
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
	<param-name>password</param-name>
	<param-value>root</param-value>
</context-param>
package servlet;

import java.io.IOException;

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

/**
 * ServletContext:
 * 1、ServletContext是一个接口,它表示 Servlet的上下文对象
 * 2、一个 web工程,只有一个 ServletContext对象。
 * 3、ServletContext对象是一个域对象。
 * 4、ServletContext对象在 web工程启动时创建,在停止时销毁(重启也会销毁)。
 * 
 * 什么是域对象?
 * 域对象,是可以像 Map一样存取数据的对象。
 * 这里的域指的是该对象存取的数据的操作范围,是整个 web工程。
 * 
 * 因此,在一个工程中,无论调用多少次getServletContext()方法,都只会得到同一个ServletContext对象,
 * 使用setAttribute()设置的属性和值,也是供多个程序共同使用的
 * 
 * 			存数据 		取数据 			删除数据
 *	Map 	put() 		get() 			remove()
 *	域对象 setAttribute() getAttribute() removeAttribute();
 */
public class ServletContextDemo extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletContextDemo() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
	 * ServletContext类的功能:
	 * 1、获取 web.xml 中配置的上下文参数 context-param
	 * 2、获取当前的工程路径,结果的格式: /工程路径
	 * 3、获取工程部署后,各目录或文件在硬盘上的绝对路径
	 * 4、像 Map 一样存取数据
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * <servlet>标签中的内容只能由ServletConfig对象获取
		 * <context-param>中的内容只能由ServletContext对象获取
		 */
		//1.获取 web.xml 中配置的上下文参数 context-param
		//先通过ServletConfig类获取ServletContext对象
		ServletContext context = getServletConfig().getServletContext();
		Object userName = context.getInitParameter("userName");
		Object password = context.getInitParameter("password");
		System.out.println(userName);
		System.out.println(password);
		
		//2.获取当前工程路径
		String path = context.getContextPath();
		System.out.println(path);//	结果: /DynamicWeb
		
		//3.获取工程部署后在硬盘上的绝对路径
		/**
		 * 斜杠 / 被服务器解析为:http://ip:port/工程名
		 * 代表查询当前工程在硬盘上的路径,这个路径对应工程中的WebContent目录
		 * 如果要查询WebContent下的其他目录或文件,只需要追加路径即可
		 */
		String realPath = context.getRealPath("/");
		System.out.println(realPath);
		//获取imgs文件夹下的1.jpg的磁盘路径
		System.out.println(context.getRealPath("/imgs/1.jpg"));
		//结果:D:\Java\eclipse\workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\DynamicWeb\
		//D:\Java\eclipse\workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\DynamicWeb\imgs\1.jpg
		
		//4、像 Map 一样存取数据
		context.setAttribute("value", "v1");
		Object object = context.getAttribute("value");
		//之后在ServletDemo-Demo3等其他程序中获取ServletContext对象之后,获取到的是同一个对象,
		//使用getAttribute("value")获取到的属性值也都是v1
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

HTTP协议

请求的 HTTP 协议格式

  • 客户端给服务器发送数据叫请求。
  • 服务器给客户端回传数据叫响应。
  • 请求又分为 GET 请求和 POST 请求两种

GET 请求

  1. 请求行
    (1) 请求的方式 GET
    (2) 请求的资源路径[+?+请求参数]
    (3) 请求的协议的版本号
  2. 请求头
    key : value 组成 不同的键值对,表示不同的含义。

POST 请求

  1. 请求行
    (1) 请求的方式 POST
    (2) 请求的资源路径[+?+请求参数]
    (3) 请求的协议的版本号

  2. 请求头
    key : value 不同的请求头,有不同的含义

  3. 请求体
    POST 请求下参数不会在浏览器地址栏显示,都放在请求体中发送给服务器

常用的请求头

Accept:表示客户端可以接收的数据类型
Accpet-Languege:表示客户端可以接收的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求时的服务器 ip 和端口号
Referer:记录浏览器发送请求时,浏览器地址栏中的地址

区分 GET 请求和 POST 请求

GET 请求:

  • form 标签 method=get
  • a 标签
  • link 标签引入 css
  • Script 标签引入 js 文件
  • img 标签引入图片
  • iframe 引入 html 页面
  • 在浏览器地址栏中输入地址后敲回车

POST 请求有哪些:

  • form 标签 method=post

响应的HTTP 协议格式

格式

  1. 响应行
    (1) 响应的协议和版本号
    (2) 响应状态码
    (3) 响应状态描述符
  2. 响应头
    (1) key:value 不同的响应头,有其不同含义
  3. 响应体:回传给客户端的数据

响应状态码

状态码含义
200请求成功
302请求重定向
404请求服务器已收到,但数据不存在,即请求地址错误
500请求服务器已收到,但服务器内部错误,一般为代码错误

MIME类型

MIME 是 HTTP 协议中的数据类型。
MIME(Multipurpose Internet Mail Extensions)多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小
类型”,并与某一种文件的扩展名相对应。
在这里插入图片描述
           在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值