基本概念(常识)

C/S架构的概念

C/S架构(Client/Server,客户端/服务器模式),是一种比较早的软件体系结构,也是生活中很常见的结构。这种结构将需要处理的业务合理地分配到客户端和服务器端,客户端通常负责完成与用 户的交互任务,服务器通常负责数据的管理。
C/S架构的主要优点如下:
客户端的界面和功能可以很丰富。应用服务器的负荷较轻。
响应速度较快。
C/S架构的主要缺点如下:
适用面窄,用户群固定。
维护和升级的成本高,所有的客户端都需要更新版本。

B/S架构的概念

B/S架构(Browser/Server,浏览器/服务器模式),是互联网兴起后的软件体系结构,该结构将系统功能实现的主要业务逻辑集中到服务器端,极少数业务逻辑在浏览器实现,浏览器通常负责完 成与用户的交互任务,服务器通常负责数据的管理。
B/S架构的主要优点如下:
无需安装客户端,只要有浏览器即可。适用面广,用户群不固定。
通过权限控制实现多客户访问的目的,交互性较强。维护和升级的成本低,无需更新所有客户端版本。
B/S架构的主要缺点如下:
应用服务器的负荷较重。
浏览器的界面和功能想要达到客户端的丰富程度需要花费大量的成本。在跨浏览器上不尽如人意,适配比较麻烦。

JavaWeb的概念

Web本意为网页的含义,这里表示互联网上供外界访问的资源。 互联网上供外界访问的资源主要分为以下两种:
静态资源:主要指Web页面中供人们浏览的数据始终是不变。
动态资源:主要指Web页面中供人们浏览的数据由程序产生,不同时间点访问页面看到的内 容各不相同。
JavaWeb主要指使用Java语言进行动态Web资源开发技术的统称,是解决相关Web互联网领域的技术总和。
早期的B/S架构

第一章 Servlet核心技术(上) - 图1

  • 后来的B/S架构

第一章 Servlet核心技术(上) - 图2

HTTP协议(熟悉)

HTTP协议的概念

  • HTTP协议(HyperText Transfer Protocol,超文本传输协议)是由W3C(万维网联盟)组织制定的一种应用层协议,是用来规范浏览器与Web服务器之间如何通讯的数据格式,主要涉及浏览器的发请求格式和服务器的响应格式。

  • HTTP协议通常承载于TCP协议之上,而承载于TLS或SSL协议层之上的协议就是常说的HTTPS协议。

第一章 Servlet核心技术(上) - 图3

  • HTTP默认的端口号为80,HTTPS默认的端口号为443。

    HTTP请求格式

  • 客户端发送一个HTTP请求到服务器的请求消息主要包括:请求行、请求头、空白行和请求体。 ```jsx 请求行用来说明请求类型和要访问的资源以及所使用的HTTP版本,格式如下: 请求类型 请求的路径 协议的版本(1.1) 请求头是紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息,格式 (key:value)如下: 主机 请求长度 请求的浏览器相关信息 空白行就是请求头部的空行,即使后面的请求数据为空则必须有空行。

请求体也叫请求数据,可以添加任意的其他数据。

  1. - 举例如下:
  2. ```jsx
  3. POST /task01_demo01/demo1.html HTTP/1.1 Host: localhost:8088
  4. Content-Length: 21
  5. Cache-Control: max-age=0
  6. User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
  7. name=scott&pwd=123456

HTTP响应格式

  • 通常情况下服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息,主要包括:响应行、响应头、空白行和响应体。 ```jsx 响应行用来说明HTTP协议版本号和状态码以及状态消息,格式如下: 协议的版本(1.0 1.1) 状态码 (200 成功 404 路径错误 500 服务错误) 状态信息 响应头用来说明客户端要使用的一些附加信息,格式(key:value)。 空白行就是响应头部的空行,即使后面的请求数据为空则必须有空行。

响应体用来服务器返回给客户端的文本信息。

  1. - 举例如下:
  2. ```jsx
  3. HTTP/1.1 200 OK
  4. Content-Type: text/html Content-Length: 588
  5. Date: Thu, 08 Sep 2021 12:59:54 GMT
  6. <html><head><title>示例1</title></head>
  7. <body><h1>这是一个HTML页面</h1></body>
  8. </html>

