Servlet入门

Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类(不用new)

  • 具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
  • Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建,它是 Java 企业版的标准组成部分,Java 企业版是支持大型开发项目的 Java 类库的扩展版本

servlet相关接口和类


servlet接口
    Sun 公司提供了一系列的接口和类用于 Servlet 技术的开发,其中最重要的接口就是 javax.servlet.Servlet
    在 Servlet 接口中定义了 5 个抽象方法:

  • void init(ServletConfig config)接收一个 ServletConfig 类型的参数,Servlet 容器通过该参数向 Servlet 传递初始化配置信息
  • ServletConfig getSendetConfig()//用于获取 Servlet 对象的配置信息,返回 Servlet 的 ServletConfig 对象
  • String getServletInfo()        //返回一个字符串,其中包含关于 Servlet 的信息
  • void service (ServletRequest request,ServletResponse response)
  • void destroy()

针对 Servlet 的接口,Sun 公司提供了两个默认的接口实现类:GenericServlet 和 HttpServlet

  • GenericServlet抽象类

    其中,GenericServlet 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理

  • HttpServlet抽象类

    HttpServlet 是 GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型      提供了具体的操作方法,通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象
    HttpServlet 类中包含两个常用方法:

        protected void doPost(HttpServletRequest req, HttpServletResponse resp)用于处理 POST 类型的 HTTP 请求的方法

        protected void doGet(HttpServletRequest req, HttpServletResponse resp)用于处理 Get 类型的 HTTP 请求的方法

        HttpServlet 主要有两大功能,具体如下:
        1.根据用户请求方式的不同,定义相应的 doXxx() 方法处理用户请求。例如,与 GET 请求方式对应的 doGet() 方法,与                  POST 方式对应的 doPost() 方法。
        2.通过 service() 方法将 HTTP 请求和响应分别强转为 HttpServletRequest 和 HttpServletResponse 类型的对象。
           由于 HttpServlet 类在重写的 service() 方法中,为每一种 HTTP 请求方式都定义了对应的 doXxx() 方法,因此,当定义               的类继承 HttpServlet 后,只需要根据请求方式重写对应的 doXxx() 方法即可,而不需要重写 service() 方法
关于servlet的生命周期(与service类中的三个方法相对应)
1)初始化阶段
当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会解析请求,检查内存中是否已经有了该 Servlet 对象
如果有,则直接使用该 Servlet 对象,如果没有,则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作
(在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次)
2)运行阶段
Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 响应的 ServletResponse 对象,然后将它们作为参数传递给 Servlet 的 service() 方法
service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。
3)销毁阶段
在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源
Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁

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

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

HttpServletRequest 接口
HttpServletRequest 接口继承自 ServletRequest 接口,其主要作用是封装 HTTP 请求消息
由于 HTTP 请求消息分为请求行、请求消息头和请求消息体三部分
因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法

  • 获取请求行信息的相关方法
方法声明功能描述
String getMethod()该方法用于获取 HTTP 请求消息中的请求方式(如 GET、POST 等)
String getRequestURI()该方法用于获取请求行中的资源名称部分即位于 URL 的主机和端门之后、参数部分之前的部分
String getQueryString()该方法用于获取请求行中的参数部分,也就是资源路径后问号(?)以后的所有内容
String getContextPath()该方法用于获取请求 URL 中属于 Web 应用程序的路径,这个路径以 / 开头,表示相对于整个 Web 站点的根目录,路径结尾不含 /。如果请求 URL 属于 Web 站点的根目录,那么返回结果为空字符串("")
String getServletPath()该方法用于获取 Servlet 的名称或 Servlet 所映射的路径
String getRemoteAddr()该方法用于获取请求客户端的 IP 地址,其格式类似于 192.168.0.3
String getRemoteHost()该方法用于获取请求客户端的完整主机名,其格式类似于 pcl.mengma.com。需要注意的是,如果无法解析出客户机的完整主机名,那么该方法将会返回客户端的 IP 地址
int getRemotePort()该方法用于获取请求客户端网络连接的端口号
String getLocaIAddr()该方法用于获取 Web 服务器上接收当前请求网络连接的 IP 地址
String getLocalName()
该方法用于获取 Web 服务器上接收当前网络连接 IP 所对应的主机名
int getLocalPort()该方法用于获取 Web 服务器上接收当前网络连接的端口号
String getServerName()该方法用于获取当前请求所指向的主机名,即 HTTP 请求消息中 Host 头字段所对应的主机名部分
int gctServcrPort()该方法用于获取当前请求所连接的服务器端口号,即 HTTP 请求消息中 Host 头字段所对应的端口号部分
StringBuffcr getRequestURL()该方法用于获取客户端发出请求时的完整 URL,包括协议、服务器名、端口号、 资源路径等信息,但不包括后面的査询参数部分。注意,getRequcstURL() 方法返冋的结果是 StringBuffer 类型,而不是 String 类型,这样更便于对结果进行修改
  • 获取请求消息头的相关方法
