1

The following error occurs when I start the server

Server Tomcat v7.0 Server at localhost failed to start.

When I look into the console for errors ,I think this is the problem "The servlets named [Myclass] and [mypropackage.Myclass] are both mapped to the url-pattern [/myclass] which is not permitted".

what is the problem here and how to fix it ?

Web.xml code

<?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>myproject</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>Myclass</servlet-name>
      <servlet-class>mypropackage.Myclass</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>Myclass</servlet-name>
      <url-pattern>/myclass</url-pattern>
   </servlet-mapping>
</web-app>

Servlet -class code :

package mypropackage;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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 Myclass
 */
 @WebServlet("/myclass")
 public class Myclass extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Myclass() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#service(HttpServletRequest request,    
  HttpServletResponse response)
     */
    protected void service(HttpServletRequest request,    
    HttpServletResponse response) throws ServletException, IOException {
        System.out.println("service method");
        String uname = "user";
        String pass = "abcd";
        String un = request.getParameter("username");
        String pw = request.getParameter("password");
        String msg = " ";
        if(un.equals(uname) && pw.equals(pass))
        {
            msg = "hello" + un + "login successful";
        }
        else
        {
            msg = "hello" + pw + "login failed";
        }

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(msg);

    }

  }

This is logs in console:

Caused by: java.lang.IllegalArgumentException: The servlets named [Myclass] and [mypropackage.Myclass] are both mapped to the url-pattern [/myclass] which is not permitted
    at org.apache.catalina.deploy.WebXml.addServletMapping(WebXml.java:293)
    at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2428)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2103)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2064)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2057)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1304)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:889)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5412)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
phpnew
  • 31
  • 5

1 Answers1

1

You indeed defined your servlet twice:

  1. using @WebServlet("/myclass") annotation into class mypropackage.MyClass

  2. Using web.xml where you defined servlet Myclass.

Both instances of servlet are mapped to the same URL and this is what container tells you. You just should use only one of the ways to define servlet: using annotations or using web.xml. I prefer to use web.xml but probably this is because I used to define servelts there years before the annotations were invented. So, you are welcome to make your choice yourself.

IMHO using web.xml is more flexible. You do not have to decide what is the URL you are mapping your servlet at development time and can deploy the same servlet several times and map it to multiple URLs.

AlexR
  • 114,158
  • 16
  • 130
  • 208