文章目录
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