1 Servlet继承体系
1.1 Servlet的继承体系
Servlet只是一个接口,我们创建的Servlet程序都是继承于HttpServlet类,通过查看源码,可以看到Servlet的整个继承体系:

Servlet接口:
提供几个抽象方法负责Servlet程序的规范
GenericServlet类:
实现了Servlet接口,但对Servlet接口中的抽象方法进行了空实现
持有一个ServletConfig接口的对象
并对ServletConfig对象进行了一些方法调用
HttpServelt类:
主要实现了service方法,完成了请求的分发处理
即将来自客户端的请求分类为get,post由doGet和doPost处理
想要正常的处理get和post请求,需要重写doGet和doPost方法
MyServlet类:
继承了HttpServlet类,根据自己的业务逻辑重写doGet和doPost方法
1.2 ServletConfig
每个Servlet程序都会有一个自己的ServletConfig对象,Servlet程序和ServletConfig对象都是由Tomcat直接创建的,ServletConfig是当Servlet程序被创建时,为其创建一个对应的ServletConfig对象,一个Servlet程序对应一个ServletConfig对象,不能获取其它Servlet程序的信息
ServletConfig对象的功能:
1,获取Servlet程序的别名
即web.xml中的servlet-name
2,获取Servlet程序的初始化参数
即web.xml中的init-param
3,获取ServletContext对象
web.xml中的Servlet程序配置:
<!-- 演示4 ServletConfig -->
<servlet>
<servlet-name>MyServlet4</servlet-name>
<servlet-class>com.coisini.servlet.MyServlet4</servlet-class>
<!--
初始化Servlet程序参数
这些参数是MyServlet4独有的 其它Servlet程序无法得到
可以通过ServletConfig对象来获取
-->
<init-param>
<param-name>userName</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet4</servlet-name>
<url-pattern>/MyServlet4</url-pattern>
</servlet-mapping>
获取ServletConfig对象,得到其对应的Servlet程序的信息:
/**
* @author 雫
* @date 2021/4/27 - 15:00
* @function
*/
public class MyServlet4 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 获取Servlet程序对象的别名
System.out.println(servletConfig.getServletName());
// 获取初始化参数
System.out.println(servletConfig.getInitParameter("userName"));
System.out.println(servletConfig.getInitParameter("password"));
// 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() { return null; }
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}
@Override
public String getServletInfo() { return null; }
@Override
public void destroy() {}
}

1.3 ServletContext
ServletContext是一个接口,表示Servlet程序的上下文,一个工程中只有一个ServletContext对象,整个ServletContext对象是一个域对象,在Web工程启动时创建,Web工程停止时销毁
域对象
可以像Map一样存储数据的对象,域就是存取数据的操作范围
ServletContext对象的域是整个Web工程
可以通过setAttribute getAttribute removeAttribute存储数据
ServletContext对象的功能:
1,像Map一样存取数据
可以通过setAttribute getAttribute removeAttribute存取数据
当前工程下的所有Servlet程序都能操作同一个ServletContext对象中的数据
2,获取当前的工程路径
即web项目的虚拟路径
3,获取web.xml中配置的上下文参数 context-param
即web.xml中的context-param
4,获取工程部署后,在服务器磁盘上的绝对路径
映射到IDEA代码的webapp目录
web.xml中的配置:
<!-- 上下文参数(属于整个Web工程) 可由ServletContext获取 -->
<context-param>
<param-name>id</param-name>
<param-value>1999</param-value>
</context-param>
<context-param>
<param-name>nick</param-name>
<param-value>coisini</param-value>
</context-param>
<!-- 演示5 ServletContext -->
<servlet>
<servlet-name>MyServlet5</servlet-name>
<servlet-class>com.coisini.servlet.MyServlet5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet5</servlet-name>
<url-pattern>/MyServlet5</url-pattern>
</servlet-mapping>
任意一个Servlet程序中获取ServletContext对象,得到整个web工程的信息:
/**
* @author 雫
* @date 2021/4/27 - 15:26
* @function
*/
public class MyServlet5 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletConfig().getServletContext();
// 获取web.xml中的上下文参数
System.out.println(servletContext.getInitParameter("id"));
System.out.println(servletContext.getInitParameter("nick"));
// 获取当前工程路径 由于设置了虚拟路径为/ 这里没有值
System.out.println("path: " + servletContext.getContextPath());
// 获取工程部署后在磁盘上的绝对路径 及工程下文件的路径
System.out.println("realPath: " + servletContext.getRealPath("/"));
// System.out.println("工程下的img1文件的绝对路径" + servletContext.getRealPath("/img/1.jpg"));
// 像Map一样存取数据
servletContext.setAttribute("var1", "xyz");
System.out.println("var1: " + servletContext.getAttribute("var1"));
servletContext.removeAttribute("var1");
System.out.println("var1: " + servletContext.getAttribute("var1"));
servletContext.setAttribute("var2", "123");
}
}
/**
* @author 雫
* @date 2021/4/24 - 16:50
* @function 处理表单3的Servlet程序
*/
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单3的数据以post的方式提交");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单3的数据以get的方式提交");
// ServletContext对象只有一个且其中的数据共享给所有Servlet程序
ServletContext servletContext = getServletContext();
System.out.println("var2: " + servletContext.getAttribute("var2"));
}
}

216

被折叠的 条评论
为什么被折叠?



