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