1、Servlet是什么

Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。

1.1 广义上来讲

从本质上来讲,Servlet就是一个特殊的Java类,说它特殊是因为这个Java类必须直接或间接地实现Servlet接口(javax.servlet.Servlet),我们自定义的Servlet更多是采用继承HttpServlet的方式,以达到间接实现Servlet接口的目的。

Servlet还有一个比较特殊的地方:必须运行在Web容器(服务器)中,不能像普通类使用main方法访问,它的方法由服务器在相应情况下调用执行。一般来说自定义Servlet要覆盖其doGet和doPost方法,根据请求是GET/POST方式会自动调用相应的doGet/doPost方法。

又要实现接口,又只能在Web容器中运行,那么Servlet的任务就来了:
  • 获取请求数据
  • 处理请求
  • 完成响应

1.2 狭义上来讲

首先要明白的是,JavaEE实际上是sun公司定义的一系列技术标准所组成的平台,用来B/S结构的应用程序。所以它实质是一套体系或者说是一套标准(其中如我们所熟知的JSP、JSTL和Servlet都隶属其中),所以有了以下Servlet的狭义说法。

所以,狭义的Servlet是指Java语言实现的一个接口,再白话一点,你可以理解为,Servlet就是一套规范,不过是以接口的形式展现。下面摘自J2EE的API:

Defines methods that all servlets must implement. 

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol. 

To implement this interface, you can write a generic servlet that extends javax.servlet.GenericServlet or an HTTP servlet that extends javax.servlet.http.HttpServlet. 

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence: 
  • The servlet is constructed, then initialized with the init method. 
  • Any calls from clients to the service method are handled. 
  • The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized. 

In addition to the life-cycle methods, this interface provides the getServletConfig method, which the servlet can use to get any startup information, and the getServletInfo method, which allows the servlet to return basic information about itself, such as author, version, and copyright.

可以看到,在J2EE这套大标准中,Servlet是作为服务器端用以交互请求和响应的一套标准。而符合J2EE这套标准(包括Servlet标准)的产品叫“实现”,不同服务器对待这套标准的方式不同,我们也可以说,“实现”是不同的,所以像JBoss、Tomcat、WebLogic都是J2EE标准的“实现”。

2、Servlet的配置

访问Servlet之前,必须配置Servlet,否则不同的请求,如何对应不同的Servlet来进行处理呢?

在web.xml中配置Servlet的主要信息,示例如下:
<servlet>
<!-- 自定义的名字,在web.xml中不重复 --->
<servlet-name>MyServlet</servlet-name>
<!-- Servlet类的完整名字 -->
<servlet-class>j2ee.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 与之前自定义的名字相对应 -->
<servlet-name>MyServlet</servlet-name>
<!-- 自定义的逻辑地址,必须以/开头 -->
<url-pattern>/doServlet</url-pattern>
</servlet-mapping>
12
 
1
<servlet>  
2
    <!-- 自定义的名字,在web.xml中不重复 --->
3
    <servlet-name>MyServlet</servlet-name>
4
    <!-- Servlet类的完整名字 -->
5
    <servlet-class>j2ee.servlet.MyServlet</servlet-class>
6
</servlet>
7
<servlet-mapping>
8
    <!-- 与之前自定义的名字相对应 -->
9
    <servlet-name>MyServlet</servlet-name>
10
    <!-- 自定义的逻辑地址,必须以/开头 -->
11
    <url-pattern>/doServlet</url-pattern>
12
</servlet-mapping>

这里重点说明一下url-pattern,自定义的逻辑地址,也就是说如果访问的url中,根路径之后符合自定义的逻辑要求,则跳转到对应的Servlet,如上 /doServlet,意味着如果我的url是诸如 http://localhost:8080/doServlet,那么访问会跳转到 j2ee.servlet.MyServlet 类中去,根据GET或POST调用相应的doGet或doPost方法。

