Java Web程序设计笔记 • 【第5章 Servlet技术】
全部章节 >>>>
本章目录
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技术】的更多相关文章
- Java Web程序设计笔记 • 【目录】
章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...
- Java Web程序设计笔记 • 【第6章 Servlet技术进阶】
全部章节 >>>> 本章目录 6.1 应用 Servlet API(一) 6.1.1 Servlet 类的层次结构 6.1.2 使用 Servlet API 的原则 6.1 ...
- Java Web程序设计笔记 • 【第1章 Web应用程序】
全部章节 >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ...
- Java Web程序设计笔记 • 【第4章 JavaBean和JSP标准动作】
全部章节 >>>> 本章目录 4.1 JavaBean 4.1.1 JavaBean 概述 4.1.2 JavaBean的重要性 4.1.3 JavaBean的特点 4.1 ...
- Java Web程序设计笔记 • 【第3章 JSP内置对象】
全部章节 >>>> 本章目录 3.1 JSP 内置对象简介 3.1.1 JSP 内置对象概述 3.1.2 JSP 表单处理 3.1.2 request对象 3.1.2 开发 ...
- Java Web程序设计笔记 • 【第9章 EL表达式】
全部章节 >>>> 本章目录 9.1 EL 表达式基础 9.1.1 EL 表达式简介 9.1.2 EL 表达式的定义 9.1.3 使用 EL 访问变量 9.1.4 使用 E ...
- Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】
全部章节 >>>> 本章目录 8.1 Session机制 8.1.1 Session 简介 8.1.2 创建 HttpSession 实例 8.1.3 HttpSesiso ...
- Java Web程序设计笔记 • 【第7章 会话跟踪技术】
全部章节 >>>> 本章目录 7.1 会话跟踪技术概述 7.1.1 为什么需要会话跟踪 7.1.2 会话的状态和跟踪 7.1.3 会话跟踪技术 7.1.4 会话跟踪工作流程 ...
- Java Web程序设计笔记 • 【第2章 JSP基础】
全部章节 >>>> 本章目录 2.1 JSP 简介 2.1.1 JSP 概述 2.1.2 开发第一个 JSP 页面 2.1.3 JSP 处理流程 2.1.4 实践练习 2. ...
随机推荐
- HTML5 之 FileReader 的使用 (网页上图片拖拽并且预显示可在这里学到) [转载]
转载至 : http://www.360doc.com/content/14/0214/18/1457948_352511416.shtml FileReader 资料(英文) : https://d ...
- vue引入d3
单页面使用 cnpm install d3 --save-dev 指定版本安装 cnpm install d3@6.3.1 -S <script> import * as d3 from ...
- 01_ubantu国内软件源配置
查找自己版本对应的软件源 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 以下为19.10版本清华大学的,个人100M的带宽,平均安装速度在600K ...
- 【Linux】【Services】【KVM】virsh命令详解
1. virsh的常用命令 help:获取帮助 virsh help KEYWORD list:列出域 dumpxml:导出指定域的xml格式的配置文件: create:创建并启动域: define: ...
- 使用fastDFS上传和下载图片文件
package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...
- Spring Cloud Alibaba 整合 Nacos 实现服务配置中心
在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...
- C# 使用modbus 读取PLC 寄存器地址
使用的组件Nmodbus 定义参数,全局变量: //创建modbus实体对象 private static ModbusFactory modbusFactory; private static IM ...
- 【阿菜做实践】利用ganache-cli本地fork以太坊主链分叉
前言 Fork主网意思是模拟具有与主网相同的状态的网络,但它将作为本地开发网络工作. 这样你就可以与部署的协议进行交互,并在本地测试复杂的交互.不用担心分叉主网作为测试链会占很多内存.这些方法都不会将 ...
- win10更新后任务栏卡死 的原因和解决办法
@ 目录 现象: 原因: 第一步:断网并关闭资讯和兴趣 第二步:卸载更新 第三步:关闭win10自动更新 第四步:永久关闭资讯和兴趣 现象: win10 更新后,开机任务栏卡死,点开始反应,设置页面无 ...
- webapck搭建环境,让你知道vue中的h函数的作用和虚拟节点如何上树!
搭建环境 npm init 初始化项目 npm i -D snabbdom 安装 npm i -D webpack@5 webpack-cli@3 webpack-dev-server@3 简单介绍 ...