java - 使用 Java EJB 和 JAX-RS 以及 Server Faces 的员工应用程序

标签 java jsf ejb

我想使用 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 ) 的规则:

  1. 容器将尝试查找请求路径与 servlet 路径的精确匹配。成功的匹配将选择 servlet。
  2. 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符,一次沿着路径树向下一个目录来完成的。最长的匹配决定选择的 servlet。
  3. 如果 URL 路径中的最后一段包含扩展名(例如 .jsp),servlet 容器将尝试匹配处理扩展名请求的 servlet。扩展名被定义为最后一个“.”字符之后的最后一个段的部分。
  4. 如果前三个规则都没有导致 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/

相关文章:

java - 有关 Java AbstractProcessor 的一些问题?

java - 为什么 hibernate 在最后添加到我的查询交叉连接

java - 使用 EL 访问继承的属性/方法时出错

java - 我的代码中的 JNDI 名称在哪里?

java - 找不到 Double 类型的 QueryString Binder 。尝试为此类型实现隐式 QueryStringBindable

java - 为什么要使用 Context.MODE_PRIVATE 或 Context.MODE_WRITABLE?

javascript - 更改单选按钮名称javascript在IE中不起作用

java - 迁移到具有功能丰富但更兼容的库的新版本 JSF

java拦截器不拦截

ejb - Wildfly 10 中的默认 slsb-strict-max-pool 大小