什么是Servlet基础
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。servlet的实质就是java代码,通过java的API动态的向客户端输出内容。
注:如果想了详细的了解JavaEE技术规范,可以参考JavaEE官方文档:JavaEE8官方文档
servlet规范:包含三个技术点
- servlet技术
- filter技术——过滤器
- listener——监听器
Servlet的架构
下图显示了 Servlet 在 Web 应用程序中的位置。
Servlet任务
Servlt执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
Servlet的基本使用
-
使用Idea直接创建一个Servlet
Servlet创建成功后向doPost()方法中添加如下语句,用于向客户端浏览器输出字符串“hello”
-
将开发好的Servlet部署到Web容器中
在Servlet3.0之前的版本中要将Servlet部署到Web容器中需要在项目的部署描述符web.xml中对Servlet进行注册并进行映射配置,这样做的缺点是如果一个Web应用中如果有多个Servlet那么Web.xml部署描述文件会非常乱。所以在Servlet3.0以后的版本中要配置Servlet只需要使用@WebServlet注解进行配置就可以了。
这个注解中常用的有两个属性 :
-
name属性:相当于web.xml的(servlet-name)
-
urlPattenrns属性:编写访问servlet的路径类似于 (url-pattern)
所以我们需要手动在“@WebServlet”注解中添加URLPatterns属性用来映射路径。
@WebServlet(name = "Servletd", value = "/Servletd") public class Servletd extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("hello");} }
这样一个最简单的Servet就创建和配置完成了。此时启动Tomcat输入此Servlet的映射路径进行访问就可以了。在浏览器中输入“http://localhost:8080/项目的成品包名/Servletd”即可以访问该Servlet了。
-
Servlet的生命周期
Servlet 生命周期可被定义为一个Servlet从被请求、加载、实例化(创建)、初始化直到毁灭的整个过程。以下是 Servlet 遵循的整个过程:
- 客户端请求该Servlet,加载Sevlet类到内存;
- Servlet容器实例化、初始化该Servlet;
- Servlet 通过调用 init () 方法进行初始化;
- Servlet 调用 service() 方法来处理客户端的请求,service方法再根据请求方式分别调用doGet或doPost()方法;
- Servlet 通过调用 destroy() 方法终止(结束);
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
生命周期方法
-
init()方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init 方法的定义如下:
public void init() throws ServletException {// 初始化代码... }
-
service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{}
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
-
doGet()方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {// Servlet 代码 }
-
doPost()方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//Servlet 代码 }
-
destroy()方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示
public void destroy() {// 终止化代码... }
Servlet生命周期架构图
第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。Servlet 容器在调用 service() 方法之前加载 Servlet。然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例(指同一个servlet的实例)的 service() 方法。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
验证实例
@WebServlet(name = "Servletd", value = "/Servletd")
public class Servletd extends HttpServlet {@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {System.out.println("service");super.service(req, res);}@Overridepublic void destroy() {System.out.println("destroy");super.destroy();}@Overridepublic void init() throws ServletException {System.out.println("init");super.init();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doGet");doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doPost");response.getWriter().write("hello");}
}
/*
init
service
doGet
doPost
……………………………………………………………………………………………………………………………………………………………………
service
doGet
doPost*/
Servlet API中主要接口及实现类
与Servlet实现相关的接口及实现类
-
Servlet接口:该接口定义了如下5个方法
- init()
- service()
- destroy()
- getServletConfig()
- getServletInfo()
如果我们要通过实现Servlet接口来编写Servlet类,需要实现Servlet接口中定义的5个方法,这样编写比较麻烦,于是有了GenericServlet抽象类。
-
GenericServlet抽象类
该类定义了一个通用的、不依赖于具体协议的Servlet,他实现了Servlet接口和ServletConfig接口。由于该类给出了除了service()方法的其他4个方法的简单实现。所以,通过继承GenericServlet来编写Servlet类,只需要实现service()方法即可。
-
HttpServlet抽象类
大多数的网络应用中,都是客户端通过HTTP协议去访问服务器端的资源,而我们所编写的Servlet也主要用于HTTP协议的请求和响应。为了快速开发应用于HTTP协议的Servlet类,Sun公司在javax.servlet.http包中给我们提供了一个抽象的类HttpServlet,它继承自GenericServlet类,用于创建适合Web站点的HTTP Servlet。
另外,针对HTTP1.1中定义的7种请求方法GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS,HttpServlet分别提供了7个处理方法:doGet(),doPost(),doHead(),doPut(),doDelete(),doTrace(),doOptions()
当容器接收到一个针对HttpServlet对象的请求时,调用该对象中的方法的顺序如下:
-
调用公共(public) service()方法。
-
在公共的 service() 方法中,首先将参数类型转换为HttpServletRequest和HttpServletResponse,然后调用保护的(protected) service()方法,将转换后的HttpServletRequest对象和HttpServletResponse对象作为参数传递进去。
-
在保护的service()方法中,首先调用HttpServletRequest对象的getMethod()方法,获取HTTP请求方法的名字,然后跟去请求方法的类型,调用相应的doXxx()方法。
因此我们在编写HttpServlet派生类的时候,一般不需要去覆盖service()方法,而只需要重写相应的doXxx()方法即可。
-
与请求和响应相关的接口(ServletRequest、ServletResponse、HTTPServletRequest、HttpServletResponse)
Servlet由Servlet容器管理,当用户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象被容器作为service()方法的参数传递给Servlet,Servlet利用ServletRequest对象获取客户端发送来的请求数据,利用ServletResponse对象发送响应数据。
对于HttpServletRequest对象和HttpServletResponse对象分别继承与ServletRequest对象和ServletResponse对象,并且在原有方法基础上新增一些方法。但都是用作封装请求数据和响应数据。
与Servlet配置相关的接口(ServletConfig接口)
Servlet容器使用ServletConfig对象在Servlet初始化期间向它传递配置信息,一个Servlet只有一个ServletConfig对象。在ServletConfig接口中,只定义了4个方法:
-
getInitParameter()
-
getInitParameterNames()
-
getServletContext()
-
getServletName()
Servlet上下文(ServletContext接口)
运行在Java虚拟机中的每一个Web应用程序都有一个与之相关的Servlet上下文。Java Servlet API提供了一个ServletContext接口用来表示上下文。在这个接口中定义了一组方法,Servlet可以使用这些方法与它的Servlet容器进行通信。例如,得到文件的MIME类型,转发请求,或者向日志文件中写入日志信息。
Servlet容器在Web应用程序加载时创建ServletContext对象,作为Web应用程序的运行时表示,ServletContext对象可以被应用程序中所有的Servlet所访问。
得到ServletContext对象的方法:
-
通过ServletConfig对象的getServletContext()方法得到。
-
GenericServlet类的getServletContext()方法得到(其实质也是调用ServletConfig对象的getServletContext()方法得到的)。
请求转发(RequestDispatcher接口)
实现请求转发是通过RequestDispatcher接口实现的,得到RequestDispatcher对象的方法:
-
利用ServletRequest接口中的RequestDispatcher()方法
-
利用ServletContext接口中的getNamedDispatcher()方法
-
利用ServletContext接口中的getRequestDispatcher()方法
请求转发的两种方法:
-
forward()
-
include()
两者区别在于,利用include()方法将请求转发给其他的Servlet,被调用的Servlet对该请求作出的响应将并入原先的响应对象中,原先的Servlet还可以继续输出响应信息。而利用forward()方法将请求转发给其他的Servlet,将由被调用的Servlet负责对请求作出响应,而原先Servlet的执行则终止。
另外还可以通过HttpServletResponse接口的sendRedirect()方法利用另外的资源来为客户端进行服务。
sendRedirect()不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。
Servlet的部署(注册与映射)
-
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用
元素和 元素完成。 -
元素用于注册Servlet,它包含有两个主要的子元素: 和 ,分别用于设置Servlet的注册名称和Servlet的完整类名。 -
一个
元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素: 和 ,分别用于指定Servlet的注册名称和Servlet的对外访问路径URL。例如: 同一个Servlet可以被映射到多个URL上,即多个
元素的 子元素的设置值可以是同一个Servlet的注册名。而 子元素的值可以有不同的多个。 -
子元素的配置方式可以有以下三种: -
完全匹配:访问的资源与配置的资源完全相同才能访问到
-
路径匹配:格式:/虚拟的目录名/* (代表任意)
-
扩展名匹配:格式:*.扩展名
元素指定对应于Servlet的URL路 径,该路径是相对于Web应用程序上下文根的路径。 Servlet 2.5规范允许
的 子元素出现多次,之前的规范只允许一 个 元素包含一个 子元素。 例如:
helloworld /hello /hello 在配置了Servlet与URL样式之间的映射后,当Servlet容器接收到一个请求,它首先确定该请求应该由哪一个Web应用程序来响应。
这是通过比较请求URL的开始部分与Web应用程序的上下文路径来确定的。
映射到Servlet的路径是请求URL减去上下文的路径,Web应用程序的Context对象在去掉请求URL的上下文路径后,将按照下面的路径映射规则的顺序对剩余部分的路径进行处理,并且在找到第一个成功的匹配后,不再进行下一个匹配。
1、容器试着对请求的路径和Servlet映射的路径进行精确匹配,如果匹配成功,则调用这个Servlet来处理请求。
2、容器试着匹配最长的路径前缀,以斜杠(/)为路径分隔符,按照路径树逐级递减匹配,选择最长匹配的Servlet来处理请求。
3、如果请求的URL路径最后有扩展名,如.jsp,Servlet容器会试着匹配处理这个扩展名的Servlet。
如果按照前面3条规则没有找到匹配的Servlet,容器会调用Web应用程序默认的Servlet来对请求进行处理,如果没有定义默认的Servlet,容器将向客户端发送HTTP 404错误信息(请求资源不存在)。
在部署描述符中,可以使用下面的语法来定义映射。
路径匹配:以/开始并且以 /* 结束的字符串用来映射路径,例如:
/admin/* 扩展名匹配:**以 *. 为前缀的字符串用来映射扩展名,例如:如果没有精确匹配,那么对/admin/路径下的资源的所有请求将由映射了上述URL样式的Servlet来处理。
*.do 以一个单独的/指示这个Web应用程序默认的Servlet,例如:如果没有精确匹配和路径匹配,那么对具有.do扩展名的资源的请求将由映射了上述URL样式的Servlet来处理。
/ 所有其他的字符被用于精确匹配,例如:如果对某个请求没有找到匹配的Servlet,那么将使用Web应用程序的默认Servlet来处理。
-
缺省Servlet与启动时加载配置
-
启动时加载
如果在
元素中配置了一个 元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法. load-on-startup的取值问题:
- 非负的整型:优先级按照 优先初始化 0 级别,数字越大初始化越靠后,也就是数字小的优先初始化
- 异常值:优先级 取值异常时,Tomcat 不会赋值 0,而是报启动异常,不能正常初始化 Servlet。
这种情况也不能正常启动Tomcat
在Tomcat全局配置文件"tomcat主目录\conf\web.xml"中有如下配置信息,以下配置信息说明在全局配置文件中配置了org.apache.catalina.servlets.DefaultServlet为缺省Servlet,并且该Servlet在Servlet容器启动时就自动加载。
-
缺省Servlet:
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
凡是在web.xml文件中找不到匹配的
元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问一个缺省Servlet。
ServletConfig与ServletContext
ServletConfig对象
-
ServletConfig接口的定义
public interface ServletConfig
这个接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet并且允许Servlet获得一个有关它的ServletContext接口的说明。每一个ServletConfig对象对应着一个唯一的Servlet
-
ServletConfig接口中的方法:
public String getInitParameter(String name):这个方法返回一个包含Servlet指定的初始化参数的String。如果这个参数不存在,返加空值。
public Enumeration getInitParameterNames():这个方法返回一个列表String对象,该对象包括Servlet的所有初始化参数名。如果Servlet没有初始化参数,getInitParameterNames返回一个空的列表。
public ServletContext getServletContext():返回这个Servlet的ServletContext对象。
-
ServletConfig对象的创建:
在Servlet 4.0中,可以使用一个或者多个@WebServlet注解的“initParams”属性或者web项目配置文件web.xml中的
标签为servlet配置一些初始化参数。 当servlet配置了初始化参数之后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init(ServletConfig servletConfig)方法时,将ServletConfig对象作为参数传递给Servlet。
进而,程序员通过Servlet对象得到当前servlet的初始化参数信息。
-
获取初始化信息的方法及步骤:
- 创建私有成员变量:private ServletConfig servletConfig;
- 重写init方法,从而获取ServletConfig对象;
@Override public void init(ServletConfig config) throws ServletException {servletConfig = config; }
-
获取某个特定的初始化参数:
使用ServletConfig接口实现类的getInitParameter(String name)方法获取
标签或@WebInitParam注解中的配置信息; -
获取配置文档中所有初始化参数
Enumeration e = servletConfig.getInitParameterNames();while(e.hasMoreElements()){ String name = (String) e.nextElement(); String value = this.config.getInitParameter(name);System.out.println(name+"="+value); }
ServletContext对象
ServletContext类似字节码文件对象,在web创建的时候就自动生成了,并且是唯一的,跟随着项目和服务器共存亡了。通过这个对象,我们可以向里面存数据(键值对),也可以通过别的Servlet来获取这个数据;也可以根据相对(服务器)路径继来获取绝对路径。根据这个信息我们可以在以后创建文件的过程中,将静态资源的文件尽量创建在web-content文件夹下,而项目文件、配置文件创建在src下。不要直接创建在web文件夹下(不会在服务器上生成)。
-
ServletContext对象:
ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装的是该web应用的信息,ServletContext对象一个web应用只有一个。
-
ServletContext对象的生命周期:
创建:该web应用被加载且服务器开启时创建;
销毁:web应用被卸载(移除该项目应用)或者服务器关闭。
-
获得ServletContext对象:
(1)、Servlet的init方法中获得ServletConfig对象“config”,通过此ServletConfig对象的getServletContext()方法返回ServletContext对象。
ServletContext servletContext = config.getServletContext ()
(2)、ServletContext servletContext = this.getServletContext ()
(3)、ServletContext servletContext = request.getServletContext()
-
ServletContext的作用:
(1)、可以在多个servlet之间共享数据
存放:setAttribute()
获得:getAttribute()
删除:removeAttribute()
(2)、获得web应用全局的初始化参数;
在web.xml可以给整个web项目配置初始化参数
(3)、获得web应用中任何资源的绝对路径:
在实际开发中,有时候可能会需要读取Web应用中的一些资源文件,比如配置文件,图片等。为此,在ServletContext接口中定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件名相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径等。
方法说明 | 功能描述 |
---|---|
Set getResourcePaths(String path) | 返回一个 Set 集合,集合中包含资源目录中子目录和文件的路径名称。参数 path 必须以正斜线 (/) 开始,指定匹配资源的部分路径 |
String getRealPath(String path) | 返回资源文件在服务器文件系统上的真实路径 (文件的绝对路径)。参数 path 代表资源文件的虚拟路径,它应该以正斜线开始 (/) 开始,“/” 表示当前 Web 应用的根目录,如果 Servlet 容器不能将虚拟路径转换为文件系统的真实路径,则返回 null |
URL getResource(String path) | 返回映射到某个资源文件的 URL 对象。参数 path 必须以正斜线 (/) 开始,“/” 表示当前 Web 应用的根目录 |
InputStream getResourceAsStream(String path) | 返回映射到某个资源文件的 InputStream 输入流对象。参数 path 传递规则和 getResource () 方法完全一致 |
request和response
HTTP协议
客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
Http请求
HTTP请求包括的内容:一个HTTP响应代表服务器向客户端回送的数据,它包括一个请求行、若干消息头、一个空行以及实体内容,
如下图所示:
其中:
- Accept:浏览器可接受的MIME类型;
- Accept-Language:为浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;详情请参考语言文化代码与国家地区之间的对应关系。
- Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
- Host:初始URL中的主机和端口;
- Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
- User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;
- Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;
HTTP响应
HTTP响应包括的内容:一个HTTP响应代表服务器向客户端回送的数据,它包括一个状态行、若干消息头、一个空行以及实体内容。
其中:
- Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
- Content-Type: 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentTyep。 可在web.xml文件中配置扩展名和MIME类型的对应关系;
- Date:当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦;
- Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。
HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求行、请求头中以及请求的数据体中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
生命周期:
诞生:客户端浏览器每次发出请求,都会创建一个响应对象。
销毁:服务方法执行完毕就会销毁
主要作用:
- 获取客户端信息
- 获取客户机请求头
- 获得客户机请求参数
- 请求转发
- 作为域对象存储数据
常用方法:
-
获取客户端信息
方法说明 功能描述 getRequestURL() 返回客户端发出请求时的完整 URL。 getRequestURI() 返回请求行中的参数部分。 getQueryString() 返回发出请求的客户机的 IP 地址。 getRemoteHost() 返回发出请求的客户机的完整主机名。 getRemoteAddr() 返回发出请求的客户机的 IP 地址。 getPathInfo() 返回请求 URL 中的额外路径信息。额外路径信息是请求 URL 中的位于 Servlet 的路径之后和查询参数之前的内容,它以 “/” 开头。 getRemotePort() 返回客户机所使用的网络端口号。 getLocalAddr() 返回 WEB 服务器的 IP 地址。 getLocalName() 返回 WEB 服务器的主机名。 -
获取客户机请求头
方法 描述 getHeader(string name) 以 String 的形式返回指定请求头的值。若请求不含指定名称的头,返回 null;若有多个相同名称的头,返回第一个头。头名称不区分大小写,可与任何请求头一起使用 getHeaders(String name) 以 String 对象的 Enumeration 的形式返回指定请求头的所有值 getHeaderNames() 返回此请求包含的所有头名称的枚举。若请求没有头,则返回一个空枚举 -
获取客户机请求参数:
可以使用HttpServletRequest获取客户端的请求参数,相关方法如下:
String getParameter(String name):通过指定名称获取参数值;
String[] getParameterValues(String name):通过指定名称获取参数值数组,有可能一个名字对应多个值,例如表单中的多个复选框使用相同的name时;
Enumeration getParameterNames():获取所有参数的名字;
Map getParameterMap():获取所有参数对应的Map,其中key为参数名,value为参数值。
-
请求转发:
指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
- 通过ServletContext的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。使用请求转发可以将请求转发至客户端无法访问到的“WEB-INF”目录下的资源位置处。
- 通过request对象提供的getRequestDispatcher(String path)方法,也可以返回一个RequestDispatcher对象,调用这个对象的forward方法同样可以实现请求转发。
-
作为域对象存储数据
request对象同时也是一个域对象(Map容器),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
request对象作为一个域对象(Map容器)使用时,主要是通过以下的四个方法来操作:
setAttribute(String name,Object o)方法,将数据作为request对象的一个属性存放到request对象中,
getAttribute(String name)方法,获取request对象的name属性的属性值,
removeAttribute(String name)方法,移除request对象的name属性,)
getAttributeNames()方法,获取request对象的所有属性名,返回的是一个,
HttpServletResponse
HttpServletResponse是一个实现了ServletResponse的接口的类的实例对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。
-
向客户端输出中文数据(中文字符乱码)
-
文件下载:
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
格式说明: content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )
字段说明:
Content-Disposition:为属性名disposition-type是以什么方式下载,如attachment为以附件方式下载disposition-parm:为默认保存时的文件名服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:复制代码 代码如下:
response.addHeader("Content-Disposition","attachment;filename=FileName.txt");
备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。
那么由上可知具体的例子: Content-Disposition: attachment; filename="filename.xls"当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。
当你在响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个"文件下载"的对话框,接下来就是由你来决定"打开"还是"保存" 了。
-
自动刷新页面:
HttpServletResponse接口中定义了setHeader方法
-
网页重定向:
使用response对象的sendRedirect()方法可以实现客户端重定向。向浏览器发送一个特殊的Header,然后由浏览器来做重定向,转到指定的页面。