dispatcher.java

来自「jetty SERVER連接資料庫用的軟體」· Java 代码 · 共 580 行 · 第 1/2 页

JAVA
580
字号
// ========================================================================// Copyright 199-2004 Mort Bay Consulting Pty. Ltd.// ------------------------------------------------------------------------// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.// ========================================================================package org.mortbay.jetty.servlet;import java.io.IOException;import java.util.Collections;import java.util.Enumeration;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.mortbay.jetty.Handler;import org.mortbay.jetty.HttpConnection;import org.mortbay.jetty.Request;import org.mortbay.jetty.handler.ContextHandler;import org.mortbay.util.Attributes;import org.mortbay.util.LazyList;import org.mortbay.util.MultiMap;import org.mortbay.util.UrlEncoded;/* ------------------------------------------------------------ *//** Servlet RequestDispatcher. *  * @author Greg Wilkins (gregw) */public class Dispatcher implements RequestDispatcher{    /** Dispatch include attribute names */    public final static String __INCLUDE_JETTY="org.mortbay.jetty.included";    public final static String __INCLUDE_PREFIX="javax.servlet.include.";    public final static String __INCLUDE_REQUEST_URI= "javax.servlet.include.request_uri";    public final static String __INCLUDE_CONTEXT_PATH= "javax.servlet.include.context_path";    public final static String __INCLUDE_SERVLET_PATH= "javax.servlet.include.servlet_path";    public final static String __INCLUDE_PATH_INFO= "javax.servlet.include.path_info";    public final static String __INCLUDE_QUERY_STRING= "javax.servlet.include.query_string";    /** Dispatch include attribute names */    public final static String __FORWARD_JETTY="org.mortbay.jetty.forwarded";    public final static String __FORWARD_PREFIX="javax.servlet.forward.";    public final static String __FORWARD_REQUEST_URI= "javax.servlet.forward.request_uri";    public final static String __FORWARD_CONTEXT_PATH= "javax.servlet.forward.context_path";    public final static String __FORWARD_SERVLET_PATH= "javax.servlet.forward.servlet_path";    public final static String __FORWARD_PATH_INFO= "javax.servlet.forward.path_info";    public final static String __FORWARD_QUERY_STRING= "javax.servlet.forward.query_string";    /** JSP attributes */    public final static String __JSP_FILE="org.apache.catalina.jsp_file";    /* ------------------------------------------------------------ */    /** Dispatch type from name     */    public static int type(String type)    {        if ("request".equalsIgnoreCase(type))            return Handler.REQUEST;        if ("forward".equalsIgnoreCase(type))            return Handler.FORWARD;        if ("include".equalsIgnoreCase(type))            return Handler.INCLUDE;        if ("error".equalsIgnoreCase(type))            return Handler.ERROR;        throw new IllegalArgumentException(type);    }    /* ------------------------------------------------------------ */    private ContextHandler _contextHandler;    private String _uri;    private String _path;    private String _dQuery;    private String _named;        /* ------------------------------------------------------------ */    /**     * @param contextHandler     * @param uriInContext     * @param pathInContext     * @param query     */    public Dispatcher(ContextHandler contextHandler, String uri, String pathInContext, String query)    {        _contextHandler=contextHandler;        _uri=uri;        _path=pathInContext;        _dQuery=query;    }    /* ------------------------------------------------------------ */    /** Constructor.      * @param servletHandler     * @param name     */    public Dispatcher(ContextHandler contextHandler,String name)        throws IllegalStateException    {        _contextHandler=contextHandler;        _named=name;    }        /* ------------------------------------------------------------ */    /*      * @see javax.servlet.RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)     */    public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException    {        forward(request, response, Handler.FORWARD);    }        /* ------------------------------------------------------------ */    /*      * @see javax.servlet.RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)     */    public void error(ServletRequest request, ServletResponse response) throws ServletException, IOException    {        forward(request, response, Handler.ERROR);    }        /* ------------------------------------------------------------ */    /*      * @see javax.servlet.RequestDispatcher#include(javax.servlet.ServletRequest, javax.servlet.ServletResponse)     */    public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException    {        Request base_request=(request instanceof Request)?((Request)request):HttpConnection.getCurrentConnection().getRequest();        request.removeAttribute(__JSP_FILE); // TODO remove when glassfish 1044 is fixed                // TODO - allow stream or writer????                Attributes old_attr=base_request.getAttributes();        MultiMap old_params=base_request.getParameters();        try        {            base_request.getConnection().include();            if (_named!=null)                _contextHandler.handle(_named, (HttpServletRequest)request, (HttpServletResponse)response, Handler.INCLUDE);            else             {                String query=_dQuery;                                if (query!=null)                {                    MultiMap parameters=new MultiMap();                    UrlEncoded.decodeTo(query,parameters,request.getCharacterEncoding());                                        if (old_params!=null && old_params.size()>0)                    {                        // Merge parameters.                        Iterator iter = old_params.entrySet().iterator();                        while (iter.hasNext())                        {                            Map.Entry entry = (Map.Entry)iter.next();                            String name=(String)entry.getKey();                            Object values=entry.getValue();                            for (int i=0;i<LazyList.size(values);i++)                                parameters.add(name, LazyList.get(values, i));                        }                                            }                    base_request.setParameters(parameters);                }                                IncludeAttributes attr = new IncludeAttributes(old_attr);                                 attr._requestURI=_uri;                attr._contextPath=_contextHandler.getContextPath();                attr._servletPath=null; // set by ServletHandler                attr._pathInfo=_path;                attr._query=query;                                base_request.setAttributes(attr);                                _contextHandler.handle(_named==null?_path:_named, (HttpServletRequest)request, (HttpServletResponse)response, Handler.INCLUDE);            }        }        finally        {            base_request.setAttributes(old_attr);            base_request.getConnection().included();            base_request.setParameters(old_params);        }    }        /* ------------------------------------------------------------ */    /*      * @see javax.servlet.RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)     */    protected void forward(ServletRequest request, ServletResponse response, int dispatch) throws ServletException, IOException    {        Request base_request=(request instanceof Request)?((Request)request):HttpConnection.getCurrentConnection().getRequest();        response.resetBuffer();         request.removeAttribute(__JSP_FILE); // TODO remove when glassfish 1044 is fixed                String old_uri=base_request.getRequestURI();        String old_context_path=base_request.getContextPath();        String old_servlet_path=base_request.getServletPath();        String old_path_info=base_request.getPathInfo();        String old_query=base_request.getQueryString();        Attributes old_attr=base_request.getAttributes();        MultiMap old_params=base_request.getParameters();        try        {            if (_named!=null)                _contextHandler.handle(_named, (HttpServletRequest)request, (HttpServletResponse)response, dispatch);            else             {                String query=_dQuery;                                if (query!=null)                {                    MultiMap parameters=new MultiMap();                    UrlEncoded.decodeTo(query,parameters,request.getCharacterEncoding());                                     boolean rewrite_old_query = false;                    if( old_params == null )                    {                        base_request.getParameterNames();    // force parameters to be evaluated                        old_params = base_request.getParameters();                    }                                        if (old_params!=null && old_params.size()>0)                    {                        // Merge parameters; new parameters of the same name take precedence.                        Iterator iter = old_params.entrySet().iterator();                        while (iter.hasNext())                        {                            Map.Entry entry = (Map.Entry)iter.next();                            String name=(String)entry.getKey();                                                        if (parameters.containsKey(name))                            {                                rewrite_old_query = true;                            }                            else                            {                                Object values=entry.getValue();                                for (int i=0;i<LazyList.size(values);i++)                                {                                    parameters.add(name, LazyList.get(values, i));                                }                            }                        }                    }                                        if (old_query != null && old_query.length()>0)                    {                        if ( rewrite_old_query )                        {                            StringBuffer overridden_query_string = new StringBuffer();                            MultiMap overridden_old_query = new MultiMap();                            UrlEncoded.decodeTo(old_query,overridden_old_query,request.getCharacterEncoding());                                MultiMap overridden_new_query = new MultiMap();                             UrlEncoded.decodeTo(query,overridden_new_query,request.getCharacterEncoding());                            Iterator iter = overridden_old_query.entrySet().iterator();                            while (iter.hasNext())                            {                                Map.Entry entry = (Map.Entry)iter.next();                                String name=(String)entry.getKey();                                if(!overridden_new_query.containsKey(name))                                {                                    Object values=entry.getValue();                                    for (int i=0;i<LazyList.size(values);i++)                                    {                                        overridden_query_string.append("&"+name+"="+LazyList.get(values, i));                                    }                                }                            }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?