Servlet


  1. Web服务器也称为WWWWORLDWIDE WEB)服务器,主要功能是提供网上信息浏览服务。严格意义上Web服务器只负责处理HTTP,只能发送静态页面的内容,而JSP,ASP,PHP等动态内容需要通过CGIFastCGIISAPI等接口交给其他程序去处理,这个其他程序就是应用服务器。比如Web服务器包括NginxApacheIIS等。而应用服务器包括WebLogicJBoss等。应用服务器一般也支持HTTP协议,因此界限没这么清晰。但是应用服务器的HTTP协议部分仅仅是支持,一般不会做特别优化,所以很少有见Tomcat直接暴露给外面,而是和NginxApache等配合,只让Tomcat处理JSPServlet部分;从事web开发的人,会很清楚一个东西叫HTTP服务器,比如JEE开发—TomcatJetty.NET开发—ISS等。HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏览器进行信息交流。HTTP服务器是Web服务器的一种,也是开发最常见的,自然还有其他方式进行信息交互,比如FTP文件服务器Servlet 是运行在Web服务器的Java小程序。Servlet可以获取并针对Web客户端的请求作出响应。一般情况下,通过HTTP,即超文本传输协议,进行传输通信

Web服务器是可以向发出请求的浏览器提供文档的程序。其核心过程为

    连接过程 — 请求过程 — 应答过程 — 关闭连接

 

  1. Servlet是一些遵从Java ServletAPIJava类,这些Java类可以响应请求,可以响应任意类型的请求,最广泛的是响应web方面的请求。Servlet必须部署在Java servlet容器才能使用。虽然很多开发者都使用Java Server PagesJSPJava ServerFacesJSFServlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet。也就是说,了解Java Servlet技术的基础知识对任何Java web开发者来说是很有用的。全称JavaServlet,是用Java编写的服务器端程序,其主要功能在于交互式浏览和修改数据,生成动态Web内容。

  2. Servlet做的事情

  1. MyFirstServlet类继承了HttpServlet。这个继承是必须的,因为所有的Servlet必须是要么继承了 javax.servlet.GenericServlet 的普通Servlet,要么是继承了 javax.servlet.http.HttpServlet HTTP Servlet

  2. 重写了doGet()doPost()方法。这两个方法都已在HttpServlet 类里定义了。当一个GETPOST请求到来时,它就会被映射到相应的方法里。例如,如果你向这个servlet发送一个HTTP GET请求,doGet()方法就会被调用。

  3. 还有一些其他有用的方法,你可以重写它们来在运行时控制应用。例如getServletInfo()

  4. HttpServletRequestHttpServletResponse是所有doXXX()方法的默认参数。

  1. Servlet生命周期

    应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件。这些事件叫做Servlet的生命周期事件(或方法)。三个核心方法分别是init(),service()destroy()。每个Servlet都会实现这些方法,并且在特定的时间调用它们。Init方法:初始化Servlet,该方法只有在第一次访问Servlet的时候被调用一次;destroy方法:销毁Servlet;service方法:访问该Servlet所要处理的业务逻辑,req:从客户端获取的数据,res:向客户端返回的数据。

  1. Servlet生命周期的初始化阶段,web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig接口的对象给它。这个配置对象(configuration object)使Servlet能够读取在web应用的web.xml文件里定义的名值(name-value)初始参数。这个方法在Servlet实例的生命周期里只调用一次

  2. 初始化后,Servlet实例就可以处理客户端请求了。web容器调用Servletservice()方法来处理每一个请求service()方法定义了能够处理的请求类型并且调用适当方法来处理这些请求。编写Servlet的开发者必须为这些方法提供实现。如果发出一个Servlet没实现的请求,那么父类的方法就会被调用并且通常会给请求方(requester)返回一个错误信息。

通常,我们不需要重写(override)这个方法。

  1. 最后,Web容器调用destroy()方法来终结Servlet。如果你想在Servlet的生命周期内关闭或者销毁一些系统或者网络资源,你可以调用这个方法来实现。destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。

  1. 如果你不喜欢使用xml配置而喜欢注解的话,没关系,Servlets API同样提供了一些注解接口给你。你可以像下面的例子一样使用 @WebServlet 注解并且不需要在web.xml里为Servlet注册任何信息。容器会自动注册你的Servlet到运行环境,并且像往常一样处理它。

     

  2. 打包和部署ServletTomcat服务器
    如果你在使用IDE(例如eclipse),那么打包和部署你的应用只需要一简单的步骤。右击项目> RunAs > Run As Server。如果还没配置服务器先配置好服务器,然后就可以准备开干了。如果你没在使用IDE,那么你需要做一些额外的工作。比如,使用命令提示符编译应用,使用ANT去生成war文件等等。但我相信,现在的开发者都在使用IDE来开发。所以我就不在这方面浪费时间了。

  3. 动态的Servlet响应内容

Java Servlets如此有用的原因之一是Servlet能动态显示网页内容。这些内容可以从服务器本身、另外一个网站、或者许多其他网络可以访问的资源里获取。Servlet不是静态网页,它们是动态的。可以说这是它们最大的优势。

  1. 处理Servlet请求和响应

  1. 序列化和反序列化

