全部章节   >>>>


本章目录

5.1 Servlet 技术介绍

5.1.1 为什么需要Servlet

5.1.1 Servlet 简介

5.1.2 Java Web 处理流程

5.1.3 Servlet 开发

5.1.4 Servlet 配置

5.1.5 实践练习

5.2 Servlet 流程

5.2.1 Servlet 运行原理

5.2.2 Servlet 生命周期

5.2.3 Servlet 常用方法

5.2.4 实践练习

5.3 HttpServletRequest 对象

5.3.1 Servlet 的层次结构

5.3.2 HttpServletRequest 接口

5.3.3 实践练习

5.4  HttpServletResponse 对象

5.4.1 HttpServletResponse 对象

5.4.1 HttpServletResponse接口

5.4.2 实践练习

总结


5.1 Servlet 技术介绍

5.1.1 为什么需要Servlet

JSP是JavaWeb应用中处理和显示动态网页的技术,而前面JSP页面中出现了大量逻辑处理、甚至数据库访问的JDBC脚本代码,这使得JSP页面显得混乱、不易维护,职责不清晰

JSP是建立在静态Html基础之上,使得数据显示时具有动态特点,所以JSP的职责就是显示数据,而不是逻辑处理

Servlet的出现很好的规避了这一点,将复杂的逻辑处理、请求响应交给Servlet处理,JSP则只负责渲染显示页面

5.1.1 Servlet 简介

Java Servlet 又称作 Java 服务器小程序,运行在服务端,主要用于Web应用中的请求响应,逻辑处理功能,让JSP更专注于数据展示

JSP虽然看起来像网页,但实际上当访问JSP时,JSP 文件首先会被转换成一个 Java 文件,而这个 Java 文件就是 Servlet 类

Jsp页面被转换的Java类

5.1.2 Java Web 处理流程

Java Web 应用程序的处理过程,实际上是一个不断请求与响应的过程。其流程如下:

客户端发送请求至 Web 服务器

Web 服务器接收请求并进行处理

Web 服务器将响应结果返回给客户端,并展现用户界面

5.1.3 Servlet 开发

创建Servlet的步骤1,创建Servlet类:

  • 手动创建Java类继承HttpServlet,在web.xml配置该Servlet的页面请求路径
  • 使用Eclipse快速创建Servlet类,更为方便快捷。

创建Servlet的步骤2,处理GET、POST请求:

  • 在Servlet中重写并修改 doGet和 doPost两个方法分别对应GET和POST请求
  • 一般处理代码只用完成一个如doPost,另外一个doGet中直接调用doPost即可

5.1.4 Servlet 配置

创建Servlet的步骤3,配置界面请求路径映射:

  • Servlet是一个Java类,无法直接被界面直接请求到,需要在项目web.xml配置请求路径
配置servlet请求访问路径
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>//对应Servlet名称
<url-pattern>/first</url-pattern>//请求路径
</servlet-mapping>

启动服务器,浏览器输入:http://localhost:8080/项目名/first

5.1.5 实践练习

5.2 Servlet 流程

5.2.1 Servlet 运行原理

当 Tomcat 服务器接收到一个 HTTP 请求时,服务器执行具体步骤如下:

  • 用户在浏览器地址栏中输入请求URL地址:http://localhost:8080/java_web_0501/first
  • Tomcat 服务器根据请求获取 URL 中最后需要访问的资源,即“/first”
  • Tomcat 服务器根据获取的“/first”与 web.xml 文件中配置的请求映射匹配,找到对应的Servlet类
  • 找到之后服务器实例化Servlet
  • 执行Servlet对应的请求处理方法,如doPost,完成给用户响应

注意:如果没有匹配到对应路径,则界面会出现404异常

5.2.2 Servlet 生命周期

Servlet 生命周期是由 Servlet 的容器来控制的,Servlet 生命周期分为 4 个阶段

第一阶段:加载并实例化

Servlet 容器负责加载和实例化

  • Servelt,在服务器启动或第一次请求时执行
  • 如果需要服务器启动时加载,则需在servlet配置时加入 <loadon-startup>1</loadon-startup>,数值越小优先级越高
  • 加载后该Servlet实例将常驻内存

