您的位置:首页 > 其它

JFinal的Web项目从ClassPath加载静态资源文件

2017-08-21 00:00 507 查看
目的

对于不同项目中共用的资源文件,例如CSS,JS,图片等静态资源文件,可以将基打包在Jar包中,加载的时候从Jar中进行加载,方便不同项目的统一引用。

WebJars就是基于这个目的做的。例如Jquery就已经打成了Jar的形式。

文件存放方式

将资源文件放置在项目的 src/main/resources中的WebJars目录下,如下所示:



将该项目打包成Jar之后,在其它的项目就可以引用了

引用原理

添加如下Handler的实现

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

import com.jfinal.handler.Handler;
import com.jfinal.log.Log;

/**
* 判断资源文件是否需要从Jar中进行加载
*
* @filename WebJarsHandler.java
* @author ggeagle
* @datetime 2017年8月15日 下午1:26:06
*/
public class WebJarsHandler extends Handler {
/**
* 日志记录
*/
private Log log = Log.getLog(Handler.class);

@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
if (target.contains("/WebJars/")) {
String path = "WebJars/" + StringUtils.substringAfter(target, "/WebJars/");
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
OutputStream outputStream = null;
try {
if (inputStream != null) {
outputStream = response.getOutputStream();
IOUtils.copy(inputStream, response.getOutputStream());
}
} catch (IOException e) {
log.error("cant get static resource : " + path + " from jar", e);
} finally {
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
}
isHandled[0] = true;
} else {
this.next.handle(target, request, response, isHandled);
}
}
}

Config配置

@Override
public void configHandler(Handlers me) {
me.add(new ContextPathHandler("ctx"));
me.add(new WebJarsHandler());
}

WEB页面配置

<link rel="stylesheet" href="#(ctx)/WebJars/pintuer/pintuer.css">

这样就能自动的从Jar中进行加载,避免了文件拷贝带来的不一致问题,可以统一升级了。

有了BUG也不怕怕了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JFinal