Java Web程序设计笔记 • 【第5章 Servlet技术】

时间:2023-02-15 13:38:02

全部章节   >>>>


本章目录

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 类

Java Web程序设计笔记 • 【第5章 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类,更为方便快捷。

Java Web程序设计笔记 • 【第5章 Servlet技术】

Java Web程序设计笔记 • 【第5章 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请求过程如图所示

Java Web程序设计笔记 • 【第5章 Servlet技术】

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

Java Web程序设计笔记 • 【第5章 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 提供了标准的接口与类,利用这些接口和类可以帮助我们编写请求逻辑处理,其结构如下

Java Web程序设计笔记 • 【第5章 Servlet技术】

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代表响应对象,可以调用其方法实现响应功能,如重定向、设置响应编码等