第二阶段:初始化

  • 在 Servlet 实例化之后,容器将调用 init() 方法,并传递实现 ServletConfig 接口的对象,在 Servlet 的整个生命周期内,init()方法只被调用一次
  • 一般根据需要是否添加init方法,如果Servlet需要初始化一些数据,可以在该方法中完成代码

第三阶段:请求处理

  • 当容器收到对这一 Servlet 的请求,就调用 Servlet 的service() 方法,并把请求和响应对象作为参数传递,service() 方法检查 HTTP 请求类型(GET、POST等),并在适当的时候调用 doGet()、doPost() 等方法
  • 每次请求都会调用对应的doGet或doPost方法

第四阶段:销毁

一旦 Web服务器停止服务,Servlet会自动执行其 destroy() 方法,以释放资源

Servlet请求过程如图所示

示例:创建Servlet,重写service、doGet、doPost、init、destroy方法演示Servlet生命周期过程

5.2.3 Servlet 常用方法

  • 任何一个 Servlet 对象都要直接或间接地实现 javax.servlet.Servlet 接口
  • 创建 Servlet 时,都继承 javax.servlet.HttpServlet 类,而它又继承GenericServlet类, GenericServlet类实现了Servlet接口,所以拥有一系列父类定义的方法,如下

方法名

作用

init

在 Servlet 生命周期中的初始化方法,仅执行一次 init() 方法

service

service() 方法主要功能是区分不同的请求类型,然后调用对应的方法

doGet

对应的get请求处理方法

doPost

对应的post请求处理方法

destroy

服务器停止时执行销毁方法

5.2.4 实践练习

5.3 HttpServletRequest 对象

5.3.1 Servlet 的层次结构

在Servlet处理请求时候,ServletAPI 提供了标准的接口与类,利用这些接口和类可以帮助我们编写请求逻辑处理,其结构如下

HttpServlet继承了GenericServlet

5.3.2 HttpServletRequest 接口

HttpServletRequest 接口代表客户端的请求,它包含了客户端提交过来的请求数据,常用方法如下

名称

作用

String getParameter(String  name)

获取页面提交指定名称的参数值

String[] getParameterValues(String  name)

获取页面提交相同名称参数的数组值

Enumeration getParameterNames( )

获取请求中所有参数名的Enumeration

Map getParameterMap( )

返回保存了请求的所有参数名和值的Map 对象

void setAttribute(String name,Object obj)

向 request 范围内存储数据,键值对形式

Object getAttribute(String name)

从request范围取出键对应的数据

Cookie[] getCookies( )

获取request中所有的Cookie,返回数组

String getMethod( )

获取请求类型,如GET、POST

String getRequestURI( )

返回主机名到请求参数之间的路径

StringBuffer getRequestURL()

获取请求的StringBuffer类型 URL

String getContextPath()

获取当前web项目根路径

String getServletPath()

获取请求 URI 中的 Servlet 路径的字符串

String getRealPath(String path)

获取当前 Web 项目的实际物理路径

String getSchema()

获取当前请求所使用的协议

String getServerName()

获取当前请求的服务器名称

int getServerPort()

获取当前请求的服务器端口

HttpSession getSession()

获取当前会话的HttpSession 对象

getRequestDispatcher()

获取转发对象,进而可以调用转发对象的forward方法转发到下一个界面

示例:使用 HttpServletRequest 接口的方法实现商品添加的功能

request.setCharacterEncoding("UTF-8");// 设置请求的编码格式
response.setCharacterEncoding("UTF-8"); // 设置响应的编码格式
String name = request.getParameter("name"); // 获取商品名称
String numberStr = request.getParameter("number"); // 获取商品编号
boolean isAutoIncrement = request.getParameterValues("isAutoIncrement").length > 0;
// 是否自增增长
int number = isAutoIncrement ? ++Product.baseNumber : Integer.parseInt(numberStr);
String brand = request.getParameter("brand"); // 获取商品品牌
String supplier = request.getParameter("supplier"); // 获取供货商信息
String priceStr = request.getParameter("price");
// 获取参考成本价
double price = (priceStr == null || "".equals(priceStr.trim())) ? 0 :
Double.parseDouble(priceStr);
String remark = request.getParameter("remark"); // 获取输入的备注

