Servlet API(一)GenericServlet类、HttpServlet类、doget()、dopost()

Servlet

一、Servlet API

Servlet API定义了若干接口和类,它由下面4个包组成。
javax.servlet包:与协议无关的servlet接口
javax.servlet.http包:http协议实现的servlet类
javax.servlet.annotation包:9个注解类和2个枚举类型
javax.servlet.descriptor包:以编程方式访问Web应用程序配置信息的类型。

	包中定义了一些接口和类,类可以去实现接口中的方法,或者扩展方法。
  • Servlet:用来完成B/S架构下,对客户端请求的响应处理
  • Servlet API:为Servlet提供了统一的编程接口
  • 常见的Servlet容器:Servlet 在容器中运行
    • Tomcat
    • Jetty / Resin

二、Servlet接口(servlet包中的接口)

javax.servlet.Servlet接口是Servlet API中的基本接口,每个Servlet必须直接或间接实现该接口。该接口的5个方法:

void init(ServletConfig config):完成Servlet初始化并准备提供服务
void service(ServletRequest request, ServletResponse response) :这个方法允许Servlet为请求提供响应。
void destroy()
ServletConfig getServletConfig():返回关于Servlet的配置信息
String getServletInfo():返回关于Servlet的信息,如作者,版本。要覆盖该方法返回有意义的信息。
在这里插入图片描述

三、GenericServlet类(servlet包中的类)

  • javax.servlet.GenericServlet实现了Servlet接口ServletConfig接口
  • 提供了Servlet接口中 除了service()外 的所有方法的实现,同时增加了支持日志的方法。
  • 在这里插入图片描述
  • 以继承GenericServlet类并实现service()方法来创建任何类型的Servlet。

实例一:扩展GenericServlet类实现service()方法

1.在src下建立一个servlet
在这里插入图片描述
2.包名:com.demo(一般采用公司域名+项目名称的反写);类名:GenericDemoServlet;父类:(查找)GenericServlet
在这里插入图片描述
3.next;name(不要和类名一致适当改大小写即可);url(访问网址)
在这里插入图片描述
4.此时只需要service方法
在这里插入图片描述

5.系统自动生成这个界面,补充内容即可
在这里插入图片描述
6.补充代码:

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    
    
		//设置响应返回的内容类型
		response.setContentType("text/html;charset=UTF-8");
		//获取servlet的名字
		String servletName = getServletConfig().getServletName();
		//获取输出流PrintWriter对象
		PrintWriter out = response.getWriter();
		out.print("<body><h1>通用的Servlet演示!</h1>" 
					+"servletName:<br>"
					+servletName+ "</body>");
		}

完整代码是:

package com.demo;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

@WebServlet(name = "genericServlet", urlPatterns = {
    
     "/generic-servlet" })//注解
public class GenericDemoServlet extends GenericServlet {
    
    
	private static final long serialVersionUID = 1L;

	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    
    
		//设置响应返回的内容类型
		response.setContentType("text/html;charset=UTF-8");
		//获取servlet的名字
		String servletName = getServletConfig().getServletName();
		//获取输出流PrintWriter对象
		PrintWriter out = response.getWriter();
		out.print("<body><h1>通用的Servlet演示!</h1>" 
					+"servletName:<br>"
					+servletName+ "</body>");	
	}
}

在service()方法中:

  1.ServletRuquest接口(请求)有关方法可以获取请求信息,请求协议,请求内容类型;
  2.ServletResponse接口(响应)定义向客户发送响应的方法:
  	 ①.调用setContentType():设置响应的内容类型;text/html表示页面类型是html文档,就是一个网页声明,诸如此类text\script(脚本),text\style(样式)
  	 ②.调用getWriter():获取输出流PrintWriter对象,通过PrintWriter对象可向客户写出HTML数据。

7.访问Servlet:
  第一种方法:右键--->run as

在这里插入图片描述

  第二种方法:在谷歌浏览器上输入 :

