如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)

Posted

技术标签:

【中文标题】如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)【英文标题】:How to configure welcome file (HTML/JSP) in Jersey container 【发布时间】:2013-10-17 03:47:17 【问题描述】:

我有一个 Jersey RESTful Web 服务项目。我已经在 web.xml 中配置了 Jersey 容器,一切正常。

在同一个项目中,我引入了一个 html 页面并包含在 <welcome-file-list> 中以处理其他一些非 REST 请求。但是当我访问 URL 时,没有显示欢迎文件。

我在web.xml中注释了Jersey容器配置并部署应用程序后,这次我可以访问欢迎文件了。

我正在使用 Tomcat 7、JDK 7、Jersey 2.2 和 Eclipse Juno。 Jersey 配置后如何使欢迎文件工作? Jersey 是否有任何限制,或者我是否需要以不同的方式进行配置才能实现这一点?

我的web.xml

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>My Service</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.my.rest.service</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>    
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
 </servlet-mapping>      
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file> 
  </welcome-file-list>
</web-app>

【问题讨论】:

您是否尝试将welcome-file-list 标签添加到web.xml。它应该工作。如下所示.. index.htmlindex.htmindex.jsp欢迎文件> 欢迎文件列表> 请同时分享您的 web.xml 配置 已发布 web.xml,我也将欢迎文件添加到列表中。 【参考方案1】:
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>com.webservice.services</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.webservice.services</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

尝试使用上面给出的不同路径的 URL 模式 (/service/*) 用于 REST。当服务器启动时,它会工作并显示欢迎文件。

【讨论】:

是的,我已经改变了。所有的 REST 服务请求都将在 http:////service 路径中处理,欢迎文件将以正常方式访问。它工作正常。在 REST 容器中保留 /* 会使欢迎页面成为不可用的资源。所有请求都将转到 Jersey 容器。【参考方案2】:

您当前的 servlet 映射是

<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>

将每个请求重定向到球衣。因此,要使欢迎页面可见,您需要输入类似

<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest</url-pattern>

这种模式只会为像

这样的 url 调用 jersey

http://localhost:8080/rest/

因此是网址

http://localhost:8080/index.html

不会被重定向到 jersey servlet。

一个针对相同场景的项目托管在https://github.com/skohli0302/jims

【讨论】:

【参考方案3】:

在 web.xml 中:

<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/somethinghere/*</url-pattern>
</servlet-mapping>

而不是

<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

【讨论】:

【参考方案4】:

你可以有类似的东西

<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/index.html</url-pattern>
</servlet-mapping>

【讨论】:

【参考方案5】:

当您使用 jersey 时,所有请求都被定向到 jersey servlet,即 ServletContainer。因此,如果任何请求与任何映射的 rest 类不匹配,它就会抛出 404。但您始终可以添加 servlet 过滤器来拦截传入的请求。根据传入的 HTTP 请求 URL(默认/欢迎等),您可以决定将其重定向到 weclome 页面:

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/welcome.jsp");

【讨论】:

【参考方案6】:

我只是想知道,下面的示例是否有效?

HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.sendRedirect("/welcome.jsp"); 如果会的话,这个sendRedirect() 会在哪里被调用?在一个servlet中,所以如果我没记错的话,应该有一个servlet,它只是redirectsfirst/default页面的请求,对吧?

【讨论】:

【参考方案7】:

您可以创建“API”类,并在您的项目中插入注释。 类 ApplicationConfig...

@ApplicationPath("api") //注解

公共类 ApplicationConfig 扩展应用程序

之后,我创建了保留的“用户”类......

类 UserApi

@Path("users")//注解页面用户。

公共类 UserApi

....我的代码补充页面....

@GET

@Path("list")

@Produces("application/json")

public String getUsuarios() throws Exception 

    String json = new Gson().toJson(this.userD.listar());

    return (json);


记住你的根项目留在...http://yourprojectpatc.com.br/api/users/list

使用“邮递员”修改 Json 来发送您的数据

【讨论】:

【参考方案8】:
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.webservice.services</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/service/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

【讨论】:

以上是关于如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)的主要内容,如果未能解决你的问题,请参考以下文章

可以在没有 DI 容器的情况下使用 Jersey 吗?

Spring Boot与JAX-RS框架Jersey的完美搭配

Jersey 2.x 服务器端应用支持的容器

使用 Jersey 通过 RESTfull 服务上传文件和资源配置不可修改?

用Jersey构建RESTful服务7--Jersey+SQLServer+Hibernate4.3+Spring3.2

如何配置用于 Jersey REST 调用的最大并发线程数?