访问一个动态网页
概念:
-
每一个用户看到的界面都是不一样的
本质:
-
一个动态网页对应一个Servlet类。
-
通过web.xml配置文件--->使用URL路径将动态网页和Servlet类对应起来--->达到网页是动态的过程
过程:
-
浏览器--->URL路径--->Servlet类加载--->Servlet类实例化--->调用相关方法(通过Servlet类中的某些方法向浏览器输出Html语句)
创建动态网页的第一步--->创建Servlet类
拆分看Servlet规范:
-
最顶层是一个名为 javax.servlet.Servlet 的接口,所有的 Servlet 类都要直接或者间接地实现该接口
-
由于直接实现Servlet接口不太方便,所以Servlet接口内置两个Servlet接口实现类(抽象类)
-
GenericServlet
-
HttpServlet
-
由上诉可知创建Servlet类的三种方式:
-
实现 javax.servlet.Servlet 接口,重写其全部方法。
-
继承 javax.servlet.GenericServlet 抽象类,重写 service() 方法。
-
继承 javax.servlet.http.HttpServlet 抽象类,重写 doGet() 或 doPost() 方法。
自定义的Servlet类和上述三者之间的关系--->MyServlet是自定义的Servlet类
概括:
-
GenericServlet 是实现了 Servlet 接口的抽象类。
-
HttpServlet 是 GenericServlet 的子类,具有 GenericServlet 的一切特性。--->并不是分别实现Servlet接口的类
-
Servlet 程序(MyServlet 类)是一个实现了 Servlet 接口的 Java 类。
Servlet接口
概念:
javax.servlet.Servlet 是 Servlet API 的核心接口,所有的 Servlet 类都直接或间接地实现了这一接口。
Servlet接口中定义的五个方法
返回值 | 方法 | 备注 |
---|---|---|
void | init(ServletConfig config) | Servlet 实例化之后,由 Servlet 容器调用,用来初始化 Servlet 对象。该方法只能被调用一次。 参数 config 用来向 Servlet 传递配置信息。 |
void | service(ServletRequest req,ServletResponse res) | Servlet 容器调用该方法处理客户端请求。 |
void | destroy() | 服务器关闭、重启或者 Servlet 对象被移除时,由 Servlet 容器调用,负责释放 Servlet 对象占用的资源。 |
ServletConfig | getServletConfig() | 该方法用来获取 ServletConfig 对象,该对象中包含了 Servlet 的初始化参数。 |
String | getServletInfo() | 该方法用于获取 Servlet 的信息,例如作者、版本、版权等。 |
示例代码:
package ServletPractice;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 自定义的Servlet类,直接实现Servlet接口当中的方法
* @since JDK 1.8
* @date 2021/09/14
* @author Lucifer
*/
public class MyServlet implements Servlet{
//初始化Servlet实例的方法--->init()。只能被调用一次
GenericServlet 抽象类
该类特点:
-
javax.servlet.GenericServlet 实现了 Servlet 接口
-
提供了除 service() 方法以外的其他四个方法的简单实现。
-
继承 GenericServlet 类创建 Servlet ,只需要重写 service() 方法即可
GenericServlet抽象类新增的以下的方法:
返回值 | 方法 | 备注 |
---|---|---|
String | getInitParameter(String name) | 返回名字为 name 的初始化参数的值,初始化参数在 web.xml 中进行配置。如果参数不存在,则返回 null。 |
Enumeration<String> |
getInitParameterNames() | 返回 Servlet 所有初始化参数的名字的枚举集合,若 Servlet 没有初始化参数,返回一个空的枚举集合。 |
ServletContext | getServletContext() | 返回 Servlet 上下文对象的引用。 |
String | getServletName() | 返回此 Servlet 实例的名称。 |
示例代码:
package ServletPractice;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 通过继承GenericServlet抽象类来实现Servlet接口
* @since JDK 1.8
* @date 2021/09/14
* @author Lucfier
*/
public class MyServletDemoNo2 extends GenericServlet {
//只需要重写service方法即可
对比:
-
对比继承抽象类实现
Servlet
接口和直接实现Serlet
接口代码量少了一半
HttpServlet 抽象类
该类特点:
-
javax.servlet.http.HttpServlet 继承了 GenericServlet 抽象类,用于开发基于 HTTP 协议的 Servlet 程序。
-
Servlet 主要用来处理 HTTP 的请求和响应,通常情况下,编写的 Servlet 类都继承自 HttpServlet。
Http/1.1当中的请求方式:
-
一共有七种:GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。
HttpServlet针对七种请求分别定义了七种方法:
-
doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()
HttpServlet 重写了 service() 方法,该方法会先获取客户端的请求方式,然后根据请求方式调用对应 doXxx 方法。
示例代码:--->展示调用doGet和doPost方法
package ServletPractice;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 继承HttpServlet抽象类,实现service方法调用doGet和doPost方法示例
* @since JDK 1.8
* @date 2021/09/14
* @author Lucifer
*/
public class MyServletDemoNo3 extends HttpServlet {
//doGet方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//直接调用PrintWriter里面的方法向前端界面打印内容
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("HelloGet");
writer.close();
}
//doPost方法--->传入请求和响应
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//无需设置响应内容直接向前端界面打印
PrintWriter writer = response.getWriter();
writer.write("HelloPost");
writer.close();
doGet(request, response); //最终还是通过doGet方法进行打印
}
}