方法声明功能描述
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 秒算起的以毫秒为单位的时间值
String getContentType()该方法用于获取 Content-Type 头字段的值,结果为 String 类型
int getContentLength()该方法用于获取 Content-Length 头字段的值,结果为 int 类型
String getCharacterEncoding()该方法用于返回请求消息的实体部分的字符集编码,通常是从 Content-Type 头字段中进行提取,结果为 String 类型
  • 获取请求消息体(表单数据、请求参数)
方法声明功能描述
String getParameter(String name)该方法用于获取某个指定名称的参数值。
如果请求消息中没有包含指定名称的参数,则 getParameter() 方法返回 null。
如果指定名称的参数存在但没有设置值,则返回一个空串。
如果请求消息中包含多个该指定名称的参数,则 getParameter() 方法返回第一个出现的参数值。

String [] getParameterValues (String name)
HTTP 请求消息中可以有多个相同名称的参数(通常由一个包含多个同名的字段元素的 form 表单生成),如果要获得 HTTP 请求消息中的同一个参数名所对应的所有参数值,那么就应该使用 getParameterValues() 方法,该方法用于返回一个 String 类型的数组。
Enumeration getParameterNames()方法用于返回一个包含请求消息中所有参数名的 Enumeration 对象,在此基础上,可以对请求消息中的所有参数进行遍历处理。
Map getParameterMap()getParameterMap() 方法用于将请求消息中的所有参数名和值装入一个 Map 对象中返回。

 

  • 通过 Request 对象传递数据

Request 对象不仅可以获取一系列数据,还可以通过属性传递数据。ServletRequest 接口中定义了一系列操作属性的方法。

1)setAttribute() 方法

该方法用于将一个对象与一个名称关联后存储到 ServletRequest 对象中,其完整语法定义如下:

public void setAttribute(java.lang.String name,java.lang.Object o);

如果 ServletRequest 对象中已经存在指定名称的属性,则 setAttribute() 方法将会先删除原来的属性然后再添加新的属性

如果传递给 setAttribute() 方法的属性值对象为 null,则删除指定名称的属性,这时的效果等同removeAttribute() 方法

2)getAttribute() 方法

该方法用于从 ServletRequest 对象中返回指定名称的属性对象,其完整的语法定义如下:

public java.lang.Object getAttribute(java.lang.String name);

3)removeAttribute() 方法

该方法用于从 ServletRequest 对象中删除指定名称的属性,其完整的语法定义如下:

public void removeAttribute(java.lang.String name);

4)getAttributeNames() 方法

该方法用于返回一个包含 ServletRequest 对象中的所有属性名的 Enumeration 对象

在此基础上,可以对 ServletRequest 对象中的所有属性进行遍历处理。getAttributeNames() 方法的完整语法定义如下:

public java.util.Enumeration getAttributeNames();

需要注意的是,只有属于同一个请求中的数据才可以通过 ServletRequest 对象传递数据

每一个请求都会创建一个新的request对象!!

  • request.getParameter() 和request.getAttribute() 区别
  1. request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据,而request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段
  2. request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据。而request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部
  3. HttpServletRequest类有setAttribute()方法,而没有setParameter()方法

RequestDispatcher接口(实现请求转发、调度)

当一个 Web 资源收到客户端的请求后,如果希望服务器通知另外一个资源处理请求,那么这时可以通过 RequestDispatcher 接口的实例对象实现。ServletRequest 接口中定义了一个获取 RequestDispatcher 对象的方法

RequestDispatcher getRequestDispatcher (String path)返回封装了某条路径所指定资源的 RequestDispatcher 对象。其中,参数 path 必须以“/”开头,用于表示当前 Web 应用的根目录。需要注意的是,WEB-INF 目录中的内容对 RequestDispatcher 对象也是可见的。因此,传递给 getRequestDispatcher(String path) 方法的资源可以是 WEB-INF 目录中的文件

获取到 RequestDispatcher 对象后,则通知其他 Web 资源处理当前的 Servlet 请求,RequestDispatcher 接口定义了两个相关方法

forward(ServletRequest request,ServletResponse response)该方法用于将请求从一个 Servlet 传递给另一个 Web 资源。在 Servlet 中,可以对请求做一个初步处理,然后通过调用这个方法,将请求传递给其他资源进行响应。需要注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出 IllegalStateException 异常
include(ServletRequest request,ServletResponse response)
该方法用于将其他的资源作为当前响应内容包含进来

请求转发详解

在 RequestDispatcher 接口中,forward() 方法可以实现请求转发,include() 方法可以实现请求包含,重点讲解 forward() 方法的使用:
在 Servlet 中,如果当前 Web 资源不想处理请求,则可以通过 forward() 方法将当前请求传递给其他的 Web 资源进行处理,这种方式称为请求转发。请求转发的工作原理如图所示
从图中可以看出,当客户端访问 Servlet1 时,可以通过 forward() 方法将请求转发给其他 Web 资源,其他 Web 资源处理完请求后,直接将响应结果返回到客户端

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestForwardServlet extends HttpServlet {

    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setAttribute("username", "张三");    // 将数据存储到request对象中
        RequestDispatcher dispatcher = request.getRequestDispatcher("/ResultServlet");
        dispatcher.forward(request,response);
    }

    public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
        doGet(request,response);
    }
}

在 RequestForwardServlet 中,通过使用 forward() 方法,将当前 Servlet 的请求转发到 ResultServlet 页面,编写一个名为 ResultServlet 的 Servlet 类,该类用于获取 RequestForwardServlet 类中存储在 request 对象中的数据并输出

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResultServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String username = (String) request.getAttribute("username");
        if (username != null) {
            out.println("用户名:" + username + "<br/>");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

 

关于setAttribute这个方法拓展

在JSP内置对象session和request都有这个方法,这个方法作用就是保存数据,然后还可以用getAttribute方法来取出。
比如现在又个User对象,User curruser = new User("zhangsan", 20, "男");
1,request.setAttribute(“curruser”, curruser)这个方法是将curruser这个对象保存在request作用域中,然后在转发进入的页面就可以获取到你的值,如果你会一些框架的话,那些框架标签也可以获取到,比如struts标签,还有jstl。如果这你都不会的话,那么你可以在jsp页面编写java小脚本来获取:<% User myuser = (User)request.getAttribute("curruser")%>,在jsp页面显示值:<%=myuser.getName()%>。
2,session.setAttribute("curruser", curruser)。这个方法和上面唯一的区别就是作用域,就是在你整个程序启动的时候,如果在session中保存了数据,那么在你这个无论你在哪个页面,在什么时候都可以获取到这个值,全局的,只要你的这个程序是启动的。session默认的过期时间是30分钟,过期无效,可以去修改这个值

地址栏中显示的仍然是 RequestForwardServlet 的请求路径,但是浏览器却显示出了 ResultServlet 中要输出的内容。这是因为发生的请求转发行为是服务器行为,从 RequestForwardServlet 到 ResultServlet 属于一次请求,在一次请求中可以使用 request 属性进行数据共享

HttpServletResponse接口

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值