[英]Restful web Service alongside web application in servlet
我是 java web 應用程序的新手。 我在 IntelliJ 中使用 java 1.8、tomcat 服務器 9.0.4 和 jersey 庫。 我想要一個簡單的 web 頁面,該頁面在調用 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;
}
}
這是我的 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 和 servlet-mapping,但網絡服務器沒有啟動並觸發錯誤。 如何更改 web.xml 來實現這一點?
問題在於 Jersey 應用程序的<url-pattern>/*</url-pattern>
。 這將使 Jersey 處理所有請求。 這使 servlet 沒有機會獲得任何請求。 Jersey 不會轉發它不知道的請求1 。
您可以做的不是使用 Servlet,而是創建一個注入HttpServletRequest
和HttpServletResponse
的 Jersey 資源方法。 然后您可以使用與 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 模式更改為/api/*
之類的其他內容,以便可以訪問其他 servlets(例如處理 static 內容的默認 servlet)。 這樣,其他 static 文件(如 CSS 和 JS 文件)可以按照容器提供的方式處理。
另一種選擇是使用 Jersey 的過濾器配置,如我在腳注中發布的鏈接中所述。 就個人而言,我更喜歡前一種方法,因為 web 應用程序和 REST API 的 URL 是分開的。
1.可以配置Jersey轉發請求。 它涉及將 Jersey 配置為作為 servlet 過濾器而不是 Servlet 運行,並設置配置 init-param。 請參閱Jersey /* servlet 映射導致 static 資源的 404 錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.