LOGO

管雷鸣

技术总监 | Java

js 数据缓存

需求:文章数据表(news)中,有一个字段,标示此文章是否显示。
文章类型是tinyint,其中的值,0表示不显示;1表示显示。
那么,在查询文章列表时,如果SQL不加额外的判断,如:

SELECT * FROM news

那么调取出来的文章列表中,是否显示这一列的值肯定就是0或者1。
这个只有这两个值,还容易看,如果还有值2代表审核中,3代表审核失败,那么列出的数据就不好分辨了。

解决方式:可以将0=不显示; 1=显示  这两个值在项目启动时,自动生成一个js缓存文件。在列出数据时,自动用js将显示的数字转化为文字描述  


步骤:

  1. 项目在开启时,要自动生成js缓存文件,放于 /cache/js/ 文件夹下。
    需要在你的项目下,建立一个文件夹 generateCache
    在其中增加一个类ShowHidden

QQ截图20171109100421.png

需要注意的是,要保证 generateCache 文件夹要在Spring的自动扫描范围内。因为项目开启后自动运行,会用到Spring的注解 :@Component,来表示这个类会在项目启动后自动执行一次,于是才能达到项目启动后自动生成js文件的目的。
需要在 /src/applicationContext.xml 中,开启这一段,让Spring能扫描到 com.ilanchuang.dabai2.generateCache 这个包下的类才行

1510195286557042802.png

ShowHidden.java 的源代码:

package com.ilanchuang.dabai2.generateCache;
import org.springframework.stereotype.Component;

/**
 * 演示示例:标注当前状态是显示或者隐藏
 * @author 管雷鸣
 */
@Component
public class ShowHidden extends com.xnx3.j2ee.generateCache.BaseGenerate {
	//构造方法,运行类的时候会自动运行,从而生成js文件
	public ShowHidden() {
		System.out.println("-----ShowHidden");
		//英文翻译过来的意思便是,自动创建一个缓存对象,当然,这个方法的作用便是自动创建一个js对象,会自动生成js代码如:  var showHidden = new Array();
		super.createCacheObject("showHidden");
		//以下两个则是为js 的 showHidden数组加入这两个值,可以理解为js的这个操作  showHidden['0'] = '隐藏';
		super.cacheAdd("0", "隐藏");
		super.cacheAdd("1", "显示");
		//下面这句便是创建js缓存文件,至 /cache/js/ 目录下,名为 ShowHidden_showHidden.js 。其中这个js的文件名,也就是当前类的名字 加 super.createCacheObject()所传入的字符串的值
		super.generateCacheFile();
	}
}

如此,项目启动后,可以到网站根目录下,进入 /cache/js/ 文件夹,找到 ShowHidden_showHidden.js

1510195920716057447.png

文本方式打开此文件,格式化后,可得到其js源代码:

var showHidden = new Array();
showHidden['0'] = '隐藏';
showHidden['1'] = '显示';

/*页面上输出选择框的所有option,显示到页面上*/

/**
 * 输出  标签,其中的值(标签),便是showHidden数组的值。 此默认 标签为非必填项
 * selectValue 当前选中的option某项的值。若不填写为空字符串、或者跟中的option标签的值都不对应,则会不选中任何项
 */
function writeSelectAllOptionForshowHidden(selectValue) {
    writeSelectAllOptionForshowHidden_(selectValue, '所有', false);
}

/**
 * 输出  标签,其中的值(标签),便是showHidden数组的值
 * selectValue 当前选中的option某项的值。若不填写为空字符串、或者跟中的option标签的值都不对应,则会不选中任何项
 * firstTitle 若是上面的参数selectValue为空字符串,那么这里便是默认选中的提示项,比如“请选择”,这个option="" 空字符串
 * required 此标签是否为必填项,true:是必填项 ;  false:非必填项
 */
function writeSelectAllOptionForshowHidden_(selectValue, firstTitle, required) {
    var content = "";
    if (selectValue == '') {
        content = content + '' + firstTitle + '';
    } else {
        content = content + '' + firstTitle + '';
    }
    for (var p in showHidden) {
        if (p == selectValue) {
            content = content + '' + showHidden[p] + '';
        } else {
            content = content + '' + showHidden[p] + '';
        }
    }
    document.write('' + content + '');
}

//这个js变量的值不是固定的,可多可少。仅仅只是针对改动后,能让浏览器刷新缓存而做,无其他任何作用。
var xnx3_r1510195123 = '111111111111111111111111111111111111111111111111111';


新建一个SpringMVC 页面进行测试,view层(JSP)页面代码:

<%@page import="com.xnx3.j2ee.Global"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
<%@ taglib uri="http://www.xnx3.com/java_xnx3/xnx3_tld" prefix="x" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<jsp:include page="iw/common/head.jsp">
	<jsp:param name="title" value="测试js数据缓存的快速使用"/>
</jsp:include>
<script src="<%=basePath+Global.CACHE_FILE %>ShowHidden_showHidden.js"></script>

<div style="padding:20px;">
	将输出的0、1转化为描述文字显示:<br/>
	<script>document.write(showHidden['0']);</script> | 
	<script>document.write(showHidden['1']);</script>

	<hr/>

 
	select标签演示:<br/>
	<div class="layui-form">
		默认选中1、select非必填:
		<script>writeSelectAllOptionForshowHidden('1');</script>
		<br/>
		默认无选中项、select非必填:
		<script>writeSelectAllOptionForshowHidden('');</script>
		<br/>
		默认无选中项、默认提示为“请选择一项吧”、select非必填:
		<script>writeSelectAllOptionForshowHidden_('', '请选择一项吧', false);</script>
		<br/>
		默认选中0、默认提示为“请选择一项吧”、select为必填:
		<script>writeSelectAllOptionForshowHidden_('0', '请选择一项吧', true);</script>
		
		<div class="layui-form-item" style="padding-top:15px;">
			<div class="layui-input-block">
				<button class="layui-btn" lay-submit="" lay-filter="demo1">保存修改</button>
				<button type="reset" class="layui-btn layui-btn-primary">重置</button>
			</div>
		</div>
	</div>
	
	<br/>
	需注意,使用select标签时,其上层 class="layui-form" 要加上,别落下
</div>

<script>
//此JS代码仅仅只是提交时才会用到,若不需要提交按钮,则完全不用加这段js代码
layui.use(['form', 'layedit', 'laydate'], function(){
  var form = layui.form;
  //监听提交
  form.on('submit(demo1)', function(data){
  	$.showLoading('保存中...');
	var d=$("form").serialize();
        $.post("http://www.baidu.com", d, function (result) { 
        	$.hideLoading();
        	var obj = JSON.parse(result);
        	if(obj.result == '1'){
        		parent.layer.msg('操作成功', {shade: 0.3});
        	}else if(obj.result == '0'){
        		parent.layer.msg(obj.info, {shade: 0.3})
        	}else{
        		parent.layer.msg(result, {shade: 0.3})
        	}
         }, "text");
		
    return false;
  });
  
});
</script>

<jsp:include page="iw/common/foot.jsp"></jsp:include>

预览效果:

1510199366662085906.gif



2024-07-02