我是java web应用程序的新手。我在intellij中使用Java1.8、TomcatServer9.0.4和jersey库。我希望有一个简单的网页,在调用get方法时显示一个数据库内容表,在调用post方法及其参数时显示一个来自同一地址的restfulapi,以便从同一个表中获取特定数据。这是我的web.xml配置:
<servlet>
<servlet-name>Test API</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>api</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Test API</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
这是我的项目结构:
这是我的api java代码:
@Path("hello")
public class postRequest {
@POST
@Produces(MediaType.TEXT_PLAIN)
public String doPost(@QueryParam("name") String name){
return "Hello,I am " + name;
}
}
这是我的web java代码:
@WebServlet(name = "getRequest", urlPatterns = {"hello"})
public class getRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);
}
}
当我在postman中调用地址localhost/hello?name=hana时,结果会显示出来,但当我在浏览器中打开localhost/hello时,只会出现一个空白页。我尝试添加另一个没有星号的servlet和servletMap,但是web服务器没有启动并触发错误。如何更改web.xml来实现这一点?
1条答案
按热度按时间djp7away1#
问题在于
<url-pattern>/*</url-pattern>
泽西岛的申请。这将使jersey处理所有请求。这使得servlet没有机会获得任何请求。泽西岛不会转发它不知道的请求。但是,您可以做的不是使用servlet,而是创建一个jersey资源方法来注入
HttpServletRequest
以及HttpServletResponse
. 然后您可以使用与servlet中相同的代码刚刚用这个资源方法测试过,效果还不错。
注意:如果您计划为整个web应用程序提供服务,这可能不是最有效的方法。我要做的就是把url模式改成其他类似的模式
/api/*
以便可以访问其他servlet(例如处理静态内容的默认servlet)。通过这种方式,其他静态文件(如css和js文件)可以按照容器提供服务的方式进行处理。另一个选择是使用jersey的过滤器配置,如我在脚注中发布的链接中所述。我个人更喜欢前者,因为web应用程序和restapi的url是分开的。
1.可以将jersey配置为转发请求。它包括将jersey配置为作为servlet过滤器而不是servlet运行,以及设置configuration init param。请参阅jersey/*servletMap导致静态资源的404错误。