java - 简单的 JavaEE HTML GET/POST 应用程序

标签 java jakarta-ee intellij-idea glassfish jax-rs

我刚刚开始使用 JavaEE(我对 JavaSE 相当流利),并且很难理解制作最简单的应用程序所需的所有新事物。现在我正在尝试使用 JAX-RS 注释在 IntelliJ 中使用 Glassfish 4 生成一个简单的“Hello World”html 页面。我已经搜索了这些注释的正确使用方法,看起来我做得正确,但无论我在 localhost 中导航到何处,我都会收到 404 错误。我开始认为我的代码中缺少重要组件,并且我对 JavaEE 的了解不够,无法知道我缺少什么(也许它可能是 web xml 文件中的某些内容,我不知道太多了)。这是我编写的代码,减去导入:

@LocalBean
@Stateless
@Path("/hello")
@Produces("text/html")
public class Hello {

    @GET
    @Path("/world")
    public String printHelloWorld() {
        return "<html lang=\"en\"><body><h1>Hello, World!</h1></body></html>";
    }
}

服务器本身已启动并正在运行,并且应用程序似乎已正确部署。启动时设置的默认 URL 是“http://localhost:8080/HelloWorld_war_exploded/ ”, 所以我的理解是我应该去 http://localhost:8080/HelloWorld_war_exploded/hello/world 显示消息。

编辑:这是我的 XML 文件,我根本没有更改它:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
</web-app>

在查看 Lutz 的评论后,我调查了基本 URL 问题,目前正在查看以下链接:http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/twbs_jaxrs_configwebxml.html?cp=SSAW57_8.5.5%2F1-3-0-28-2-0-1

我会相应更新。

最佳答案

您需要在 web.xml 中配置 Jersey(Glassfish 中的 JAX-RS 实现)。您当前只有 JSF 配置

<servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>the.package.where.your.resources.are</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

<url-mapping>是您的 Jersey 应用程序的基础。所以你会使用

http://localhost:8080/HelloWorld_war_exploded/api/hello/world

如果你想使用标准JAX-RS配置,你可以这样做

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

这将扫描整个类路径中的资源,因此您不需要像之前的配置那样指定包。

或者您可以使用 Java 代码

@javax.ws.rs.ApplicationPath("/api")
public class RestApplication extends javax.ws.rs.core.Application {

}

将此类留空还将扫描整个类路径以查找资源。或者您可以显式添加您的类

@javax.ws.rs.ApplicationPath("/api")
public class RestApplication extends javax.ws.rs.core.Application {
     @Override
     public Set<Class<?>> getClasess() {
         Set<Class<?>> classes = new HashSet<>();
         classes.add(Hello.class);
         return classes;
     }
}

关于java - 简单的 JavaEE HTML GET/POST 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30647311/

相关文章:

java - 如何使用 hibernate 工具生成带有注释的领域对象

java - Selenium - Chrome 性能日志不工作

java - 将 Stateless (Webservice)Bean 注入(inject)另一个 Bean

java - 如何在java中创建列表的列表(list<classname>)

java - 如何使用对象的同一个实例

jakarta-ee - 每次都需要重启 Tomcat 才能让 Xuggler 正常工作

java - Apache 错误: "FAIL - Application at context path/tibclient could not be started"

java - 如何在 Mac OS 上使用 Intellij 中的 gradle 和 java9 设置环境变量?

maven - 在 intellij 中搜索 Maven 原型(prototype)列表

search - 如何强制 IntelliJ 始终在 "Whole Project"中搜索