title: 【学习之路】Servlet学习
draft: true
tags:
- 学习之路
- JavaEE
- Servlet
categories: - JavaEE
- Servlet
cover: https://cdn.jsdelivr.net/gh/CodeZixuan/Blog_Images/Violet_Evergarden_anime_anime_girls-1467453.jpg
description: 关于Servlet的学习笔记
abbrlink: 10954
date: 2020-10-03 22:41:10
Servlet程序的实现代码
- 实现Servlet接口
- 重写service方法
- 到工程目录下的web.xml文件中去配置servlet程序访问地址
public class HelloServlet implements Servlet {/*** service方法是专门用来处理请求和响应的* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic 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>test.HelloServlet</servlet-class></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></web-app>
常见错误
- 常见错误 :url-pattern 中配置的路径没有以斜杠打头:

- 常见错误 :servlet-name 配置的值不存在:

- 常见错误 :servlet-class 标签的全类名配置错误:

Servlet的生命周期
- 执行Servlet构造器方法
- 执行init方法
第一步第二部是在第一次访问时调用
- 执行Service方法
第三步在每次访问时都会调用
- 执行destroy销毁方法
第四步在web工程停止的时候调用
通过HttpServlet实现Servlet程序
- 编写一个类继承Servlet类
- 更具业务需要重写doGet或doPost方法
- 到web.xml中的配置Servlet程序的访问地址
public class HelloServlet2 extends HttpServlet {/*** doGet()在get请求的时候调用* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HelloServlet2 的 doGet 方法");}/*** doPost()在post请求的时候调用* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HelloServlet2 的 doPost 方法");}}
使用IDEA编辑器直接创建Servlet程序


Servlet类的继承体系

ServletConfig类
- Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
- Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对
象。
ServletConfig类的三大作用
- 可以获取Servlet程序的别名 Servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
- web.xml中 的配置
<!-- servlet 标签给Tomcat 配置Servlet程序 --><servlet><!--servlet-name标签Servlet程序起一个别名(一般是类名)--><servlet-name>HelloServlet</servlet-name><!--servlet-class是Servlet程序的全类名--><servlet-class>test.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标签配置访问地址/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径/hello 表示地址为:http://ip:port/工程路径/hello--><url-pattern>/hello</url-pattern></servlet-mapping>
- 注意点
重写init方法时要先super调用父类的方法super.init(config)将config参数进行储存
ServletContext类
ServletContext类的四个作用
- 获取web.xml中配置的上下文参数context-parm
- 获取当前工程的路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map集合一样存取数据
- ServletContext演示代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1、获取web.xml中配置的上下文参数context-paramServletContext context = getServletConfig().getServletContext();String username = context.getInitParameter("username");System.out.println("context-param 参数 username 的值是:" + username);System.out.println("context-param 参数 password 的值是:" + context.getInitParameter("password"));// 2、获取当前的工程路径,格式: /工程路径System.out.println( "当前工程路径:" + context.getContextPath() );// 3、获取工程部署后在服务器硬盘上的绝对路径/*** /斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录*/System.out.println("工程部署的路径是:" + context.getRealPath("/"));System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));}
- web.xml中的配置
<!--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>
- ServletContext 像 Map 一样存取数据
public class ContextServlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取ServletContext 对象ServletContext context = getServletContext();System.out.println(context);System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));context.setAttribute("key1", "value1");System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));}}