Tomcat服务器(重点)

基本概念

Tomcat本意为公猫的含义,最初是由Sun公司的软件架构师詹姆斯·邓肯·戴维森开发的,后来他帮助将其变为开源项目并由Sun公司贡献给Apache软件基金会。
Tomcat服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。

安装方式

第一章 Servlet核心技术(上) - 图4下载地址:http://tomcat.apache.org/

目录结构

bin 主要存放二进制可执行文件和脚本。
conf 主要存放各种配置文件。
lib 主要用来存放Tomcat运行需要加载的jar包。
logs 主要存放Tomcat在运行过程中产生的日志文件。
temp 主要存放Tomcat在运行过程中产生的临时文件。
webapps 主要存放应用程序,当Tomcat启动时会去加载该目录下的应用程序。
work 主要存放tomcat在运行时的编译后文件,例如JSP编译后的文件。
image.png

启动和关闭

  • 启动方式

使用bin目录下的批处理文件startup.bat来启动Tomcat服务器,若出现一个毫秒数说明启动成功。

  • 关闭方式

使用bin目录下的批处理文件shutdown.bat来关闭Tomcat服务器。

  • 注意事项

启动之前首先安装JDK并配置环境变量JAVA_HOME,若希望Tomcat服务器可以在任意路径启动, 则需要配置环境变量CATALINA_HOME。
启动信息乱码的处理方式:logging.properties文件修改为
java.util.logging.ConsoleHandler.encoding = GBK
image.png

MAC下安装和配置参考:https://www.cnblogs.com/ring1992/p/12715467.html
按快捷键:command+shift+G
开启:./startup.sh
关闭:./shutdown.sh

配置文件

  • server.xml文件是服务器的主配置文件,可以设置端口号、设置域名或IP、默认加载的项目、请求 编码等。

    1. <Connector port="8888" protocol="HTTP/1.1"
    2. connectionTimeout="20000" redirectPort="8443" />
  • tomcat-users.xml文件用来配置管理Tomcat服务器的用户与权限 。

    1. <role rolename="manager-gui"/>
    2. <user username="admin" password="123456" roles="manager-gui"/>

    Servlet的概念和使用(重点)

    基本概念

  • Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写的服务器端程序,换句话说,Servlet就是运行在服务器上的Java类。

  • Servlet用来完成B/S架构下客户端请求的响应处理,也就是交互式地浏览和生成数据,生成动态Web内容。

    Servlet的编程步骤

  • 建立一个Java Web Application项目并配置Tomcat服务器。

  • 自定义类实现Servlet接口或继承 HttpServlet类(推荐) 并重写service方法。
  • 将自定义类的信息配置到 web.xml文件并启动项目,配置方式如下: ```jsx HelloServlet com.lagou.task01.HelloServlet

HelloServlet

/hello

  1. - 在浏览器上访问的方式为:
  2. http://localhost:8080/工程路径/url-pattern的内容
  3. <a name="uKoyd"></a>
  4. ## Servlet接口
  5. 1. **基本概念**
  6. - javax.servlet.Servlet接口用于定义所有servlet必须实现的方法。
  7. 2. **常用的方法**
  8. | **方法声明** | **功能介绍** |
  9. | --- | --- |
  10. | void init(ServletCong cong) | servlet容器调用,以向servlet指示servlet正在被放入服务中 |
  11. | void service(ServletRequest req, ServletResponse res) | servlet容器调用,以允许servlet响应请求 |
  12. | ServletCong getServletCong() | 返回ServletCong对象,该对象包含此servlet的初始化和启动参数 |
  13. | String getServletInfo() | 返回有关servlet的信息,如作者、版本和版权 |
  14. | void destroy() | servlet容器调用,以向servlet指示该servlet正在退出服务 |
  15. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/258783/1619320027246-6feaee2d-03eb-450f-a224-9a14e4800363.png#clientId=u0e6c75e9-e1ea-4&from=paste&height=1670&id=u6fccbf72&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1670&originWidth=2848&originalType=binary&size=518588&status=done&style=none&taskId=u6008437d-f636-4bfe-af30-964fd89b1e2&width=2848)
  16. <a name="8IraJ"></a>
  17. ## GenericServlet类
  18. 1. **基本概念**
  19. - javax.servlet.GenericServlet类主要用于定义一个通用的、与协议无关的servlet,该类实现了Servlet接口。
  20. 若编写通用servlet,只需重写service抽象方法即可。
  21. 2. **常用的方法**
  22. | **方法声明** | **功能介绍** |
  23. | --- | --- |
  24. | abstract void service(ServletRequest req, ServletResponse res) | servlet容器调用允许servlet响应请求 |
  25. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/258783/1619320203302-d0677cd1-7244-44f5-933c-75d93fcee7a2.png#clientId=u0e6c75e9-e1ea-4&from=paste&height=1546&id=u5f16793e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1546&originWidth=2880&originalType=binary&size=433347&status=done&style=none&taskId=u1e65300c-9e27-4cb5-b3fd-49187cf8454&width=2880)
  26. <a name="7ygbe"></a>
  27. ## HttpServlet类
  28. 1. **基本概念**
  29. - javax.servlet.http.HttpServlet类是个抽象类并继承了GenericServlet类。
  30. - 用于创建适用于网站的HTTP Servlet,该类的子类必须至少重写一个方法。
  31. 2. **常用的方法**
  32. | **方法声明** | **功能介绍** |
  33. | --- | --- |
  34. | void doGet(HttpServletRequest req, HttpServletResponse resp) | 处理客户端的GET请求 |
  35. | void doPost(HttpServletRequest req, HttpServletResponse resp) | 处理客户端的POST请求 |
  36. | void init() | 进行初始化操作 |
  37. | void service(HttpServletRequest req, HttpServletResponse resp) | 根据请求决定调用doGet还是<br />doPost方法 |
  38. | void destroy() | 删除实例时释放资源 |
  39. <a name="1kWKx"></a>
  40. ## Servlet 的生命周期
  41. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/258783/1619019978918-f3eb267f-0b11-4556-8c9b-75937a343bfd.jpeg#id=iBK3F&originHeight=453&originWidth=1017&originalType=binary&status=done&style=none)
  42. - 构造方法只被调用一次,当第一次请求Servlet时调用构造方法来创建Servlet的实例。
  43. - init方法只被调用一次,当创建好Servlet实例后立即调用该方法实现Servlet的初始化。
  44. - service方法被多次调用,每当有请求时都会调用service方法来用于请求的响应。
  45. - destroy方法只被调用一次,当该Servlet实例所在的Web应用被卸载前调用该方法来释放当前占用的资源。
  46. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/258783/1619320419217-aaf65ffb-dcad-4fe2-9e83-fe32c4727203.png#clientId=u0e6c75e9-e1ea-4&from=paste&height=1968&id=u154f31e5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1968&originWidth=2876&originalType=binary&size=618384&status=done&style=none&taskId=u21806398-12b9-4d53-a54b-4d7cf0cb883&width=2876)
  47. <a name="D4tiL"></a>
  48. # POST和GET请求(重点)
  49. <a name="wcsvw"></a>
  50. ## GET请求
  51. 发出GET请求的主要方式:
  52. 1. 在浏览器输入URL按回车
  53. 1. 点击<a>超链接
  54. 1. 点击submit按钮,提交 <form method=“get”>表单GET请求特点:
  55. 会将请求数据添加到请求URL地址的后面,只能提交少量的数据、不安全
  56. <a name="tRIgG"></a>
  57. ## POST请求
  58. 发出POST请求的方法如下:<br /> 点击submit按钮,提交 <form method=“post”>表单<br />POST请求的特点:<br /> 请求数据添加到HTTP协议体中,可提交大量数据、安全性好
  59. <a name="P7JHx"></a>
  60. ## ServletRequest接口
  61. 1. **基本概念**
  62. - javax.servlet.ServletRequest接口主要用于向servlet提供客户端请求信息,可以从中获取到任何请求信息。
  63. - Servlet容器创建一个ServletRequest对象,并将其作为参数传递给Servletservice方法。
  64. 2. **常用的方法**
  65. | **方法声明** | **功能介绍** |
  66. | --- | --- |
  67. | String getParameter(String name) | 以字符串形式返回请求参数的值,如果该参数不存在,则返回空值 |
  68. | String[] getParameterValues( String name) | 返回一个字符串对象数组,其中包含给定请求参数所具有的所有值,如果该参数不存在,则返回空值 |
  69. | Enumeration getParameterNames() | 返回包含此请求中包含的参数名称的字符串对象的枚举。如果请求没有参数,则方法返回空枚举 |
  70. | Map<String, String[]> getParameterMap() | 返回请求参数的键值对,一个键可以对应多个值 |
  71. | String getRemoteAddr() | 返回发送请求的客户端或最后一个代理的IP地址 |
  72. | int getRemotePort() | 返回发送请求的客户端或最后一个代理的端口号 |
  73. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/258783/1619321579697-1446567b-ee18-49dd-9b85-7c919f1566d1.png#clientId=u0e6c75e9-e1ea-4&from=paste&height=1884&id=u3d0095de&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1884&originWidth=2862&originalType=binary&size=661329&status=done&style=none&taskId=ub88d47d1-31a0-4944-b7ae-78ed3235514&width=2862)
  74. ```html
  75. <!DOCTYPE html>
  76. <html lang="en">
  77. <head>
  78. <meta charset="UTF-8">
  79. <title>请求参数的获取和测试</title>
  80. </head>
  81. <body>
  82. <form action="parameter" method="post">
  83. 姓名:<input type="text" name="name"/><br/>
  84. 年龄:<input type="text" name="age"/><br/>
  85. 爱好:<input type="checkbox" name="hobby" value="Java"/>Java
  86. <input type="checkbox" name="hobby" value="C"/>C
  87. <input type="checkbox" name="hobby" value="C++"/>C++<br/>
  88. <input type="submit" value="提交"/>
  89. </form>
  90. </body>
  91. </html>
  1. package com.lagou.demo02;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. import java.util.Enumeration;
  9. import java.util.Map;
  10. import java.util.Random;
  11. import java.util.Set;
  12. public class ParameterServlet extends HttpServlet {
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. // 6.设置请求信息中的编码方式为utf-8来解决乱码问题
  15. request.setCharacterEncoding("utf-8");
  16. // 1.获取指定参数名称对应的参数值并打印
  17. String name = request.getParameter("name");
  18. System.out.println("获取到的姓名为:" + name);
  19. String[] hobbies = request.getParameterValues("hobby");
  20. System.out.print("获取到的爱好有:");
  21. for (String ts : hobbies) {
  22. System.out.print(ts + " ");
  23. }
  24. System.out.println();
  25. System.out.println("-------------------------------------------------------");
  26. // 2.获取所有参数的名称
  27. Enumeration<String> parameterNames = request.getParameterNames();
  28. System.out.print("获取到的所有参数名称为:");
  29. while (parameterNames.hasMoreElements()) {
  30. System.out.print(parameterNames.nextElement() + " ");
  31. }
  32. System.out.println();
  33. System.out.println("-------------------------------------------------------");
  34. // 3.获取请求参数名和对应值的第二种方式
  35. Map<String, String[]> parameterMap = request.getParameterMap();
  36. // 使用Map集合中所有的键值对组成Set集合
  37. Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
  38. // 遍历Set集合
  39. for (Map.Entry<String, String[]> me : entries) {
  40. System.out.print(me.getKey() + "对应的数值有:");
  41. for (String ts : me.getValue()) {
  42. System.out.print(ts + " ");
  43. }
  44. System.out.println();
  45. }
  46. System.out.println("-------------------------------------------------------");
  47. // 4.获取客户端请求的其它信息
  48. System.out.println("发送请求的客户端IP地址为:" + request.getRemoteAddr());
  49. System.out.println("发送请求的客户端端口号为:" + request.getRemotePort());
  50. System.out.println("请求资源的路径为:" + request.getRequestURI());
  51. System.out.println("请求资源的完整路径为:" + request.getRequestURL());
  52. System.out.println("请求方式为:" + request.getMethod());
  53. System.out.println("请求的附带参数为:" + request.getQueryString());
  54. System.out.println("请求的Servlet路径为:" + request.getServletPath());
  55. System.out.println("-------------------------------------------------------");
  56. // 5.向浏览器发出响应数据
  57. // 获取响应数据的默认编码方式
  58. String characterEncoding = response.getCharacterEncoding();
  59. System.out.println("服务器响应数据的默认编码方式为:" + characterEncoding); // ISO-8859-1
  60. // 设置服务器和浏览器的编码方式以及文本类型
  61. response.setContentType("text/html;charset=UTF-8");
  62. PrintWriter writer = response.getWriter();
  63. //writer.write("I Received!");
  64. //writer.write("我接收到了!");
  65. Random ra = new Random();
  66. int num = ra.nextInt(100) + 1;
  67. writer.write("<h1>" + num + "</h1>");
  68. System.out.println("服务器发送数据成功!");
  69. writer.close();
  70. }
  71. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  72. this.doPost(request, response);
  73. }
  74. }

HttpServletRequest接口

  1. 基本概念
  • javax.servlet.http.HttpServletRequest接口是ServletRequest接口的子接口,主要用于提供HTTP

请求信息的功能。

  • 不同于表单数据,在发送HTTP请求时,HTTP请求头直接由浏览器设置。
  • 可直接通过HttpServletRequest对象提供的一系列get方法获取请求头数据。
  1. 常用的方法 | 方法声明 | 功能介绍 | | —- | —- | | String getRequestURI() | 返回此请求的资源路径信息 | | StringBuffer getRequestURL() | 返回此请求的完整路径信息 | | String getMethod() | 返回发出此请求的HTTP方法的名称,例如GET、POST | | String getQueryString() | 返回路径后面请求中附带的参数 | | String getServletPath() | 返回此请求中调用servlet的路径部分 |
  1. // 4.获取客户端请求的其它信息
  2. System.out.println("发送请求的客户端IP地址为:" + request.getRemoteAddr());
  3. System.out.println("发送请求的客户端端口号为:" + request.getRemotePort());
  4. System.out.println("请求资源的路径为:" + request.getRequestURI());
  5. System.out.println("请求资源的完整路径为:" + request.getRequestURL());
  6. System.out.println("请求方式为:" + request.getMethod());
  7. System.out.println("请求的附带参数为:" + request.getQueryString());
  8. System.out.println("请求的Servlet路径为:" + request.getServletPath());

