Jetty源码分析之ContextHandler

ContextHandler是ScopedHandler的直接子类,继承关系比较简单就不贴类图了。
ContextHandler从名字的直观含义上来看是上下文Handler,在servlet规范中每个web应用都有一个上下文(context)的含义,其实就是对应到这里的ContextHandler了。当web容器收到用户请求之后,会根据请求里面的url先判断属于请求时发给哪个web应用的,但并不会将请求直接交给Servlet进行处理而是交给这个应用的ContextHandler。这是因为可能应用中配置的Servlet并不只有一个,还需要在一个地方根据请求的url再次转发给合适的Servlet;另外在将请求交给Servlet之前还需要进行一些判断和处理,这些工作都是在ContextHandler中完成的。另外ContextHandler还以内部类的形式实现了ServletContext。

下面先看下ContextHandler中的一些属性:

    //ServletContext,Servlet规范定义的接口,这里的内部类Context是其具体实现
    protected Context _scontext;
    private final AttributesMap _attributes;
    //对应web.xml中配置的初始化参数
    private final Map<String, String> _initParams;
    private ClassLoader _classLoader;
    //应用程序路径,可以在jetty.xml配置文件中配置,如果同时在jetty下部署了多个应用,则会默认以应用名称作为前缀
    private String _contextPath = "/";
    private String _contextPathEncoded = "/";

    //Context对应的名称
    private String _displayName;

    private Resource _baseResource;
    //文件类型
    private MimeTypes _mimeTypes;
    private Map<String, String> _localeEncodingMap;
    private String[] _welcomeFiles;
    //负责错误处理返回的Hanler,会返回一个默认的错误页面
    private ErrorHandler _errorHandler;
    //允许目标是这些主机的请求通过,如果不配置,则表示不对请求中的目标主机做限制
    private String[] _vhosts;

    private Logger _logger;
    //是否允许请求的url就是_contextPath的值,比如"/manager"(针对部署了多个应用的情况,contextPath需要根据加上每个应用名称做前缀)
    //这种情况下要想请求应用程序根路径应该是"/manager/"而不是"/manager".如果只部署了一个应用,contextPath可以设为"/",这种也就无所谓了.
    private boolean _allowNullPathInfo;
    private int _maxFormKeys = Integer.getInteger("org.eclipse.jetty.server.Request.maxFormKeys",-1).intValue();
    private int _maxFormContentSize = Integer.getInteger("org.eclipse.jetty.server.Request.maxFormContentSize",-1).intValue();
    //是否对传入的url进行路径压缩,路径压缩指的是将url中的多个“/"替换成一个"/"
    private boolean _compactPath = false;
    private boolean _usingSecurityManager = System.getSecurityManager()!=null;

    //一些监听器的配置,对应到web.xml中配置的各种listener
    private final List<EventListener> _eventListeners=new CopyOnWriteArrayList<>();
    private final List<EventListener> _programmaticListeners=new CopyOnWriteArrayList<>();
    private final List<ServletContextListener> _servletContextListeners=new CopyOnWriteArrayList<>();
    private final List<ServletContextListener> _destroySerletContextListeners=new ArrayList<>();
    private final List<ServletContextAttributeListener> _servletContextAttributeListeners=new CopyOnWriteArrayList<>();
    private final List<ServletRequestListener> _servletRequestListeners=new CopyOnWriteArrayList<>();
    private final List<ServletRequestAttributeListener> _servletRequestAttributeListeners=new CopyOnWriteArrayList<>();
    private final List<Contex
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值