【Servlet】03-Web容器模型

测试背锅
• 阅读 2754

Servlet技术模型中,我们了解到了Web应用中,Servlet的基础职能,和使用Servlet的一些注意事项。但是,这一切,都需要Web容器进行管理,Web容器在Servlet编程中起到如下作用:

  • 通过部署文件,初始化Servlet和ServletContext

  • 控制Servlet的作用域,对Servlet属性进行增删查改

  • 描述Web容器请求处理模型元素:过滤器、过滤器链、请求/响应的包装

  • 监听Web事件(监听器的使用)

  • 描述RequestDispatcher,用Servlet转发、包含目标资源

我们先来讲讲容器部署应用时,对Servlet怎么做初始化的:
DD(Deployment Descriptor)文件中

<servlet>
    <init-param>
        <param-name>paramName</param-name>
        <param-value>paramValue</param-value>
    <init-param>
</servlet>

Java文件中

// 在一个Servlet中
getServletConfig().getInitParameter("paramName");

如果我们有如下需求:在整个项目中获取某一个属性,那么,我们是这样初始化的:
DD文件中:

<context-param>
            <param-name>paramName</param-name>
    <param-value>paramValue</param-value>
</context-param>

Java文件中:

getServletContext().getInitParameter("paramName");

如果,我们需要在Web项目启动时,构造一些对象,那么,监听器就粉墨登场。

要使用监听器,我们需要做如下几件事:

  1. 实现一个监听器接口

  2. 覆盖接口里的方法

  3. 配置DD文件或者注解

我们监听器的Java文件如下:

@WebListener
class SomeListener implements ServletContextListener{
    public void contextInitialzed(ServletContextEvent sce){
        // 获取Context的引用
        ServletContext context = sce.getServletContext();
    }
}

我们的DD文件(没有使用@WebListener的时候有用):

<listener>
    <listener-class></listener-class>
</listener>

我们还有更多的Listener可以选择:

作用
ServletContextAttributeListener 监听Web应用的属性
HttpSessionListener 监听Web中的Session
HttpSessionBindingListener 监听对象绑定到会话
HttpSessionActivationListener 对Session迁移事件监听
ServletRequestListener 监听Web中的请求

对于属性而言,我们还需要知道属性的作用域,我们需要知道的作用域有:

  • 上下文(Context)

  • 请求(Request)

  • 会话(HtttpSession)

我们有一个参照表,用来描述各种作用域:

名称 意义 作用域
PageContext 页面上下文,可以获取所有页面对象 页面
HttpServletRequest 客户端请求 请求域
HttpServletResponse 服务器响应
ServletContext 表示一个应用程序 整个服务器端

我们需要知道,ServletContext属性不是线程安全的,因为,它可能被其它用户更改。

这里有一个对上下文属性加锁的示例:

public void doGet(HttpServletRequest request, 
// 下面的代码对ServletContext同步
HttpServletResponse response){
    synchronized(getServletContext()){
        getServletContext().setAttribute("attributeName","attributeValue");
    }
}

同样,我们的HttpSession属性也不是线程安全的,对HttpSession进行同步处理,可以避免线程不安全的修改。

对于和线程有关的问题,我们应做到:

  • 声明局部变量,而不是实例变量

  • 在合适的作用域里使用属性

我们认识了属性的一些知识后,我们可以把属性请求/分派出去:

request.setAttribute("beer","BEER");
request.getRequestDispatcher("someurl");
// 使用如下方法,必须以/打头
getServletContext().getRequestDispatcher("/someurl");
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
Servlet的多线程机制与线程安全
Servlet的多线程机制     Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Ser
Stella981 Stella981
3年前
SpringBoot连接常见设置
SpringBoot集成了Servlet容器,因此我们可以方便的启动一个容器,并访问其中的接口。那么如何控制Servlet容器中的线程池呢?可以通过如下配置进行控制server:tomcat:appcectcount:1minspacethreads:1maxthreads:
Stella981 Stella981
3年前
Spring Boot使用笔记
1\. boot将自动把bean类型为Servlet,Filter,listener等servlet规范中的类型,向boot内嵌的web容器注册,需要控制filter、servlet的初始化和参数等,可以使用FilterRegistrationBean和ServletRegistrationBean,来自文档https://docs.spring.i
Easter79 Easter79
3年前
Tomcat的工作模式
Tomcat作为Servlet容器,有3种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。1.独立的Servlet容器   独立的Servlet容器是Tomcat的默认模式。在这种模式下,Tomcat可以作为独立的JavaWeb服务器,Servlet容器作为构成Web服务器的一部分而存在。2.进
Wesley13 Wesley13
3年前
JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet
一、Servlet的传统配置方式  在JavaWeb开发中,每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示:1<servlet2<servletnameActionServlet</servletname3<servletcla
Wesley13 Wesley13
3年前
JavaWeb中的web.xml文件配置解析
一web.xml的文件重要性  web.xml是servlet规定的启动配置文件,凡属基于servlet的javaWeb容器必遵守这个规范,而目前主流的容器都是基于servlet的,因此可以理解web.xml是每个javaweb应用都离不开web.xml配置文件。  web.xml完整的名字应该叫做部署描述符
Stella981 Stella981
3年前
Spring Boot Servlet支持介绍
Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到Servlet、Filter、Listener、Interceptor 等等。当使用SpringBoot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。 
Stella981 Stella981
3年前
Servlet 原理
要介绍Servlet必须要先把Servlet容器说清楚,Servlet与Servlet容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的结果。从技术角度来说是为了解耦,通过标准化接口来相互协作。既然接口是连接Servlet与Servlet容器的
Easter79 Easter79
3年前
SpringBoot连接常见设置
SpringBoot集成了Servlet容器,因此我们可以方便的启动一个容器,并访问其中的接口。那么如何控制Servlet容器中的线程池呢?可以通过如下配置进行控制server:tomcat:appcectcount:1minspacethreads:1maxthreads:
Stella981 Stella981
3年前
Servlet容器,过滤器,拦截器,监听器整理
Servlet容器JavaServlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。Servlet可完成以下功能:1、创建并返回基于客户请求的动态HTML页面。2、创建可以嵌入到
Stella981 Stella981
3年前
Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)
javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置。①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Java应用程序②Filter过滤器:javax.servlet.Filter是一个接口,实现请求的拦截和放行,并可添加新功能,达到过滤请求的作用③list