All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jrouter.servlet.ServletThreadContext Maven / Gradle / Ivy

/*
 * Copyright (C) 2010-2111 [email protected]
 *
 * 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 jrouter.servlet;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import jrouter.ActionInvocation;

/**
 * ServletThreadContext是一个线程变量,使用了一个公共的{@link ThreadLocal}。
 * ServletThreadContext包含一个{@link ActionInvocation},存储线程安全的Action运行时上下文。
 * ServletThreadContext包含http的相关的变量。
 * ServletThreadContext包含一个contextMap变量,存储自定义的key-value。
 * ServletThreadContext包含一个Exception对象,存储发生的异常。
 *
 * @see ServletActionFactory.DefaultServletActionFactory
 * @see ServletActionFactory.DefaultServletActionInvocation
 */
public class ServletThreadContext {

    /** Thread Safe */
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {

        @Override
        protected ServletThreadContext initialValue() {
            return new ServletThreadContext(new HashMap(8));
        }

    };

    /** Action运行时上下文 */
    private ActionInvocation actionInvocation;

    /** Http request */
    private HttpServletRequest request;

    /** Http response */
    private HttpServletResponse response;

    /** Http modifiable request parameters map */
    private RequestMap requestMap;

    /** ServletContext */
    private ServletContext servletContext;

    /** Store key-value */
    private final Map contextMap;

    /** Exception */
    private Exception exception;

    /**
     * 构造一个指定存储键值对{@code Map}的ServletThreadContext。
     *
     * @param contextMap 指定存储键值对的Map。
     */
    private ServletThreadContext(Map contextMap) {
        this.contextMap = contextMap;
    }

    /**
     * 获取当前线程副本中的ServletThreadContext。
     *
     * @return 前线程副本中的ServletThreadContext。
     */
    private static ServletThreadContext get() {
        return THREAD_LOCAL.get();
    }

    /**
     * 移除前线程副本中的ServletThreadContext。
     */
    public static void remove() {
        Map map = null;
        if ((map = getRequestParameters()) != null) {
            map.clear();
        }
        if ((map = getContextMap()) != null) {
            map.clear();
        }
        THREAD_LOCAL.remove();
    }

    /**
     * 返回Action运行时上下文。
     *
     * @param  Action运行时上下文类型。
     *
     * @return Action运行时上下文。
     *
     * @see ServletActionFactory.DefaultServletActionFactory#createActionInvocation
     */
    public static  T getActionInvocation() {
        return (T) get().actionInvocation;
    }

    /**
     * 设置Action运行时上下文。
     *
     * @param actionInvocation Action运行时上下文。
     */
    public static void setActionInvocation(ActionInvocation actionInvocation) {
        get().actionInvocation = actionInvocation;
    }

    /**
     * Sets the HTTP servlet request object.
     *
     * @param request the HTTP servlet request object.
     */
    public static void setRequest(HttpServletRequest request) {
        get().request = request;
        get().requestMap = new RequestMap(request);
    }

    /**
     * Gets the HTTP servlet request object.
     *
     * @return the HTTP servlet request object.
     */
    public static HttpServletRequest getRequest() {
        return get().request;
    }

    /**
     * Gets the HTTP servlet session object.
     *
     * @return the HTTP servlet session object.
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }

    /**
     * Gets the HTTP servlet session object.
     *
     * @param create true to create
     * a new session for this request if necessary;
     * false to return null
     * if there's no current session
     *
     * @return the HTTP servlet session object.
     */
    public static HttpSession getSession(boolean create) {
        return getRequest().getSession(create);
    }

    /**
     * Gets the HTTP servlet request parameters.
     *
     * @return the HTTP servlet request parameters.
     */
    public static Map getRequestParameters() {
        return get().requestMap;
    }

    /**
     * Sets the HTTP servlet response object.
     *
     * @param response the HTTP servlet response object.
     */
    public static void setResponse(HttpServletResponse response) {
        get().response = response;
    }

    /**
     * Gets the HTTP servlet response object.
     *
     * @return the HTTP servlet response object.
     */
    public static HttpServletResponse getResponse() {
        return get().response;

    }

    /**
     * Gets the servlet context.
     *
     * @return the servlet context.
     */
    public static ServletContext getServletContext() {
        return get().servletContext;
    }

    /**
     * Sets the current servlet context object.
     *
     * @param servletContext The servlet context to use
     */
    public static void setServletContext(ServletContext servletContext) {
        get().servletContext = servletContext;
    }

    /**
     * 返回ThreadContext中的Map容器。
     *
     * @return the context map。
     */
    public static  Map getContextMap() {
        return (Map) get().contextMap;
    }

    /**
     * Get the exception.
     *
     * @return the exception
     */
    public static Exception getException() {
        return get().exception;
    }

    /**
     * Store the exception.
     *
     * @param exception The exception
     */
    public static void setException(Exception exception) {
        get().exception = exception;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy