我在tomcat中部署了一个servlet“csvreports
”。 csvreports中的“index.html
”从data/
文件夹中选择csv文件,并显示为html表格。
网址格式为
localhost:8080/csvreports/?csv=test.csv
我正在解析index.html
中的网址以获取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
重定向到单个网页。
如何实现这一点的任何其他想法将不胜感激。
答案 0 :(得分:3)
使用index.jsp
代替index.html
。您可以直接重命名文件,而无需更改任何内容。
然后在您的web.xml中,您可以指定所有以/csvreports
开头的网址都应该路由到您的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
中,您可以在网址上使用带有两个捕获组的正则表达式。
var regex = /.*csvreports\/(.*)\?csv=(.*)/g;
第一个.*
将告诉它匹配csvreports之前的任何字符。这样,无论您的主机名是什么,它都会匹配。例如,目前它是localhost:8080,但如果将其部署到测试或生产服务器,或者如果其他人从另一台计算机上攻击您的Web服务器,则会有所不同。
接下来,它匹配csvreports
,这意味着在主机名之后,URL必须包含确切的字符串csvreports
。
接下来,它会查找单个斜杠/
。
然后,第一个捕获组(.*)
出现。括号表示它是匹配组。 .*
告诉它匹配任何字符。因此,它会匹配您网址中第一个/
与问号?
之间的所有字符。
然后,它会查找?csv=
。
最后,第二个捕获组(.*)
用于捕获=
之后的任何字符。
现在您已将所有正则表达式设置为与您的网址匹配,您可以在正则表达式上调用.exec()
方法,并将其传递给您的网址。
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'
,当你想要的是{ {1}}。因此,在连接它们之前,请检查'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;
}