zoukankan      html  css  js  c++  java
  • Servlet基础

    1.Servlet概述

      Servlet是使用Java语言编写的运行在服务器端的程序,通常来说,Servlet是只所有实现了Servlet接口的类。 Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等。

      Servlet是由Servlet容器提供,Servlet容器是指提供了Servlet功能的服务器(如Tomcat)。Servlet容器会将Servlet动态加载到服务器上,然后通过HTTP请求和HTTP响应和客户端进行交互。

      ①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。

      ②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器。

     

    Servlet技术的特点:

      (1)方便:Servlet提供了大量的使用工具例程,如处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话等。

      (2)跨平台:Servlet使用Java类编写,可以在不同的操作系统平台和不用的应用服务平台运行。

      (3)灵活性和可扩展性强:采用Servlet开发的Web应用程序,由于Java类的继承性及构造函数等特点,使得应用灵活,可随意扩展。

     

    2.实现Servlet程序

      在前面,我们已经知道了servlet是什么,为什么需要servlet?(为了实现动态网页,而不是显示静态网页)

     (1)创建一个servletDemo1继承HttpServlet,重写doGet和doPost方法,也就是看请求的方式是get还是post,然后用不同的处理方式来处理请求。

     1 import java.io.IOException;
     2 import javax.servlet.ServletException;
     3 import javax.servlet.http.HttpServlet;
     4 import javax.servlet.http.HttpServletRequest;
     5 import javax.servlet.http.HttpServletResponse;
     6 
     7 public class servletDemo4 extends HttpServlet {
     8     private static final long serialVersionUID = 1L;
     9 
    10     public void doGet(HttpServletRequest request, HttpServletResponse response)
    11             throws ServletException, IOException {
    12         System.out.println("4");
    13     }
    15     public void doPost(HttpServletRequest request, HttpServletResponse response)
    16             throws ServletException, IOException {
    17         
    18     }
    19 }

      (2)在web.xml中配置servletDemo1,为什么需要配置?让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
     3   <servlet>
     4     <!-- 给servlet取名字,一般写的servlet类的名字 -->
     5     <servlet-name>servleDemo1</servlet-name>                            //3
     6     <!-- servlet的全限定类名,也就是servlet的位置 -->
     7     <servlet-class>com.itheima.servlet.ServleDemo1</servlet-class>      //4
     8   </servlet>
     9 
    10   <servlet-mapping>
    11     <!-- 跟上面的servlet名字相同 -->
    12     <servlet-name>servleDemo1</servlet-name>                   //2
    13     <!-- 浏览器通过url找到servle。 一定要加,相当于项目名称 -->
    14     <url-pattern>/demo1</url-pattern>                          //1
    15   </servlet-mapping>
    16   
    17   <welcome-file-list>
    18     <welcome-file>index.jsp</welcome-file>
    19   </welcome-file-list>
    20 </web-app>

    按照步骤,首先浏览器通过http://localhost:8080/项目名称/demo1来找到web.xml中的url-pattern,这就是第一步,匹配到了url-pattern后,就会找到第二步servlet的名字servletDemo1,知道了名字,就可以通过servlet-name找到第三步,到了第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。

      (3)部署应用到tomcat服务器

      (4)测试:http://locahost:8080/day08_servlet(项目名称)/demo1

    Servlet执行过程:

    3.Servlet的生命周期

    1、servlet的生命周期是什么?

        服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)

        该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

        最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

    实例化-->初始化-->服务->销毁

    1.初始化阶段:    出生:(实例化-->初始化)第一次访问Servlet就出生(默认情况下)

      当客户端向Servlet容器发送HTTP请求要求访问Servlet时,Servlet容器(Tomcat)首先会解析请求,检查内存中是否已经有核心的Servlet对象,如果有,则直接使用该Servlet对象,如果没有,则创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,早Servlet的整个生命周期内,它的init()方法只被调用一次。

    2.运行阶段:    活着:(服务)应用活着,servlet就活着

      这是Servlet生命周期最重要的阶段,在这个阶段中,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service() 方法。service() 方法从ServletRequest对象中获得客户请求消息并处理该请求,通过ServletRequest对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并创建新的ServletReq和ServletResponse对象,也就是说,service()方法在Servlet的整个声明周期中会被多次调用。

    3.销毁阶段:    死亡:(销毁)应用卸载了servlet就销毁。

      当服务器关闭或Web应用被移除容器时,Servlet随着Web应用的关闭而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个声明周期中,destroy()方法也智能被调用一次。

       需要注意的是:Servlet对象一旦创建就会驻留在内存中等待客户端的访问,知道服务器关闭或Web应用被移除容器时,Servlet对象才会被销毁。

    如何让servlet在服务器启动时就创建

    4.Servlet的三种创建方式

    (1)实现javax.servlet.Servlet接口;

    (2)继承javax.servlet.GenericServlet类(适配器模式)

    (3)继承javax.servet.HTTPServlet类(模板方法设计模式)

    小技巧:使生成的servlet更清新一些

    找到:MyEclipseCommonplugins目录

    把com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar复制到上面目录

    问题:(原文:https://www.cnblogs.com/whgk/p/6399262.html

    1、为什么创建的servlet是继承自httpServlet,而不是直接实现Servlet接口?

    2、servlet的生命周期中,可以看出,执行的是service方法,为什么我们就只需要写doGet和doPost方法呢?

    5.Servlet的线程安全

    Servlet对象是一个单实例的对象,并且在多线程的环境下运行,所以Servlet对象存在线程安全问题 。

      当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。

    解决线程安全问题的最佳办法,不要写全局变量,而写局部变量。

    6.ServletConfig和ServletContext

    (1)ServletConfig接口

      在运行Servlet程序时,可能需要一些辅助信息,例如,文件中使用的编码、使用Servlet程序的共享信息等,这些信息可以在web.xml文件中使用一个或多个<init-param>元素进行配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到Servlet的ServletConfig对象中,此时可调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。

    作用1:可以获取servlet配置信息

    作用2:可以获得ServletContext对象

    getServletName();  //获取servlet的名称,也就是在web.xml中配置的servlet-name;

    getServletContext(); //获取ServletContext对象;

    getInitParameter(String); //根据初始化参数名返回对应的初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数;

    getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型。

    注意:在上面我们所分析的源码过程中,我们就知道,其实可以不用先获得ServletConfig,然后在获取其各种参数,可以直接使用其方法,比如上面我们用的ServletConfig().getServletName();可以直接写成getServletName();而不用在先获取ServletConfig();了,原因就是在GenericServlet中,已经帮我们获取了这些数据,我们只需要直接拿就行。

    (2)ServletContext接口

      当Tomcat启动时,Tomcat会为每个Web应用创建唯一一个ServletContext对象代表当前的Web应用,该对象封装了当前Web用于的所有信息。可以利用该对象获取Web应用程序的初始化、读取资源文件等。

    (原文:https://www.cnblogs.com/whgk/p/6399262.html

      获取途径:getServletContext(); 、getServletConfig().getServletContext();  //这两种获取方式的区别就跟上面的解释一样,第一种是直接拿,在GenericServlet中已经帮我们用getServletConfig().getServletContext();拿到了ServletContext。我们只需要直接获取就行了,第二种就相当于我们自己在获取一遍,两种读是一样的。

      功能:tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。

      1、web项目中共享数据,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

          setAttribute(String name, Object obj) 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到

          getAttribute(String name) 通过指定名称获得内容

          removeAttribute(String name) 通过指定名称移除内容 

     

      2、整个web项目初始化参数 //这个就是全局初始化参数,每个Servlet中都能获取到该初始化值

            getInitPatameter(String name)  //通过指定名称获取初始化值

            getInitParameterNames()  //获得枚举类型

             web.xml 配置 整个web项目的初始化

    3、获取web项目资源

       获取web项目下指定资源的路径:getServletContext().getRealPath("/WEB-INF/web.xml")

                                                                     String  getRealPath(String path);//根据资源名称得到资源的绝对路径.  可以得到当前应用任何位置的任何资源。

      获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(java.lang.String path)

    4、getResourcePaths(java.lang.String path)  指定路径下的所有内容

    5.实现Servlet的转发

      RequestDispatcher getRequestDispatcher(String path) ;//参数表示要跳转到哪去

    2018-09-24 10:46:58

  • 相关阅读:
    ORACLE函数介绍
    msdn的javascript文章转载
    baidu的高级搜索命令
    周杰伦 青花瓷 蒲公英的约定 我不配 彩虹 歌词和下载
    谷歌百度相争 新浪渔翁得利
    tomcat+jsp web运行环境搭建
    C#2008与.NET 3.5 高级程序设计读书笔记(24) LINQ API编程
    C#2008与.NET 3.5 高级程序设计读书笔记(16) 类型反射、晚期绑定和基于特性的编程
    C#2008与.NET 3.5 高级程序设计读书笔记(15) .NET程序集入门
    C#2008与.NET 3.5 高级程序设计读书笔记(25) WCF
  • 原文地址:https://www.cnblogs.com/qqiua/p/9689517.html
Copyright © 2011-2022 走看看