Servlet——了解Java Servlet技术
什么是Servlet
Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet必须部署在Java servlet容器才能使用
Servlet框架
很多开发者都使用Java Server Pages(JSP)和Java Server Faces(JSF)等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet
先有Servlet然后才有Jsp
Servlet是服务器上的一段小程序,一个servlet就是一个Java类,可以通过“请求——响应”编程方式访问驻在这个服务器上的servlet程序
编写动态的Servlet响应内容
Java Servlets如此有用的原因之一是Servlet能动态显示网页内容。这些内容可以从服务器本身、另外一个网站、或者许多其他网络可以访问的资源里获取。Servlet不是静态网页,它们是动态的。可以说这是它们最大的优势。
Tomcat容器等级
Tomcat分为四个容器等级,Servlet的容器管理Context容器,一个context对应一个web工程
Tomcat -> container -> enginer -> Host -> context -> wrapper
他们之间是层层包裹下去的
Servlet编写
继承关系图:
* Servlet(三个方法 init、service、destroy) interface
* genericServlet (与协议无关的servlet) abs class
* httpServlet 实现了http协议的servlet abs class
* 自定义servlet 重写doGet doPost
编写步骤
- 继承HttpServlet
- 重写doGet doPost
- web.xml注册servlet
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name> //和上面的name一样对应
<url-pattern>/</url-pattern> //一个斜杠/代表的是当前web站点的根目录,这里配置对应的访问url
</servlet-mapping>
servlet执行顺序
发出一个url请求后
在web.xml找到与之对应的url地址<url-pattern>/</url-pattern>
找到对应的name<servlet-name></servlet-name>
最后找到class来处理
找到处理类,根据提交方式get post执行doXXX
生命周期
当servlet被部署到应用服务器中后,由服务器控制Servlet的生命周期。Servlet生命周期包含四个阶段:加载和实例化–>初始化–>请求处理(服务)–>终止服务(销毁)。
初始化前判断是否存在servlet实例,如果不存在,进行构造方法生成实例,生成servlet实例,如果存在进入2阶段执行service
1. 初始化阶段——调用init() 方法
2. 响应客户端请求阶段——调用service方法,service根据请求方式决定执行doXXX
3. 销毁阶段——调用destroy方法,服务器停止或者结束服务的时候
生命周期的详细过程
Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy()。每个Servlet都会实现这些方法,并且在特定的运行时间调用它们。
加载和实例化
一般情况下,Servlet只会在第一次请求到达后,才会被加载和实例化。除非特别配置了启动时加载(配置了load-on-startup),Servlet才会在应用启动时加载和实例化。在Servlet加载和实例化之前,有两个类先实例化:
* ServletContext(Servlet上下文)——全局变量
* Filter(过滤器)——filter chain
在Servlet生命周期的初始化阶段
- 时机:一般情况下,Servlet只会在第一次请求到达后,才会被初始化。
- web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig 接口的对象给它。这个配置对象(configuration object)使Servlet能够读取在web应用的web.xml文件里定义的名值(name-value)初始参数。这个方法在Servlet实例的生命周期里只调用一次。
初始化后,Servlet实例就可以处理客户端请求了
- 处理方法在service方法中根据HTTP请求的Method分派到相应的doGet、doPost等方法
web容器调用Servlet的service()方法来处理每一个请求。service() 方法定义了能够处理的请求类型并且调用适当方法来处理这些请求。编写Servlet的开发者必须为这些方法提供实现,
如果发出一个Servlet没实现的请求,那么父类的方法就会被调用并且通常会给请求方(requester)返回一个错误信息。
通常我们不重写service - 会话管理
会话管理也是类似的方式:
方法a,是协议本身支持状态,让协议去记住每一个会话,但显然http不可能是这么强大。
方法b,是让客户端保持状态。
方法c,则是在服务端保持状态.
- 使用cookie,即让客户端保持状态。
Cookie是指网站为了辨别用户身份而储存在用户本地终端的数据。整个流程携带信息请求。
使用cookie操作方便,使用简单。但缺点也是很明显的:数据保存在客户端,必须要对数据进行加密/签名;cookie大小有限制,对复杂数据是不够的。 - session机制,即在服务端保持状态。
当一个请求到达时,服务器先检查请求中是否包含了一个Session标识——称为SessionId。
如果已包含SessionId,服务器就根据该SessionId将对应的Session检索出来。
如果不包含SessionId,则为此客户端创建一个Session并且生成一个与该Session关联的SessionId。
保存SessionId的方式可以采用Cookie 也可以采用URL重写
一次请求的过程:
将前面所说的内容串一下吧:当一个Servlet请求到达时,服务器会根据Filter的配置,为Servlet生成一条对应的Filter链。Filter链按顺序(配置中出现的顺序)执行,
所有Filter执行完成后,执行Servlet的service方法。(不一定执行完全部filter,可能filter里面嵌套了 service的方法)
Filter执行过程中,可以获取到请求、响应的实例,修改请求、响应的数据;也可以在Filter里做会话管理,判断客户端状态。
而在Servlet中,service方法处理业务逻辑、通过ServletContext获取资源、设置共享属性,并生成显示内容。 - 使用cookie,即让客户端保持状态。
最后,web容器调用destroy()方法来终结Servlet
如果你想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,你可以调用这个方法来实现。destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。Tomcat容器装载servlet时刻
- web.xml配置——启动时自动装在servlet实例
<servlet>
<loadon-startup>1<loadon-startup> //数字代表优先级,数字越小优先级越高
</servlet>
- 第一次request请求
- servlet 类被修改更新
创建的servlet实例保存在内存中,init只被调用一次
关于servlet的用法
servlet和jsp的九大内置对象
- out —–> response.getwriter()
- request —–> service(request)
- response —–> service(response)
- session ——> request.getsession()
- application ——> getServletContext()
- exception —–> Throwable
- Page —–> this
- PageContext —–> PageContext
- Config —–> getServletConfig
servlet获取表单数据
获取多个复选按钮的值
requeset.getParamaterValues(“”)
servlet 的路径问题
url 超链接:
相对路径 第一斜线“/”表示的是根目录
绝对路径 request.getContextPath项目根目录
<url-pattern>
中斜线开头 表示项目的根目录
@WebServlet注解来开发Servlet
使用 @WebServlet 注解并且不需要在web.xml里为Servlet注册任何信息。容器会自动注册你的Servlet到运行环境,并且像往常一样处理它。
@WebServlet(name = "MyFirstServlet", urlPatterns = {"/MyFirstServlet"})
public class MyFirstServlet extends HttpServlet {}
处理Servlet请求和响应
为了获取请求参数,需要调用 HttpServletRequest 对象的 getParameter() 方法,并且传递你要获取的输入参数的id给该方法。
使用 HttpServletResponse 对象给客户端发送响应。
传递Servlet初始化参数
可以在代码里调用 getServletConfig.getInitializationParameter() 并传递参数名给该方法来使用参数
String value = getServletConfig().getInitParameter(“name”);
为特定的URL请求添加Servlet过滤器
过滤器必须要实现 javax.servlet.Filter 接口。
这个接口包含了init(),descriptor()和doFilter()这些方法。init()和destroy()方法会被容器调用。 doFilter()方法用来在过滤器类里实现逻辑任务。
如果你想把过滤器组成过滤链(chain filter)或者存在多匹配给定URL模式的个过滤器,它们就会根据web.xml里的配置顺序被调用。
在web.xml里配置过滤器,需要使用和 XML元素以及相关的子元素标签。
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
使用注解来为特定的servlet配置过滤器,你可以使用@WebFilter注解。
使用Servlet读写Cookie
很多应用都想在客户端机器里保存用户当前的浏览历史。目的是当用户再次使用应用时,他能够从上次离开的地方开始浏览。为了实现这个需求,通常使用cookies。你可以把它看作是保存在客户端机器里的键值对基本数据。当使用浏览器打开应用时,应用可以对这些数据进行读写。
为了创建cookie,需要实例化一个新的 javax.servlet.http.Cookie 对象并且为它分配名称和值。实例化cookie后,可以设置属性来配置cookie。在这个例子里,我们使用 setMaxAge() 和 setHttpOnly() 方法来设置cookie的生命周期和防范客户端脚本。
从Servlet3.0 API开始,已经可以把cookie标记为HTTP only了。这使cookie可以防范客户端脚本的攻击,使cookie更加安全。
Cookie cookie = new Cookie("sessionId","123456789");
cookie.setHttpOnly(true);
cookie.setMaxAge(-30);
response.addCookie(cookie);
谢谢。
参考学习