全部章节   >>>>


本章目录

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. nodeJs,Express中间件是什么与常见中间件

    中间件的功能和分类 中间件的本质就是一个函数,在收到请求和返回相应的过程中做一些我们想做的事情.Express文档中对它的作用是这么描述的: 执行任何代码.修改请求和响应对象.终结请求-响应循环.调用 ...

  2. 《C陷阱与缺陷》 第0章导读 第1章词法陷阱

    1.= 与==的区别 赋值运算符= 的优先级要小于逻辑运算符== 也就是说,会进行先逻辑上的比较,然后再把比较结果进行赋值,很合理. getc库是什么??? 1.C语言中有单字符 = 也有多字符单元如 ...

  3. 【AWS】【TroubleShooting】EC2实例无法使用SSH远程登陆(EC2 failure for SSH connection)

    1. Login AWS web console and check the EC2 instance.

  4. When does compiler create default and copy constructors in C++?

    In C++, compiler creates a default constructor if we don't define our own constructor (See this). Co ...

  5. Linux系统下部署eleasticsearch+kibana

    1.官网下载eleasticsearch和kibana,两个版本应安装一致,否则会出现kibana连接不上eleasticsearch的情况(这里我以6.3.1为例) eleasticsearch的下 ...

  6. 【Keras】神经网络的搭建

    Dense层的使用方法 参考:https://blog.csdn.net/qq_34840129/article/details/86319446 keras.layers.core.Dense( u ...

  7. C#获取Windows10屏幕的缩放比例

    现在1920x1080以上分辨率的高分屏电脑渐渐普及了.我们会在Windows的显示设置里看到缩放比例的设置.在Windows桌面客户端的开发中,有时会想要精确计算窗口的面积或位置.然而在默认情况下, ...

  8. 第43篇-JNI引用的管理(2)

    之前我们已经介绍了JNIHandleBlock,但是没有具体介绍JNIHandleBlock中存储的句柄,这一篇我们将详细介绍对这些句柄的操作. JNI句柄分为两种,全局和局部对象引用: (1)大部分 ...

  9. [BUUCTF]REVERSE——helloword

    helloword 题目是安卓逆向.安卓逆向工具下载地址 用APKIDE打开附件,ctf+f调出检索版,检索main函数,能看到flag字符串 flag{7631a988259a00816deda84 ...

  10. python selenium 多账户自动登入163邮箱

    pycharm一些快捷键: ' ctrl ' +' / ' :注释 ' Tab ' :同时缩进 ' shift ' +' Tab ' :左移 一次缩进 本文webinfo.txt路径:C:\Pytho ...