📄 servlethandler.java
字号:
throw (RetryRequest)th; } else if (th instanceof HttpException) throw (HttpException)th; else if (Log.isDebugEnabled()) { Log.warn(request.getRequestURI(), th); Log.debug(request.toString()); } else if (th instanceof IOException || th instanceof UnavailableException) { Log.warn(request.getRequestURI()+": "+th); } else { Log.warn(request.getRequestURI(),th); } // TODO httpResponse.getHttpConnection().forceClose(); if (!response.isCommitted()) { request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION_TYPE,th.getClass()); request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION,th); if (th instanceof UnavailableException) { UnavailableException ue = (UnavailableException)th; if (ue.isPermanent()) response.sendError(HttpServletResponse.SC_NOT_FOUND,th.getMessage()); else response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,th.getMessage()); } else response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,th.getMessage()); } else if(Log.isDebugEnabled())Log.debug("Response already committed for handling "+th); } catch(Error e) { if (type!=REQUEST) throw e; Log.warn("Error for "+request.getRequestURI(),e); if(Log.isDebugEnabled())Log.debug(request.toString()); // TODO httpResponse.getHttpConnection().forceClose(); if (!response.isCommitted()) { request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION_TYPE,e.getClass()); request.setAttribute(ServletHandler.__J_S_ERROR_EXCEPTION,e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,e.getMessage()); } else if(Log.isDebugEnabled())Log.debug("Response already committed for handling ",e); } finally { if (request_listeners!=null) { for(int i=LazyList.size(request_listeners);i-->0;) { final ServletRequestListener listener = (ServletRequestListener)LazyList.get(request_listeners,i); listener.requestDestroyed(request_event); } } base_request.setServletName(old_servlet_name); base_request.setRoleMap(old_role_map); if (type!=INCLUDE) { base_request.setServletPath(old_servlet_path); base_request.setPathInfo(old_path_info); } } return; } /* ------------------------------------------------------------ */ private FilterChain getFilterChain(int requestType, String pathInContext, ServletHolder servletHolder) { String key=pathInContext==null?servletHolder.getName():pathInContext; if (_filterChainsCached && _chainCache!=null) { synchronized(this) { if(_chainCache[requestType].containsKey(key)) return (FilterChain)_chainCache[requestType].get(key); } } // Build list of filters Object filters= null; // Path filters if (pathInContext!=null && _filterPathMappings!=null) { for (int i= 0; i < _filterPathMappings.size(); i++) { FilterMapping mapping = (FilterMapping)_filterPathMappings.get(i); if (mapping.appliesTo(pathInContext, requestType)) filters= LazyList.add(filters, mapping.getFilterHolder()); } } // Servlet name filters if (servletHolder != null && _filterNameMappings!=null && _filterNameMappings.size() > 0) { // Servlet name filters if (_filterNameMappings.size() > 0) { Object o= _filterNameMappings.get(servletHolder.getName()); for (int i=0; i<LazyList.size(o);i++) { FilterMapping mapping = (FilterMapping)LazyList.get(o,i); if (mapping.appliesTo(requestType)) filters=LazyList.add(filters,mapping.getFilterHolder()); } o= _filterNameMappings.get("*"); for (int i=0; i<LazyList.size(o);i++) { FilterMapping mapping = (FilterMapping)LazyList.get(o,i); if (mapping.appliesTo(requestType)) filters=LazyList.add(filters,mapping.getFilterHolder()); } } } if (filters==null) return null; FilterChain chain = null; if (_filterChainsCached) { if (LazyList.size(filters) > 0) chain= new CachedChain(filters, servletHolder); synchronized(this) { if (_maxFilterChainsCacheSize>0 && _chainCache[requestType].size()>_maxFilterChainsCacheSize) _chainCache[requestType].clear(); _chainCache[requestType].put(key,chain); } } else if (LazyList.size(filters) > 0) chain = new Chain(filters, servletHolder); return chain; } /* ------------------------------------------------------------ */ /** * @return Returns the initializeAtStart. * @deprecated */ public boolean isInitializeAtStart() { return false; } /* ------------------------------------------------------------ */ /** * @param initializeAtStart The initializeAtStart to set. * @deprecated */ public void setInitializeAtStart(boolean initializeAtStart) { } /* ------------------------------------------------------------ */ /** * @return true if the handler is started and there are no unavailable servlets */ public boolean isAvailable() { if (!isStarted()) return false; ServletHolder[] holders = getServlets(); for (int i=0;i<holders.length;i++) { ServletHolder holder = holders[i]; if (holder!=null && !holder.isAvailable()) return false; } return true; } /* ------------------------------------------------------------ */ /** * @param start True if this handler will start with unavailable servlets */ public void setStartWithUnavailable(boolean start) { _startWithUnavailable=start; } /* ------------------------------------------------------------ */ /** * @return True if this handler will start with unavailable servlets */ public boolean isStartWithUnavailable() { return _startWithUnavailable; } /* ------------------------------------------------------------ */ /** Initialize filters and load-on-startup servlets. * Called automatically from start if autoInitializeServlet is true. */ public void initialize() throws Exception { MultiException mx = new MultiException(); // Start filters if (_filters!=null) { for (int i=0;i<_filters.length; i++) _filters[i].start(); } if (_servlets!=null) { // Sort and Initialize servlets ServletHolder[] servlets = (ServletHolder[])_servlets.clone(); Arrays.sort(servlets); for (int i=0; i<servlets.length; i++) { try { if (servlets[i].getClassName()==null && servlets[i].getForcedPath()!=null) { ServletHolder forced_holder = (ServletHolder)_servletPathMap.match(servlets[i].getForcedPath()); if (forced_holder==null || forced_holder.getClassName()==null) { mx.add(new IllegalStateException("No forced path servlet for "+servlets[i].getForcedPath())); continue; } servlets[i].setClassName(forced_holder.getClassName()); } servlets[i].start(); } catch(Throwable e) { Log.debug(Log.EXCEPTION,e); mx.add(e); } } mx.ifExceptionThrow(); } } /* ------------------------------------------------------------ */ /** * @return Returns the filterChainsCached. */ public boolean isFilterChainsCached() { return _filterChainsCached; } /* ------------------------------------------------------------ */ /** * @see also newServletHolder(Class) */ public ServletHolder newServletHolder() { return new ServletHolder(); } /* ------------------------------------------------------------ */ public ServletHolder newServletHolder(Class servlet) { return new ServletHolder(servlet); } /* ------------------------------------------------------------ */ /** conveniance method to add a servlet. * @return The servlet holder. */ public ServletHolder addServletWithMapping (String className,String pathSpec) { ServletHolder holder = newServletHolder(null); holder.setName(className+"-"+holder.hashCode()); holder.setClassName(className); addServletWithMapping(holder,pathSpec); return holder; } /* ------------------------------------------------------------ */ /** conveniance method to add a servlet. * @return The servlet holder. */ public ServletHolder addServletWithMapping (Class servlet,String pathSpec) { ServletHolder holder = newServletHolder(servlet); setServlets((ServletHolder[])LazyList.addToArray(getServlets(), holder, ServletHolder.class)); addServletWithMapping(holder,pathSpec); return holder; } /* ------------------------------------------------------------ */ /** conveniance method to add a servlet. * @param name * @param className * @param pathSpec * @return The servlet holder. */ public void addServletWithMapping (ServletHolder servlet,String pathSpec) { ServletHolder[] holders=getServlets(); if (holders!=null) holders = (ServletHolder[])holders.clone(); try { setServlets((ServletHolder[])LazyList.addToArray(holders, servlet, ServletHolder.class)); ServletMapping mapping = new ServletMapping(); mapping.setServletName(servlet.getName()); mapping.setPathSpec(pathSpec); setServletMappings((ServletMapping[])LazyList.addToArray(getServletMappings(), mapping, ServletMapping.class)); } catch (Exception e) { setServlets(holders); if (e instanceof RuntimeException) throw (RuntimeException)e; throw new RuntimeException(e); } } /* ------------------------------------------------------------ */ /** Convenience method to add a servlet with a servlet mapping. * @param className * @param pathSpec * @return * @deprecated */ public ServletHolder addServlet (String className, String pathSpec) { return addServletWithMapping (className, pathSpec); } /* ------------------------------------------------------------ */ /**Convenience method to add a pre-constructed ServletHolder. * @param holder */ public void addServlet(ServletHolder holder) { setServlets((ServletHolder[])LazyList.addToArray(getServlets(), holder, ServletHolder.class)); } /* ------------------------------------------------------------ */ /** Convenience method to add a pre-constructed ServletMapping. * @param mapping */ public void addServletMapping (ServletMapping mapping) { setServletMappings((ServletMapping[])LazyList.addToArray(getServletMappings(), mapping, ServletMapping.class)); } /* ------------------------------------------------------------ */ public FilterHolder newFilterHolder(Class filter) { return new FilterHolder(filter); } /* ------------------------------------------------------------ */ /** * @see {@link #newFilterHolder(Class)} */ public FilterHolder newFilterHolder() { return new FilterHolder(); } /* ------------------------------------------------------------ */ public FilterHolder getFilter(String name) { return (FilterHolder)_filterNameMap.get(name); } /* ------------------------------------------------------------ */ /** conveniance method to add a filter. * @param name * @param className * @param pathSpec * @param dispatches see {@link FilterMapping#setDispatches(int)} * @return The filter holder. */ public FilterHolder addFilterWithMapping (Class filter,String pathSpec,int dispatches) { FilterHolder holder = newFilterHolder(filter); addFilterWithMapping(holder,pathSpec,dispatches); return holder; } /* ------------------------------------------------------------ */ /** conveniance method to add a filter. * @param name * @param className * @param pathSpec * @param dispatches see {@link FilterMapping#setDispatches(int)} * @return The filter holder. */ public FilterHolder addFilterWithMapping (String className,String pathSpec,int dispatches) { FilterHolder holder = newFilterHolder(null); holder.setName(className+"-"+holder.hashCode()); holder.setClassName(className); addFilterWithMapping(holder,pathSpec,dispatches); return holder; } /* ------------------------------------------------------------ */ /** conveniance method to add a filter. * @param name * @param className * @param pathSpec * @param dispatches see {@link FilterMapping#setDispatches(int)} * @return The filter holder. */ public void addFilterWithMapping (FilterHolder holder,String pathSpec,int dispatches)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -