JSP与Servlet技术
一、Servlet 基础知识
- Servlet 是 Java Web 应用程序中的组件技术,是运行在服务器端的 Java 应用程序,实现与 JSP 类似的功能。Servlet 本身是一个 Java 类,可以动态地扩展服务器的能力。Web 服务器执行 JSP 文件时,JSP 容器会将其转译为 Servlet 文件,并自动编译解释执行。JSP 中使用到的所有对象都将被转换为 Servlet,然后被执行。
- Servlet 接收来自客户端的请求,将处理结果返回给客户端。
1.什么是 Servlet
- Servlet 是运行在 Web 服务器上的 Java 程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求与 HTTP 服务器上的数据库和应用程序之间的中间层。所有的 JSP 文件都要事先转换为一个 Servlet 才能运行。
- Servlet 在服务器端处理用户信息可以完成以下任务:
- 获取客户端浏览器通过 HTML 表单提交的数据及相关信息
- 创建并返回对客户端的动态响应页面
- 访问服务器端资源,如文件、数据库
- 为 JSP 页面准备动态数据,与 JSP 一起协作创建响应页面
2.Servlet 生命周期
- Servlet 是在服务器端运行的。Servlet 是 javax.servlet 包中 HttpServlet 类的子类,由服务器完成该子类的创建和初始化。Servlet 生命周期定义了一个 Servlet 如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务。Servlet 生命周期主要由3个过程组成。
(1)init() 方法:服务器初始化
- 当首次创建 Servlet 时才会调用 init() 方法,而不是每个用户请求都调用。当用户首次调用对应于 Servlet 的 URL 或再次启动服务器时,就会创建 Servlet。当有客户请求 Servlet 服务时,Web 服务器将启动一个新的线程,在线程中调用 service() 方法响应客户的请求。
(2)service() 方法:初始化完毕,Servlet 对象调用该方法响应客户的请求
- 对于每个请求,Servlet 引擎都会调用此 service() 方法,并把 Servlet 的请求对象和响应对象传递给该方法作为参数。方法声明如下:
public void service(ServletRequest request,ServletResponse response)
- 其中,request 对象和 response 对象由 Servlet 容器创建并传给 service() 方法,service() 方法会根据 HTTP 请求类型,调用响应的 doGet() 或 doPost() 等方法。service() 方法可以被调用多次。
(3)destroy() 方法:调用该方法销毁 Servlet 对象
- 当 Servlet 被卸载时 destroy() 方法被自动调用。该方法用来释放 Servlet 占用的资源,比如数据库连接、Socket 连接等。destroy() 方法只会被调用一次。
3.Servlet 的技术特点
(1)有效性
- 不同于传统的 CGI(需要为每一项 HTTP 请求新进程),在使用 Servlet 时,可以存在 n 个线程,而只使用 Servlet 类的一个副本。且在完成响应后,Servlet 仍然保留在内存中,因此,可以直接在请求之间存储任意复杂的数据。
(2)方便性
- Servlet 包含扩展基础结构,能够自动对 HTML 表单数据进行分析和解码、读取和设置 HTTP 头、处理 Cookie、跟踪会话以及实现许多其他类似的高级功能。
(3)功能强大性
- Servlet 可以支持几种功能。Servlet 可以直接与 Web 服务器对话,例如,与 Web 服务器的通信更易于将相对 URL 转换成具体的路径名。多个 Servlet 之间还能共享数据,这更易于实现数据库连接共享和类似资源共享优化操作。Servlet 还可以保留不同请求的信息,从而简化了类似会话跟踪和缓存早期计算结果的一些技术。
(4)可移植型
- Servlet 是使用 Java 编程语言并遵循标准的 API 编写的,所以几乎不用进行任何更改便可以在各种服务器上运行。
(5)安全性
- 与传统的 CGI 程序相比,Servlet 更安全。
(6)便宜
3.Servlet 与 JSP 的区别
- Servlet 是一种在服务器端运行的 Java 程序。而 JSP 是继 Servlet 后 Sun 公司推出的新技术,它是以 Servlet 为基础开发的。Servlet 是 JSP 的早期版本,在 JSP 中,更加注重页面的表示,而在 Servlet 中则更注重业务逻辑的实现。因此,在编写的页面显示效果比较复杂时,首选 JSP。或者在开发过程中,HTML 代码经常发生变化,而 Java 代码则相对比较固定时,可以选择 JSP。在处理业务逻辑时,首选则是 Servlet。同时,JSP 只能处理浏览器的请求,而 Servlet 则可以处理一个客户端的应用程序。因此,Servlet 加强了 Web 服务器的功能。
- Servlet 与 JSP 相比有以下几点区别:
(1)编程方式不同
- Servlet 是按照 Java 规范编写的 Java 程序,JSP 是按照 Web 规范编写的脚本语言。
(2)编译方式不同
- Servlet 每次修改后需要重新编译才能运行,JSP 被 JSP 容器编译为 Servlet 文件。
(3)运行速度不同
- 由于一个 JSP 页面在第一次访问时要被编译成 Servlet,需要一段时间,所以客户端得到响应所需要的时间比较长。当该页面再次被访问时,它对应的.class文件已经生成,不需要再次翻译和编译,JSP 引擎可以直接执行.class文件,因此,JSP 页面的访问速度会大为提高。总之,在运行速度上,Servlet 比 JSP 快。
5.Servlet 在 Java Web 项目中的作用
(1).Servlet 在服务器端的作用
- 客户端访问服务器时,所有的 JSP 文件都会转化为 Servlet 文件,Servlet 文件负责在服务器端处理用户的数据。这部分功能在开发服务器时已经封装成内部的功能,人们不用关心,除非自己开发一个服务器才需要了解。
(2).Servlet 在 MVC 设计模式中的应用
- MVC 设计模式是目前用得比较多的一种设计模式,被广泛用于 Web 应用程序中。Model(模型)表示业务逻辑层,View(视图)代表表示层,Controller(控制器)代表控制层。其中,控制器部分由 Servlet 完成,这也是在项目开发中实际用到的 Servlet。
(3).Servlet 在 Java Web 框架中的应用
- 在 Java Web 项目开发中用到的猪獒组件技术有 JSP、Servlet、JavaBean、JDBC、XML、Tomcat 等。为了整合 Java Web 组件技术并提高软件开发效率,近年来推出了许多基于 MVC 模式的 Web 框架技术,如 Struts、Maverick、WebWork、Turbine 和 Spring 等。其中比较经典的框架技术是 Struts。
- 在 Struts 框架技术中,实现了 MVC 模式,其中已封装好的核心控制器由 Servlet 实现;人们还需要实现 Action 来完成对数据流量的控制。在 Struts 1.x 版本中由 Servlet 实现控制功能,在 Strutds 2.x 版本中 Action 是业务控制器,由 Java 类来实现。
6.Servlet 部署
- 部署描述符文件可配置 Servlet 的名字、Servlet 的类、初始化参数、启动转入的优先级、Servlet 的映射、运行的安全设置、过滤器的名字和类以及它的初始化参数。
- 部署描述符文件是 Java EE 程序的重要组成部分,其主要功能包括以下几个方面。
- 用于 Servlet 和 Web 应用程序的初始化。通过配置文件,可以减少初始化值的硬编码。
- Servlet/JSP 定义。在 Web 应用程序中的每个 Servlet 和预编译的 JSP 文件都应在部署描述符文件中定义。
- MIME 类型定义。可以在部署描述符文件中为每种内容定义 MIME 类型。
- 安全控制。可以使用部署描述符文件控制对应用程序的访问。
- 一个标准的部署描述符文件(web.xml)通常放在 /WEB-INF 目录下。
- 配置 Servlet 文件的部署描述符文件(web.xml),代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>example_Servlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
</web-app>
7.开发一个简单的 Servlet
- Java Servlet 应用实例(FirstServlet.java),代码如下:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// Servlet 文件继承父类 HttpServlet
public class FirstServlet extends HttpServlet{
protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException,
IOException{
response.setContentType("text/html;charset = UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet FirdtServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>这是我的第一个 Servlet 文件"+request.getContextPath()+"</h1>");
out.println("</body>");
out.println("</html>");
}finally {
out.close();
}
}
//使用 Servlet 文件时常用的两种方法之一,如果表单中请求方式是 get,调用 doGet 方法执行
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,
IOException{
processRequest(request,response);
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,
IOException{
processRequest(request,response);
}
//获取 Servlet 版本信息,在 MVC 编程中可以不使用该方法,可以删除
public String getServletInfo() {
return "Short description";
}
}
- 文件结构如图所示:
- 页面效果如图所示: