像静态资源一样,是不是可以为放置在 webapps 之外的 JSP 提供服务

Posted

技术标签:

【中文标题】像静态资源一样,是不是可以为放置在 webapps 之外的 JSP 提供服务【英文标题】:Like static resource, is it possible to serve JSPs which are placed out side of webapps像静态资源一样,是否可以为放置在 webapps 之外的 JSP 提供服务 【发布时间】:2017-12-08 05:00:53 【问题描述】:

我在我的 Tomcat 应用程序中使用 Struts2。

我通过将它们放置在 webapps 之外并设置为server.xml 来提供我的应用程序的静态资源。

现在我必须以相同的方式为 JSP 提供服务,这超出了我的上下文。可能吗?或者有什么办法可以做到这一点?

【问题讨论】:

为什么要这样做? @AleksandrM 我想将单租户应用程序转换为多租户,并且一些租户有自定义 JSP。 自定义JSP是什么意思?是否要动态更改页面? 不,不是动态的。在 webapps 中有默认的 jsps 可用。但是一些 JSP 被定制为覆盖默认值。所以我过去常常在单租户应用程序中重写它们。现在多租户的情况有所不同.. 怎么样?为什么不能把其他的 jsp-s 和 default 放在一起,让一些用户使用其他的? 【参考方案1】:

JSP 被编译成 servlet(因此是 java 类),由 JSP 容器使用相当复杂的生命周期执行,您可以在此处阅读:https://www.tutorialspoint.com/jsp/jsp_life_cycle.htm

所以简短的回答是:不。您不能在 Web 应用程序之外提供 JSP 页面,因为该 Web 应用程序的主要功能之一是编译和执行 JSP。

正如另一个答案所暗示的,您可以使用各种机制访问 java 资源,但您总是需要看起来像 JSP 容器的东西来呈现 JSP。

如果您想通过内容交付网络等方式为您的应用提供更多服务,您将不得不转向其他技术。

您可能会考虑创建一个纯粹的客户端应用程序,通过 REST、graphql 或 Web 套接字与后端通信。

【讨论】:

感谢您的回复。我不清楚您编辑的内容。 你能解释一下tomcat的内部结构吗,tomcat如何处理Web应用程序中的JSP?它如何作为回应。我非常了解生命周期等等。【参考方案2】:

您可以将 JSP 放置在任何地方,但 Web 应用程序应该知道资源的位置。

由于您没有指出要存储 JSP 的确切位置,所以我无法告诉您如何执行此操作。我可以说在Java中通过URL检索资源,如果您可以将服务器指向存储资源的某个URL,那么您可以访问这些资源。

如果您需要了解更多关于如何在 Java 中访问资源的信息,您可以阅读Location-Independent Access to Resources。

资源、名称和上下文

一个资源由一个字符串标识,该字符串由一个序列组成 子字符串,由斜杠 (/) 分隔,后跟资源名称。 每个子字符串都必须是有效的 Java 标识符。资源名称是 shortNameshortName.extension 的形式。 shortNameextension 必须是 Java 标识符。

资源的名称独立于 Java 实现;在 特别是,路径分隔符始终是斜杠 (/)。然而 Java实现控制内容的细节如何 资源被映射到文件、数据库或其他包含 实际资源。

资源名称的解释是相对于类加载器的 实例。 ClassLoader 类实现的方法执行此操作 解释。


静态资源和动态资源的区别:

静态资源可以通过浏览器直接运行 动态资源(如 JSP)在服务器上运行。

不要将加载动态资源与加载静态资源混淆,因为静态资源可以与响应一起返回,但动态资源应该返回给服务器。

【讨论】:

您可以认为 JSP 位于运行我的 Web 应用程序的同一台机器上,但位于 tomcat 安装目录之外。 不相关,但您知道它是什么 Web 应用程序上下文吗? 我没有收到你的问题

以上是关于像静态资源一样,是不是可以为放置在 webapps 之外的 JSP 提供服务的主要内容,如果未能解决你的问题,请参考以下文章

tomcat 配置静态资源访问

idea中JSP页面不能访问静态资源(图片,js,css)

springboot打包后静态资源webapp文件夹无法打包进去

SpringBoot: 5.访问静态资源(转)

像webapp.to一样开发移动应用程序

为 webapp 连接多个表