web基础day08-servlet

  1. Servlet概述
    a. Sun公司提供的一个动态资源开发的技术。Servlet本质就是一个java文件。需要先编译后执行,并且需要存储在servlet容器中。
    b. servlet容器:存储并运行servlet的环境称之为servlet容器,tomcat
    c. web容器:存储并运行web资源的环境称之为web容器。tomcat

    1. 实现servlet
      a. 第一步:
      i. 创建一个类,实现servlet接口,即可变成一个servlet文件。

       		import java.io.*;
       		import javax.servlet.*;
       		
       		public class FirstServlet extends GenericServlet{
       		        public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
       		                res.getWriter().write("hello servlet");
       		        }
       		
       		}
      

      ii. 将编译后的文件放入classes目录
      1) 编译方式:
      a) 打开cmd窗口
      临时引入环境变量 set classpath=%classpath%;[从tomcat/lib下找到servlet-api拖动到cmd窗口]
      b) 使用javac指令编译FirstServlet.java
      javac -d . FirstServlet.java
      c) 将编译后的文件夹放入class目录中

      b. 第二步:为servlet添加配置文件。—添加servlet映射
      在web.xml中添加配置如下:

       		 <servlet>
       		 
       		        <servlet-name>FirstServlet</servlet-name>
       		        <servlet-class>x.xx.FirstServlet</servlet-class>
       		        
       		    </servlet>
       		    
       		   <servlet-mapping>
       		        <servlet-name>FirstServlet</servlet-name>
       		        <url-pattern>/servlet/FirstServlet</url-pattern>
       		    </servlet-mapping>
      

    一般是用myeclipse来开发,可以省去很多步骤

    1. Servlet问题分析
      a. HttpServletRequest 和HttpServletResponse两个接口如何创建对象的?
      虽然上述两个接口定义了变量request,和response但是真正是实现对象创建的应该是他们的两个子实现类,HttpServletRequestWrapper和HttpServletResponseWrapper。
      b. 页面中的静态资源为什么可以被直接访问?
      页面中的静态资源和没有人要的资源都会交给conf/web.xml里的defaultServlet来处理。defaultServlet也称之为缺省servlet。
      i. 地址栏中输入的任何内容都会作为虚拟路径使用,书写静态资源名称,如(1.html)也是虚拟路径,这个路径如果没有和url-pattern相匹配,则会交给defaultServlet处理。
      ii. defaultServlet会先在静态资源中作比对,如果有静态资源名称与之相同,则加载显示,如果没有则会显示404页面。

    2. servlet细节一
      servlet组成:servlet标签和servlet-mapping标签
      servlet标签称之为注册servlet标签,servlet-mapping标签称之为servlet映射标签。
      注册servlet标签中添加子标签servlet-name和servlet-class,代表servlet的名称和具体包名类路径。映射servlet标签中添加子标签servlet-name和url-pattern。

      FirstServlet
      cn.tedu.FirstServlet


      FirstServlet
      /servlet/FirstServlet

      之所以书写成注册和映射servlet两部分,是因为
      i. 考虑以后可能有多个虚拟路径同时映射到真实的servlet身上,以上形式只需要书写映射servlet标签即可,相对来说,较为简单。
      ii. servlet名称不允许重复。

    3. servlet-细节二
      a. servlet虚拟路径的通配形式–共两种
      i. 以"/“开头,以”/"结尾的通配形式。
      ii. "
      .后缀"的通配形式。*.do

      FirstServlet
      xxx.xx.FirstServlet

      FirstServlet /servlet/* FirstServlet cn.tedu.FirstServlet FirstServlet *.do
    4. servlet细节三–通配路径的优先级
      • 对于如下的一些映射关系:
      ○ Servlet1 映射到 /abc/*
      ○ Servlet2 映射到 /*
      ○ Servlet3 映射到 /abc
      ○ Servlet4 映射到 .do (永远匹配级最低)
      • 问题:
      ○ 当请求URL为“/abc/a.html”,“/abc/
      ”和“/”都匹配,哪个servlet响应
      § Servlet引擎将调用Servlet1。
      ○ 当请求URL为“/abc”时,“/abc/
      ”和“/abc”都匹配,哪个servlet响应
      § Servlet引擎将调用Servlet3。
      ○ 当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应
      § Servlet引擎将调用Servlet1。
      ○ 当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应
      § Servlet引擎将调用Servlet2。
      ○ 当请求URL为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,哪个servlet响应
      § Servlet引擎将调用Servlet2。
      • 注意:
      ○ 虚拟路径与通配路径越相似的路径越优先采用。
      ○ *.do永远匹配级别最低。

    5. servlet细节四—load-on-startup标签
      a. load-on-startup标签可以书写在注册servlet标签中。在load-on-startup标签中间可以添加一个数字,如果这个数字大于等于0,那么当前servlet会随着web应用的启动而加载。如果数字小于0,则servlet不会随着web应用的启动而加载,仍然需要访问之后才会创建对象完成初始化。
      b. 注意:load-on-startup标签中的数字表示优先级,数字越小,优先级越高,越优先启动。
      需求:
      在服务器启动的时候自动创建表格student,并添加表数据。

    6. servlet细节五—缺省servlet
      在conf/web.xml中包含一个缺省servlet(defaultServlet),会随着tomcat服务器的启动而加载,负责所有web应用静态资源的加载,如果用户访问的资源路径不存在或者服务器报错,都会交给缺省servlet来处理。
      缺省servlet的url-pattern配置为一个"/"

      default
      /

      “/“为缺省servlet特有的虚拟路径形式,任何一个servlet如果配置虚拟路径为”/”,那么当前servlet都会作为缺省Servlet进行工作。
      a. 问题:"/“和”/"意义上的区别:
      i. "/"是缺省servlet的虚拟路径,一旦servlet配置这个虚拟路径,则会作为缺省servlet使用,负责静态资源和没人要的资源加载。
      ii. "/
      "是通配的虚拟路径形式,表示在*号的位置输入任意的内容都会与当前的路径匹配,所有的路径都会使用/*来通配,使用对应的servlet显示结果。

    7. servlet细节六—线程安全问题
      ○ 当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
      ○ 如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。
      ○ SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。
      ○ 对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。
      ○ 实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。
      a. 线程安全问题的解决方案:
      i. 多实用局部变量,少使用成员变量和静态变量。因为成员变量和静态变量都会引发线程安全问题。
      ii. 合理加锁。锁一定要锁住关键部分代码,否则会降低代码的执行效率。

    8. Servlet细节七–servlet运行过程及生命周期
      a. servlet运行过程:
      i. 通过hosts文件或域名解析器,将域名解析为一个ip地址,找到对应的服务器,再通过端口号确定是哪一个服务器。
      ii. 通过Host请求确定是当前服务器的哪一台虚拟主机。
      iii. 通过请求行的请求资源名称部分,确定是哪一个web应用的虚拟路径。
      iv. 通过请求行的请求资源名称部分,确定是当前web应用的哪一个web资源的虚拟路径。
      再使用web资源的虚拟路径与web.xml文件中的url-patter作比较,确定是哪一个真实的servlet文件。
      v. servlet返回的结果会放在response缓冲区中,在服务器内组织成一定结构之后,再发送给浏览器展示。
      b. servlet生命周期
      在servlet被初次访问的时候,会创建一个对象驻留在tomcat内存中。这个对象会重复使用。在对象创建之后,会立刻调用init方法完成初始化的操作。每一次访问servlet都会导致service方法执行,提供服务。在web应用被移除容器或者或者服务器关闭的情况下,servlet对象会被销毁,在销毁之前会自动调用destroy方法完成一些善后的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值