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 |
获得Servlet在web.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的状态行。该方法用于发送表示错误信息的状态码。
建议该方法仅发送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响应头字段的值 无需手动设置,由服务器自行设置 |
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) |