全部章节   >>>>


本章目录

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. Git提交规范

    Commit message 的格式 每次提交,Commit message 都包括三个部分:Header,Body 和 Footer. <type>(<scope>): &l ...

  2. eclipse上安装 windowBuilder方法

    最近因为需要用java Swing做一些组件设计,但想想以前在大学时候为了布局组件和位置设计花了很多时间.所以再网上查了一些带有可视化的设计插件用来提高工作效率. 其中一个是 windowBuilde ...

  3. Java中的Date和时区转换

    1.Date中保存的是什么 在java中,只要我们执行 Date date = new Date(); 就可以得到当前时间.如: Date date = new Date(); System.out. ...

  4. sonic 安装记录

    https://github.com/valeriansaliou/sonic $ rustc --versionrustc 1.50.0-dev ubantu环境 rocksdb 安装依赖 apt ...

  5. Docker的常用命令总结

    一.普通指令 启动 Docker sudo systemctl start docker 停止 Docker sudo systemctl stop docker 普通重启 Docker sudo s ...

  6. Selenium之Canvas画布操作

    现在有一个场景是需要进入到 Canvas画布中 进行单击操作,现在使用过如下方法 canvas = driver.find_element_by_xpath("//canvas[@id='# ...

  7. ABP VNext框架基础知识介绍(1)--框架基础类继承关系

    在我较早的时候,就开始研究和介绍ABP框架,ABP框架相对一些其他的框架,它整合了很多.net core的新技术和相关应用场景,虽然最早开始ABP框架是基于.net framework,后来也全部转向 ...

  8. 效验pipeline语法

    目录 一.简介 二.配置 一.简介 因为jenkins pipeline不像JAVA之类的语言那样应用广泛,所以没有相关的代码检测插件. 2018年11月初,Jenkins官方博客介绍了一个VS Co ...

  9. 内存泄漏避雷!你真的了解重写equals()和hashcode()方法的原因吗?

    基本概念 要比较两个对象是否相等时需要调用对象的equals() 方法: 判断对象引用所指向的对象地址是否相等 对象地址相等时, 那么对象相关的数据也相等,包括: 对象句柄 对象头 对象实例数据 对象 ...

  10. bjdctf_2020_babyrop2

    这道题是一道基本题,正因为它经典,所以需要重点记录一下. 这道题考察格式化字符串泄露canary,然后rop获得libc版本,之后拿到shell.拿到程序之后我们先检查一下保护... 开启了堆栈不可执 ...