localhost:8006/Chapter02/generic-servlet
在这里插入图片描述

注意:GenericServlet类没有doget()和dopost()方法

四、HttpServlet类(http包中的类)

javax.servlet.http包中定义了使用HTTP协议创建的Servlet所需要的接口和类。并且其中某些接口和类扩展了javax.servlet包对应的接口和类来实现对HTTP协议的支持。

1.HttpServlet抽象类:支持Http协议的Servlet.
2.HttpServletRequest接口:基于HTTP协议的请求对象,继承了ServletRequest接口。
3.HttpServletResponse接口:基于HTTP协议的响应对象,继承了ServletResponse接口。
4.HttpSession接口:实现会话管理,存储用户信息。
5.Cookie类:创建cookie对象的一个实现类。

1.HttpServlet类

  • HttpServlet抽象类扩展了GenericServlet类,用来实现HTTP协议的Servlet,并在类中增加新的service()。该service是向客户请求提供服务的方法。
    protected void service(HttpServiceRequest,HttpServletResponse)throws ServletException,IOException
    在这里插入图片描述
  • 在HttpServlet中针对不同的HTTP请求方法定义了不同的处理方法,如处理GET请求(),如下:
protected void doGet(HttpServletRequest request, HttpServletResponse  response)throws ServletException, IOException
//POST请求的方法是doPost()。

实例二:HttpServlet新写service()方法

package com.demo;

import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDate;
import java.time.LocalTime;

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

@WebServlet(name = "helloServlet", urlPatterns = {
    
     "/hello-servlet" })
public class HelloServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;

	//在没有GenericServlet类新写service()方法基础上,看是否可以用HttpServletRequest自身?
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<body>今天的日期是:" + LocalDate.now()+ "<br>"
					+"现在的时间是:"+LocalTime.now()+"</body>");
		
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		
	}
}
//如果service里没有东西,是空的,移到了doget里,访问页面也不会有东西(访问的是service);
//当service方法不存在时,doget()才会有用。

2.HttpServletRequest接口

  • 继承ServletRequest接口,从请求对象中获取HTTP请求头,cookie等信息。

3.HttpServletResponse接口

  • 继承ServletResponse接口,为响应设置HTTP请求头,Cookie信息等方法。

实例三:继承HttpServlet,实现doget()方法

package com.demo;

import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDate;
import java.time.LocalTime;

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

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet(name = "helloServlet", urlPatterns = {
    
     "/hello-servlet" })
public class HelloServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
//补充
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
	//设置响应内容类型
		response.setContentType("text/html;charset=UTF-8");
	//获得响应对象	
		PrintWriter out = response.getWriter();
	//向浏览器输出信息
		out.println("<body>今天的日期是:"+LocalDate.now()+"<br>"
					+"现在的时间是:"+LocalTime.now()+"</body>");
	}
}

在这里插入图片描述

总结

1.在该类中没有覆盖service()方法,而是直接覆盖的doget()方法
2.GenericServlet没有service方法,实现servlet接口,另写一个service方法

  public class GenericDemoServlet extends GenericServlet { 
  		public void service(ServletRequest request, ServletResponse response) throws 
  		ServletException, IOException {}
  }
  //注意参数类型“ServletRequest ,ServletResponse”

3.而HelloServlet继承HttpServlet时,service()和doget()参数类型都是(HttpServletRequest,HttpServletResponse),HttpServlet有service方法,可以新写,参数类型是本身HttpServletRequest…
4.GenericServlet是servlet包中的抽象类,实现了Servlet接口,无关http协议的;
HttpServlet抽象类是http包中的,有关http协议的,扩展了servlet包中对应的抽象类和包。
因此扩展了GenericServlet抽象类,同时还有doget()和dopost()方法。

GenericServlet、HttpServlet、doget()、dopost()区别借鉴:

https://blog.csdn.net/dongguang1082/article/details/4189799?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.add_param_isCf

猜你喜欢

转载自blog.csdn.net/weixin_44926962/article/details/109399035