Tomcat中的servlet配置理解
刚开始使用Servlet时,因为web.xml的url-pattern和html中form表单的action的访问路径配置不对,总是出现404页面不存在的错误。根本原因是对Tomcat处理Http请求的过程理解不深。
子长网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联成立与2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。Tomcat处理Http请求过程:
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/TestTomcat/loginSucceed,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host
5) localhost Host获得请求/TestTomcat/loginSucceed,匹配它所拥有的所有Context
6) Host匹配到路径为/TestTomcat的Context
7) path="/TestTomcat"的Context获得请求/loginSucceed,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为/loginSucceed的servlet,对应于HelloServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser
对以上过程不理解的可以查看我转载的博文:Tomcat工作原理详解
从以上过程可以看出:一个完整的Http URL在Tomcat中被层层剥离,首先通过域名(上面的localhost)匹配虚拟主机,并将/TestTomcat/loginSucceed传给对应主机;然后主机通过/TestTomcat匹配Context的path,将/loginSucceed传给特定的Context(其实就是web应用,因为一台主机上可以同时运行多个web应用,即为多个web应用提供服务器的功能);Context根据/loginSucceed来匹配Servlet,通过和url-pattern来匹配。所以我们在web.xml中的url-pattern中不能带项目名。而form表单中的action指向的URL是主机名后的部分,如上面的/TestTomcat/loginSucceed,所以此处一定要加上项目名(用来匹配哪个Context,即web应用)
以下是类似实践:
我建了个TestTomcat项目,建包com.heyujun.servlet,包下建类HelloServlet
HelloServlet类:
注意:在类中的URL路径配置有两种方法:
1、response.sendRedirt("/TestTomcat/loginSucceed1.html");
//此处如果想让浏览器访问longinSucceed.html文件,一定要加上项目名,和.html;而且这会使浏览器显示的URL改变
2、response.sendRedirt("loginSucceed1.html");如果不想带上项目名,就直接写HTML、JSP等文件的名字,一定不要加"/",不要写成response.sendRedirt("/loginSucceed1.html");
猜测源码是根据URL前是否有"/",如果有就将紧跟"/"的文件名作为项目名。如果过写成response.sendRedirt("/loginSucceed1.html");可能会把loginSucceed1.html作为项目名,而机器上并不存在该项目,所以报404错误
public class HelloWorld extends HttpServlet { private String message; public void init() throws ServletException { // 执行必需的初始化 message = "Hello World"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirt("/TestTomcat/loginSucceed1.html"); // response.sendRedirt("loginSucceed1.html"); } public void destroy() { // 什么也不做 } }
web.xml:
welcome.html:
下面提交表单的action="/TestTomcat/loginSucceed",我觉得这里的路径配置也是和上面一样有两种方法,理由同HelloServlet类中所述
1、action="/TestTomcat/loginSucceed"
2、action="loginSucceed"
网页题目:Tomcat中的servlet配置理解
文章起源:http://pwwzsj.com/article/chojss.html