Java 缩小jersey拦截器中的html和js

Java 缩小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意味着在

使用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意味着在某些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;