【问题标题】:Java Servlet-2.3 not working in Websphere Liberty Profile 8.5.5.6Java Servlet-2.3 在 Websphere Liberty Profile 8.5.5.6 中不起作用
【发布时间】:2017-10-22 14:11:17
【问题描述】:

我们有一个 Java Web 应用程序在 IBM Websphere Liberty 配置文件服务器中运行。我们最近开发了一个 Java Servlet,它负责使用 Java 库生成 JFreeCharts。

web.xml 中的代码

<servlet>
    <servlet-name>GraphicServlet</servlet-name>
    <servlet-class>com.test.GraphicServlet</servlet-class>
    <load-on-startup>10</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>GraphicServlet</servlet-name>
    <url-pattern>*.img</url-pattern>
</servlet-mapping>

index.html 文件中的代码

<img src="summary/chart.img" height="100" width="100" />

GraphicsServlet.java 中的代码

该Servlet实现了doGet方法,该方法中的业务逻辑使用JFreeCharts生成图表图像文件(.png),该图像以流的形式作为响应返回。

申请流程:

访问应用程序时默认显示index.html文件,该页面有需要显示JFreeChart生成的图表的部分。

场景描述:

访问应用程序时未显示图像文件。使用浏览器的开发者工具,我发现向 *.img Url 发送请求时会打印 404 错误。接下来,我试图找出该 Servlet 是否真的部署到了服务器上,或者是否在 .war 文件中遗漏了,我检查了 websphere 中的部署文件夹并发现了已部署的 Servlet。接下来,我尝试检查 Servlet 是否已启动并正在运行。在新的浏览器中,我发送了一个类似 http://localhost:9080/myapp/summary/chart.img 的测试请求,它在屏幕上返回 404 错误。

我想知道为什么 servlet 没有起床。于是,我在我的GraphicsServlet中实现了HttpServlet的init()方法,并写了一个打印语句。当应用程序完成加载时,我没有得到那个打印。最后,我尝试注释掉 doGet 方法的每一行,即使我收到了 屏幕出现 404 错误。

问题描述:我想知道GraphicsServlet为什么起不来。请让我知道是否有任何技术可以知道 GraphicServlet 失败的原因。

更新 1: 我尝试删除 web.xml 中的配置并使用 @WebServlet 注释对 GraphicServlet 进行注释。现在,我可以看到这些打印语句,并且现在可以确认 GraphicServlet 在使用注释时已启动并正在运行。所以,我开始查看 web.xml DOCTYPE 标签。 Web 应用 DTD 的版本非常旧。是2.3版本,我们安装的Java版本是1.8。谁能在这里告诉我 WebApp-2.3 有什么问题?

更新 2: 我从 GraphicServlet 中删除了 @WebServlet 注释,并再次尝试使用 xml 配置,并将 web.xml 文件中的 Web 应用程序版本从 2.3 更改为 3.1(也是 3.0)。 GraphicServlet 仍未启动并运行。

更新 3: 我注意到 Websphere server.xml 文件中使用了 javaee-7.0 功能。

感谢您的耐心等待。

【问题讨论】:

  • 我用@WebServlet("*.img") 注释创建了servlet,它工作得很好。所以从你的应用程序中删除web.xml。此外,如果您使用的是 Eclipse,请从 Eclipse Marketplace 安装 WebSphere Developer Tools,如果您需要,它将生成正确的部署描述符。 Liberty 仅支持 Web 应用程序 3.0 及更高版本,因此您的 2.3 可能存在问题。
  • 谢谢加斯。该应用程序非常大,删除web.xml 文件需要付出巨大的努力。您能否指出一些明确表明 Liberty 仅支持 Web 应用程序 3.0 的资源?
  • 所以只需将 web.xml 更新到 3.0。您不必删除它。如果您对至少 Java EE 6 有所了解,请更新 application.xml。
  • 我已经尝试将 web.xml 更改为 3.0 和 3.1。这没有用。请让我知道一个清楚地表明 Liberty 仅支持 Web 应用程序 3.0 的资源。

标签: java servlets web-applications websphere-liberty


【解决方案1】:

也许您应该将 web.xml 中的 servlet 映射更改为如下所示:

/summary/*.img

【讨论】:

  • 我试过了,但没有用。然而,为了确认这是否会导致错误,我创建了一个带有虚拟 servlet 的虚拟测试应用程序,该虚拟 servlet 映射到 *.img。虚拟 servlet 拾取了所有以 .img 结尾的请求 Url,所以,通过这个,我认为当 servlet 映射到 *.img 时,任何以 .img 结尾的 url 都可以由这个 servlet 提供服务。
  • 服务器启动时不需要调用servlet“init”方法。它可以在收到第一个请求时延迟加载和初始化。检查以确保在 servlet 容器创建实际 servlet 时日志中没有错误。
猜你喜欢
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2012-08-21
  • 2016-01-16
  • 2016-05-21
相关资源
最近更新 更多