如何从作为 Web 应用程序插件一部分的 servlet 中访问 .js 文件?

Posted

技术标签:

【中文标题】如何从作为 Web 应用程序插件一部分的 servlet 中访问 .js 文件?【英文标题】:How to access .js file from within a servlet which is part of a web application plugin? 【发布时间】:2020-11-24 15:54:58 【问题描述】:

我无法找到一种方法来访问我放在我正在尝试扩展的插件的项目文件夹中的 javascript 文件。不幸的是,this topic 提供的解决方案不起作用。我希望这不是特定于 webapp(可以说它称为thiswebappname)我正在为其编写插件。 我首先扩展了一个现有的示例插件,它具有以下项目结构:

项目结构

myprojectsnamespace.myproject

JRE 系统库 插件依赖项 源 myprojectsnamespace.myproject MyServlet.java ... 元信息 网络应用 WEB-INF javascript myScript.js web.xml build.properties plugin.xml

这里有一些我怀疑可能有助于找到解决方案的文件:

build.properties

source.my-servlet.jar = src/
src.includes = my-servlet.jar
bin.includes = META-INF/,\
               webapp/,\
               plugin.xml

plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
   <extension
         point="com.thiswebappname.portal.tomcat.webapps">
      <webapp
            contextRoot="webapp"
            name="thiswebappname/myprojectsnamespace"/>
   </extension>
</plugin>

我无法从MyServlet 加载myScript.js 的内容。 servlet 是由web.xml 发布的:

<...>
<servlet>
  <servlet-name>MyServlet</servlet-name>
  <display-name>My Servlet</display-name>
  <servlet-class>myprojectnamespace.myproject.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/LoadScript</url-pattern>
</servlet-mapping>

MyServlet.java我尝试了以下,都没有成功:

MyServlet.java

public class MyServlet extends HttpServlet
  private static final long serialVersionUID = 1L;
    
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp ) throws IOException
    resp.setContentType("text/html");
    resp.getWriter().println("<script>");
    resp.getWriter().println(new String(Files.readAllBytes(Paths.get("getPopup.js")),StandardCharsets.UTF_8));
    //above line doesn't find the file. I also tried "myprojectsnamespace.myproject/webapp/WEB-INF/javascript/myScript.js" etc., same problem
    resp.getWriter().println("</script>");

    /* following approach has the same problem, i.e. can't find the file:
    resp.setContentType("text/html");
    resp.getWriter().println("<script language='text/javascript' src='myScript.js'>");
    resp.getWriter().println("</script>"); */

当我在浏览器中输入http://myserver/thiswebappname/LoadScript 时,doGet() 确实按预期从MyServlet 调用,但脚本没有被加载。我错过了一些明显的东西吗?我还没有找到像在 web.xml 中使用 MyServlet 那样“发布”.js 文件的方法。

【问题讨论】:

【参考方案1】:

你可以使用:

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/javascript/myScript.js");

或者,如果您只想要输入流:

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/javascript/myScript.js");

即使 Servlet 容器从不扩展 WAR 文件(如 Tomcat),这仍然有效。

【讨论】:

我最终在 try-with-resources 块中使用了 InputStream 变体,tyvm! 供将来参考:ServletContext context = request.getSession().getServletContext()String scriptTag = IOUtils.toString(context.getResourceAsStream("/WEB-INF/javascript/myScript.js"), StandardCharsets.UTF_8);

以上是关于如何从作为 Web 应用程序插件一部分的 servlet 中访问 .js 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WebStorm 中调试从 grunt serve 开始的 Angular 网站?

node+小程序+web端简单的websocket通讯

Serv-u 备份处理

Win2008serve作为以域控制器,怎么搭建ftp服务器

自定义 ng serve 以代理对 /api 的调用?

如何在使用ng build而不是ng serve时运行webpack?