Servlet&ServletContext

Servlet

1) 概述

  • 官方:servlet是运行在web服务器中能够编写java代码的小型程序
  • 解释说法:
    ①servlet本质上就是一个java的接口类
    ②和普通的类相比,一个类要想在服务端运行就需要实现servlet接口规范

2)作用

在服务器端接受浏览器带来的请求数据(请求行 请求头 请求体)以及给浏览器做响应数据(响应行 响应头 响应体)

3)servlet快速入门

一、servlet2.5的方式: 有web.xml配置文件

步骤:
1 创建web项目  JAVAEE 5(servlet2.5) 带web.xml配置文件
2 编写一个类 实现java提供的servlet规范
3 告诉tomcat 自己 servlet的浏览器访问地址
		ps: tomcat只要一启动 就会去加载web.xml文件 只加载一次
servlet的创建和服务方法service的执行都是有tomcat自动完成的

在这里插入图片描述

二、 扩展–servlet3.0的方式: 没有web.xml配置文件

1. 创建JavaEE6(含6)以上的工程
2. 创建一个类 实现servlet接口
3. 创建servlet,在@WebServlet注解中添加urlPatterns = "/demo2",作为请求路径

在这里插入图片描述

4)servlet的生命周期

生命周期:从生到死的流程

servlet从生到死的流程都离不开以下3个方法

init方法 service方法 destroy方法都和servlet的生命周期相关 

init方法   Servlet对象只要一创建出来就会调用的方法  
service方法 处理浏览器交互的方法  
destroy方法 对象销毁后执行的方法

面试题:聊一下Servlet的生命周期?

当浏览器第一次访问servlet的时候 服务器会创建servlet对象 调用init方法做初始化  对象只创建一次 所有人用的都是同一个创建出来的servlet对象 所以servlet是单例
每次访问到servlet的时候 servlet的service方法就会被调用  访问一次调用一次
当服务器关闭的时候 服务器会调用destroy方法销毁掉当前servlet对象 做对象销毁后的操作

5)servlet的体系结构

问题

目前我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?

查询到的继承体系:

Servlet--接口
	|
	|
	|
GenericServlet
	|
	|
	|
HttpServlet (功能最多)

企业开发中:继承HttpServlet,只需要复写doget和dopost方法,而开发工具已经提供好了模板,我们直接用即可

public class MyServlet5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("和浏览器交互了..");
    }

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

6)Servlet的配置

1 url-pattern配置

我们在创建servlet后,如果想要这个servlet可以被我们访问到,必须在web.xml文件中对其进行配置。
在其中有一个url-pattern的标签是用于确定我们访问一个servlet的路径
接下来,我们详细介绍一下关于这个标签的配置

问题1:一个servlet是否可以被不同的路径映射?

 <servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>cn.itcast.web.ServletDemo1</servlet-class>
 </servlet>
 <servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/sd1</url-pattern>
        <url-pattern>/sd2</url-pattern>
        <url-pattern>/sd3</url-pattern>
        <url-pattern>/sd</url-pattern>
</servlet-mapping>

答案是可以的,但一般在开发中,我们只需要配置一个有效路径即可

问题2:路径映射的配置方式还有哪些?

1 完全路径匹配 我们之前写的都是完全匹配方式 ,它要求必须以”/”开始 
				例如: /aaa   /a/aa/aaa 
2 目录匹配 必须以”/”开始,以”*”结束
				例如:/*    /a/*
3 扩展名匹配 不能以”/”开始,以*.xx结束 xx代表的是后缀名	
				例如: *.do  *.action *.abc ...

问题3:多种匹配的优先级问题?

 <servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
        <servlet-name>ServletDemo2</servlet-name>
        <url-pattern>/aaa</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
        <servlet-name>ServletDemo3</servlet-name>
        <url-pattern>*.do</url-pattern>
  </servlet-mapping>
只有一个servlet会执行,执行的结果是按照优先级去执行的
优先级:完全匹配>目录匹配>扩展名匹配

2 load-on-startup配置

servlet的默认创建是在第一次访问的时候

servlet在服务器启动时,就创建出来

<servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>cn.itcast.web.ServletDemo1</servlet-class>
  		<!--将servlet的创建时机提前到服务器加载
                    取值:正整数
                    特点:数值越小 优先级越高
        -->
        <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

load-on-startup的取值是正整数,数字越小,优先执行权就越高

扩展:数字1被tomcat默认的servlet给占用了,在tomcat的web.xml中我们可以看到也使用了一个servlet

ps:tomcat一启动 会加载2个web.xml文件,一个是自己项目的web.xml,一个tomcat的web.xml

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
 </servlet-mapping>

该servlet是tomcat帮我们创建的,主要用来处理其它的servlet处理不了的请求

比如在当前下访问不到的资源都会走该servlet,该servlet底层默认走写好的页面(404 500…)

Servlet的路径

我们在开发中,经常在页面上通过表单或超连接向服务器发送请求,如果我们访问的是一个servlet,那么这时访问servlet的路径应该如何书写?接下来我们就介绍一下,关于在客户端浏览器访问servlet的路径问题.

servlet的访问路径分为2种

 servlet的访问地址分为2种:
                  绝对路径(网络地址):企业开发的选择 --掌握
                       带协议的绝对路径: 地址栏的访问地址
                            例如:http://localhost:8080/web06_2/hello
                            即可以访问本机的也可以访问外部的

						不带协议的绝对路径:省略协议和端口号
                            例如:/web06_2/hello  以/开始以资源名称结尾
                            默认访问是本机的项目


                  相对路径(网络地址): 比较自己和目标资源的相对地址
                  index.html: http://localhost:8080/web06_2/html/html2/index.html
                  MyServlet:  http://localhost:8080/web06_2/hello

结论:
对于我们后续的学习与开发中,我们使用绝对路径会比较多一些,而在使用绝对路径时,我们主要使用的是不带协议的绝对路径,而带协议的绝对路径只要在访问站外资源时才会使用。对于相对路径,我们需要分析它们的相对关系,所以不建议大家使用。

ServletContext对象

概述

ServletContext:Servlet的上下文对象 (全局管理者)

特点:在整个项目中就只有一个ServletContext对象

创建:tomcat一启动就会为部署在它上面的项目创建一个对应的全局管理者-ServletContext

销毁:tomcat一关闭就会销毁全局管理者-ServletContext

作用

1 可以作为容器,在多个servlet之间共享数据 (重要)
		1.setAttribute(String key Object vlue)        存
		2.Object getAttribute(String key)             取   如果没有取到是null       
		3.removeAttribute(String key)                 删	
		
		
2 可以获取服务器上项目的资源路径和流(路径和流)---(重要)下载
		1. getRealPath(String path)  获取虚拟路径
	    2. getResourceAsStream(String path)	  获取当前项目在虚拟路径上的某个资源的流

API实现

获取servletContext对象:

getServletContext()

数据存取操作:保存在ServletContext中的数据是项目全局共享的数据

作为容器:用来在多个servlet之间传递信息数据

setAttribute(String key Object vlue)   存    
Object getAttribute(String key)   取          
removeAttribute(String key)  删 			    

读取项目资源的方法

1. getRealPath(String path)
	获取WEB项目的资源路径
	
2. getResourceAsStream(String path)
	根据WEB项目的资源流

3. getInitParameter(String name) --和框架有关系的
  	获取web.xml中的参数内容 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值