七 Servlet 基础

概述

1997 年 Sun 公司为了将 Applet 技术扩展到 Web 服务器端提出了 Servlet 技术,之后,以此为基础,推出了 Java Server Page(JSP),其具备了 Java Servlet 几乎所有优点。

实际上,JSP 引擎根据 JSP 页面生成的 Java 文件,就是一个 Servlet(基于 Java 技术的 Web 组件)。其与平台无关,会被编译成字节码供容器(也称引擎,是支持 Servlet 功能的 Web 服务的扩展)管理。

Servlet 必须在 Web 应用程序的 web.xml 文件中进行配置,指明其路径,才可以被引擎加载。

在配置时,可以使用 <load-on-startup>AnyTime</load-on-startup> 来表示 Servlet 可以在任何时间被载入。

自定义 Servlet 时,需要实现 Servlet 接口,但是可以直接扩展 javax.servlet.GenericServlet 类,或者扩展 javax.servlet.http.HttpServlet 类来处理和 HTTP 相关的请求。

Servlet 中提供了 RequestDispatcher 接口,来实现多个 Servlet 的协作,该接口中的 forward()include() 方法都可以将请求信息转发到其他 Servlet ,但是前者转发后,原 Servlet 将不再响应,这有点儿类似服务端的跳转 <jsp:forward> 标签

在 web.xml 配置文件中,可以通过 <error-page> 配置报错后的处理资源路径。使用子标签 <location> 指定处理错误的资源文件,可以是一个 JSP 页面,也可以是一个 servlet 服务。而 <error-code><exception-type> 子标签则可以指定在该错误代码或错误类型下使用该资源进行处理。

其实在 Java EE 6 推出 Servlet 3.0 后,并不是所有的 Servlet 都需要在 web.xml 进行配置,可以使用注解功能。但是,如果想要限制注解的使用,只部署 web.xml 中的 Servlet ,则可以将 <web-app> 标签的 metadata-complete 属性置为 true 值。

使用 @WebServlet 将 Servlet 注解为需要处理用户请求的 Servlet ,而使用 @WebInitParam 可以注解初始化参数。

过滤器

在 Web 应用中部署多个过滤器,Web 容器会根据过滤器的声明部署次序将用户的请求依次传递给相应的过滤器进行处理,直到目的资源。当然,具体是否传递给下一个过滤器或者直接传递给目的资源,或转发或拒绝,由当前的过滤器决定。同样的,返回的响应会依照相反的过滤器顺序,回传给用户。

自定义过滤器,需要实现 javax.servlet.Filter 接口。在其 doFilter() 方法中,需要调用 FilterChaindoFilter() 方法(javax.servlet.FilterChain 接口是由容器实现的),在该方法之前,只能修改请求对象,之后,只能修改响应对象。

public void doFilter(ServletRequest request, 
						ServletResponse response, 
						FilterChain chain) throws IOException, ServletException {
	//处理 request
	chain.doFilter(request, response);
	//处理 response
}

同样的,使用 @WebFilter 注解,可以不用在 web.xml 中进行过滤器的配置。其中可以通过 dispatcherTypes 指定使用过滤器的范围,取值范围如下枚举:

public enum DispatcherType {
    FORWARD,
    INCLUDE,
    REQUEST,
    ASYNC,
    ERROR
}

监听器

Servlet 监听器可以对 ServletContext、HttpSession 以及 ServletRequest 对象的状态进行监听,在状态发生变化的前后,Servlet 容器会触发相关事件,而监听器可以处理这些事件。

javax.servlet.* 中定义了 8 个监听器接口,均继承自 java.util.EventListener 接口,可以用来监听请求对象的创建和销毁,请求对象属性的变化,Web 应用启动及终止时,上下文对象的创建及销毁,上下文对象属性的变化,会话的创建和销毁,会话属性的变化,会话对象绑定的变化。

实现相应的接口,当变化发生时,进行相应的处理,但是需要在 web.xml 文件中进行相应的配置。使用 <listener> 标签,并使用 <listener-class> 子标签指定具体实现监听接口的类。当然,也可以直接使用 @WebListener 注解,从而省略 web.xml 中的配置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值