使用ResHandler访问classpath下的资源文件

方便将css、js、pic资源文件打包进jar里


package com.hszdz.jfinal;

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

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

import com.jfinal.handler.Handler;
import com.jfinal.kit.LogKit;

/**
 * 
 * @author hszdz(qq:58875000)
 * 
 */
public class ResHandler extends Handler {

	private String resBase = "/res/";

	public ResHandler(String resBase) {
		this.resBase = resBase;
	}

	public ResHandler() {
	}

	@Override
	public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		if (!target.startsWith(resBase)) {
			next.handle(target, request, response, isHandled);
			return;
		}
		InputStream is = getClass().getResourceAsStream(target);
		if (is == null) {
			next.handle(target, request, response, isHandled);
			return;
		}
		try {
			try {
				// LogKit.info("handler jar resource:" + target);
				isHandled[0] = true;
				String contentType = getContentType(target);
				response.setContentType(contentType);
				copy(is, response.getOutputStream());
				response.setHeader("Cache-Control", "max-age=3600");
			} finally {
				is.close();
			}
		} catch (Exception e) {
			LogKit.error(target + "发生错误:" + e.getMessage());
		}
	}

	protected String getContentType(String name) {
		if (name.endsWith(".js")) {
			return "text/javascript";
		} else if (name.endsWith(".css")) {
			return "text/css";
		} else if (name.endsWith(".html")) {
			return "text/html";
		} else if (name.endsWith(".txt")) {
			return "text/plain";
		} else if (name.endsWith(".gif")) {
			return "image/gif";
		} else if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {
			return "image/jpeg";
		} else if (name.endsWith(".png")) {
			return "image/png";
		} else {
			return null;
		}
	}

	protected void copy(InputStream input, OutputStream output) throws IOException {
		final byte[] buffer = new byte[4096];
		int n;
		while (-1 != (n = input.read(buffer))) {
			output.write(buffer, 0, n);
		}
		output.flush();
	}

}


评论区

netwild

2018-05-15 11:13

不错!
但如果是servlet3.0的话,容器本身就支持访问resource/META-INF/resource下的静态资源

热门分享

扫码入社