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. 请实现一个函数,把字符串中的每一个空格替换成“%20”,比如输入 “We are Happly。” 则输出“we%20are%20happy。”

    请实现一个函数,把字符串中的每一个空格替换成"%20",比如输入 "We are Happly."  则输出"we%20are%20happy. &q ...

  2. doT js模板入门 2

    doT js 使用{{}} 非常相似于JSP,所以用起来感觉非常亲切,非常顺手 {{–><% }}–>%> 比如: <div id="evaluationtmp ...

  3. 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作

    这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制. 依旧用部门和员工举例.多个员工相应一个部门(多对一关联关系) 员工类:Employee.java package cn ...

  4. hiho一下 第四十九周 欧拉路&#183;一

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho近期在玩一个解密类的游戏.他们须要控制角色在一片原始丛林里面探险 ...

  5. 编辑HTML代码,批量制作博文清单

    当积累的博文多了,常想制作一个分类文件夹,方便读者阅读.这能够是一个不轻松且枯燥的工作. 以<关于"IT学子成长指导"专栏及文章文件夹>中文件夹的制作为例.介绍我的&q ...

  6. atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案  v3 q39

    atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案  v3 q39 1. 问题::线程死锁  卡住无反应1 1.1. 分类:: cmd调用,  net io  , file  io  ...

  7. 如何给unity3d工程加入依赖的android工程

    最近在忙着接平台的事,需要接入各种各样的android平台sdk来发布.在接sdk的时候遇到了这样的一个情况,有点麻烦,所以纪录一下. 有些sdk的接入是提供jar包,这样的可以简单地将jar包制作成 ...

  8. cpu故障定位 top strace pstack

    一次服务器CPU占用率高的定位分析 推荐   背景:通过性能监控发现上线服务器cpu某核占用率已经达到了100%,而且是由我们的某个核心服务导致的.幸亏由于我们的服务进程由多个相同worker(线程) ...

  9. (C#)System.Security.SecureString(表示应保密的文本)

    正常的String类型值,在脱离开作用域之后,其值在内存中并不会被立即销毁,这时如果有人恶意扫描你的内存,程序中所保存的机密信息就会暴露;于是就有了System.Security.SecureStri ...

  10. hadoop之WordCount源代码分析

    //近期在研究hadoop.第一个想要要開始研究的必然是wordcount程序了.看了<hadoop应用开发实战解说>结合自己的理解,对wordcount的源代码进行分析. <pre ...