jsp内js片段压缩器

html jsp中如果使用较短的js片段,可以使用此压缩器压缩过滤该js片段

一、自定义控件

 
 
public class JsCssMinifier extends SimpleTagSupport {

	private static final String REDIS_PACKAGE = "wei.wap.jscssmini";

	private static Logger logger = LoggerFactory.getLogger(JsCssMinifier.class);

	/**
	 * 代码片段类型 js css,默认 js
	 */
	private String codeType = "js";

	/**
	 * 是否启用,优先级低于web.xml param JsCssMinifierEnable ,默认true
	 */
	private boolean enabled = true;

	/**
	 * 代码版本,非空时表示将压缩后的js做redis存储,避免总是执行压缩消耗性能 ,原理类似于 xxx.js?v=xxx,建议以月日时分作为版本号
	 * 如果EL等服务器内容产生的是总是变化的值,则应当将对应代码排除在当前js片段之外
	 */
	private String redisVersion;

	private StringWriter sw = new StringWriter();

	public void doTag() throws JspException, IOException {

		String annoPrefix = codeType.equals("css") ? "<!-- " : "//";
		String annoPostfix = codeType.equals("css") ? " --> " : "";
		PageContext pageContext = ((PageContext) this.getJspContext());

		String enable = pageContext.getServletContext().getInitParameter(
				"JsCssMinifierEnable");
		getJspBody().invoke(sw);
		JspWriter out = getJspContext().getOut();
		String content = sw.toString();
		StringBuilder warning = new StringBuilder();
		StringBuilder error = new StringBuilder();
		if (enable.equals("false") || !enabled) {
			out.println(content + annoPrefix + "from ori" + annoPostfix);
			return;
		} else {

			boolean useRedis = false;
			String redisKey = null;
			// redisversion不为空时存取redis
			if (!StringHelp.IsNullOrEmpty(redisVersion)) {
				useRedis = true;
				String jspName = Common
						.GenerateJspFileName2(((HttpServletRequest) pageContext
								.getRequest()));
				redisKey = REDIS_PACKAGE + "." + jspName + "." + codeType + "."
						+ redisVersion;
				content = RedisUtil.getString(redisKey);
				// 如果存在redis则直接返回
				if (!StringHelp.IsNullOrEmpty(content)) {
					out.println(content + annoPrefix + "from re" + annoPostfix);
					return;
				} else {
					content = sw.toString();
				}
			}
			// 记录压缩耗时
			Long begin = null;
			if (logger.isDebugEnabled()) {
				begin = System.currentTimeMillis();
			}
			Reader reader = new StringReader(content);
			Writer writer = new StringBuilderWriter();
			if (codeType.equals("js")) {
				JavaScriptCompressor compressor = new JavaScriptCompressor(
						reader, new ErrorReporter() {
							public void warning(String message,
									String sourceName, int line,
									String lineSource, int lineOffset) {
								if (line < 0) {
									warning.append("alert('[WARNING]:"
											+ message + "');");
								} else {
									warning.append("alert('[WARNING]" + line
											+ ':' + lineOffset + ':' + message
											+ "');");
								}
							}

							public void error(String message,
									String sourceName, int line,
									String lineSource, int lineOffset) {
								if (line < 0) {
									error.append("alert('[ERROR]:" + message
											+ "');");
								} else {
									error.append("alert('[ERROR]" + line + ':'
											+ lineOffset + ':' + message
											+ "');");
								}
							}

							public EvaluatorException runtimeError(
									String message, String sourceName,
									int line, String lineSource, int lineOffset) {
								error(message, sourceName, line, lineSource,
										lineOffset);
								return new EvaluatorException("message:"
										+ message + ";" + "sourceName:"
										+ sourceName + ";" + "line:" + line
										+ ";" + "lineSource:" + lineSource
										+ ";" + "lineOffset:" + lineOffset);
							}
						});
				compressor.compress(writer, -1, true, false, false, false);
			} else {
				CssCompressor csscompressor = new CssCompressor(reader);
				csscompressor.compress(writer, -1);
			}
			String writerContent = writer.toString();
			if (useRedis)
				RedisUtil.setString(redisKey, writerContent);
			out.println(writerContent + warning + error + annoPrefix
					+ "from co" + annoPostfix);
			reader.close();
			writer.close();
			Long end = null;
			if (logger.isDebugEnabled()) {
				end = System.currentTimeMillis();
			}
			if (logger.isDebugEnabled()) {
				logger.debug((end.longValue() - begin.longValue()) + "ms  ");
			}
		}

	}

	public String getCodeType() {
		return codeType;
	}

	public void setCodeType(String codeType) {
		this.codeType = codeType;
	}

	public Boolean getEnabled() {
		return enabled;
	}

	public void setEnabled(Boolean enabled) {
		this.enabled = enabled;
	}

	public String getRedisVersion() {
		return redisVersion;
	}

	public void setRedisVersion(String redisVersion) {
		this.redisVersion = redisVersion;
	}

}
二、 使用

	<script type="text/javascript">
		<custom3:JsCssMinifier redisVersion="0003">
		// 根据手机号码获取验证码
		var buttonTimer;
		$(function() {
			$("#btnsc").click(
					function() {
						if (!$("#tel").valid())
							return;
						if (!buttonTimer)
							buttonTimer = new ButtonTimer("获取验证码",
									" {0}s后重新发送", "#btnsc", "huisetwo", 60);
						var valid = buttonTimer.begin();
						if (!valid)
							return;
						$
								.ajax({
									type : "POST",
									url : '<c:url value="sendcode"/>',
									data : {
										tel : $("#tel").val()
									},
									success : function(result) {
										if (result != null
												&& result.statu == "Success") {
										}
									}
								});
					});
		});
		</custom3:JsCssMinifier>
	</script>

三、效果



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值