由于很多转发请求,很难识别当前显示的jsp文件。是否有可能在战争中获取当前的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
答案 0 :(得分:0)
这将取决于实现,但由于许多实现使用Jasper,它可能比您想象的更便携。当然,可移植性可能不是问题。
但简单的例子就是你采用了完整的合格班级名称&#34;这个&#34;从JSP中,您可以从中导出路径名。每个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
,请转换剩余的&#34;。&#34;到&#34; /&#34;,&#34; _&#34;到了&#34;。&#34;你会得到:
/root.jsp
/d/root.jsp
有效地为您提供所需的信息。
如果你在运行时覆盖JSP,那么它会开始将_1和_2粘贴到最后,所以你必须考虑到这一点。
但要玩弄它,它应该对你有用,并让你到达你去的地方。
请记住,它不是可移植的,它显然适用于Jasper(Tomcat,TomEE,Jetty,Glassfish),但我无法谈论WebLogic或WebSphere。
但是,它可能会。容器必须以某种方式将JSP文件映射到类,这是一种直观的方式。
所以,试一试,看看你是否可以让它与你的容器一起使用。