0

I have simple servlet that prints something to response

@WebServlet(name = "helloServlet", value = "/hello-servlet" , s )
public class HelloServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

that what web.xml looks like:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>hello-servlet</welcome-file>
    </welcome-file-list>
</web-app>

and the problem is that url isn`t changed when it redirect to servlet in welcome-file list
my url : http://localhost:8080/testsss_war_exploded/
but should be : http://localhost:8080/testsss_war_exploded/hello-servlet

1 Answer 1

1

That is the way welcome resources are supposed to work:

The container may send the request to the welcome resource with a forward, a redirect, or a container specific mechanism that is indistinguishable from a direct request.

(Servlet 5.0 Specification)

Tomcat redirects the request internally. If you want to send a HTTP redirect, you need to do it yourself. You can check the original URI to see if the request was forwarded by the welcome files mechanism:

@WebServlet(name = "helloServlet", urlPatterns = {"/hello-servlet"})
public class HelloServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      if (req.getRequestURI().endsWith("/")) {
         resp.sendRedirect("hello-servlet");
         return;
      }
}

Another solution would be to renounce the the welcome files mechanism and explicitly bind your servlet to the applications root:

@WebServlet(name = "helloServlet", urlPatterns = {"", "/hello-servlet"})
public class HelloServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      if (req.getServletPath().isEmpty()) {
         resp.sendRedirect("hello-servlet");
         return;
      }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.