四、 JSP04 Servlet 技术

四、 Servlet 技术

4.1 认识 Servlet

Web 容器在处理 JSP 文件时,会将 JSP 文件通过 JSP 容器转换成可识别的 .java 文件

这个 .java 文就是一个 Servlet 类,JSP 技术就是基于 Servlet 实现的

4.1.1 什么是 Servlet

  • Servlet 是一个符合特定规范的 Java 程序,是一个基于 Java 技术的 Web 组件
  • 主要用于生成动态的内容
  • Servlet 在服务器端运行,有 Servlet 容器管理
  • Servlet 与客户端通过 Servlet 容器实现的 请求/响应模型进行交互
  • 运行流程主要如下图

image-20230528125725792

4.1.2 什么是 Servlet 容器

  • Servlet 容器也被称为 Servlet 引擎,是 Web 服务器或应用程序服务器的一部分
  • 用于在发送的请求和响应之上提供网络服务,管理和运行 Servlet/JSP

4.2 Servlet API 简介

Servlet 是一个特殊的 Java 类,这个 Java 类必须符合 Servlet 规范

Servlet API 定义在 javax.servlet 包中

主要描述和定义 Servlet 组件和运行环境之间的协定

4.2.1 Servlet 接口

  • Servlet 接口定义了所有 Servlet 组件必须实现的方法
  • 以及一系列初始化 Servlet、处理请求、释放 Servlet 等与 Servlet 的生命周期相关的方法
  • Servlet 接口的常用方法
方法名称功能描述
void init(ServletConfig config)用于在处理客户请求前完成 Servlet 对象的初始化工作
void service(ServletRequesr req,Servlet Response res)用于处理客户端的请求
void destroy()用于释放 Servlet 对象所使用的资源
ServletConfig getServletConfig()返回传递给 init() 方法的 ServletConfig 对象,该对象包含此 Servlet 的初始化和启动参数
String getServletInfo()返回有关 Servlet 的信息,如作者,版本和版权

4.2.2 GenericServlet 抽象类

  • 抽象类 GenericServlet 定义了通用的、不依赖于协议的 Servlet
  • 该类实现了 Servlet 接口和 ServletConfig 接口
  • 给出了出 service() 方法外的其他方法的简单实现
  • GenericServlet 抽象类的常用方法
方法名称功能描述
public void init(ServletConfig config)是对 Servlet 接口中 init(ServletConfig config)方法的实现
将 ServletConfig 实例保存以备用
public void init()用于在子类中重写,以实现用户定制的初始化工作
public String getInitParameter(String name)通过调用 ServletConfig 接口的 getInitParameter(String name) 方法
获取设置的初始化参数,为了简化从 ServletConfig 对象中获取初始化参数
而定义的方法
public ServletContext getServletContext()通过调用 ServletConfig 接口的 getServletContext() 方法返回 ServletContext()
对象的引用,为了简化从 ServletConfig 对象中获取 ServletContext 对象而定义
方法
  • 实现用户制定的初始化工作通常只需要重写不带参数的 init() 方法
  • 如果重写带参的 init(ServletConfig config) 方法,则应包含 super.init(config) 代码

4.2.3 HttpServlet 抽象类

  • Servlet 是运行在 Web 服务器的 Java 程序,基于 HTTP 来处理来自客户端的请求并给出响应
  • 抽象类 HttpServlet 继承自 GenericServlet 类
  • 除了具有 GenericServlet 类的相似的方法
  • 还针对 HTTP 提供了相关的支持
  • 能够针对 HTTP 的 POST、GET 等请求方式进行差异化处理
  • HTTPServlet 抽象类的常用方法
方法名称功能描述
public void service(ServletRequest req,
ServletResponse res)
对 GenericServlet 类中 service() 方法的实现,将请求
分发给 protected 类型的 sercice() 方法
protected void service(HttpServletRequesr req,
HttpServletResponse res)
针对 HTTP 的 service() 方法,接收标准的 HTTP 请求,并将他们分
发给 HttpServlet 类中定义的一系列 doXxx() 方法
protected void doXxx(HttpServletRequesr req,
HttpServletResponse res)
针对 HTTP 的不同请求方面而定义的一系列处理方法,如
doGet()、doPost() 等

4.2.4 ServletContext 接口

  • ServletContext 接口定义了 Servlet 组件用来与 Servlet 容器进行通信的一组方法

  • 例如:获取文件的 MIME 类型、调度请求或写入日志文件

  • 一个 ServletContext 示例表示一个 Web 应用的上下文

  • JSP 内置对象 application 就是 ServletContext 的示例

  • ServletContext 接口的常用方法

方法名称功能描述
String getInitParameter(String name)获取应用范围的名称为 name 的初始化参数值,应用范围的初始化
参数可以在部署描述符中使用<context-param> 元素定义
void setAttribute(String name,Object object)设置名称为 name 的属性
Object getAttribute(String name)获取名称为 name 的属性
void removeAttribute(String name)从 Servlet 上下文中删除局域给定名称的属性
String getRealPath(String path)返回参数所代表目录的真是路径
void log(Stirng message)记录一般日志信息

4.2.5 ServletConfig 接口

  • Servlet 容器使用 ServletConfig 接口的示例向 Servlet 组件传递配置信息
  • ServletConfig 接口的常用方法
方法名称功能描述
Enumeration <String> getInitParameterNames()获取 Servlet 所有初始化参数的名称
String getInitParameter(String name)获取以 name 命名的初始化餐数值
ServletContext getServletContext()返回 Servlet 的上下文对象引用

4.3 Servlet 的生命周期

Servlet 生命周期可被定义为 Servlet 从创建直到销毁的整个过程

包括加载和实例化、初始化、服务及销毁

4.3.1 Servlet 生命周期简介

  • Servlet 接口中的 init() 方法、service() 方法和 destroy() 方法表示了 Servlet 的生命周期
  • Servlet 不能独立运行,必须被部署在 Servlet 容器中
  • Servlet 容器会对 Servlet 的生命周期进行管理,如下图

image-20230528141546845

1、加载和实例化

  • 当客户端向某个 Servlet 发送一个请求时,Servlet 容器会查找内存中是否存在该 Servlet 的实例
  • 如果不存在,就会创建一个实例
  • 如果存在,就会之间从内存中取出该示例响应请求

2、初始化

  • Servlet 容器在完成 Servlet 实例化后,会调用该 Servlet 的 init() 方法进行初始化
  • 初始化的目的是让 Servlet 在处理客户端请求前完成一些准备工作
  • 对于每个 Servlet 实例,Servlet 容器只调用一次 init() 方法

3、服务

  • Servlet 容器会调用 Servlet 的 service() 方法处理客户端的请求
  • HttpServlet 的 service() 方法则会根据不同的请求方法(GET、POST 等)
  • 将请求分别发送到 doGet()、doPost() 等方法进行处理

4、销毁

  • Servlet 容器既负责创建 Servlet 实例,又负责销毁 Servlet 实例
  • 当 Servlet 实例应当被释放时,Servlet 容器就会调用 destroy() 方法
  • destroy() 方法负责释放 Servlet 实例所使用的资源,而不是之间回收 Servlet 实例

4.4 实现 Servlet

实现 Servlet 大致分为四个步骤

​ 1、创建普通的 Java 类

​ 2、实现 Servlet 的规范

​ 3、重写 service() 方法,用于处理请求

​ 4、设置注解,指定访问的路径

4.4.1 实现 Servlet 步骤01: 创建普通的 Java 类

  • 在 Web 项目中创建一个 Java 类

  • 我这里命名为 ”HelloServlet“

  • 代码示例 01

package com.example.demo;

public class HelloServlet  {
}

4.4.2 实现 Servlet 步骤02:实现 Servlet 的规范

  • 实现 Servlet 的规范 方式主要有以下几种
    • 继承 HttpServlet 类
    • 继承 GenericServlet 类
    • 实现 Servlet 接口
  • 最常用的是 继承 HttpServlet 接口
  • 代码示例 02
package com.example.demo;

import javax.servlet.http.HttpServlet;

public class HelloServlet  extends HttpServlet {
}

4.4.3 实现 Servlet 步骤03:重写 service() 方法

  • 重写 service() 方法,用于处理页面的请求,以及响应页面

  • 参数 req 表示请求,参数 resp 表示响应

  • 代码示例 03

package com.example.demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet  extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //输出在控制台
        System.out.println("HelloServlet");
        //输出在页面
        resp.getWriter().write("HelloServlet");
    }
}

4.4.4 实现 Servlet 步骤04:设置注解

  • 设置注解,指定 Servlet 的访问路径
  • 设置注解语法
@WebServlet("/路径")
  • 为 Servlet 设置注解后,可以直接在搜索此页面
  • 代码示例 04
package com.example.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//设置注解
@WebServlet("/ser01")

public class HelloServlet  extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //输出在控制台
        System.out.println("HelloServlet");
        //输出在页面
        resp.getWriter().write("HelloServlet");
    }
}

  • 可以在网址栏中直接搜索设置的路径

image-20230528145639995

  • 设置的路径无误的话,就会执行 Servlet 的创建和调用

s ServletException, IOException {
//输出在控制台
System.out.println(“HelloServlet”);
//输出在页面
resp.getWriter().write(“HelloServlet”);
}
}


- 可以在网址栏中直接搜索设置的路径

[外链图片转存中...(img-ctfi0hOT-1685257076158)]

- **设置的路径无误的话,就会执行 Servlet 的创建和调用**

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验报告:实验十一 - 文件上传与下载、Excel表格的导入导出、页面分页 实验目的: 本实验旨在通过使用JSPServlet技术,探索文件上传与下载的功能实现、Excel表格的导入导出方法,以及页面分页的实现思路。通过本实验,我们可以加深对这些功能的理解,并且为后续基于JSPServlet的项目开发提供基础支持。 一、文件上传与下载的实现思路: 1. 文件上传: a. 在JSP页面上,使用HTML表单元素创建一个文件上传表单。 b. 用户选择要上传的文件,并点击提交按钮。 c. 在Servlet中处理表单提交的请求。 d. 使用Apache Commons FileUpload库解析上传的文件,并保存到指定路径。 ```java // 从request中获取文件上传信息 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); // 处理每个文件项 for (FileItem item : items) { if (!item.isFormField()) { // 获取文件名和保存路径 String fileName = item.getName(); String filePath = "/path/to/save/" + fileName; // 保存文件到指定路径 item.write(new File(filePath)); } } ``` 2. 文件下载: a. 在JSP页面上,创建一个下载链接或按钮,指向Servlet。 b. 在Servlet中处理下载请求,设置响应头部信息。 c. 读取要下载的文件,并将其作为响应的内容返回给客户端。 ```java // 设置响应头部信息 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"filename.ext\""); // 读取要下载的文件 File file = new File("/path/to/file"); // 将文件内容写入响应输出流 try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } ``` 二、Excel表格的导入导出方法: 1. Excel表格导入: a. 在JSP页面上,使用HTML表单元素创建一个文件上传表单。 b. 用户选择要上传的Excel文件,并点击提交按钮。 c. 在Servlet中处理表单提交的请求。 d. 使用Apache POI库解析上传的Excel文件,并提取数据进行处理。 ```java // 从request中获取文件上传信息 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); // 处理每个文件项 for (FileItem item : items) { if (!item.isFormField()) { // 获取文件名和输入流 String fileName = item.getName(); InputStream inputStream = item.getInputStream(); // 使用Apache POI解析Excel文件 Workbook workbook = WorkbookFactory.create(inputStream); Sheet sheet = workbook.getSheetAt(0); // 遍历行和列,处理Excel数据 for (Row row : sheet) { for (Cell cell : row) { // 处理单元格数据 } } } } ``` 2. Excel表格导出: a. 在Servlet中处理导出请求,准备要导出的数据。 b. 使用Apache POI库创建一个新的Excel工作簿,并创建工作表。 c. 遍历数据,将其写入Excel工作表中。 d. 将Excel工作簿保存到文件,并将其作为响应的内容返回给客户端。 ```java // 创建新的Excel工作簿和工作表 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 遍历数据,将其写入工作表 int rowNum = 0; for (Object[] rowData : data) { Row row = sheet.createRow(rowNum++); int colNum = 0; for (Object field : rowData) { Cell cell = row.createCell(colNum++); if (field instanceof String) { cell.setCellValue((String) field); } else if (field instanceof Integer) { cell.setCellValue((Integer) field); } } } // 将工作簿保存到文件 try (OutputStream outputStream = new FileOutputStream("/path/to/file")) { workbook.write(outputStream); } ``` 三、页面分页的实现思路: 1. 在JSP页面上,显示需要进行分页的数据列表。 2. 在Servlet中处理分页请求,根据当前页码和每页显示的数据条数,从数据库或其他数据源中获取对应页的数据。 3. 将获取到的数据保存在请求属性中,并转发到JSP页面。 4. 在JSP页面上,根据请求属性中的数据,显示当前页的数据列表。 5. 在JSP页面上,显示分页导航条,包含页码和跳转功能。 6. 当用户点击页码或跳转输入框时,触发相应的事件,将新的页码作为参数发送给Servlet。 7. 重复步骤2-6,实现页面切换和数据更新。 总结: 通过本次实验,我们成功使用JSPServlet技术实现了文件上传与下载的功能,掌握了Excel表格的导入导出方法,并了解了页面分页的实现思路。这些功能在实际的Web项目开发中具有重要的作用,能够提高用户体验和数据处理效率。在实现过程中,我们深入理解了JSPServlet的工作原理,并熟练运用相关的库和API,为进一步的基于JSPServlet的开发工作打下了基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值