2017-09-27 77 views
1

我想用JAVA企业Java Beans和RESTful Web服务(JAX-RS)创建员工管理工具。雇员应用程序与Java EJB和JAX-RS和服务器面

的意图是,你必须例如管理/ 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将处理该请求,如果我打电话jsf servlet工作的index.xhtml文件。

但我想要做的是,我想在资源上面建立一个图形用户界面 - 所以我想在浏览器中调用/ v1/emp,然后用户应该看到例如列表或表单在xhtml文件中定义)

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

我怎样才能实现我的关注上面调用资源/ v1/emp并获得UI xhtml页面?

谢谢。

回答

0

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

  1. 容器将尝试找到请求的路径的精确匹配的路径该servlet。成功的匹配选择servlet。
  2. 容器将递归地尝试匹配最长的路径前缀。这是通过一次将路径树降级到一个目录来完成的,使用'/'字符作为路径分隔符。最长的匹配决定了所选的servlet。
  3. 如果URL路径中的最后一个段包含扩展名(例如.jsp),那么servlet容器将尝试匹配处理扩展请求的servlet。扩展名被定义为最后'。'字符后的最后一个段的一部分。
  4. 如果前三条规则都不导致servlet匹配,那么容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,它将被使用。

因此,您可以为您的API和您的页面使用不同的URI。例如像这样定义你的servlets:

... 
<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始终具体指定使用扩展名的路由到其他页面。

+0

你好, 感谢您的回答,这意味着我不应该直接从网页浏览器像/ api/v1/emp调用资源,而只是调用实例index.html并提供一个带有输入字段的表单你可以在哪里创建一个新员工。 并且在托管bean函数中 - 例如action =“#{dataBean.create(...)}” - 接受在表单中输入的参数并在函数内部调用 - 我不知道getRequestURL() (...)我的资源/ api/v1/emp 但不直接从浏览器? 它可能在一个应用程序中使用java服务器面和休息(JAX-RS)吗? – Michael

+0

为什么你需要REST API?你有另一个客户,如移动客户端?从Web浏览器,如果faces servlet处理该请求,您将获得'v1/emp'的页面。从托管bean中,您不需要调用URL,您可以直接使用JAX-RS注释注入您的休息控制器,并按原样使用它。他们在同一个控制器中,所以没有问题。 –

相关问题