用自己的话表达出来-Servlet

什么是Servlet

  Servlet就是工作在服务器端的类,该类可以处理用户传过来的请求,也可以通过响应向用户输送数据。

如何使用Servlet

  Servlet就是处理用户的HTTP请求,然后回送HTTP响应,若是没有Servlet技术出现的话,我们还要手动的使用一些基本、底层的类去解析HTTP。现在有了Servlet的底层封装,我们可以基于Servlet快速的开发。我们可以让我们编写的类继承HttpServlet,HttpServlet也是继承了GenericServlet,里面定义了与HTTP相关的各种方法,如GET、POST、HEAD等,我们只需要在自己编写的类上重写对应的请求方法就可以处理用户通过给HTTP方法传送过来的请求了。

  例如在doGet方法里面,有两个参数,一个是HttpServletRequest,另外一个是HttpServletResponse,前面一个对应的就是用户的HTTP请求,后面一个就是你响应给用户的HTTP响应。在HttpServletRequest里面,你可以获取HTTP请求的各种信息,如用户的IP,用户通过哪个端口发送,请求参数,请求头,各种路径,编码格式等。在HttpServletResponse里面,你可以设置你的响应内容,响应头,响应编码等。

Servlet的生命周期

  (1)加载实例化。当用户请求一个Servlet的时候,如果Servlet容器中没有这个Servlet的实例的话,容器就会加载实例化一个该Servlet。

  (2)初始化。在进行处理请求前,会调用Servlet的init方法进行初始化,在init方法里面你可以写你要初始化的代码。

  (3)处理请求。Servlet会调用父类的service方法,该方法处理过程主要是这样的,首先在HttpServletRequest参数中通过getMethod方法拿到这个Http请求的是什么方法,然后判断这个方法是什么类型的,如果是GET方法,就对应到doGet方法中处理,前面你的Servlet类中必须要重写这个方法,不是的话报405的错误,就是说你请求的这个方法不被访问。

  (4)销毁。当Servlet容器决定要删除这个Servlet实例的时候,就会调用这个Servlet的destroy方法。例如当你运行着Tomcat,然后你修改了改Servlet的时候,Servlet容器就是删除你以前的Servlet实例,然后加载实例化新的这个。

          

Servlet是单例的

  为什么设计Servlet为单例呢?我们可以先想想如果Servlet不是单例的话,很多客户通过访问一个Servlet的话,每次都new出一个实例的话,内存很快就爆了,所以设计出单例是合理的。

  怎么看Servlet是单例的?我们只需要在doXXX方法中打印this,就可以判断是不是用同一个实例。

单实例多线程的Servlet模型

  Servlet规范定义中,在默认的情况下,Servlet容器对声明的每一个Servlet,只创建一个实例,如果有多个客户同时访问这个Servlet,Servlet容器如何处理这多个请求呢?答案就是多线程,Servlet维护了一个线程池来服务请求,线程池实际上是等待执行代码的一组线程,这些线程叫做工作者线程,当容器收到一个访问Servlet的请求,调度者线程从线程池中选取一个线程来执行Servlet里面的service方法。

           

Servlet简单例子

/**
 * Servlet的工作流程
 * @author xujianguo <[email protected]>
 * @date 2014-6-21
 * @CopyRight 2014 Topview Inc.
 * @version V1.0
 */
@WebServlet(name="servlet_work", urlPatterns="/servlet_work")
public class ServletWork extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException {
        System.out.println("------ ServletWork Init ------");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("------ ServletWork DoGet ------");
        resp.getWriter().write("ServletWork");
    }

    @Override
    public void destroy() {
        System.out.println("------ ServletWork Destroy ------");
    }
}
时间: 2024-10-27 20:00:20

用自己的话表达出来-Servlet的相关文章

说一说Servlet 的生命周期

答:servlet 有良好的生存期的定义, 包括加载和实例化. 初始化. 处理请求以及服务结束.这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达.Servlet 被服务器实例化后, 容器运行其 init 方法, 请求到达时运行其 service 方法, service方法自动派遣运行与请求对应的 doXXX 方法( doGet, doPost) 等, 当服务器决定将实例销毁的时候调用其 destroy 方法.web 容器加载

java面试题大全

java面试笔试题大汇总     第一,谈谈final, finally, finalize的区别. 最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 这个问得很少. 第五,HashMap和Hashtable的区

Java Web部分

Java Web部分 1.Tomcat的优化经验? 答:去掉对web.xml的监视,把JSP提前编辑成Servlet. 有富余物理内存的情况,加大tomcat使用的JVM的内存 2.HTTP请求的get与post方式的区别? 答: get:是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述. post:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求UR

Java笔试题-线程编程方面

Ja 线程编程方面 60.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用stop(),是因为它不安全.它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们.结果很难检查出真正的问题所在.suspend()方法容易发生死锁.调用suspend()的时候,

【Java 面试】面试

一. 笔试题之Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他.有些题来自网上搜集整理,有些题来自传智播客学员面试后的反馈,说真的,少数一些网上的面试题,我真怀疑其是否还有存在价值! 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有没有goto?

javaweb面试题01

1 Servlet 的生命周期 答:Web 容器加载Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其init 方法进行Servlet 的初始化,请求到达时运行其service 方法,service方法自动派遣运行与请求对应的doXXX 方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy 方法. 2 forward 和redirect 的区别 答:forward 是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个

Java面试宝典2013版(超长版)

一. Java基础部分......................................................................................................2 1.一个".java"源文件里能否够包含多个类(不是内部类)?有什么限制?.....2 2.Java有没有goto?........................................................................

java面试③Web部分

2.2.1 讲一下http get和post请求的区别 get和post请求都是http的请求方式,用户通过不同的http请求方式完成对资源(url)的不同操作,具体点来讲get一般用于获取/查询资源信息,而post一般用于更新资源信息. http定义了与服务器交互的不同方法,最基本的方法有4种,分别是get,post,put,delete,url全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而http中的get,post,put,delete就是对应着这个资源

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么