把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。

  1. 两种用途:(一)把对象的字节序列地保存到硬盘上,通常存放在一个文件中;(二)在网络上传送对象的字节序列。

2)JDK类库中的序列化API

a.对象序列化包括如下步骤

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject()方法写对象。

b.对象反序列化的步骤如下:

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象。

3) serialVersionUID的作用

serialVersionUID: ,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量

4)serialVersionUID的取值

为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。

显式地定义serialVersionUID有两种用途:

1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID

2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID

Servlet可以轻松创建一个基于请求和响应生命周期的web应用。它们能够提供HTTP响应并且可以使用同一段代码来处理业务逻辑。处理业务逻辑的能力使Servlet比标准的HTML代码更强大。

现实世界里的应用,一个HTML网页表单包含了要发送给Servlet的参数。Servlet会以某种方式来处理这些参数并且 返回一个客户端能够识别的响应。在对象是HttpServlet的情况下,客户端是web浏览器,响应是web页面。<form> action属性指定了使用哪个Servlet来处理表单里的参数值。

为了获取请求参数,需要调用 HttpServletRequest 对象的 getParameter() 方法,并且传递你要获取的输入参数的id给该方法。

(9) 监听Servlet容器事件

有时候,知道应用服务器容器(the application server container)里某些事件发生的时间是很有用的。这个概念适用于很多情况,但它通常用在开启应用时初始化应用或者关闭应用时清理应用。可以在应用里注册一个监听器(listener)来显示应用什么时候开启或者关闭。因此,通过监听这些事件,Servlet可以在一些事件发生时执行相应的动作。

为了创建一个基于容器事件执行动作的监听器,你必须创建一个实现 ServletContextListener 接口的类。这个类必须实现的方法有 contextInitialized() contextDestroyed()。这两个方法都需要 ServletContextEvent 作为参数,并且在每次初始化或者关闭Servlet容器时都会被自动调用。

为了在容器注册监听器,你可以使用下面其中一个方法:

  1. 利用 @WebListener 注解。
    2)
    web.xml应用部署文件里注册监听器。
    3)
    使用 ServletContext 里定义的addListener() 方法

请注意,ServletContextListener不是Servlet API里唯一的监听器。这里还有一些其他的监听器,比如. 根据你要监听的事件选择他们来实现你的监听器类。比如,每当创建或销毁一个用户session时,HttpSessionListener 就会发出通知。

(10)传递Servlet初始化参数

现在的大多数应用都需要设置一些在应用/控制器(controller)启动时可以传递的配置参数(configuration parameters)。Servlet同样可以接受初始化参数,并在处理第一个请求前来使用它们来构建配置参数。显然,你也可以在Servlet里硬编码配置值。但是这样做的话,在Servlet发生改动时你需要再次重新编译整个应用。没有人喜欢这样做。设置后,你就可以在代码里调用 getServletConfig.getInitializationParameter() 并传递参数名给该方法来使用参数。就像下面展示的代码一样

11)为特定的URL请求添加Servlet过滤器

12)使用Servlet下载二进制文件

\

13)使用RequestDispatcher.forward()转发请求到另一个Servlet

(14)使用HttpServletResponse.sendRedirect()重定向请求到另一个Servlet

(15)使用Servlet读写Cookie

为了创建cookie,需要实例化一个新的javax.servlet.http.Cookie 对象并且为它分配名称和值。实例化cookie后,可以设置属性来配置cookie。在这个例子里,我们使用 setMaxAge() setHttpOnly() 方法来设置cookie的生命周期和防范客户端脚本。


 



二.解析

当我们在地址栏中访问http://127.0.0.1:8080/MyServletWeb/Hello的时候tomcat服务器首先会查找在其WebApp目录中的MyServletWeb文件夹,找到后访问其WEB-INF/web.xml文件,查找<utl-pattern>等于/Hello的节点(因为我要访问的是.../MyServlet/Hello),然后根据其对应的<servlet-name>节点的值(本例为Hello)找到相应的<servlet-class>(本例为com.servlet.action.HelloServlet),并执行其service方法。

三、Tomcat包含了核心服务模块:Connector连接模块  Container 容器。Tomcat Server 核心是一个 Servlet/JSP Container。对每一个HTTP请求。连接过程请求过程应答过程关闭连接

四、分析源码

@WebServlet(urlPatterns = "/helloWorld.html")

@WebServlet 注解用于声明一个HttpServlet的配置。其中,urlPatters = “/helloWorld.html”urlPatterns复数形式,说明至少一个URL必须被申明。它和另一个value必须存在一个,但不能同时存在。如果要匹配多个URL路径的话,如下:

?

1

@WebServlet(urlPatterns = { "/helloWorld01.html", "/helloWorld02.html" }

下面有个@Override,重写了父类HttpServletdoGet方法。我们先看看父类HttpServletHttpServlet是一个抽象类,它提供了以下方法:

— doGet  服务于 HTPP GET 请求

— doPost 服务于 HTTP POST 请求

— doPut  服务于 HTTP PUT 请求

— doDelete,服务于 HTTP DELETE 请求

print,这里还好一句话。如果打印个table会很麻烦,因此有一个JSP的东西出现了,是ServletHTML化身。

五、深入Servlet具体过程



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值