我是Java Web应用程序的新手。我在IntelliJ中使用Java 1.8,tomcat服务器9.0.4和球衣库。我希望有一个简单的网页,该网页在调用get方法时显示数据库内容的表,并且在调用post方法及其参数以从同一表中获取特定数据时,也显示来自同一地址的静态API 。这是我的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;
}
}
这是我的网络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时,只会出现空白页面。我想添加另一个没有 Asterisk 的servlet和servlet映射,但是Web服务器无法启动并触发错误。我该如何更改web.xml来做到这一点?
问题是<url-pattern>/*</url-pattern>
Jersey应用程序的。这将使Jersey处理所有请求。这样,servlet就没有机会获得任何请求。泽西岛不会转发不知道的请求1。
但是,你可以做的是代替使用Servlet,而只需创建一个注入HttpServletRequest
and的Jersey资源方法HttpServletResponse
。然后,你可以使用与Servlet中相同的代码
@GET
@Path("redirect")
public void redirect(@Context HttpServletRequest request,
@Context HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/index.jsp");
dispatcher.forward(request, response);
}
刚刚使用此资源方法进行了测试,并且效果很好。
注意:如果你打算服务整个Web应用程序,则这可能不是最有效的方法。我要做的就是将url-pattern更改为其他类似内容,/api/*
以便可以访问其他servlet(例如处理静态内容的默认servlet)。这样,其他静态文件(如CSS和JS文件)就可以按应由容器提供的方式进行处理。
另一个选择是使用脚注的链接中提到的Jersey的筛选器配置。就个人而言,我更喜欢前一种方法,因为Web应用程序的URL和REST API的URL是分开的。
1.可以将Jersey配置为转发请求。它涉及将Jersey配置为作为Servlet过滤器而不是Servlet来运行,还涉及设置配置init-param。请参阅Jersey / * servlet映射导致404错误的静态资源。