博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat中的servlet配置理解
阅读量:6226 次
发布时间:2019-06-21

本文共 3204 字,大约阅读时间需要 10 分钟。

hot3.png

        刚开始使用Servlet时,因为web.xml的url-pattern和html中form表单的action的访问路径配置不对,总是出现404页面不存在的错误。根本原因是对Tomcat处理Http请求的过程理解不深。

        Tomcat处理Http请求过程:

        假设来自客户的请求为:

        http://localhost:8080/TestTomcat/loginSucceed

        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:

 <url-pattern>/loginSucceed</url-pattern>//注意此处一定不要再加上项目路径即Context的path,而且前面一定要加"/",否则启动失败

welcome.html
welcome.htm
welcome.jsp
HelloServlet
com.heyujun.servlet.HelloServlet
HelloServlet
/loginSucceed
//注意此处一定不要再加上项目路径即Context的path

welcome.html:

下面提交表单的action="/TestTomcat/loginSucceed",我觉得这里的路径配置也是和上面一样有两种方法,理由同HelloServlet类中所述

1、action="/TestTomcat/loginSucceed"

2、action="loginSucceed"  

login page
//注意:此处一定要加上项目路径即Context的path,用来找特定的webapp,后面的/loginSucceed才是Servlet对应的url //而web.xml中的 url-pattern就是此处的/loginSucceed First name:
Last name:

 

转载于:https://my.oschina.net/henryking/blog/757743

你可能感兴趣的文章
ObjectOutputStream和ObjectInputStream
查看>>
博客增加二维码功能
查看>>
static作用
查看>>
TCP协议中的三次握手和四次挥手(图解)
查看>>
RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能
查看>>
使用Xcode和Instruments调试解决iOS内存泄漏
查看>>
[翻译] MotionBlur
查看>>
在这些形式的验证码
查看>>
Android学习笔记(四十):Preference使用
查看>>
Codeforces Beta Round #6 (Div. 2 Only) E. Exposition multiset
查看>>
ThinkPhp学习09
查看>>
家庭常用5号/7号电池购买及使用攻略
查看>>
IT架构之IT架构标准——思维导图
查看>>
ZOJ3827 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江I称号 Information Entropy 水的问题...
查看>>
List、Map和Set实现类
查看>>
Android Fragment 真正彻底的解决(下一个)
查看>>
zoj 3659 并检查集合
查看>>
VS2010如何调试IIS上的网站
查看>>
Codeforces 327B-Hungry Sequence(素数筛)
查看>>
iPhone 6/plus iOS Safari fieldset border 边框消失
查看>>