The Java Servlet specification does not include handling a PATCH request. That means that class javax.servlet.http.HttpServlet does not have a doPatch() method, unlike doGet, doPost, doPut etc.
That does not mean that a Java Servlet can not handle PATCH requests. It is quite simple to make it do that.
The trick is overriding the service(request,response) method – and have it respond to PATCH requests (in a special way) and to all other requests in the normal way. Or to do it one step more elegantly:
- create an abstract class – MyServlet for example – that extends from HttpServlet, override servce() and add an abstract doPatch() method – that is not supposed to be ever invoked but only be overridden
package nl.amis.patch.view; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class MyServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getMethod().equalsIgnoreCase("PATCH")){ doPatch(request, response); } else { super.service(request, response); } } public abstract void doPatch(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } - any servlet (class) that should handle PATCH requests should extend from this class [MyServlet] and implement the doPatch() method
package nl.amis.patch.view;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(name = "TheServlet", urlPatterns = { "/theservlet" })
public class TheServlet extends MyServlet {
private static final String CONTENT_TYPE = "text/html; charset=windows-1252";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPatch(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>TheServlet</title></head>");
out.println("<body>");
out.println("<p>The Servlet has received a PATCH request and will do something meaningful with it! This is the reply.</p>");
out.println("</body></html>");
out.close();
}
}
Here is the result of sending a PATCH request from Postman to the Servlet:
