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. ...
随机推荐
- nodeJs,Express中间件是什么与常见中间件
中间件的功能和分类 中间件的本质就是一个函数,在收到请求和返回相应的过程中做一些我们想做的事情.Express文档中对它的作用是这么描述的: 执行任何代码.修改请求和响应对象.终结请求-响应循环.调用 ...
- 《C陷阱与缺陷》 第0章导读 第1章词法陷阱
1.= 与==的区别 赋值运算符= 的优先级要小于逻辑运算符== 也就是说,会进行先逻辑上的比较,然后再把比较结果进行赋值,很合理. getc库是什么??? 1.C语言中有单字符 = 也有多字符单元如 ...
- 【AWS】【TroubleShooting】EC2实例无法使用SSH远程登陆(EC2 failure for SSH connection)
1. Login AWS web console and check the EC2 instance.
- 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 ...
- Linux系统下部署eleasticsearch+kibana
1.官网下载eleasticsearch和kibana,两个版本应安装一致,否则会出现kibana连接不上eleasticsearch的情况(这里我以6.3.1为例) eleasticsearch的下 ...
- 【Keras】神经网络的搭建
Dense层的使用方法 参考:https://blog.csdn.net/qq_34840129/article/details/86319446 keras.layers.core.Dense( u ...
- C#获取Windows10屏幕的缩放比例
现在1920x1080以上分辨率的高分屏电脑渐渐普及了.我们会在Windows的显示设置里看到缩放比例的设置.在Windows桌面客户端的开发中,有时会想要精确计算窗口的面积或位置.然而在默认情况下, ...
- 第43篇-JNI引用的管理(2)
之前我们已经介绍了JNIHandleBlock,但是没有具体介绍JNIHandleBlock中存储的句柄,这一篇我们将详细介绍对这些句柄的操作. JNI句柄分为两种,全局和局部对象引用: (1)大部分 ...
- [BUUCTF]REVERSE——helloword
helloword 题目是安卓逆向.安卓逆向工具下载地址 用APKIDE打开附件,ctf+f调出检索版,检索main函数,能看到flag字符串 flag{7631a988259a00816deda84 ...
- python selenium 多账户自动登入163邮箱
pycharm一些快捷键: ' ctrl ' +' / ' :注释 ' Tab ' :同时缩进 ' shift ' +' Tab ' :左移 一次缩进 本文webinfo.txt路径:C:\Pytho ...