其中,自定义的逻辑地址,有以下几种匹配方式:
  • 完全匹配
    • 如<url-pattern>/doServlet</url-pattern>
    • 即如 http://localhost:8080/doServlet 才能访问, .../doServlet.do 或 .../doServlet/xxx 等都无法访问到该Servlet
  • 路径匹配
    • 如<url-pattern>/*</url-pattern>
    • 即根路径下所有请求都会访问到对应Servlet
  • 扩展名匹配
    • 如<url-pattern>*.do</url-pattern> 以 .do 结尾的请求
    • 如<url-pattern>*.html</url-pattern> 以 .html 结尾的请求

3、Servlet的作用

最基本的网页是静态的,也就是最普通的html形式,为了能编写服务器动态网页,Servlet接下了重任,用来输出HTML标签和内容:
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>This is my Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
for (int i = 0; i < 10; i++) {
out.println("<font color='red'>i=" + i + "</font><br>");
}
out.println("</HTML>");
out.flush();
out.close();
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
x
 
1
public class MyServlet extends HttpServlet {
2
    @Override
3
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
4
        response.setContentType("text/html;charset=utf-8");
5
        PrintWriter out = response.getWriter();
6
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
7
        out.println("<HTML>");
8
        out.println("  <HEAD><TITLE>This is my Servlet</TITLE></HEAD>");
9
        out.println("  <BODY>");
10
        out.print("  This is ");
11
        out.print(this.getClass());
12
        out.println(", using the GET method");
13
        out.println("  </BODY>");
14
        for (int i = 0; i < 10; i++) {
15
            out.println("<font color='red'>i=" + i + "</font><br>");
16
        }
17
        out.println("</HTML>");
18
        out.flush();
19
        out.close();
20
    }
21

22
    @Override
23
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
24
        doGet(request, response);
25
    }
26
}

如web.xml中配置Servlet如下:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>j2ee.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/doServlet</url-pattern>
</servlet-mapping>
 
1
<servlet>
2
    <servlet-name>MyServlet</servlet-name>
3
    <servlet-class>j2ee.servlet.MyServlet</servlet-class>
4
</servlet>
5
<servlet-mapping>
6
    <servlet-name>MyServlet</servlet-name>
7
    <url-pattern>/doServlet</url-pattern>
8
</servlet-mapping>

那么我们访问符合的路径时,我们得到的是:

 
可以看到,我们通过Servlet中编写网页内容,最终得到了相应的网页内容,而且该页面的内容根据我们代码中的逻辑不同会动态发生改变,也就是我们说的能编写动态页面。
 
但是真的太麻烦了,我们要写大量诸如out.print的重复代码,而且格式杂乱也不便于修改。

直到JSP的出现,需要输出动态内容的功能,都在JSP中实现了(至于JSP是什么,以后会提到),Servlet不用再去写那些痛苦的out.print代码了。所以,现在Servlet的作用是用来做控制器使用,用来接收请求,处理请求,跳转到不同的页面



[01] Servlet是什么的更多相关文章

  1. [技巧篇]01.Servlet的优化模版代码

    Servlet.java的模版 #---------------------------------------------# # <aw:description>Template for ...

  2. 01 Servlet & Jsp 技术概述

    Servlet 介绍 servlet 是运行在web服务器或应用服务器上的java程序, 它是一个中间层, 负责连接来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序. 为 ...

  3. 01 Servlet技术

    Servlet 1.Servlet技术 1.1.什么是Servlet Servlet是JavaEE规范之一.规范就是接口 Servlet就JavaWeb三大组件之一.三大组件分别是:Servlet程序 ...

  4. javaweb 01: servlet前言

    动力节点杜老师,javaweb最新课程的笔记,假期一直跟着bilibili上的课程在学,放在这里,方便复习 Servlet前言 关于系统架构 系统架构包括什么形式? C/S架构 B/S架构 C/S架构 ...

  5. JSP数据交互(二)和Servlet基础

    01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...

  6. javaWeb学习总结(3)- Servlet总结(servlet的主要接口、类)

    Servlet总结01——servlet的主要接口.类 (一)servlet类 Servlet主要类.接口的结构如下图所示: 要编写一个Servlet需要实现javax.servlet.Servlet ...

  7. [01] JSP的基本认识

    1.什么是JSP JSP,全称JavaServer Pages,是由Sun Microsystems公司倡导和许多公司参与共同建立的一种使软件开发者可以响应客户端请求,而动态生成HTML.XML或其他 ...

  8. JAVA Oauth 认证服务器的搭建

    http://blog.csdn.net/binyao02123202/article/details/12204411 1.软件下载 Oauth服务端: http://code.google.com ...

  9. 编程从入门到提高,然后放弃再跑路(Java)

    1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利用p ...

随机推荐

  1. C / C++ 运行环境搭建教程

    C / C++ 运行环境搭建教程 一.实验环境 本机操作系统:Windows 7 64位 虚拟机:VMware Workstation 12 pro 虚拟机操作系统:Linux CentOS 7 二. ...

  2. Ubuntu14.04下搭建VPN服务 -pptp

    在Ubantu下采用PPTP搭建VPN,优点是配置简单快捷.本教程亲自测试,熟练了在新机器上5分钟搞定VPN. - - - - - - - - - - - - - - - - - - - - - - ...

  3. 我理解的Java中重载与重写

    程序中我们用方法来实现对对象的操作,但是对象可能有不同的数据类型,这时候对不同的数据类型,进行相同的操作,我们就可以用到方法的重载,即方法名相同,但是具有不同的参数列表. 方法的重载可以根据传递参数的 ...

  4. Android studio一些常见技巧(不断更新)

    一.Android studio取消默认每次打开时打开最后一个项目 二.as添加jar包 新建一个libs目录,在java下 进行手动gragle同步或者如下图 三.代码边上的小图标 1.布局文件中存 ...

  5. 有哪些关于 Python 的技术博客?

    Python是一种动态解释型的编程语言,它可以在Windows.UNIX.MAC等多种操作系统以及Java..NET开发平台上使用.不过包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.因此如何 ...

  6. mysql数据类型double和decimal区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336 实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 ...

  7. Spring中的线程池和定时任务功能

    1.功能介绍 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能.同时使用框架自己定义的抽象接口来屏蔽掉底层 ...

  8. js函数防抖、节流实现

    防抖 Debounce 函数防抖就是,延迟一段时间再执行函数,如果这段时间内又触发了该函数,则延迟重新计算: // 简单实现 function debounce(fn, wait) { let t r ...

  9. Java基础学习——泛型

    一.泛型方法 /** 自定义泛型:自定义泛型可以理解为是一个数据类型的占位符,或者理解为是一个数据类型的变量. 泛型方法: 泛型方法的自定义格式:修饰符<声明自定义泛型>返回值类型 函数名 ...

  10. MITNIK ATTACK

    Https 443 http 80 TCP/IP 协议栈:将数据封装包头 传输层报头 Ack回复确认位 FIN结束位 SIN 开始位 RST 重置位 Seq 序号位 网络层报头 目的地址 原地址 报文 ...