Servlet

1、Servlet概念

        Servlet = (Server + Applet)是运行在服务端(Tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口

        Servlet 是 JavaEE 规范之一。规范就是接口

        Servlet 也是 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。

 

作用:

        用来接收、处理客户端请求、响应数据给浏览器(客户端)Web资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能。我们可以把Servlet称为Web应用中的控制器(Controller)

Servlet的请求过程

 

2、实现步骤

第一步:创建HTML页面

<!--
使用绝对路径: /部署的项目名/要访问的资源路径
-->
<a href="/web/hello">访问HelloServlet</a>

第二步:创建Servlet类HelloServlet01

实现步骤:
*   1: 定义类实现接口 Servlet
*   2: 重写接口中的抽象方法(5个)
*   3: 配置的核心配置文件 web.xml
*
*   Servlet的两种说法
*      狭义 : Servlet专门指的是接口Servlet
*      广义 : 广义上的Servlet,指的是该接口的所有的实现类
public class HelloServlet01 implements Servlet {
    /**
     *  方法重写: service
     *  作用: 浏览器请求达到该方法
     *  参数: servletRequest对象,负责获取客户端的请求参数
     *  参数: servletResponse对象,负责向客户端响应数据
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet 欢迎你");
        //向客户端响应字符串 Hello,I am Servlet
        servletResponse.getWriter().write("Hello,I am Servlet");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException { }
    @Override
    public ServletConfig getServletConfig() { return null; }
    @Override
    public String getServletInfo() {return null; }
    @Override
    public void destroy() { }

第三步:在web.xml中配置HelloServlet01

 

<!--
配置HelloServlet的映射路径
-->
<servlet>
    <!--
相当于给该Servlet取个名,我们可以就使用Servlet的类名/类名首字母改小写
-->
    <servlet-name>helloServlet01</servlet-name>
    
    <!--
你要配置的那个Servlet的全限定名
-->
    <servlet-class>com.atguigu.servlet.HelloServlet01</servlet-class>
</servlet>

<servlet-mapping>
    <!--
和servlet标签中的servlet-name保持一致
-->
    <servlet-name>helloServlet</servlet-name>
    
    <!--
这就是要给HelloServlet配置的映射路径,以/开头
-->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

3、Servlet的生命周期(创建—销毁)

3.1 概念:

        Servlet的生命周期就是servlet从创建到销毁的过程,我们所要去探讨的就是Servlet对象在什么时候创建出来以及在什么时候销毁。当然创建和销毁Servlet对象的工作是不需要我们去做的,由Tomcat服务器完成

创建:

        默认情况下是在第一次有请求访问该Servlet实例的时候才会创建该Servlet对象

销毁:

        在服务器关闭,或者当前项目从服务器中移除的时候会销毁当前项目中的所有Servlet对象

3.2 Servlet的生命周期方法

        在Servlet的生命周期中必然会经历的方法我们称之为Servlet的生命周期方法,总共包含三个方法:init、service、destroy

对象的生命周期分为四个阶段

1、执行 Servlet 构造器方法

2、执行 init 初始化方法(Servlet对象的初始化)

        该方法会在Servlet实例对象被创建出来之后执行,我们可以在该方法中获取当前Servlet的初始化参数,以及进行一些读取配置文件之类的操作

        Tomcat服务器,在启动的时候,就创建Servlet对象

        Servlet对象的初始化时机,默认是客户端第一次请求的时候创建,创建对象的同时,tomcat服务器调用方法 init(),并传递参数 servletConfig

        第1、2阶段,是在第一次访问的时候创建 Servlet 程序时会调用。(只调用一次)

3、执行 service 方法(客户端请求过程)每次访问都会调用

        该方法会在Servlet实例对象每次接收到请求的时候均执行,我们可以在该方法中接收、处理请求,以及将客户端需要的数据响应给客户端

        客户端浏览器每次请求Servlet都会调用方法service , Tomcat引擎调用

4、执行 destroy 销毁方法(对象的销毁)在 web 工程停止的时候调用

        该方法会在Servlet实例对象销毁之前执行,我们可以在该方法中做一些资源回收、释放、关闭等等操作

4、Servlet的体系结构

4.1类关系(通过继承 HttpServlet 实现 Servlet 程序)

        Servlet接口有一个实现类是GenericServlet,而GenericServlet有一个子类是HttpServlet,我们创建Servlet的时候会选择继承HttpServlet,因为它里面相当于也实现了Servlet接口,并且对一些方法做了默认实现;而且子类的功能会比父类的更加强大

 

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

1、编写一个类去继承 HttpServlet 类

2、根据业务需要重写 doGet 或 doPost 方法

3、到 web.xml 中的配置 Servlet 程序的访问地址

4.2 ServletConfig接口

是Servlet的配置信息类

        Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。

Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象

作用

1、可以获取 Servlet 程序的别名 servlet-name 的值

2、获取初始化参数 init-param

3、获取 ServletContext 对象

接口中的方法

方法名

作用

getServletName()

获取HelloServlet定义的Servlet名称

getServletContext()

获取ServletContext对象

org.apache.catalina.core.ApplicationContextFacade@71135c0c

getInitParameter(String key)

获取配置Servlet时设置的『初始化参数』,根据名字获取值

getInitParameterNames()

获取所有初始化参数名组成的Enumeration对象

public void init(ServletConfig servletConfig) throws ServletException {
    //String getServletName() 获取Servlet名字
    String servletName = servletConfig.getServletName();
    System.out.println("servletName = " + servletName);

    //String getInitParameter(String key) 获取Servlet的初始化参数,参数在web.xml配置
//    <init-param>
//       <param-name>java</param-name>
//       <param-value>java好学吗</param-value>
//   </init-param>
     String value = servletConfig.getInitParameter("java");
    System.out.println("value = " + value);

    // getInitParameterNames() 获取Servlet的初始化参数的所有的键
    //返回值是向量枚举  Enumeration == Iterator
    Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
    //hasMoreElements == hasNext
    while (parameterNames.hasMoreElements()){
        //nextElement == next
        String element = parameterNames.nextElement();
        System.out.println("element = " + element);
    }

ServletConfig : 获取的初始化参数,针对当前的Servlet有效的

ServletContext : 对应整个的Web应用程序是有效

5、ServletContext 类

5.1 概念

        服务器Tomca为其部署的每一个应用(项目)都创建了一个ServletContext对象。ServletContext属于整个项目的,该项目中的所有Servlet都可以共享同一个ServletContext对象

ServletContex作为全局的域t对象,域对象就是在一定的作用域范围内进行数据共享的对象,ServletContext作为全局域对象可以在整个项目的所有动态资源(包含所有Servlet)中进行数据共享

1、ServletContext 是一个接口,它表示 Servlet 上下文对象

2、一个 web 工程,只有一个 ServletContext 对象实例。

3、ServletContext 对象是一个域对象。

4、ServletContext 是在 web 工程部署启动的时候创建,在 web 工程停止的时候销毁

获取ServletContex的API

//方式一:调用Servlet自身的getServletContext方法获取
ServletContext ServletContext = getServletContext()

//方式二:调用ServletConfig接口的getServletContext方法
ServletContext ServletContext = servletConfig.getServletContext();
//HttpServletRequest对象也实现了ServletConfig接口,所以也有getServletContext()方法
ServletContext ServletContext = request.getServletContext();

5.2 ServletContext 类的五个作用

1、获取 web.xml 中配置的上下文参数 context-param

getInitParameter()

在web.xml中配置
<context-param>
    <!--参数名,键-->
    <param-name>java</param-name>
    <!--参数值-->
    <param-value>Java不太好学</param-value>
</context-param>

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    //getInitParameter(String 键) 返回字符串的值
    String java = context.getInitParameter("java");
    System.out.println("java = " + java);
}

2、获取当前的工程名

getContextPath()

public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	//找到ServletContext
    	ServletContext context = this.getServletContext();
	//获取当前的工程名
		String contextPath = context.getContextPath();
		//System.out.println("当前工程的名字:"+ contextPath);
		//请求重定向 , 缺点:因为工程名写死了。  解决方案: 动态获取工程名
		//response.sendRedirect(contextPath+"/1.html");
		//为了大家方便获取当前工程名字,那么request对象也相应的增加该方法。
		response.sendRedirect(request.getContextPath()+"/1.html");			
		}

3、获取工程部署后在服务器硬盘上的绝对路径

getRealPath()

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    //1 获取 web目录下的1.txt的绝对路径
    String  path1  = context.getRealPath("1.txt");
    System.out.println("path1 = " + path1);

    //2 获取WEB-INF目录下的2.txt的绝对路径
    String  path2  = context.getRealPath("WEB-INF/2.txt");
    System.out.println("path2 = " + path2);

    //3 获取src目录下的3.txt的绝对路径
    String  path3  = context.getRealPath("WEB-INF/classes/3.txt");
    System.out.println("path3 = " + path3);

    //4 获取web02模块下面的文件4.txt,不会部署到运行环境Tomcat服务器

}

4、像 Map 一样存取数据 (ServletContext域对象)

setAttribute()

域对象的三个方法:
void setAttribute(String key,object value)   键和值存储在域对象中
Object getAttribute(String key)            获取域对象中,键对应的值
void removeAttribute(String key)             移除域对象中的键和值

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    //向域对象存储键和值
    context.setAttribute("contextKey","contextValue");
    //取出域对象的值
    Object contextKey = context.getAttribute("contextKey");
    System.out.println("contextKey = " + contextKey);
}

5、获取互联网邮件扩展类型

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    String mime = context.getMimeType("1.xlsx");//获取指定文件的mime类型,传递文件名就可以
    System.out.println("mime = " + mime);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓 铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值