ServletResponse接口

  1. 基本概念
  • javax.servlet.ServletResponse接口用于定义一个对象来帮助Servlet向客户端发送响应。
  • Servlet容器创建ServletResponse对象,并将其作为参数传递给servlet的service方法。
  1. 常用方法 | 方法声明 | 功能介绍 | | —- | —- | | PrintWriter getWriter() | 返回可向客户端发送字符文本的PrintWriter对象 | | String getCharacterEncoding() | 获取响应内容的编码方式 | | void setContentType(String type) | 如果尚未提交响应,则设置发送到客户端响应的内容类型。内容类型可以包括字符编码规范,例如text/html;charset=UTF-8 |
  1. System.out.println("-------------------------------------------------------");
  2. // 5.向浏览器发出响应数据
  3. // 获取响应数据的默认编码方式
  4. String characterEncoding = response.getCharacterEncoding();
  5. System.out.println("服务器响应数据的默认编码方式为:" + characterEncoding); // ISO-8859-1
  6. // 设置服务器和浏览器的编码方式以及文本类型
  7. response.setContentType("text/html;charset=UTF-8");
  8. PrintWriter writer = response.getWriter();
  9. //writer.write("I Received!");
  10. //writer.write("我接收到了!");
  11. Random ra = new Random();
  12. int num = ra.nextInt(100) + 1;
  13. writer.write("<h1>" + num + "</h1>");
  14. System.out.println("服务器发送数据成功!");
  15. writer.close();

HttpServletResponse接口

  1. 基本概念
  • javax.servlet.http.HttpServletResponse接口继承ServletResponse接口,以便在发送响应时提供特定于HTTP的功能。
  1. 常用的方法
方法声明 功能介绍
void sendRedirect(String location) 使用指定的重定向位置URL向客户端发送临时重定向响应

使用示例

  1. // 继承HttpServlet
  2. public class HelloWorld extends HttpServlet {
  3. // 重写HttpServlet中的doGet方法
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  5. throws IOException, ServletException {
  6. // 设置响应输出编码,避免中文乱码
  7. response.setContentType(“text/html;charset=utf-8”);
  8. // 获取响应输出流
  9. PrintWriter out= response.getWriter();
  10. // 利用输出流输出信息
  11. out.println(“<html><body> Hello world!</body></html>”);
  12. //关闭流out.close();
  13. }
  14. }

案例题目
使用Servlet获取在服务器获取一个1~100之间的随机数并发送给客户端进行显示。

Servlet接收中文乱码(重点)

接收乱码原因

浏览器在提交表单时,会对中文参数值进行自动编码。当Tomcat服务器接收到浏览器请求后自动解码,当编码与解码方式不一致时,就会导致乱码。

解决POST接收乱码

接收之前设置编码方式:
request.setCharacterEncoding(“utf-8”)
提示:
必须在调用request.getParameter(“name”)之前设置
image.png

解决GET接收乱码

将接收到的中文乱码重新编码:
// 接收到get请求的中文字符串
String name = request.getParameter(“name”);
// 将中文字符重新编码,默认编码为ISO-8859-1
String userName = new String(name.getBytes(“ISO-8859-1”),“utf-8”);
image.png

ServletConfig接口(熟悉)

  1. 基本概念
  • javax.servlet.ServletConfig接口用于描述Servlet本身的相关配置信息,在初始化期间用于将信息 传递给Servlet配置对象。
  1. 配置方式

    1. <!-- 在web.xml中配置ServletConfig初始化参数 -->
    2. <servlet>
    3. <servlet-name>actionservlet</servlet-name>
    4. <servlet-class>com.lagou.demo01.ActionServlet</servlet-class>
    5. <!-- 配置 Serlvet 的初始化参数 -->
    6. <init-param>
    7. <!-- 参数名 -->
    8. <param-name>config</param-name>
    9. <!-- 参数值 -->
    10. <param-value>struts.xml</param-value>
    11. </init-param>
    12. </servlet>
  2. 常用的方法 | 方法声明 | 功能介绍 | | —- | —- | | String getServletName() | 返回Servlet的别名 | | String getInitParameter(String name) | 返回包含初始化参数值的字符串,如果该参数不存在,则返回null | | Enumeration getInitParameterNames() | 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果
    servlet没有初始化参数,则返回空枚举 | | ServletContext getServletContext() | 返回对调用方正在其中执行的ServletContext的引用 |

image.png

  1. package com.lagou.demo02;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.util.Enumeration;
  8. /**
  9. * @author 悟空
  10. * @create 2021/4/25 下午12:13
  11. */
  12. public class ConfigServlet implements Servlet {
  13. @Override
  14. public void init(ServletConfig servletConfig) throws ServletException {
  15. System.out.println("初始化操作执行了...");
  16. System.out.println("Servlet别名是:" + servletConfig.getServletName()); // ConfigServlet
  17. System.out.println("-----------------------------------------------");
  18. // 获取配置文件中的初始化参数信息
  19. String userName = servletConfig.getInitParameter("userName");
  20. System.out.println("获取到的初始化用户名为:" + userName);
  21. // 获取所有配置参数的名称
  22. Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
  23. while (initParameterNames.hasMoreElements()){
  24. System.out.println("初始化参数名为:" + initParameterNames.nextElement());
  25. }
  26. System.out.println("-----------------------------------------------");
  27. // 获取ServletContext接口的引用
  28. ServletContext servletContext = servletConfig.getServletContext();
  29. System.out.println("获取到的ServletContext引用为:" + servletContext);
  30. }
  31. @Override
  32. public ServletConfig getServletConfig() {
  33. return null;
  34. }
  35. @Override
  36. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  37. }
  38. @Override
  39. public String getServletInfo() {
  40. return null;
  41. }
  42. @Override
  43. public void destroy() {
  44. }
  45. }

ServletContext接口(熟悉)

  1. 基本概念
  • javax.servlet.ServletContext接口主要用于定义一组方法,Servlet使用这些方法与它的Servlet容 器通信。
  • 服务器容器在启动时会为每个项目创建唯一的一个ServletContext对象,用于实现多个Servlet之间的信息共享和通信。
  • 在Servlet中通过this.getServletContext()方法可以获得ServletContext对象。
  1. 配置方式

    1. <!--在web.xml中配置ServletContext初始化参数 -->
    2. <context-param>
    3. <param-name>username</param-name>
    4. <param-value>scott</param-value>
    5. <context-param>
    6. <context-param>
    7. <param-name>password</param-name>
    8. <param-value>tiger</param-value>
    9. <context-param>
  2. 常用的方法 | 方法声明 | 功能介绍 | | —- | —- | | String getInitParameter(String name) | 返回包含初始化参数值的字符串,如果该参数不存在,则返回
    null | | Enumeration getInitParameterNames() | 将servlet的初始化参数的名称作为字符串对象的枚举返回,如 果servlet没有初始化参数,则返回空枚举 | | String getRealPath(String path) | 返回包含给定虚拟路径的实际路径的字符串 | | String getContextPath() | 返回与此上下文关联的主路径 | | InputStream getResourceAsStream(String path) | 将位于指定路径的资源作为InputStream对象返回 | | void setAttribute(String name, Object object) | 将指定的属性名和属性值绑定到当前对象 | | Object getAttribute(String name) | 根据执行的属性名获取属性值 | | void removeAttribute(String name) | 删除指定的属性名信息 |

image.png

  1. package com.lagou.demo02;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.util.Enumeration;
  9. /**
  10. * @author 悟空
  11. * @create 2021/4/25 下午12:27
  12. */
  13. public class ContextServlet extends HttpServlet {
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. // 1.配置参数的获取
  16. ServletContext servletContext = getServletConfig().getServletContext();
  17. Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
  18. while (initParameterNames.hasMoreElements()) {
  19. String s = initParameterNames.nextElement();
  20. System.out.println(s + "对应值为:" + servletContext.getInitParameter(s));
  21. }
  22. System.out.println("----------------------------------------------------------");
  23. // 2.相关路径的获取
  24. // 本质上就是获取工程路径 /工程名
  25. String contextPath = servletContext.getContextPath();
  26. System.out.println("获取上下文关联的路径信息为:" + contextPath); // /task01_demo02
  27. // / 在服务器被解析为: http://ip地址:端口号/工程名 获取实际路径信息
  28. // 获取到的是部署工程路径信息 对应 当前工程中的web目录
  29. String realPath = servletContext.getRealPath("/");
  30. System.out.println("获取到的实际路径信息为:" + realPath);
  31. System.out.println("----------------------------------------------------------");
  32. // 3.设置获取属性信息
  33. servletContext.setAttribute("key","value");
  34. Object key = servletContext.getAttribute("key");
  35. System.out.println("根据参数指定属性名获取到的属性值为:" + key); // value
  36. servletContext.removeAttribute("key");
  37. key = servletContext.getAttribute("key");
  38. System.out.println("根据参数指定属性名获取到的属性值为:" + key); // null
  39. }
  40. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  41. this.doPost(request, response);
  42. }
  43. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!-- 对于ServletContext对象的参数进行配置 -->
  7. <context-param>
  8. <param-name>param1</param-name>
  9. <param-value>value1</param-value>
  10. </context-param>
  11. <context-param>
  12. <param-name>param2</param-name>
  13. <param-value>value2</param-value>
  14. </context-param>
  15. <servlet>
  16. <servlet-name>ConfigServlet</servlet-name>
  17. <servlet-class>com.lagou.demo02.ConfigServlet</servlet-class>
  18. <!-- 实现初始化参数的配置 -->
  19. <init-param>
  20. <!-- 初始化参数的名称 -->
  21. <param-name>userName</param-name>
  22. <!-- 初始化参数的数值 -->
  23. <param-value>admin</param-value>
  24. </init-param>
  25. <init-param>
  26. <param-name>password</param-name>
  27. <param-value>123456</param-value>
  28. </init-param>
  29. </servlet>
  30. <servlet-mapping>
  31. <servlet-name>ConfigServlet</servlet-name>
  32. <url-pattern>/config</url-pattern>
  33. </servlet-mapping>
  34. <!-- 进行Servlet的配置 -->
  35. <servlet>
  36. <!-- 对Servlet起别名 习惯上就使用类名 -->
  37. <servlet-name>HelloServlet3</servlet-name>
  38. <!-- 指定上述别名所对应的Servlet类 -->
  39. <servlet-class>com.lagou.demo02.HelloServlet3</servlet-class>
  40. </servlet>
  41. <!-- 进行Servlet的映射配置 -->
  42. <servlet-mapping>
  43. <servlet-name>HelloServlet3</servlet-name>
  44. <!-- 配置浏览器的访问地址 -->
  45. <url-pattern>/hello3</url-pattern>
  46. </servlet-mapping>
  47. <!-- 进行Servlet的配置 -->
  48. <servlet>
  49. <!-- 对Servlet起别名 习惯上就使用类名 -->
  50. <servlet-name>HelloServlet2</servlet-name>
  51. <!-- 指定上述别名所对应的Servlet类 -->
  52. <servlet-class>com.lagou.demo02.HelloServlet2</servlet-class>
  53. </servlet>
  54. <!-- 进行Servlet的映射配置 -->
  55. <servlet-mapping>
  56. <servlet-name>HelloServlet2</servlet-name>
  57. <!-- 配置浏览器的访问地址 -->
  58. <url-pattern>/hello2</url-pattern>
  59. </servlet-mapping>
  60. <!-- 进行Servlet的配置 -->
  61. <servlet>
  62. <!-- 对Servlet起别名 习惯上就使用类名 -->
  63. <servlet-name>HelloServlet</servlet-name>
  64. <!-- 指定上述别名所对应的Servlet类 -->
  65. <servlet-class>com.lagou.demo02.HelloServlet</servlet-class>
  66. </servlet>
  67. <servlet>
  68. <servlet-name>ParameterServlet</servlet-name>
  69. <servlet-class>com.lagou.demo02.ParameterServlet</servlet-class>
  70. </servlet>
  71. <servlet>
  72. <servlet-name>ContextServlet</servlet-name>
  73. <servlet-class>com.lagou.demo02.ContextServlet</servlet-class>
  74. </servlet>
  75. <servlet-mapping>
  76. <servlet-name>ContextServlet</servlet-name>
  77. <url-pattern>/context</url-pattern>
  78. </servlet-mapping>
  79. <servlet-mapping>
  80. <servlet-name>ParameterServlet</servlet-name>
  81. <url-pattern>/parameter</url-pattern>
  82. </servlet-mapping>
  83. <!-- 进行Servlet的映射配置 -->
  84. <servlet-mapping>
  85. <servlet-name>HelloServlet</servlet-name>
  86. <!-- 配置浏览器的访问地址 -->
  87. <url-pattern>/hello</url-pattern>
  88. </servlet-mapping>
  89. </web-app>