簡體   English   中英

Restful web 服務以及 servlet 中的 web 應用程序

[英]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,而是創建一個注入HttpServletRequestHttpServletResponse的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM