我在Tomcat中部署了servlet'csvreports
'。 csvreports中的“ index.html
”从data/
文件夹中选择csv文件,并显示为html表。
网址格式为
localhost:8080/csvreports/?csv=test.csv
我正在解析
index.html
中的url以获取csv文件名,并从代码中的/data/test.csv
中读取。现在,网址已更改为
localhost:8080/csvreports/folder1/?csv=test.csv,
localhost:8080/csvreports/folder2/?csv=test.csv
等folder1和folder2是动态生成的,并且假定文件夹已经存在于
tomcat/webapps/csvreports/
中我需要对所有网址执行相同的
index.html
。我的想法是解析url以获取路径,最后使用该路径读取csv。我想了解如何将
localhost:8080/csvreports/*/?csv=test.csv
重定向到单个网页。任何其他有关如何完成此操作的想法将不胜感激。
最佳答案
将所有URL映射到同一页面
使用index.jsp
代替index.html
。您实际上可以只重命名文件,而无需更改任何内容。
然后,在web.xml中,可以指定所有以/csvreports
开头的URL都应路由到index.jsp
。
<servlet>
<servlet-name>index</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>index</servlet-name>
<url-pattern>/csvreports/*</url-pattern>
</servlet-mapping>
正则表达式提取路径
在
index.jsp
中,您可以在URL上使用带有两个捕获组的正则表达式。var regex = /.*csvreports\/(.*)\?csv=(.*)/g;
第一个
.*
将告诉它匹配csvreports之前的任何字符。这样,无论您的主机名是什么,它都将匹配。例如,当前它是localhost:8080,但是如果将其部署到测试或生产服务器,或者如果其他人从另一台计算机访问您的Web服务器,则情况将有所不同。接下来,它匹配
csvreports
,这意味着在主机名之后,URL必须包含确切的字符串csvreports
。接下来,它查找单个斜杠
/
。然后,出现第一个捕获组
(.*)
。括号表示它是一个匹配组。 .*
告诉它匹配任何字符。因此,它将匹配URL中第一个/
和问号?
之间的所有字符。然后,它将查找
?csv=
。最后,第二个捕获组
(.*)
用于捕获=
之后的任何字符。现在您已将所有正则表达式设置为匹配您的URL,您可以在正则表达式上调用
.exec()
方法,并将其传递给您的URL。var match = regex.exec(url);
最后,您可以从调用
match
返回的.exec()
变量中提取捕获的组。var directories = match[1];
var csvfilename = match[2];
您可以通过串联这两个匹配的组来获取路径。您可能还需要检查以确保
/
末尾有一个directories
。例如,正则表达式应匹配localhost:8080/csvreports/folder1?csv=file.csv
,但在这种情况下为directories='folder1'
和csvfilename=file.csv
,因此,将它们串联时,如果想要的是'folder1file.csv'
,则将得到'folder1/file.csv'
。因此,在连接它们之前,请检查directories
中的最后一个字符是否为/
,如果不是,请在/
和directories
之间放置一个csvfilename
。例
这是一个简单的示例来展示此正则表达式的作用。
function getPathFromUrl() {
var url = document.getElementById('url').value;
var regex = /.*csvreports\/(.*)\?csv=(.*)/g;
var match = regex.exec(url);
var span = document.getElementById('path');
var directories = match[1];
var csvfilename = match[2];
var path = directories;
if (path[path.length-1] !== '/') {
path += '/'
}
path += csvfilename;
span.innerHTML = path;
}
<input id="url" type="text" value="localhost:8080/csvreports/folder1/?csv=test.csv" size="50">
<button id="button" onclick="getPathFromUrl()">Get Path</button>
<br><br>
<label for="path"><strong>Path:</strong></label>
<span id="path"></span>