【转】servlet提交表单(思考了好多天)
【http://ants620.blog.51cto.com/19390/7895】
这几天一直在学习servlet,当我正要调试一个表单提交的程序,发生了HTTP404错误,即找不到相应的类。于是我检查了自己的环境配置,完美无缺。
把servlet应用程序放在/web-inf/classes下,在web.xml配置:
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-patter>
</servlet-mapping>
可为什么就运行不了了呢。百思不得其解。查找了好多资料,可自己还是没有错误。
经过对问题苦苦思索了几天,觉得问题是出在目录查找上。
因为开始的url是:[url]http://localhost:8080/servlet[/url]*-**amples/form.html
提交后变成了:<a href='http://localhost:8080/servlet/hello?name="aa">[url]http://localhost:8080/servlet/hello?name=[/url]"aa"
而我的应用程序却不在/目录下,而是在/servlt*-**amples/下。该怎么解决呢?
于是我在提交的表单程序上改了action属性。即:
<form action="/servlet-examples/servlet/hello" method="get">
这样问题得到了圆满的解决。解决之后,我想这个问题可以在tomcat服务器也该能够通过配置得到解决
把servlet应用程序放在/web-inf/classes下,在web.xml配置:
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-patter>
</servlet-mapping>
可为什么就运行不了了呢。百思不得其解。查找了好多资料,可自己还是没有错误。
经过对问题苦苦思索了几天,觉得问题是出在目录查找上。
因为开始的url是:[url]http://localhost:8080/servlet[/url]*-**amples/form.html
提交后变成了:<a href='http://localhost:8080/servlet/hello?name="aa">[url]http://localhost:8080/servlet/hello?name=[/url]"aa"
而我的应用程序却不在/目录下,而是在/servlt*-**amples/下。该怎么解决呢?
于是我在提交的表单程序上改了action属性。即:
<form action="/servlet-examples/servlet/hello" method="get">
这样问题得到了圆满的解决。解决之后,我想这个问题可以在tomcat服务器也该能够通过配置得到解决
的。我不知道怎么改。看到的人士如果懂得,就说下。
***********************************************************************
(请博主删除掉楼上的两次回复,还没写完就按了回车)
呵呵,主要是对 URI 的构成规则有了误解。
URI 的构成规则中规定,http://hostname:port/ContextPath/ServletPath/Pathinfo中,端口后边的第一个路径叫Context Path。在你的文章中,就是 servlet-examples了。从物理上来讲,如果没有特别配置,Context Path基本上等于 tomcat/webapps 下面相应目录的名称,例如 Tomcat/webapps/servlet-examples 目录。
在 web.xml 中配置的 servlet 名称和路径、映射等,都是在“Context Path”这个势力范围内进行的,也就是说,只有当你的请求是“http://localhost:8080/servlet-examples/abcdefg...”时,"abcdefg..."中的内容才会被servlet-examples目录下的 web.xml 识别。
你的两次尝试中,第一个URL:http://localhost:8080/servlet/hello,此时,tomcat会去C:/Tomcat/webapps/ROOT/WEB-INF/web.xml 中寻找映射为“servlet/hello”的servlet,或者到 C:/Tomcat/webapps/servlet/WEB-INF/web.xml 中去寻找名为 hello 的 servlet。而你真正的 hello 程序却是放在 C:/Tomcat/webapps/servlet-examples/WEB-INF/classes 目录下,配置文件在 C:/Tomcat/webapps/servlet-examples/WEB-INF/web.xml 中,那当然是找不到的了。
第二个URL:http://localhost:8080/servlet-exampes/servlet/hello,此时,Tomcat会去 C:/Tomcat/webapps/servlet-examples/WEB-INF/web.xml中去寻找"servlet/hello"这个映射所对应的servlet——而你已经配置了,所以能找到。
如果你坚持要采用原先的URL来访问,那么,把你的程序以及web.xml移动到 Tomcat/webapps/ROOT目录下去。
呵呵,主要是对 URI 的构成规则有了误解。
URI 的构成规则中规定,http://hostname:port/ContextPath/ServletPath/Pathinfo中,端口后边的第一个路径叫Context Path。在你的文章中,就是 servlet-examples了。从物理上来讲,如果没有特别配置,Context Path基本上等于 tomcat/webapps 下面相应目录的名称,例如 Tomcat/webapps/servlet-examples 目录。
在 web.xml 中配置的 servlet 名称和路径、映射等,都是在“Context Path”这个势力范围内进行的,也就是说,只有当你的请求是“http://localhost:8080/servlet-examples/abcdefg...”时,"abcdefg..."中的内容才会被servlet-examples目录下的 web.xml 识别。
你的两次尝试中,第一个URL:http://localhost:8080/servlet/hello,此时,tomcat会去C:/Tomcat/webapps/ROOT/WEB-INF/web.xml 中寻找映射为“servlet/hello”的servlet,或者到 C:/Tomcat/webapps/servlet/WEB-INF/web.xml 中去寻找名为 hello 的 servlet。而你真正的 hello 程序却是放在 C:/Tomcat/webapps/servlet-examples/WEB-INF/classes 目录下,配置文件在 C:/Tomcat/webapps/servlet-examples/WEB-INF/web.xml 中,那当然是找不到的了。
第二个URL:http://localhost:8080/servlet-exampes/servlet/hello,此时,Tomcat会去 C:/Tomcat/webapps/servlet-examples/WEB-INF/web.xml中去寻找"servlet/hello"这个映射所对应的servlet——而你已经配置了,所以能找到。
如果你坚持要采用原先的URL来访问,那么,把你的程序以及web.xml移动到 Tomcat/webapps/ROOT目录下去。
关于 Context Path及 URI 的构成,请参考 Servlet 规范。如果是 Servlet 2.4 的规范,那么应该在第 38 页,4.4 节,Request Path Elements。另:第11章,Mapping Requests to Servlets 也可以看一看。