Jetty - Servlet cannot be found

2019-06-28 01:18发布

问题:

I am new to Servlets and wanted to call a simple Servlet by using Eclipse's Jetty plugin. I can call the index.html, but when trying to access the Servlet I get:

HTTP ERROR: 404
Problem accessing /ProjectServlet. Reason:
NOT_FOUND

I think I configured all my files correctly and cannot explain why Jetty returns this error.

Thanks for helping me!


index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>TEST</title>
</head>
<body>
    <h1>Servlet Call Test:</h1>
    <form action="/ProjectServlet" method="GET">
        <input type="text" name="name" maxlength="20" value="Name" onfocus="this.select()"/><br>
        <input type="submit" name="callservlet" value="Call Servlet."/>
    </form>
</body>
</html>

ProjectServlet.java

package servlets;


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ProjectServlet
 */
@WebServlet(description = "Servlet to return JSON response with project list", urlPatterns = { "/ProjectServlet" })
public class ProjectServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public ProjectServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //Call Servlet Button
        if (request.getParameter("callservlet") != null) {

            response.setContentType("application/json");

            String name = request.getParameter("name"); 
            String jsonexample = "hi " + name; 

            response.getWriter().write(jsonexample);
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ProjectServlet</servlet-name>
    <servlet-class>servlets.ProjectServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ProjectServlet</servlet-name>
    <url-pattern>/ProjectServlet</url-pattern>
  </servlet-mapping>
</web-app>

回答1:

This should be as shown below to add the context path before Servlet url.

<form action="${pageContext.servletContext.contextPath}/ProjectServlet" 
         method="GET">

instead of

<form action="/ProjectServlet" method="GET">


回答2:

Use either web.xml declaration or use annotation you are using both that's why conflicting situation occurs and 404 has been returned.So either remove annotation or mappings from xml file.

Moreover specify action for submit button

 <input type="submit" name="callservlet" value="Call Servlet." onClick="action"/>
                                                               ^^^^^^^^^^^^^^^^^


回答3:

You either need to user relative path (without '/'):

<form action="ProjectServlet" method="GET">

or full path to the servelt including root context:

<form action="/yourRootContext/ProjectServlet" method="GET">

If you do not plan to change the root context you can hard code it in the page, otherwise get it using either:

Scrplet: action="<%= application.getContextPath() %>/ProjectServlet"
EL: action="${pageContext.servletContext.contextPath}/ProjectServlet"

based on your preferences.