Java Servlet组件

32 篇文章 1 订阅

1.什么是Servlet?

        从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案。而具体的Servlet容器负责提供标准的实现。
        从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了Servlet接口的实现类。

  •         Servlet(Server Applet)作为服务器端的一个组件,它的本意是“服务器端的小程序”。
  •         Servlet的实例对象由Servlet容器负责创建;
  •         Servlet的方法由容器在特定情况下调用;
  •         Servlet容器会在Web应用卸载时销毁Servlet对象的实例。

在Servlet中通常需要:

  • 接收请求数据;
  • 处理请求;
  • 完成响应。

2.怎么来使用Servlet

实现Servlet有三种方式:

  • 实现Servlet接口;
  • 继承javax.servlet.GenericServlet类;
  • 继承javax.servlet.http.HttpServlet类;

实现Servlet接口需要重写它的(init(),getServletConfig(),service(),getServletInfo(),destory())方法

public class AServalet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

继承GenericServlet类需要重写它的service方法

public class AServalet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    }
}

继承HttpServlet类需要重新doGet和doPost方法

public class AServalet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

 在实际开发中使用第三种方法!

运行Servlet需要配置Servlet文件

在web目录下WEB-INF中的web.xml文件配置

    <servlet>
    //名称,随意取, 一般取名类名
    <servlet-name>Servlet02</servlet-name>
    //对应的Servlet类, 全名(包.类名)
    <servlet-class>com.fs.web01.Servlet02</servlet-class>
    </servlet>
    //指定访问路径
    <servlet-mapping>
        <servlet-name>Servlet02</servlet-name>
        //访问路径
        <url-pattern>/Servlet02</url-pattern>
    </servlet-mapping>

我的第一个Servlet应用

public class Servlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }
}

需要在浏览器域名后输入访问路径 

 在后面的开发中我们推荐使用注解来替换配置文件,使用方法:

name忽略:
@WebServlet(name="Servlet02",urlPatterns="/Servlet02")
@WebServlet(urlPatterns="/Servlet02")
urlPatterns 与value 等同
@WebServlet(value="/Servlet02")
@WebServlet(value = "/Servlet02")
public class Servlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }
}

 Servlet作用:

  • 接收请求 【解析请求报文中的数据:请求参数】

  • 处理请求 【DAO和数据库交互】

  • 完成响应 【设置响应报文】

3.Servlet生命周期 

所谓生命周期,就是说出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:

  • void init(ServletConfig);

  • void service(ServletRequest,ServletResponse);

  • void destroy();

        1.出生:服务器会在Servlet 第一次被访问时创建Servlet ,或者是在服务器启动时创建Servlet 。 如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住, Servlet出生后马上就会调用init()方法,而且一个Servlet的一生 这个方法只会被调用一次。

        2.服务:当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。 服务器接收到一次请求,就会调用service() 方法一次 ,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

        3.死亡:Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。

测试生命周期:

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(value="/Servlet02")
public class Servlet02 implements Servlet{

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("我出生啦");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("我在这里!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("我要寄啦!");
    }
}

启动后 

关闭后

 4.Servlet两个接口

1. ServletConfig接口

ServletConfig接口封装了Servlet配置信息

  • 每一个Servlet都有一个唯一对应的ServletConfig对象,代表当前Servlet的配置信息。

  • 对象由Servlet容器创建,并传入生命周期方法init(ServletConfig config)中。可以直接获取使用。

  • 代表当前Web应用的ServletContext对象也封装到了ServletConfig对象中,使ServletConfig对象成为了获取ServletContext对象的一座桥梁。

  • ServletConfig对象的主要功能:
    • 获取Servlet名称:getServletName()

    • 获取全局上下文ServletContext对象:getServletContext()

    • 获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。

2.ServletContext接口

 Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。

  • 由于一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象也被称为 application 对象(Web应用程序对象)。

  • 对象由Servlet容器在项目启动时创建,通过ServletConfig对象的getServletContext()方法获取。在项目卸载时销毁。

  • ServletContext对象的主要功能:

    a.获取项目的上下文路径(带/的项目名): getContextPath()
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //获取路径对象
        ServletContext servletContext = servletConfig.getServletContext();
        //获取具体路径
        String contextPath = servletContext.getContextPath();
        System.out.println(contextPath);
    }

        b.获取虚拟路径所映射的本地真实路径:getRealPath(String path)

        c. 作为域对象共享数据

                setAttribute(key,value):以后可以在任意位置取出并使用

                getAttribute(key):取出设置的value值.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值