如何在 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。它应该工作。如下所示..<?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://您当前的 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,它只是redirects
对first/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)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot与JAX-RS框架Jersey的完美搭配
使用 Jersey 通过 RESTfull 服务上传文件和资源配置不可修改?
用Jersey构建RESTful服务7--Jersey+SQLServer+Hibernate4.3+Spring3.2