• 触发更新 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("登录失败!");  //登录错误提示信息
                }
            }
        });
    }
    

      

  • 相关阅读:
    穿出不一样的自己,做自己的高级定制服装师_豆瓣
    微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙
    (Pre sell) ZOPO ZP998 (C2 II) 5.5 inch smart phone True Octa Core MTK6592 1920X1080 FHD screen 401 ppi 2GB/32GB 14.0Mp camera-in Mobile Phones from Electronics on Aliexpress.com
    内秀_百度百科
    Boost正则表达式库regex常用search和match示例
    怎样学习使用libiconv库
    libiconv_百度百科
    c++
    解决Boost.Regex对中文支持不好的问题
    毛料西服缩水了怎么办?_百度知道
  • 原文地址:https://www.cnblogs.com/bridgestone29-08/p/8568705.html
Copyright © 2020-2023  润新知