【前情提要】
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" οnclick="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("登录失败!"); //登录错误提示信息
}
}
});
}