tomcat 是一个web引擎,他需要进行配置之后才能作为静态文件服务器,但是默认情况下是不支持搜索功能的,需要自己写一个简单的Servlet
// 如果是文件数量巨大且需要搜索内容,建议结合 Lucene 或 Solr/Elasticsearch,本文只是合适小型项目且不想进行大量修改时的一个补丁手段,请勿进行依赖
1. 编写一个简单的jsp
<%@ page import="java.io.File, java.util.*" %>
<%@ page contentType="application/json;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<%
String keyword = request.getParameter("name");
String dbSchemaPath = request.getParameter("dbSchemaPath");
String type = request.getParameter("type");
// 1. 路径映射
String folderPath = "/appserver/logs";
String urlPath = "/app/";
if ("sql".equalsIgnoreCase(type)) {
folderPath = "/appserver/backup";
urlPath = "/sql/";
}
folderPath = folderPath + "/" + dbSchemaPath; // 拼接具体数据目录
File dir = new File(folderPath);
List<Map<String, String>> results = new ArrayList<>();
if (dir.exists() && dir.isDirectory() && keyword != null && !keyword.trim().isEmpty()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
// 2. 按最后修改时间进行降序排序 (最新的排在最前面)
Arrays.sort(files, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.compare(f2.lastModified(), f1.lastModified());
}
});
// 3. 过滤并构建结果
// List<String> results = new ArrayList<String>();
String hostInfo = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
for (File f : files) {
if (f.isFile() && f.getName().contains(keyword)) {
// 使用 Map 构建对象数据
String address = hostInfo + urlPath + dbSchemaPath + "/" + f.getName();
Map<String, String> fileInfo = new HashMap<>();
fileInfo.put("dbName", f.getName());
fileInfo.put("address", address);
results.add(fileInfo);
}
}
}
}
// 简洁的输出方式:手动转 JSON 字符串(逻辑清晰,不依赖外部库)
// 如果 Tomcat 版本较新,也可以直接用 JSONParser,但直接遍历 Map 是最稳妥的
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < results.size(); i++) {
Map<String, String> m = results.get(i);
sb.append(String.format("{\"dbName\":\"%s\",\"address\":\"%s\"}", m.get("dbName"), m.get("address")));
if (i < results.size() - 1) sb.append(",");
}
// 返回
sb.append("]");
out.print(sb.toString());
%>
这只是一个简单的jsp,我们主要是用于进行简单文件搜索,尽量不依赖第三方包,并且尽量兼容所有版本的tomcat和jdk
2. 定义的 Web 应用目录
默认情况下是放在 webapps/ROOT 下,如果你想自定义目录,需要在server.xml 中再增加一个 Context 映射
<Host name="localhost" appBase=""
unpackWARs="true" autoDeploy="true">
<!-- host 内新增一个 Context (ztools_api 是在tomcat目录下,如果不是tomcat目录下,需要写绝对路径) -->
<Context docBase="ztools_api" path="/api" reloadable="true" />
</Host>