I'm trying to figure out servlets but i just don't seem to be able to do it right.
My file structure is as follows
C:\Tomcat\webapps | --test | --WEB-INF | ---web.xml ---classes | ---BookServlet.java ---BookServlet.class
I compile BookServlet.java, no errors.
Here's the source code of BookServlet.java
1 | /* |
2 | * BookServlet.java |
3 | * |
4 | * Created on March 6, 2007, 12:00 AM |
5 | */ |
6 | |
7 | import java.io.*; |
8 | import java.net.*; |
9 | |
10 | import javax.servlet.*; |
11 | import javax.servlet.http.*; |
12 | |
13 | /** |
14 | * |
15 | * @author Administrator |
16 | * @version |
17 | */// |
18 | public class BookServlet extends HttpServlet { |
19 | |
20 | /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. |
21 | * @param request servlet request |
22 | * @param response servlet response |
23 | */ |
24 | protected void processRequest(HttpServletRequest request, HttpServletResponse response) |
25 | throws ServletException, IOException { |
26 | response.setContentType("text/html;charset=UTF-8"); |
27 | PrintWriter out = response.getWriter(); |
28 | /* TODO output your page here |
29 | out.println("<html>"); |
30 | out.println("<head>"); |
31 | out.println("<title>Servlet BookServlet</title>"); |
32 | out.println("</head>"); |
33 | out.println("<body>"); |
34 | out.println("<h1>Servlet BookServlet at " + request.getContextPath () + "</h1>"); |
35 | out.println("</body>"); |
36 | out.println("</html>"); |
37 | */ |
38 | out.close(); |
39 | } |
40 | |
41 | // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> |
42 | /** Handles the HTTP <code>GET</code> method. |
43 | * @param request servlet request |
44 | * @param response servlet response |
45 | */ |
46 | protected void doGet(HttpServletRequest request, HttpServletResponse response) |
47 | throws ServletException, IOException { |
48 | processRequest(request, response); |
49 | } |
50 | |
51 | /** Handles the HTTP <code>POST</code> method. |
52 | * @param request servlet request |
53 | * @param response servlet response |
54 | */ |
55 | protected void doPost(HttpServletRequest request, HttpServletResponse response) |
56 | throws ServletException, IOException { |
57 | processRequest(request, response); |
58 | } |
59 | |
60 | /** Returns a short description of the servlet. |
61 | */ |
62 | public String getServletInfo() { |
63 | return "Short description"; |
64 | } |
65 | // </editor-fold> |
66 | } |
my web.xml
<web-app> - <servlet> <servlet-name>hello</servlet-name> <description>This servlet ... is hello servlet</description> <servlet-class>BookServlet</servlet-class> </servlet> - <servlet-mapping> <servlet-name>BookServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app>
Using the Tomcat Web Application Manager I start the "test" application and I get this error:
FAIL - Application at context path /test could not be started
Upon furthur investigation, i look at the log file
1 | Mar 6, 2007 9:01:37 AM org.apache.tomcat.util.digester.Digester endElement |
2 | SEVERE: End event threw exception |
3 | java.lang.reflect.InvocationTargetException |
4 | at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source) |
5 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) |
6 | at java.lang.reflect.Method.invoke(Method.java:585) |
7 | at org.apache.tomcat.util.IntrospectionUtils.callMethodN(IntrospectionUtils.java:930) |
8 | at org.apache.catalina.startup.CallMethodMultiRule.end(WebRuleSet.java:760) |
9 | at org.apache.tomcat.util.digester.Rule.end(Rule.java:229) |
10 | at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1058) |
11 | at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:633) |
12 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1241) |
13 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1685) |
14 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368) |
15 | at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834) |
16 | at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) |
17 | at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148) |
18 | at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242) |
19 | at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562) |
20 | at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369) |
21 | at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062) |
22 | at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) |
23 | at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) |
24 | at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) |
25 | at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1177) |
26 | at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:542) |
27 | at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105) |
28 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) |
29 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) |
30 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) |
31 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) |
32 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228) |
33 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) |
34 | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) |
35 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) |
36 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) |
37 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) |
38 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216) |
39 | at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) |
40 | at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) |
41 | at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) |
42 | at java.lang.Thread.run(Thread.java:595) |
43 | Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name BookServlet |
44 | at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2381) |
45 | at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2361) |
46 | ... 39 more |
47 | Mar 6, 2007 9:01:37 AM org.apache.catalina.startup.ContextConfig applicationWebConfig |
48 | SEVERE: Parse error in application web.xml file at jndi:/localhost/yves/WEB-INF/web.xml |
49 | java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name BookServlet |
50 | at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2726) |
51 | at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2752) |
52 | at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1061) |
53 | at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:633) |
54 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1241) |
55 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1685) |
56 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368) |
57 | at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834) |
58 | at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) |
59 | at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148) |
60 | at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242) |
61 | at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562) |
62 | at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369) |
63 | at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062) |
64 | at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) |
65 | at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) |
66 | at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) |
67 | at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1177) |
68 | at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:542) |
69 | at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105) |
70 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) |
71 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) |
72 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) |
73 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) |
74 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228) |
75 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) |
76 | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) |
77 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) |
78 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) |
79 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) |
80 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216) |
81 | at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) |
82 | at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) |
83 | at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) |
84 | at java.lang.Thread.run(Thread.java:595) |
85 | Mar 6, 2007 9:01:37 AM org.apache.catalina.startup.ContextConfig applicationWebConfig |
86 | SEVERE: Occurred at line 12 column 19 |
87 | Mar 6, 2007 9:01:37 AM org.apache.catalina.startup.ContextConfig start |
88 | SEVERE: Marking this application unavailable due to previous error(s) |
89 | Mar 6, 2007 9:01:37 AM org.apache.catalina.core.StandardContext start |
90 | SEVERE: Error getConfigured |
91 | Mar 6, 2007 9:01:37 AM org.apache.catalina.core.StandardContext start |
92 | SEVERE: Context [/test] startup failed due to previous errors |
Can anybody tell me what I'm doing wrong?
Thanks
The contents of both tags <servlet-name> must be the same.
<servlet> <servlet-name>hello</servlet-name> <description>This servlet ... is hello servlet</description> <servlet-class>BookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
[edit]
In the <servlet> element you declare the servlet class and give it an alias (the <servlet-name>), then you declare the requests it will handle with the element <servlet-mapping> by using its alias (hello), not the class name.
Rampage, I edited as you suggested
web.xml
<servlet> <servlet-name>BookServlet</servlet-name> <description>This servlet ... is hello servlet</description> <servlet-class>BookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BookServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
1 | Mar 6, 2007 9:26:03 AM org.apache.tomcat.util.digester.Digester fatalError |
2 | SEVERE: Parse Fatal Error at line 7 column 2: The markup in the document following the root element must be well-formed. |
3 | org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. |
4 | at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236) |
5 | at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:215) |
6 | at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:386) |
7 | at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316) |
8 | at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1438) |
9 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDispatcher.dispatch(XMLDocumentScannerImpl.java:1274) |
10 | at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368) |
11 | at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834) |
12 | at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) |
13 | at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148) |
14 | at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242) |
15 | at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562) |
16 | at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369) |
17 | at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062) |
18 | at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) |
19 | at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) |
20 | at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) |
21 | at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1177) |
22 | at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:542) |
23 | at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105) |
24 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) |
25 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) |
26 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) |
27 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) |
28 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228) |
29 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) |
30 | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) |
31 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) |
32 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) |
33 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) |
34 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216) |
35 | at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) |
36 | at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) |
37 | at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) |
38 | at java.lang.Thread.run(Thread.java:595) |
39 | Mar 6, 2007 9:26:03 AM org.apache.catalina.startup.ContextConfig applicationWebConfig |
40 | SEVERE: Parse error in application web.xml file at jndi:/localhost/yves/WEB-INF/web.xml |
41 | org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. |
42 | at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269) |
43 | at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562) |
44 | at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369) |
45 | at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062) |
46 | at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) |
47 | at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) |
48 | at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) |
49 | at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1177) |
50 | at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:542) |
51 | at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105) |
52 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) |
53 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) |
54 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) |
55 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) |
56 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228) |
57 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) |
58 | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) |
59 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) |
60 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) |
61 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) |
62 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216) |
63 | at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) |
64 | at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) |
65 | at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) |
66 | at java.lang.Thread.run(Thread.java:595) |
67 | Mar 6, 2007 9:26:03 AM org.apache.catalina.startup.ContextConfig applicationWebConfig |
68 | SEVERE: Occurred at line 7 column 2 |
69 | Mar 6, 2007 9:26:03 AM org.apache.catalina.startup.ContextConfig start |
70 | SEVERE: Marking this application unavailable due to previous error(s) |
71 | Mar 6, 2007 9:26:03 AM org.apache.catalina.core.StandardContext start |
72 | SEVERE: Error getConfigured |
73 | Mar 6, 2007 9:26:03 AM org.apache.catalina.core.StandardContext start |
74 | SEVERE: Context [/test] startup failed due to previous errors |
I don't know if using the same name for the servlet and the class has anything to do with that, I'd use a different name.
SEVERE: Parse Fatal Error at line 7 column 2: The markup in the document following the root element must be well-formed.
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
You must have messed up the syntax. Could you post the whole .xml file?
what i posted is the entire xml file
You forgot <web-app></web-app>?
thanks Infernic, now forgive my newbyness but when i run
http://localhost:8080/test/BookServlet
I get a 404
<url-pattern>/test</url-pattern>
The URL is: http://localhost:8080/test/test
thanks for putting up with me guys, last little bit
1 | /* |
2 | * BookServlet.java |
3 | * |
4 | * Created on March 6, 2007, 12:00 AM |
5 | */ |
6 | |
7 | import java.io.*; |
8 | import java.net.*; |
9 | |
10 | import javax.servlet.*; |
11 | import javax.servlet.http.*; |
12 | |
13 | /** |
14 | * |
15 | * @author Administrator |
16 | * @version |
17 | */// |
18 | public class BookServlet extends HttpServlet { |
19 | |
20 | /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. |
21 | * @param request servlet request |
22 | * @param response servlet response |
23 | */ |
24 | protected void processRequest(HttpServletRequest request, HttpServletResponse response) |
25 | throws ServletException, IOException { |
26 | response.setContentType("text/html;charset=UTF-8"); |
27 | PrintWriter out = response.getWriter(); |
28 | out.println("<html>"); |
29 | out.println("<head>"); |
30 | out.println("<title>Servlet BookServlet</title>"); |
31 | out.println("</head>"); |
32 | out.println("<body>"); |
33 | out.println("<h1>Servlet BookServlet at " + request.getContextPath () + "</h1>"); |
34 | out.println("</body>"); |
35 | out.println("</html>"); |
36 | out.close(); |
37 | } |
38 | |
39 | // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> |
40 | /** Handles the HTTP <code>GET</code> method. |
41 | * @param request servlet request |
42 | * @param response servlet response |
43 | */ |
44 | protected void doGet(HttpServletRequest request, HttpServletResponse response) |
45 | throws ServletException, IOException { |
46 | processRequest(request, response); |
47 | } |
48 | |
49 | /** Handles the HTTP <code>POST</code> method. |
50 | * @param request servlet request |
51 | * @param response servlet response |
52 | */ |
53 | protected void doPost(HttpServletRequest request, HttpServletResponse response) |
54 | throws ServletException, IOException { |
55 | processRequest(request, response); |
56 | } |
57 | |
58 | /** Returns a short description of the servlet. |
59 | */ |
60 | public String getServletInfo() { |
61 | return "Short description"; |
62 | } |
63 | // </editor-fold> |
64 | } |
echoes nothing
use out.flush() instead of out.close()
you guys are awesome
thanks
crap, i didnt select the give credits option
but thanks a lot