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

时间:2017-09-27 06:04:29

标签: java jsf ejb

我想使用JAVA Entreprise Java Bean和RESTful Web服务(JAX-RS)创建一个员工管理工具。

目的是您有一个端点,例如Administration / v1 / emp,您可以在其中POST一个名字等的新员工。

到目前为止,这可行,我可以使用SOAPUI发送POST请求。

现在我想创建一个包含Java服务器面和/或PrimeFaces的UI。我已经看到我可以为此创建托管bean并使用此托管bean来调用我的entreprise 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文件中)

但是现在我得到一个json或xml表示(当然)如果我调用资源/ v1 / emp并在list.xhtml文件中定义我的列表我需要在浏览器中调用list.xhtml

如何调用资源/ v1 / emp并获取UI xhtml页面?

感谢。

1 个答案:

答案 0 :(得分:0)

这是servlet容器用于将请求路由到特定servlet(source)的规则:

  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功匹配选择servlet。
  2. 容器将递归尝试匹配最长的路径前缀。这是通过使用'/'字符作为路径分隔符一次单击目录的路径树来完成的。最长的匹配决定了所选的servlet。
  3. 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理扩展请求的servlet。扩展名被定义为最后一个'。'字符后的最后一个段的一部分。
  4. 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。
  5. 因此,您可以为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始终特定使用扩展名到其他页面的路径。