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>
三、效果