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)

原文地址:https://www.cnblogs.com/xfdhh/p/11405223.html