Java 缩小jersey拦截器中的html和js
使用mvc和jsp,对html或js文件的所有请求都通过@Template或Viewable完成。 榜样 其中grid是grid.jsp文件,其中包含纯javascriptJava 缩小jersey拦截器中的html和js,java,web-services,jsp,jersey,jax-rs,Java,Web Services,Jsp,Jersey,Jax Rs,使用mvc和jsp,对html或js文件的所有请求都通过@Template或Viewable完成。 榜样 其中grid是grid.jsp文件,其中包含纯javascript <%@ page contentType="application/javascript;charset=UTF-8" language="java" %> 其中form是form.jsp,其中包含html和js。 这是正确的方法吗?我无法将输出流转换为字符串 谢谢 --更新 回答问题; html+js意味着在
<%@ page contentType="application/javascript;charset=UTF-8" language="java" %>
其中form是form.jsp,其中包含html和js
。
这是正确的方法吗?我无法将输出流转换为字符串
谢谢
--更新
回答问题;
html+js意味着在某些jsp中是html标记和js代码
<div id="form" style="width: 500px; display: none">
<div class="w2ui-page page-0">
<div class="w2ui-field">
</div>....
<script type="text/javascript">
var uiElement = (function () {
var config = {
onOpen: function (event) {
event.onComplete = function () {
$('#formContainer').w2render('form');
}
...
}());
</script>
您真的在资源方法中返回js文件吗
some js and html + js files are dynamic build, example;
grid.jsp contains inside
<%@ page contentType="application/javascript;charset=UTF-8" language="java" %>
var uiElement = (function () {
var config = {
grid: {
name: ${it.name},
listUrl:'${it.entityListUrl}',
formUrl:'${it.entityFormUrl}',
columns: ${it.columns},
records: ${it.records},
}}
从客户端调用js“文件”
$.getScript('dynamic js file name' - it is dynamic too).done(function (script, status, xhr) {
//console.log(xhr.responseText);
uiElement.init();
w2ui[layout].content(layout_main, w2ui[uiElement.name]);
});
also some html blocks build dynamic
{
<c:if test="${it.recid != 0}">
<div class="w2ui-field">
<label>active:</label>
<div>
<input name="active" type="checkbox"/>
</div>
</div>
</c:if>
}
也可以通过可视(模板、模型)使用不同的模板(jsp文件)
在menu.jsp模板的菜单生成器中的某处
List<MenuItem> items..
MenuItem item1 = new MenuItem(W2UI.TASK_GRID, W2UIService.GRID);
items.add(item1);
及
TaskGrid是用js代码填充grid.jsp模板的模型,因此很容易添加具有不同数据集和按钮的任何类型的网格
由$.getScript()在客户端上处理的组件类型(type.SCRIPT),由$('#tempContainer').load()在客户端上处理的type.HTML
---更新工厂和供应商
@Provider
@Priority(200)
@HtmlMinify
public class HtmlMinifyInterceptor implements WriterInterceptor {
@Inject private HtmlCompressor compressor;
您可以使用的自定义实现作为
WriterInterceptorContext的输出流的包装:
import com.googlecode.htmlcompressor.compressor.Compressor;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class HtmlMinifyOutputStream extends ByteArrayOutputStream {
private OutputStream origOut;
private Compressor compressor;
public HtmlMinifyOutputStream(OutputStream origOut, Compressor compressor) {
this.origOut = origOut;
this.compressor = compressor;
}
public void close() throws IOException {
super.close();
String compressedBody = compressor.compress(new String(this.buf));
this.origOut.write(compressedBody.getBytes());
this.origOut.close();
}
}
HtmlMinifyOutputStream
可以在WriterInterceptor
实现中使用。注入HtmlCompressor
实例:
import com.googlecode.htmlcompressor.compressor.Compressor;
import javax.inject.Inject;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;
import java.io.*;
@Provider
@HtmlMinify
public class MinifyHtmlInterceptor implements WriterInterceptor {
@Inject
private Compressor compressor;
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
final OutputStream outputStream = context.getOutputStream();
context.setOutputStream(new HtmlMinifyOutputStream(outputStream, compressor));
context.proceed();
}
}
@HtmlMinify
是一个注释,用于激活特定资源方法上的MinifyHtmlInterceptor
。(见):
每个应用程序只能创建一次HtmlCompressor
,并且可以同时使用,因为:
HtmlCompressor和XmlCompressor类被认为是线程安全的*,可用于多线程环境
()
下面是一个工厂(请参见:),它创建压缩程序实例并启用内联css和javascript压缩:
import com.googlecode.htmlcompressor.compressor.Compressor;
import com.googlecode.htmlcompressor.compressor.HtmlCompressor;
import org.glassfish.hk2.api.Factory;
public class HtmlCompressorFactory implements Factory<Compressor> {
private HtmlCompressor compressor;
@Override
public Compressor provide() {
if(compressor == null) {
compressor = new HtmlCompressor();
}
compressor.setCompressJavaScript(true);
compressor.setCompressCss(true);
return compressor;
}
@Override
public void dispose(Compressor compressor) {}
}
如果启用了内联javascript或内联css压缩:
具有默认设置的HTML压缩器不需要任何依赖项
内联CSS压缩需要库。
内联JavaScript压缩需要库(默认情况下)或库。
()
我使用maven,因此我将此依赖项添加到pom.xml中:
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.4.8</version>
</dependency>
并激活它:
compressor.setJavaScriptCompressor(new ClosureJavaScriptCompressor());
compressor.setCompressJavaScript(true);
compressor.setCssCompressor(new YuiCssCompressor());
compressor.setCompressCss(true);
return compressor;
如果要压缩纯JavaScript或CSS文件,则不能使用htmlcompressor
。此库仅支持带有内嵌CSS/JS的HTML文件。但是您可以实现一个MinifyJsInterceptor
或MinifyCssInterceptor
类似于minifyhtmlintterceptor
,它直接使用YUI压缩器和/或Google闭包库
对于gzip压缩,您应该实现另一个拦截器。因此,可以分别配置缩小和压缩。如果激活多个拦截器,请使用javax.annotation.Priority
控制执行顺序。(请参阅:)htmlcompressor在html+js文件上无法正常工作,但这是另一个问题,感谢OutputStream Wrapper。我只在html上使用过它,没有问题。“html+js文件”是什么意思?你真的在你的资源方法中返回js文件吗;setOutputStream(新的gzip输出流(新的MinifyOutputStream(outputStream));是的,但最好使用2个拦截器。。。gzip拦截器可以根据默认值启用。。。不应为json启用html侦听器。。。这就是为什么我会拆分THISHI@ USER 268553如果这个答案已经解决了你的问题,请考虑通过点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。压缩js时是否出现错误?或者它只是没有强迫性?更新了我的答案,2分让它工作:1)添加yui压缩程序jar,2)在压缩程序上启用内联css/js压缩…错误是-SyntaxError:missing}在已经添加函数bodyyuicompressor之后;我还尝试了compressor.setJavaScriptCompressor(新的ClosureJavaScriptCompressor())和其他来自
List<MenuItem> items..
MenuItem item1 = new MenuItem(W2UI.TASK_GRID, W2UIService.GRID);
items.add(item1);
W2UIService.GRID is string url for client js request and for server method resource @Path() anno.
public enum W2UI {
TASK_GRID("task_grid", "tasks", Type.SCRIPT){
@Override
public W2UIElement getUI() {
return new TaskGrid(getName());
}
},
.....
}
@Provider
@Priority(200)
@HtmlMinify
public class HtmlMinifyInterceptor implements WriterInterceptor {
@Inject private HtmlCompressor compressor;
public class HtmlMinifierFactory implements Factory<HtmlCompressor> {
private HtmlCompressor compressor;
@Override
public HtmlCompressor provide() {
if (null == compressor) compressor = new HtmlCompressor();
ClosureJavaScriptCompressor jsCompressor = new ClosureJavaScriptCompressor();
jsCompressor.setCompilationLevel(CompilationLevel.SIMPLE_OPTIMIZATIONS);
@ApplicationPath("/")
public class MainRsConfig extends ResourceConfig {
public MainRsConfig() {
..
register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(HtmlMinifierFactory.class).to(HtmlCompressor.class).in(Singleton.class);
}
});
..
import com.googlecode.htmlcompressor.compressor.Compressor;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class HtmlMinifyOutputStream extends ByteArrayOutputStream {
private OutputStream origOut;
private Compressor compressor;
public HtmlMinifyOutputStream(OutputStream origOut, Compressor compressor) {
this.origOut = origOut;
this.compressor = compressor;
}
public void close() throws IOException {
super.close();
String compressedBody = compressor.compress(new String(this.buf));
this.origOut.write(compressedBody.getBytes());
this.origOut.close();
}
}
import com.googlecode.htmlcompressor.compressor.Compressor;
import javax.inject.Inject;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;
import java.io.*;
@Provider
@HtmlMinify
public class MinifyHtmlInterceptor implements WriterInterceptor {
@Inject
private Compressor compressor;
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
final OutputStream outputStream = context.getOutputStream();
context.setOutputStream(new HtmlMinifyOutputStream(outputStream, compressor));
context.proceed();
}
}
import javax.ws.rs.NameBinding;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@NameBinding
@Retention(value = RetentionPolicy.RUNTIME)
public @interface HtmlMinify {}
import com.googlecode.htmlcompressor.compressor.Compressor;
import com.googlecode.htmlcompressor.compressor.HtmlCompressor;
import org.glassfish.hk2.api.Factory;
public class HtmlCompressorFactory implements Factory<Compressor> {
private HtmlCompressor compressor;
@Override
public Compressor provide() {
if(compressor == null) {
compressor = new HtmlCompressor();
}
compressor.setCompressJavaScript(true);
compressor.setCompressCss(true);
return compressor;
}
@Override
public void dispose(Compressor compressor) {}
}
final ResourceConfig rc = new ResourceConfig().packages("com.example");
rc.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(HtmlCompressorFactory.class).to(Compressor.class).in(Singleton.class);
}
});
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.4.8</version>
</dependency>
<dependency>
<groupId>com.google.javascript</groupId>
<artifactId>closure-compiler</artifactId>
<version>r2388</version>
</dependency>
compressor.setJavaScriptCompressor(new ClosureJavaScriptCompressor());
compressor.setCompressJavaScript(true);
compressor.setCssCompressor(new YuiCssCompressor());
compressor.setCompressCss(true);
return compressor;