Tomcat中的servlet配置理解

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

        Tomcat处理Http请求过程:web

        假设来自客户的请求为:
        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工做原理详解app

从以上过程能够看出:一个完整的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应用)webapp

 

    如下是相似实践:jsp

    我建了个TestTomcat项目,建包com.heyujun.servlet,包下建类HelloServletui

HelloServlet类:url

注意:在类中的URL路径配置有两种方法:spa

一、response.sendRedirt("/TestTomcat/loginSucceed1.html");
//此处若是想让浏览器访问longinSucceed.html文件,必定要加上项目名,和.html;并且这会使浏览器显示的URL改变

二、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,并且前面必定要加"/",不然启动失败

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <welcome-file-list>
	<welcome-file>welcome.html</welcome-file>
	<welcome-file>welcome.htm</welcome-file>
	<welcome-file>welcome.jsp</welcome-file>
	</welcome-file-list>
  <servlet>  
     <!-- 类名 -->  
    <servlet-name>HelloServlet</servlet-name>  
    <!-- 所在的包 -->  
    <servlet-class>com.heyujun.servlet.HelloServlet</servlet-class>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>HelloServlet</servlet-name>  
    <!-- 访问的网址 -->  
     <url-pattern>/loginSucceed</url-pattern>//注意此处必定不要再加上项目路径即Context的path
    </servlet-mapping>  
</web-app>

welcome.html:

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

一、action="/TestTomcat/loginSucceed"

二、action="loginSucceed"  

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login page</title>
</head>
<body>
	<form action="/TestTomcat/loginSucceed">
   //注意:此处必定要加上项目路径即Context的path,用来找特定的webapp,后面的/loginSucceed才是Servlet对应的url
   //而web.xml中的 url-pattern就是此处的/loginSucceed
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <input type="submit" value="提交">
	</form>
</body>
</html>
相关文章
相关标签/搜索