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