Servlet从入门到精通四——Servlet开发中的细节

                                                                                               Servlet开发中的细节

1、细节一

 

加入你拷贝一个已经存在的Web应用day05Myeclipse,然后你把它重命名为t_day05,请问,

你发布后,在浏览器中用/t_day05可以访问到Web资源吗?

 

答案是否定的。

虽然你改了名字,可是配置没变,右键项目点Properties,找到MyEclipse下的Web,如下图:

Web Context--root是路径名,必须改这里才起作用。

2、细节二

1)一个Servlet可以被映射到多个URL地址上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个servlet的注册名。

<servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/servlet/ServletDemo1</url-pattern>
  </servlet-mapping>
  
  
<servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/aa</url-pattern>
  </servlet-mapping>
  
  <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/1.html</url-pattern>
</servlet-mapping>

2)在Servlet映射的URL中可以使用  通配符,但只有两种固定的格式

    一种是:  *.扩展名             <url-pattern>*.do</url-pattern> 

    另一种是:/开头,/*结尾        <url-pattern>/servletdemo1/*</url-pattern>

 

3、细节三

问题:对于如下的一些映射关系

Servlet1 映射到 /abc/*

Servlet2 映射到 /*

Servlet3 映射到 /abc

Servlet4 映射到 *.do

1)当请求URL为“/abc/a.html”时,“/abc/*”和“/*”都匹配,哪个Servlet响应?

         Servlet1响应,因为它长的像。

2)当请求为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个Servlet响应?

        Servlet1响应,因为*.前面的优先级最低。

 

4、细节四

Servlet引擎是Web服务器中用来调用Servlet的程序。

Servlet不能独立运行,它完全由Servlet引擎来控制和调度。

1)针对客服端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象。也就是说,Servlet实例对象一旦被创建,它就会驻留在内存中,为后续的其它请求服务,直至Web容器退出,servlet对象才会被销毁。

Servlet实例对象不会在Web服务器打开的时候创建,而是在第一次访问Servlet的时候创建。

当服务器停止或者Web应用被移除的时候Servlet实例对象被销毁。

测试程序:

package cn.itcast;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {
	
	
	@Override
	public void init() throws ServletException {
		super.init();
		System.out.println("init");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	public void destroy() {
		super.destroy();
		System.out.println("destroy");
	}
	
	

}


 

servlet实例对象被调用的时候,init方法执行,输出init

servlet实例对象销毁的时候,destroy方法执行,输出destroy

         2)在Servlet的整个生命周期内,Servletinit方法只被调用一次。而对一个servlet的每次访问请求都导致servlet引擎调用一次servletservice方法。对于每次访问请求,servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的servletservice方法,service方法再根据请求方式分别调用doXXX方法。

比如,有10个人发请求,每个人访问10次,有100service方法,100HttpServletRequest

100HttpServletResponse。但init方法只调用一次,只有一个servlet实例对象。

HttpServletResponseHttpServletRequest在访问完会被销毁。所以,大型网站每天有很多人访问,但是因为他们不可能同一秒钟访问,所以网站可以承受住。

 

5、细节五

xml中,如果在<servlet>子元素中配置了<load-on-startup>元素,那么WEB服务器启动时,

会装载和创建Servlet实例对象、以及调用init方法。而不是第一次访问servlet时候创建。

<servlet>
    <servlet-name>ServletDemo2</servlet-name>
    <servlet-class>cn.itcast.ServletDemo2</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>


 

Struts框架中有应用

 

6、细节六

 如果某个Servlet的映射路径为一个/,那么这个servlet就是当前web应用程序的缺servlet。

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它的访问请求都交给缺省Servlet处理。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。

 在Tomcat6.0安装目录下的conf文件夹下的web.xml中配置了缺省Servlet。

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

  <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

 

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值