我想使用 JAVA Entreprise Java Beans 和 RESTful Web 服务 (JAX-RS) 创建一个员工管理工具。
目的是您有一个端点,例如 Administration/v1/emp,您可以在其中发布新员工的姓名等。
到目前为止,这有效,我可以使用 SOAPUI 发送 POST 请求。
现在我想创建一个带有 Java 服务器界面和/或 PrimeFaces 的 UI。我已经看到我可以为此创建托管 bean,并使用此托管 bean 来调用我的企业 java bean 上的方法(业务逻辑) 到目前为止,一切都很好。 但在我的应用程序中,我的 web.xml 中有两个 servlet,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/v1/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<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>
<context-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.se.bac.service.RESTApplication</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
</web-app>
如果我调用像/v1/emp 这样的资源,resteasy servlet 将处理该请求,如果我调用 index.xhtml 文件,jsf servlet 就会工作。
但我想做的是,我想在资源之上构建一个图形用户界面 - 所以我想在浏览器中调用/v1/emp,然后用户应该看到例如列表或表单(如 xhtml 文件中定义)
但是现在,如果我调用资源/v1/emp 并获得在 list.xhtml 文件中定义的列表,我会得到一个 json 或 xml 表示(当然),我需要在浏览器中调用 list.xhtml
如何实现我上面提到的调用资源/v1/emp 并获取 UI xhtml 页面?
谢谢。
最佳答案
这就是 servlet 容器用来将请求路由到特定 servlet ( source ) 的规则:
- 容器将尝试查找请求路径与 servlet 路径的精确匹配。成功的匹配将选择 servlet。
- 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符,一次沿着路径树向下一个目录来完成的。最长的匹配决定选择的 servlet。
- 如果 URL 路径中的最后一段包含扩展名(例如 .jsp),servlet 容器将尝试匹配处理扩展名请求的 servlet。扩展名被定义为最后一个“.”字符之后的最后一个段的部分。
- 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。
因此,您可以为 API 和页面使用不同的 URI。例如,像这样定义您的 servlet:
...
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/api/v1/*</url-pattern>
</servlet-mapping>
...
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/</url-pattern>
<url-pattern>/v1/*</url-pattern>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
所以我们的想法是你需要划分请求。您需要更加具体,因为容器仅使用请求的 URL 来定义由谁来处理它。此外,您还可以将 Faces Servlet 定义为默认 servlet,然后从您的 index.xhtml
始终使用扩展程序指定到其他页面的路由。
关于java - 使用 Java EJB 和 JAX-RS 以及 Server Faces 的员工应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46440543/