Servlet映射、生命周期和相对路径与绝对路径

一、tomcat和servlet的关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件.

二、Servlet映射

  1. 当创建一个TestServlet文件的时候,需要在web.xml中配置TestServlet文件。
public class DataServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}
  1. 为什么需要在web.xml中配置TestServlet。让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用
  <servlet>
  	<!-- 给servlet取名字,一般跟我们写的servlet类名相同 -->
  	<servlet-name>TestServlet</servlet-name>
  	<!-- servlet的全限定类名,也就是servlet的位置 -->
  	<servlet-class>com.jd.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<!-- 跟上面的servlet名字相同 -->
  	<servlet-name>TestServlet</servlet-name>
  	<!-- 浏览器通过该url找到servlet。/一定要加,相当于项目名称 -->
  	<url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>

映射步骤:首先浏览器通过127.0.0.1/test/TestServlet来找到web.xml中的url-pattern。2.匹配到了url-pattern后,就会找到第二步servlet的名字TestServlet,知道了名字,就可以通过servlet-name找到第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。

三、Servlet生命周期

init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:

  1. init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。同时也可用于获取web.xml中的数据
	//sevlet对象属于实例(程序运行结束之前,缓存中只有一个对象存在)
    public TestServlet() {
    	//用于成员变量赋值,会触发对象创建
    	//默认情况下,第一次使用该Servlet时创建对象
    	//如果配置<load-on-startup>1<load-on-startup>,则servlet对象随着tomcat的启动而创建
        super();
    }

	public void init() throws ServletException {
		//servlet对象创建后,该方法立即执行,用于获取web.xml中的数据。
		//由于servlet方法式单例,仅仅创建一次,所以该方法只执行一次
		super.init();
		//System.out.println("init"+this);
		String name = getServletContext().getInitParameter("name");//获取web.xml中多个Servlet共享的值
		System.out.println(name);
		String mobile = getInitParameter("mobile");//获取自己Servlet的值
		System.out.println(mobile);
	}
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		//System.out.println("init(ServletConfig config)"+this);
		String name = config.getServletContext().getInitParameter("name");//获取web.xml中多个Servlet共享的值
		System.out.println(name);
		String mobile = config.getInitParameter("mobile");//获取自己Servlet的值
		System.out.println(mobile);
	}

web.xml中配置:

  <context-param>
  	<!-- 多个Servlet共享的值 -->
  	<param-name>name</param-name>
  	<param-value>Jimmy</param-value>
  </context-param>
  <servlet>
  	<servlet-name>TestServlet</servlet-name>
  	<servlet-class>com.zzu.servlet.TestServlet</servlet-class>
  	<init-param>
  		<!-- 自己Servlet的值 -->
  		<param-name>mobile</param-name>
  		<param-value>110</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup><!-- 在启动tomcat的时候创建servlet对象 -->
  </servlet>
  <servlet-mapping>
  	<servlet-name>TestServlet</servlet-name>
  	<url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
  1. service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
	//任何请求优先到达service方法,通过该方法确定执行doGet还是doPost
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);//将这行代码注释将不执行doget或dopost方法
	}
	
	
	//a连接 form指定method标签属性get,异步不写或者指定为get
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
	
	//form指定method标签属性get,异步指定为get
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
  1. destory,当要销毁Servlet时,Servlet容器就会调用这个方法。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
	//Servlet对象销毁之前调用,用于释放资源。由于servlet方法式单例,仅仅创建一次,所以该方法只执行一次
	//Tomcat服务器关闭时调用,项目重新发布前调用
	@Override
	public void destroy() {
		super.destroy();
		System.out.println("destroy"+this);
	}

四、HttpServlet中的service()、doPost()、doGet()的区别

  1. Service() 方法:
    不管是 get 方式或是 post 方式的请求,如果 自己写的Servlet 类中有 service() 方法,则优先调用 Service 方法进行处理。(如果覆写的service方法中调用了父类的servic()方法super.service(req,resp),则service方法处理完后,会再根据请求方式相应的doPost或是doGet方法执行)。

  2. doGet() 方法:
    在没有 service 方法的情况下如果是 get 方式的请求所调 用的处理请求的方法

  3. doPost() 方法:
    在没有 service 方法的情况下如果是 post 方式的请求所调 用的处理请求的方法

在这里插入图片描述

在这里插入图片描述
执行结果:我是service方法

五、相对路径与绝对路径

在Servlet中,"/“代表Web应用的根目录。
“./” 代表当前目录,”…/"代表上级目录

动态获取根目录目录:
request.getContextPath()

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值