我在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>

09-25 17:52