接收界面传递的一系列数据

示例:使用 HttpServletRequest 接口的方法实现商品添加的功能

// 判断用户输入是否合法 如果数据不合法,转发到增加界面,并且存入错误信息界面显示
if (name == null || "".equals(name.trim()) || brand == null || "".equals(brand)
|| priceStr == null || "".equals(priceStr.trim())) {
// 保存错误信息到 request 作用域内
request.setAttribute("errorMessage", " 商品名称、商品品牌和商品价格不能为空 ");
// 转发到 productAdded.jsp 页面
request.getRequestDispatcher("productAdded.jsp").forward(request, response);
} else {
// 保存商品数据到 Product 对象 如果输入合法将数据存入全局数据列表中,转发至下一个显示界面
Product product = new Product(name, number, brand, supplier, price, remark);
// 添加商品数据到商品集合中
Product.productList.add(product);
// 跳转到商品显示页面
request.getRequestDispatcher("productList.jsp").forward(request, response);}

示例:使用 HttpServletRequest 接口的方法实现商品列表展示

<!– 取出存储的全局列表数据显示产品列表 -->
<tbody id="TableData">
<%
//取出存储的全局数据循环
for (Product product : Product.productList) {
%>
<tr>
<td><%=product.getNumber()%></td>
<td><%=product.getName()%></td>
<td><%=product.getBrand()%></td>
<td><%=product.getSupplier()%></td>
<td><%=product.getPrice()%></td>
<td><%=product.getRemark()%></td>
</tr>
<%}%>
</tbody>

5.3.3 实践练习

5.4  HttpServletResponse 对象

5.4.1 HttpServletResponse 对象

HttpServletResponse 接口代表向客户端发送的响应,利用response可以向客户  端响应信息或跳转界面

HttpServletResponse常用方法如下:

方法名

作用

public PrintWriter getWriter() 

获取响应的打印输出流对象

public void addCookie()

向响应中添加 cookie 对象

public void setCharacterEncoding(String enc)

设置响应的编码

public void sendRedirect(String path)

将请求重定向到指定位置

5.4.1 HttpServletResponse接口

示例:使用 response 实现用户登录的功能

request.setCharacterEncoding("UTF-8"); // 设置请求的编码格式
response.setCharacterEncoding("UTF-8"); // 设置相应的编码格式
String username = request.getParameter("username"); // 获取账号 从request中获取请求数据
String password = request.getParameter("password"); // 获取密码
// 判断账号和密码是否正确
if ("admin".equals(username) && "abc".equals(password)) {
// 将登录账号保存到 session 作用域内
request.getSession().setAttribute("user", username); //将用户信息存入session,供后续功能取出使用
// 登录成功,跳转到主页面
request.getRequestDispatcher("main.jsp").forward(request, response);
}

示例:使用 response 实现用户退出的功能

1、主界面中创建退出超链接或按钮
2、创建退出Servlet,核心代码如下:

// 从 session 中删除登录用户
request.getSession().removeAttribute(“administratorre”);//session中移除用户信息
重定向跳转界面
sponse.sendRedirect("login.jsp");// 重定向到页面

3、在web.xml中配置Servlet映射请求路径

5.4.2 实践练习

总结

  • Java Servlet 又称作 Java 服务器小程序,运行在服务端,主要用于Web应用中的请求响应,逻辑处理功能,让JSP更专注于数据展示
  • Servlet的实现步骤为:创建Servlet并且完成请求处理、在web.xml中配置Servlet及请求路径、页面上请求Servlet
  • Servlet生命周期包括:加载实例化、初始化、服务、销毁几个阶段
  • HttpServletRequest代表请求对象,可以调用其方法获取请求相关的信息,如请求的参数等
  • HttpServletResonse代表响应对象,可以调用其方法实现响应功能,如重定向、设置响应编码等

Java Web程序设计笔记 • 【第5章 Servlet技术】的更多相关文章

  1. Java Web程序设计笔记 • 【目录】

    章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...

  2. Java Web程序设计笔记 • 【第6章 Servlet技术进阶】

    全部章节   >>>> 本章目录 6.1 应用 Servlet API(一) 6.1.1 Servlet 类的层次结构 6.1.2 使用 Servlet API 的原则 6.1 ...

  3. Java Web程序设计笔记 • 【第1章 Web应用程序】

    全部章节   >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ...

  4. Java Web程序设计笔记 • 【第4章 JavaBean和JSP标准动作】

    全部章节   >>>> 本章目录 4.1 JavaBean 4.1.1 JavaBean 概述 4.1.2 JavaBean的重要性 4.1.3 JavaBean的特点 4.1 ...

  5. Java Web程序设计笔记 • 【第3章 JSP内置对象】

    全部章节   >>>> 本章目录 3.1 JSP 内置对象简介 3.1.1 JSP 内置对象概述 3.1.2 JSP 表单处理 3.1.2 request对象 3.1.2 开发 ...

  6. Java Web程序设计笔记 • 【第9章 EL表达式】

    全部章节   >>>> 本章目录 9.1 EL 表达式基础 9.1.1 EL 表达式简介 9.1.2 EL 表达式的定义 9.1.3 使用 EL 访问变量 9.1.4 使用 E ...

  7. Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】

    全部章节   >>>> 本章目录 8.1 Session机制 8.1.1 Session 简介 8.1.2 创建 HttpSession 实例 8.1.3 HttpSesiso ...

  8. Java Web程序设计笔记 • 【第7章 会话跟踪技术】

    全部章节   >>>> 本章目录 7.1 会话跟踪技术概述 7.1.1 为什么需要会话跟踪 7.1.2 会话的状态和跟踪 7.1.3 会话跟踪技术 7.1.4 会话跟踪工作流程 ...

  9. Java Web程序设计笔记 • 【第2章 JSP基础】

    全部章节   >>>> 本章目录 2.1 JSP 简介 2.1.1 JSP 概述 2.1.2 开发第一个 JSP 页面 2.1.3 JSP 处理流程 2.1.4 实践练习 2. ...

随机推荐

  1. HTML5 之 FileReader 的使用 (网页上图片拖拽并且预显示可在这里学到) [转载]

    转载至 : http://www.360doc.com/content/14/0214/18/1457948_352511416.shtml FileReader 资料(英文) : https://d ...

  2. vue引入d3

    单页面使用 cnpm install d3 --save-dev 指定版本安装 cnpm install d3@6.3.1 -S <script> import * as d3 from ...

  3. 01_ubantu国内软件源配置

    查找自己版本对应的软件源 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 以下为19.10版本清华大学的,个人100M的带宽,平均安装速度在600K ...

  4. 【Linux】【Services】【KVM】virsh命令详解

    1. virsh的常用命令 help:获取帮助 virsh help KEYWORD list:列出域 dumpxml:导出指定域的xml格式的配置文件: create:创建并启动域: define: ...

  5. 使用fastDFS上传和下载图片文件

    package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...

  6. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  7. C# 使用modbus 读取PLC 寄存器地址

    使用的组件Nmodbus 定义参数,全局变量: //创建modbus实体对象 private static ModbusFactory modbusFactory; private static IM ...

  8. 【阿菜做实践】利用ganache-cli本地fork以太坊主链分叉

    前言 Fork主网意思是模拟具有与主网相同的状态的网络,但它将作为本地开发网络工作. 这样你就可以与部署的协议进行交互,并在本地测试复杂的交互.不用担心分叉主网作为测试链会占很多内存.这些方法都不会将 ...

  9. win10更新后任务栏卡死 的原因和解决办法

    @ 目录 现象: 原因: 第一步:断网并关闭资讯和兴趣 第二步:卸载更新 第三步:关闭win10自动更新 第四步:永久关闭资讯和兴趣 现象: win10 更新后,开机任务栏卡死,点开始反应,设置页面无 ...

  10. webapck搭建环境,让你知道vue中的h函数的作用和虚拟节点如何上树!

    搭建环境 npm init 初始化项目 npm i -D snabbdom 安装 npm i -D webpack@5 webpack-cli@3 webpack-dev-server@3 简单介绍 ...