有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在war中获取当前jsp文件路径?

由于有很多转发请求,很难识别当前显示的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


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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

    这是战争的根源。当我运行它时,我得到以下信息:

    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,请转换剩余的“.”到“/”和“u”到a”您将获得:

    /root.jsp
    /d/root.jsp
    

    这实际上让你得到了你想要的

    如果在运行时覆盖一个JSP,那么它将开始将_1和_2粘贴到末尾,因此您必须对此进行说明

    但是好好玩玩这个,它应该对你有用,让你走到你要去的地方

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

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

    所以,试试看你是否能让它和你的容器一起工作