1.什么是Servlet

  • 用来扩展web服务器功能的组件——早期的web服务器只能处理静态资源的请求,即需要事先将html文件准备好,并存放到web服务器上面。不能够处理动态资源的请求(需要计算,动态生成html),而Servlet可以根据客户端不同请求给予相应的响应服务(处理动态请求)。
  • Servlet是一个直接或间接实现javax.servlet.Servlet接口的Java类(通常可以继承HttpServlet类
  • Servlet必须部署在web服务器端,用来处理客户端的请求,通常我们把能够运行Servlet的服务器称作Servlet容器,如Tomcat

2.Servlet的创建

  创建Servlet实例有两个时机:

  • 客户端第一次请求某个Servlet时,容器创建该Servlet实例(大部分Servlet都是以这种方式创建)。
  • Web应用启动时立即创建Servlet实例,即load-on-startup Servlet。

  关于load-on-startup参数:

  • load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
  • 它的值必须是一个整数,表示servlet应该被载入的顺序
  • 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
  • 当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
  • 正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
  • 当值相同时,容器就会自己选择顺序来加载。

3.Servlet的生命周期

javax.servlet.Servlet源码:

public interface Servlet {
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy();
}

所有的servlet都是javax.servlet.Servlet的子类,就像Java里面所有的类都是Object的子类一样。Servlet类规定了每个servlet应该实现的方法,这个是遵循Servlet规范的。但是自定义的servlet一般不用直接实现Servlet,而是继承javax.servlet.GenericServlet或者javax.servlet.http.HttpServlet就行了。这是因为HttpServlet间接实现了Servlet,提供了通用的功能。所以我们在自定义的TestServlet里面只需要专注实现业务逻辑就行了。

Servlet里面有三个比较重要的方法:init、service、destroy。它们被称作是servlet生命周期的方法,它们都是由servlet容器调用。另外两个方法用于获取servlet相关信息的,需要根据业务逻辑进行实现和调用。

Servlet生命周期:

  • 实例化:容器创建Servlet对象
  • 初始化:调用Servlet的init()方法
  • 服务:调用Servlet实例的service()方法来处理请求
  • 销毁:容器删除Servlet实例(调用Servlet实例的destroy()方法)

4.HttpServlet运行过程

HttpServlet是一个针对HTTP协议的通用实现,它实现了HTTP协议中的基本方法get、post等,通过重写service方法实现方法的分派。

  1. Web Client依据ip,port向Servlet容器(Tomcat)发出Http请求
  2. 容器接收Web Client的请求
  3. 容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
  4. 容器创建一个HttpResponse对象
  5. 容器创建Servlet对象,然后调用该对象的service方法,把HttpRequest与HttpResponse作为参数传给 Servlet 对象。
  6. Servlet 对象调用HttpRequest的有关方法,获取Http请求信息。(Servlet的service方法中)
  7. Servlet 对象调用HttpResponse的有关方法,生成响应数据。(Servlet的service方法中)
  8. 容器把HttpResponse的响应结果传给Web Client。

  如果想要分别响应客户端的GET和POST请求,需要重写HttpServlet对象的doGet和doPost方法,如果所有请求的响应都是一样的,则只需要重写service方法即可。

5.Servlet与JSP

  JSP的本质就是Servlet,我们将编写好的JSP文件部署在web容器中之后,web容器会将JSP编译成对应的Servlet。

  如果Servlet要生成表现层页面时,所有的HTML标签都需要使用Servlet的输出流来输出,繁琐且不利于美工人员修改。

  在标准的MVC模式中,Servlet仅作为控制器使用,而JSP仅作为表现层技术使用:

  • M:Model,即模型,对应JavaBean。
  • V:View,即视图,对应JSP。
  • C:Controller,即控制器,对应Servlet。

6.Java创建Servlet实例

6.1 首先创建一个JavaWeb工程,然后创建一个类继承HttpServlet

package com.xzh;

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; /**
* Created by xiangzh on 2017/8/29.
*/
public class ServletDemo extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}

6.2 在web.xml文件中配置上面的Servlet

    <servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>com.xzh.ServletDemo</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/ServletDemo</url-pattern>
</servlet-mapping>

6.3 将项目打包放到Tomcat中,启动Tomcat,测试结果如下:

注意:一个Web应用对应一个ServletContext,一个Servlet对应一个ServletConfig。每个Servlet都是单例的,所以需要自己处理好并发的场景。

参考:

JavaWeb——Servlet

http://www.cnblogs.com/xdp-gacl/p/3760336.html

http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html

http://www.cnblogs.com/goody9807/archive/2007/06/13/782519.html

http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html

JavaWeb—Servlet的更多相关文章

  1. JavaWeb:Servlet技术

    JavaWeb:Servlet技术 快速开始 Servlet是什么 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 ...

  2. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  3. [JavaWeb] Servlet Filter

    作用: Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servle ...

  4. 【Java123】JavaWeb Servlet开发

    http://www.runoob.com/servlet/servlet-intro.html https://www.cnblogs.com/xdp-gacl/tag/JavaWeb学习总结/de ...

  5. JavaWeb——Servlet开发

    什么是Servlet? Servlet运行的过程 Servlet的生命周期 生命周期的各个阶段 Servlet的配置 使用Web.xml配置 使用注解配置 Servlet相关接口 ServletCon ...

  6. javaweb——Servlet作为控制器

    1.文件预览 JSP:login.jsp--用户登陆,jsp只是用于向客户端展示信息,处理信息的是servlet. welcome.jsp--用户登陆成功,显示给用户的界面. jsp文件是位于webC ...

  7. javaweb servlet中使用请求转发乱码

    乱码的方式有很多,这里指出一种不容易想到的 *请确保您的页面单独访问正常,经过servlet请求转发时,有PrintWriter out = response.getWriter()不正常,没有正常 ...

  8. Javaweb Servlet出现Class xxx is not a servlet错误原因

  9. javaWeb+servlet+mysql实现简单的企业员工管理系统

    企业员工信息管理系统 一.源码描述       本程序为企业员工信息管理系统.是javaEE一个系统,主要实现登录功能和两个模块信息的增删改查.可以作为JAVAweb学习,也可在原有基础上进行深一步的 ...

随机推荐

  1. CentOS 7中mariadb编译安装教程systemctl启动

    mariadb做为mysql的替代品 现在centos的新版本yum包已换成mariadb 跟上篇一样只是启动方式改为systemd 安装一些库 yum install gcc gcc-c++ wge ...

  2. unity, iOS下画面错乱解法

    unity版本号为5.1.1f1 Personal 在ipod5,系统为iOS7.1上测试.发现下面两种出现画面错乱的问题: 一,退后台在返回前台时画面发生错乱(错乱持续一两秒,然后变为正常).   ...

  3. Google I/O 2014 大会总结 Android开发新方向

    昨天晚上,Google I/O 2014大会召开,会上主要展示了下面几个部分的创新内容: Android L 操作系统 首先是界面,谷歌又一次设计了一套 UI 规范.并称之为"Materia ...

  4. Perl/C#连接Oracle/SQL Server和简单操作

    连接数据库是一个很常见也很必须的操作.先将我用到的总结一下. 1. Perl 连接数据库 Perl 连接数据库的思路都是: 1)使用DBI模块: 2)创建数据库连接句柄dbh: 3)利用dbh创建语句 ...

  5. LeetCode447. Number of Boomerangs

    Description Given n points in the plane that are all pairwise distinct, a "boomerang" is a ...

  6. 日志系统之扩展Flume-LineDeserializer

    本人博客文章如未特别注明皆为原创.如有转载请注明出处:http://blog.csdn.net/yanghua_kobe/article/details/46595401 继续闲聊日志系统,在之前的博 ...

  7. pom.xml settings.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  8. 图像sift配准后融合

    image rectification 图像校正 在配准时,先找到特征点,找到特征点后剔除伪匹配点. 然后针对两幅图像做几何矫正(一般通过估计出来的仿射矩阵完成). 这部完成后,图像可以匹配了,但是两 ...

  9. C++中计算矩阵的行列式

    使用eigen库: 求行列式: #include <iostream> #include <Eigen/Dense> using namespace std; using na ...

  10. HDU1712ACboy needs your help【分组背包】

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...