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. ...
随机推荐
- 安全相关,关于https
什么是 HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全 ...
- Linux基础命令---host域名查询工具
host host是一个常用的DNS查询工具,经常用来查询域名.检查域名解析是否正确. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ...
- entfrm-boot开发平台功能介绍【entfrm开源模块化无代码开发平台】
简介 entfrm开发平台,是一个以模块化为核心的无代码开发平台,是一个集PC和APP快速开发.系统管理.运维监控.开发工具.OAuth2授权.可视化数据源管理与数据构建.API动态生成与统计.工作流 ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(3. 用ansible管理机器和软件)
1. 简介 1.1. 公司环境使用的puppet,但是我更喜欢ansible,原因有二,第一,我是红帽的忠粉:),第二,我对python比较熟悉 1.2. ansible官方网站:https://ww ...
- 【Linux】【Services】【Disks】zfs
1. 简介: 据说zfs有去除重复数据的功能,无良人士继续要求吧samba共享盘使用的centos7上自带的xfs改成zfs,并且开启去重功能.samba配置见 http://www.cnblogs. ...
- 创建线程的第二种方式------实现Runnable接口的方式
package cn.itcast.demo16.Demo07.Runnable;/** * @author newcityman * @date 2019/7/22 - 23:17 */public ...
- 关于finally中的语句和try中的return之间的执行顺序
首先是第一种情况: 我们这里由于程序只是单一的,所以后面的代码只有主题部分: Public class test{ Public static void main(String[] args){ Sy ...
- JAVA日志发展史
JAVA日志发展史 第一阶段 2001年以前,Java是没有日志库的,打印日志全凭System.out和System.err 缺点: 产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出 输出 ...
- 设计风格之REST
一.简介 REST简介 REST 是英文 representational state transfer(表象性状态转变)或者表述性状态转 移;Rest 是 web 服务的一种架构风格;使用 HTTP ...
- 【划重点】Python matplotlib绘图建立画布和坐标系
一.建立画布 import matplotlib.pyplot as plt import numpy as np x=np.arange(8) y=np.arange(8) print(x,y) # ...