触发更新 ServletContext 中的全局变量值

Posted BridgeStone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发更新 ServletContext 中的全局变量值相关的知识,希望对你有一定的参考价值。

【前情提要】

ServletContext对象--三大域对象

Servlet三大域对象的应用 request、session、application(ServletContext)

ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。

(1)request,一个用户可有多个;

(2)session,一个用户一个;

(3)而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

【引言】

需求:

1.服务器启动,加载 “基础数据”,从数据库指定表 Or 配置文件,提供公共调用;

2.“基础数据” 变更,重新加载 变动后的 “基础数据”。

【正文】

java 逻辑

public class ApplicationListener implements ServletContextListener,ServletRequestListener
{
	private static Logger log = Logger.getLogger(ApplicationListener.class);

	public void contextInitialized(ServletContextEvent context)
	{//web start business
		/** ……启动服务…… **/
		LocalCache.getInstance().start();
		if(log.isInfoEnabled())
		{
			log.info("DebtLoad started------------------------------");
		}
		ServletContext servletContext = context.getServletContext();

		/** 设置 基础数据 **/
		ApplicationListener.setInitData(servletContext);
	}

	public void contextDestroyed(ServletContextEvent arg0)
	{
				
		LocalCache.getInstance().stop();
		app.stop();

		if(log.isInfoEnabled())
		{
			log.info("DebtLoad stopped-------------------------------------------------------------------------------------");
		}
	}


	/** 监控请求 **/
	public void requestInitialized(ServletRequestEvent context)
	{
		HttpServletRequest request=(HttpServletRequest)context.getServletRequest();
		String strClientIP=request.getRemoteAddr();
		String strURL=request.getRequestURL().toString();
		String requestURI = request.getRequestURI();
		/** 对指定请求进行识别,符合要求,做相应操作 **/
		if (requestURI.indexOf("reloadInitData.do") > -1 ) {
			ServletContext servletContext = context.getServletContext();

			/** 设置 基础数据 **/
			ApplicationListener.setInitData(servletContext);
			return;
		}

		if(strURL.endsWith(".error")==false)
		{
			return;
		}
		
		if(request.getQueryString()!=null)
		{
			strURL+="?"+request.getQueryString();
		}
		if(log.isDebugEnabled())
		{
			log.debug(strClientIP+": "+strURL);
		}
	}


	public void requestDestroyed(ServletRequestEvent arg0)
	{
	}


	/**
	 *  从数据库,加载数据
	 * @param strTransName
	 * @return
	 */
	private static String getInitData(String strTransName)
	{
		/** 读取 基础数据 **/
		/** ………… **/

		return Result.toJSON();
	}

	/**
	 * 将基础数据,设置到 ServletContext 中
	 * @param servletContext
	 */
	private static void setInitData(ServletContext servletContext)
	{
		/** 从数据库,加载基础数据 **/
		String borrowMode = ApplicationListener.getInitData("getBorrowModes");
		String ceditorFund = ApplicationListener.getInitData("getCreditorFunds");
		String column = ApplicationListener.getInitData("getDBFields");

		servletContext.setAttribute("borrowModeJson",borrowMode.substring(8,borrowMode.length()-1));
		servletContext.setAttribute("ceditorFundJson",ceditorFund.substring(8,ceditorFund.length()-1));
		servletContext.setAttribute("columnJson",column.substring(8,column.length()-1));
	}

}

  

html 

<a href="javascript:void(0);" style="margin-left:68%;visibility:hidden" onclick="reLoadInitData();" class="easyui-linkbutton" data-options="iconCls:‘icon-reload‘">重新加载基础数据</a>

 正常情况下,按钮【重新加载基础数据】不可见。避免 误操作 和 无关操作,所以,平时给隐藏了。需要使用时,将“visibility:hidden”删除,按钮就能显示出来。

 

js:

function reLoadInitData() {
    jQuery.ajax({
        type: "GET",   //post提交方式默认是get
        url: "/reloadInitData.do",
        error: function (request) {      // 设置表单提交出错
            jQuery("#showMsg").html(request);  //登录错误提示信息
        },
        success: function (data) {
            if(data == "success"){
                document.location = "/zijinfang/list.htm";
            }else{
                jQuery("#showMsg").html("登录失败!");  //登录错误提示信息
            }
        }
    });
}

  

以上是关于触发更新 ServletContext 中的全局变量值的主要内容,如果未能解决你的问题,请参考以下文章

触发数组编号后更新全局变量

ServletContext简介

更新前Oracle SQL变异表触发器

仅在目标 C 中本地更新全局变量值

监听器

ServletContext设置全局变量实现统计站点访问次数