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";
	}
}
  • 文件结构如图所示:

jsp页面中js调用本页面java方法 jsp页面调用servlet_Java

  • 页面效果如图所示:

jsp页面中js调用本页面java方法 jsp页面调用servlet_Java_02