【问题标题】:How to get current jsp file path in war?如何在战争中获取当前的jsp文件路径?
【发布时间】:2015-06-17 01:31:24
【问题描述】:

由于转发请求较多,很难识别当前显示的jsp文件。是否可以在war中获取当前的jsp文件路径?如何实现?

举个例子: 网址:http://localhost:8080/controller/action

文件路径:/view/dev/test.jsp

<%= getServletContext().getRealPath("/") %> 

上面的语句不起作用,它显示 C:\Projects\test\build\web\ 而不是 C:\Projects\test\build\web\view\dev\test.jsp

【问题讨论】:

  • @RobertMoskal 这个 SO 问题没有任何可接受的答案。通常,我只会以“可靠”的 SO 问题作为参考投票结束。
  • 为什么需要当前URL对应的物理磁盘文件系统路径?顺便说一句,getRealPath() 没有单一的合理用法(它甚至不应该被引入)。
  • @Tiny 而不是完整路径,我想在 Test.war 中有文件路径。
  • getRealPath 不起作用,因为它首先需要提供一条路径,他说他没有。

标签: java jsp


【解决方案1】:

这将取决于实现,但由于许多实现使用 Jasper,它可能比您想象的更便携。当然,便携性可能不是问题。

但最简单的情况是,您从 JSP 中获取“this”的完整限定类名,并且可以从中派生路径名。每个 JSP 都被编译成一个 Servlet,它们每个都需要自己独特的类。

例如,在 Glassfish 中,它使用来自 Tomcat/Apache 的 Jasper:

我有一个简单的jsp,root.jsp:

<html>
    <body>
        <% out.println(this.getClass()); %>
    </body>
</html>

它位于 WAR 的根级别。当我运行它时,我得到了这个:

class org.apache.jsp.root_jsp

当我创建目录d,并将root.jsp复制到其中并执行它时,我得到:

class org.apache.jsp.d.root_jsp

所以,您可以看到,/root.jsp 的类名是 org.apache.jsp.root_jsp。对于/d/root.jsp,它是org.apache.jsp.d.root_jsp

如果您从类名中删除org.apache.jsp,请转换任何剩余的“.”到“/”,“_”到“。”你会得到:

/root.jsp
/d/root.jsp

这能有效地得到你想要的。

如果您在运行时覆盖 JSP,那么它将开始将 _1 和 _2 粘贴到末尾,因此您必须考虑到这一点。

但是玩弄这个,它应该对你有用,并带你去你要去的地方。

请记住,它不是可移植的,它显然适用于 Jasper(Tomcat、TomEE、Jetty、Glassfish)的任何东西,但我不能说 WebLogic 或 WebSphere。

但是,它可能。容器必须以某种方式将 JSP 文件映射到一个类,这是一种直观的方式。

所以,尝试一下,看看你是否可以让它与你的容器一起工作。

【讨论】:

  • 它成功了!虽然它与 PHP 中的 FILE 相比并不完美。
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多