servlet基础

Servlet(Server Applet),是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

生命周期

  1. 客户端请求该 Servlet;
  2. 加载 Servlet 类到内存;
  3. 实例化并调用init()方法初始化该 Servlet;
  4. service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doGet()、doPut()、doTrace()、doDelete()、doOptions());
  5. destroy()。
加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。
Server 创建一个 Servlet的实例
第一个客户端的请求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
一个客户端的请求到达 Server
Server 创建一个请求对象,处理客户端请求
Server 创建一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

工作模式

客户端发送请求至服务器
服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端

与 JSP 比较

SUN 首先发展出 Servlet,其功能比较强劲,体系设计也很先进,只是,它输出 HTML 语句还是采用了老的 CGI 方式,是一句一句输出,所以,编写和修改 HTML 非常不方便。
Java Server Pages(JSP)是一种实现普通静态HTML 和动态 HTML 混合编码的技术,JSP 并没有增加任何本质上不能用 Servlet 实现的功能。但是,在 JSP 中编写静态HTML 更加方便,不必再用 println语 句来输出每一行 HTML 代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行 HTML设计,同时留出供 Servlet 程序员插入动态内容的空间。
后来 SUN 推出了类似于 ASP 的镶嵌型的 JSP,把 JSP TAG 镶嵌到 HTML 语句中,这样,就大大简化和方便了网页的设计和修改。 这是 JSP 和 Servlet 区别的运作原理层面。
从网络三层结构的角度看 JSP 和 Servlet 的区别:一个网络项目最少分三层:data layer(数据层),business layer(业务层),presentation layer(表现层)。当然也可以更复杂。Servlet 用来写 business layer 是很强大的,但是对于写 presentation layer 就很不方便。JSP 则主要是为了方便写 presentation layer 而设计的。当然也可以写 business layer。
根据 SUN 自己的推荐,JSP中应该仅仅存放与 presentation layer 有关的东西,也就是说,只放输出 HTML 网页的部分。而所有的数据计算,数据分析,数据库联结处理,统统是属于 business layer,应该放在 Java BEANS 中。通过 JSP 调用 Java BEANS,实现两层的整合。
综上所述,Servlet 是一个早期的不完善的产品,写 business layer 很好,写 presentation layer 就很臭,并且两层混杂。所以,推出JSP+BEAN,用 JSP 写 presentation layer,用 BEAN 写 business layer。SUN 自己的意思也是将来用 JSP 替代 Servlet。这是技术更新方面 JSP 和 Servlet 的区别。

Servlet的各类用途

1、控制器作用

¡在流行的MVC三层架构中扮演着控制器的作用,控制着页面的跳转,参数的传递和业务逻辑的封装等。

2、WEB过滤作用

¡可以通过在配置文件web.xml中的配置,控制过滤一些内容的显示与否。(servlet过滤器)

3、WEB监听作用

¡Servlet的监听分为两种:一种是环境变量监听(ServletContext)和属性监听(HttpSession)。二者实现的原理都是通过JAVA的事件监听器(EventListener)来实现的。

代码结构

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
public class wuServlet extends HttpServlet { 
  public void doGet(HttpServletRequest request, 
      HttpServletResponse response) 
      throws ServletException, IOException { 
      //可编写使用request读取与请求有关的信息和表单数据的代码 
      //可编写使用response指定HTTP应答状态代码和应答头的代码 
      PrintWriter out = response.getWriter(); 
      //可编写使用out对象向页面中输出信息的代码 
  } 
} 
doGet()和doPost()这两个方法是由service()方法调用的,有时可能需要直接覆盖service()方法,比如Servlet要处理Get和Post两种请求时。
通过Servlet向浏览器中输出文本信息(MyServlet.java):
import java.io.*; 
  import javax.servlet.*; 
  import javax.servlet.http.*; 
  public class MyServlet extends HttpServlet { 
    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) 
        throws ServletException, IOException { 
      response.setContentType("text/html;charset=gb2312"); 
      PrintWriter out = response.getWriter(); 
      out.println("欢迎来到工学1号馆!"); 
    } 
  }

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
  <web-app> 
    <servlet> 
      <servlet-name>MyServlet</servlet-name> 
      <servlet-class>com.MyServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
      <servlet-name>MyServlet</servlet-name> 
      <url-pattern>/textServlet</url-pattern> 
    </servlet-mapping> 
  </web-app> 
原文地址:https://www.cnblogs.com/wuyudong/p/servlet-base.html