zoukankan      html  css  js  c++  java
  • Servlet详解

    Servlet简介

    1、什么是Servlet? 

      Servlet=server+applet(服务器端小程序)。

      Servlet是sun公司提供的一门用于开发动态web资源的技术。运行在服务器端,一个小的Java程序。它可以接收从web浏览器发送过来的请求,也可以给浏览器产生相应。通常使用超文本传输协议(HTTP)。

    2、作用(MVC模式)

    3、在创建Servlet的时候,默认需要导入tomcat服务器的包。tomcat默认集成了servlet的jar包

      Servlet在内存中是单例的--单实例对象,一个Servlet类 在内存中最多有一个对象

    4、Servlet继承树

      

    5、Servlet中的方法介绍 

      init:初始化方法,用来初始化Servlet对象 Servlet默认是第一次访问时被 创建,只创建一次,只初始一次。
      service:服务,这个用来执行servlet服务,数据接收以及页面的跳转(所有的操作都在servlet中进行)
      destroy:销毁,这是一个servlet的销毁的时候执行的方法。 超过时间连接 正常关闭服务器 释放资源
      doGet():接收get请求
      oPost():接收post请求

    6、创建一个Servlet步骤

      1、创建一个类,继承HttpServlet,复写doGet和doPost方法

      2、编写配置文件  在web.xml中配置<servlet>  <servlet-mapping>

      3、浏览器访问

      4、服务器执行

    7、Servlet执行流程

    8、Servlet的生命周期  

      Servlet的生命周期一共分为三个阶段

        第一阶段:初始化阶段

          初始化是有Tomcat执行的

          共初始化1次。

          浏览器第一次请求时数据会初始化。

        ******或者在web.xml的<servlet>标签中配置<load-on-startup>2</load-on-startup>  

          --- 传入正整数,整数越小,被创建的优先级就越高.

          --- 建议使用大于等于2的正整数,会在Tomcat启动的时候直接初始化。

        第二阶段:运行阶段

          只要初始化了之后Service()方法运行N次。

        第三阶段:销毁阶段  只销毁1次。

          服务器关闭会执行销毁

          当前类重新编译的时候执行销毁随之创建新的Servlet

          超时(默认30分钟无操作)

    9、url-pattern的配置  

      url-pattern配置方式共有三种:

      1.完全路径匹配 :地址栏请求路径,和web.xml设置的访问路径完全一致,才能访问

        格式:以 / 开始 ,/代表的是当前的项目下

        例如:  /demo1 , /aaa/demo2 , /aaa/bbb/demo3

      2.目录匹配 :地址栏请求路径的目录名,和web.xml设置的访问路径目录名完全一致,才能访问

        格式:以 / 开始 需要以 * 结束.

        例如: /*  (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*

      3.扩展名匹配 :地址栏请求路径的扩展名,和web.xml设置的访问路径扩展名完全一致,才能访问

        格式:不能以 / 开始 以 * 开始的.

        例如: *.do , *.action 、*.jsp 、*.jpg     后面框架中会用到

        ***** 错误的写法 : /*.do

      4.缺省路径/缺省匹配   /  对应的是defaultServlet

        通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet 

      tomcat获得匹配路径时,优先级顺序:完全匹配 > 目录匹配 > 扩展名匹配 > 缺省匹配

     10、ServletConfig:获得Servlet的配置信息  

      每个Servlet都有一个<Servlet>标签对应,<Servlet>标签的内容,可以理解为某个Servlet独一无二的配置信息。

      ServletConfig对象就是某个Servlet独一无二的身份证

      获取方式:在doPost()或doGet()方法中,this.getServletConfig()可以获取对象

      对象可以使用以下方法: 

    方法名

    返回值类型

    描述

    getInitParameter(name)

    String

    获得Servlet的初始化参数的.

    用来替代某个Servlet中的常量的

    getServletContext()

    ServletContext

    获得ServletContext对象的引用

    项目启动时,将web.xml中所有的配置信息进行封装。

    ServletContext相当于某个项目独一无二的身份证

    getServletName()

    String

    获得Servletweb.xml中配置的name的值。

    <servlet-name>标签配置内容。

    ServletRequest接收请求

    1、在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。

    2、因为Request是操作浏览器端传过来的请求,所以不能进行写入操作,不能修改请求的内容,只能进行请求行、头、体的读取操作 。

    3、request获取请求行信息

    方法声明

    功能描述

    String getMethod()

    该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)

    忽略大小写判断请求方式

    String getRequestURI()

    该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分

    仅获取资源名,不包含参数列表

    String getQueryString()

    该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容

    String getProtocol()

    该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0或HTTP/1.1

    String getContextPath()

    该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以“/”开头,表示相对于整个WEB站点的根目录,路径结尾不含“/”。如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("")

    动态获取项目名称。

    例如:/day12

    String getServletPath()

    该方法用于获取Servlet的名称或Servlet所映射的路径

    url-pattern

    String getRemoteAddr()

    该方法用于获取请求客户端的IP地址,其格式类似于“192.168.0.3”

    本机:

    0:0:0:0:0:0:0:1  localhost  127.0.0.1

    统计IP

    String getRemoteHost()

    该方法用于获取请求客户端的完整主机名,需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址

    int getRemotePort()

    该方法用于获取请求客户端网络连接的端口号

    String getLocalAddr()

    该方法用于获取Web服务器上接收当前请求网络连接的IP地址

    String getLocalName()

    该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名

    int getLocalPort()

    该方法用于获取Web服务器上接收当前网络连接的端口号

    接收请求的端口号

    String getServerName()

    该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分

    int getServerPort()

    该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分

    发送响应的端口号

    String getScheme()

    该方法用于获取请求的协议名,例如http、https或ftp

    StringBuffer getRequestURL()

    该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改

    获取到包含http协议的资源路径,不包含参数列表

    4、request获取请求头信息

    方法声明

    功能描述

    String getHeader(String name)

    该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值

    Enumeration getHeaders(String name)

    该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时候可能会出现多次

    Enumeration getHeaderNames()

    该方法用于获取一个包含所有请求头字段的Enumeration对象

    int getIntHeader(String name)

    该方法用于获取指定名称的头字段,并且将其值转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1;如果获取到的头字段的值不能转为int类型,将发生NumberFormatException异常

    Long getDateHeader(String name)

    该方法用于获取指定头字段的值,并将其按GMT时间格式转换成一个代表日期/时间的长整数,这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值

    5、request获取请求体信息

      Post才有请求体  但get方法也可以用这些方法获取参数信息

      获取指定参数的单个值:getParamater(String name)获取指定参数的多个值

      getParamaterValues(String name)获取整个参数列表  

      getParamaterMap() 

      注:如果参数列表上没有对应的参数名,方法会返回null。

      如果参数名对应多个参数值,该方法只能获得第一个。

    6、获取信息时的乱码问题

      Get方法乱码:

        name=new String(name.getBytes("iso-8859-1"),"utf-8");

        或者修改server.xml中的配置信息

                                  

     

     

     Post乱码:

      request.setCharacterEncoding("utf-8");  //放在最上方

    Response

    1、Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。

      Response对象封装了响应行、头、体三部分信息,我们可以通过调用response对象的方法,来轻松控制服务器向浏览器写响应信息。

    2、response操作响应行

      setStatus(int status);

        该方法用于设置HTTP响应消息的状态码,并生成响应状态行。

        由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。

        若未设置状态码,且服务器运行正常,Web服务器会默认产生一个状态码为200的状态行。
      sendError(int sc,String errorMsg);

        该方法用于发送表示错误信息的状态码。

        建议该方法仅发送4xx和5xx状态码。

    3、response操作响应头

           方法声明

    功能描述

    void addHeader(String name, String value)

    这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段

    void setHeader(String name, String value)

    void setCharacterEncoding(String charset)

    该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。

    void setContentType(String type)

    该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8

    void addIntHeader(String name,

    int value)

    这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦

    void setIntHeader(String name,

    int value)

    void setContentLength(int len)

    该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值

    无需手动设置,由服务器自行设置

     
    4、response对象操作响应体 

      getOutputStream()

        向响应体输出二进制字节流信息。【文件下载】

      getWriter()

        向响应体输出字符流信息。【字符串及前端代码输出】

        若输出前端代码,则会被浏览器解析执行

        两个方法我们都使用其write()方法进行数据输出。

      注:一个响应体不可以同时被两种流操作

    5、乱码问题  

      setContentType("text/html;charset=UTF-8");

      response.setContentType("application/json;charset=utf-8");  //设置json中的乱码问题

    ServletContext

    1、ServletContext是某个项目独一无二的身份证对象

      服务器启动的时候,为每个WEB应用创建一个单独的ServletContext对象,将web.xml中的配置信息进行封装。

    2、生命周期:

      创建:服务器正常启动时

      销毁:服务器正常关闭时

    3、作用:

      获取项目配置信息;

      项目内进行信息共享;

    4、Servlet中的获取方式(必须写在某个Servlet内部):this.getServletContext();

      只要是在同一个项目中,任意Servlet获取到的都是同一个ServletContext对象

    5、作用域

      request 作用于一次请求  重新打开一个网页就失效

      session 作用于一次会话  另外一个浏览器打开就失效

      context 作用于整个项目  服务器没有关闭就都可以使用,有时间(一般30分钟)

    6、ervletContext对象---域对象

      域对象:在域作用范围内进行数据共享。相当于一个map

    方法名

    描述

    setAttribute(String name,Object object)

    向ServletContext中存数据

    相当于map.put(key,value); 

    getAttribute(String name)

    从ServletContext中取数据

    相当于map.get(key)

    removeAttribute(name)

    从ServletContext中移除数据

    相当于map.remove(key)

  • 相关阅读:
    电脑缺少网卡驱动不能上网
    eclipse的package, folder, source folder 异同以及相互转化
    向数据库表插入查询的数据
    更换项目jdk版本
    linux安装jdk(非rpm命令)
    主机ping不同虚拟机
    如何实现VoIP中大并发应用
    简单设置几个参数让你的电脑无人可染指(只有你能用)
    aliyun阿里云Maven仓库地址——加速你的maven构建
    nodejs持续学习--必须关注4网站
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11405223.html
Copyright © 2011-2022 走看看