java web三大组件之Servlet

Servlet容器

在这里插入图片描述
web容器中有Servlet容器,spring项目部署后存在spring容器和springmvc容器(是spring的子容器)。其中spring控制service层和dao层的bean对象。springmvc容器控制controller层bean对象。servlet容器控制servlet对象。
项目启动的过程:首先servlet初始化,初始化过程是通过web.xml中spring的配置加载spring配置,初始化spring容器和springmvc容器。待容器加载完成,servlet初始化完成,则完成启动。HTTP请求到达web容器后,会达到servlet容器,容器通过分发器分发到具体的spring的Controller层,执行业务操作后返回结果
Servlet容器有哪些:
目前流行的Servlet容器软件包括Tomcat,jetty,jboss等。servlet容器主要负责管理servlet,jsp的生命周期以及共享数据
每接到一个请求到servlet,这个servlet就会运行一个Thread

servlet和jsp

Servlet是一个处理网络请求(很多时候是http请求)的类,用于实现web应用的。另外也有很多的框架比如struts是以它为底子,搭建一个更高抽象的解决方案,Servlet是运行在处理网络请求的Servlet容器中的,比如最知名的Tomcat。jsp是Servlet技术的扩展,

servlet和jsp的区别

1、Servlet在Java代码中可以通过HttpServletResponse对象动态输出HTML内容。
2、JSP是在静态HTML内容中嵌入Java代码,然后Java代码在被动态执行后生成HTML内容。
一句话:jsp就是在html里面写java代码,servlet就是在java里面写html代码。

servlet和jsp的各自特点

1、Servlet虽然能够很好地组织业务逻辑代码,但是在Java源文件中,因为是通过字符串拼接的方式生成动态HTML内容,这样就容易导致代码维护困难、可读性差。
2、JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑。

通过MVC双剑合璧

MVC模式,是Model-View-Controller的简称,是软件工程中的一种软件架构模式,分为三个基本部分,分别是:模型(Model)、视图(View)和控制器(Controller):
Controller——负责转发请求,对请求进行处理
View——负责界面显示
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现
在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:
在这里插入图片描述1、Web浏览器发送HTTP请求到服务端,然后被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
2、Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
3、Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
4、动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中有很大的优势,它完美规避了JSP与Servlet各自的缺点,让Servlet只负责业务逻辑部分,而不会生成HTML代码;同时JSP中也不会充斥着大量的业务代码,这样能大提高了代码的可读性和可维护性。

Servlet生命周期

1.默认情况下,第一次被访问时,Servlet被创建,然后执行init方法并且只执行一次(Filter是在容器启动的时候被创建并执行init方法),可以配置执行Servlet的创建时机;
2.调用服务的service的方法处理doGet和doPost方法
3.容器关闭时候调用destroy 销毁方法

servlet和JSP九大内置对象

在这里插入图片描述

四大域

servletcontext域(application域)
  1. 作用的范围:整个web应用程序
  2. 作用:数据产生之后,不仅等会还要用 ,还要给别人用,则请使用servletcontext。它是四个域中范围最大的域。由于一个web应用中的所有servlet共享同一个servletcontext对象,所以多个servlet通过servletcontext对象实现了数据在不同servlet之间的共享。
  3. 使用:
    在servlet中使用getServletContext方法即可获取当前web应用的servletcontext对象
ServletContext servletContext = getServletContext();
servletContext.setAttribute("lzh", "liuzhihui");
Object lzh = servletContext.getAttribute("lzh");

也可以在监听器中使用:

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("MyServletContextListener初始化啦!!");
        ServletContext sc = servletContextEvent.getServletContext();
        sc.setAttribute("lzh", "liuzhihui");
    }
Httpsession域(session域)
  1. 作用范围:一次会话。数据产生之后显示给用户了,等会还要使用的情况下使用Httpsession域。它是四个域中范围第二大的域。
  2. 作用:在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session。如果没有,就在内存中创建一个session并返回。当一短时间内(默认30分钟)session没有被使用,则服务器会销毁该session。若服务器非正常关闭,未到期的session也会跟着销毁。若调用session提供的invalidate()方法,可以立即销毁session。
  3. 使用:
//servlet中
request.getSession();
session.getAttribute("username");
session.setAttribute("username", "xxx");
session.setMaxInactiveInterval(30*60);
session.invalidate();

ServletRequest域(request域)

  1. 作用范围:ServletRequset域是:整个请求链(请求转发也存在)。数据产生之后,只需要使用一次,这种情况下请使用ServletRequset域。它是四个域中范围排第三的域。
  2. 作用:在整个请求链中共享数据。
    最常用到:在servlet中处理好的数据交给JSP显示,此时参数就可以放置在ServletRequset域中带过去。

Servlet创建

对于一个 Servlet 类,我们日常最常用的方法是继承自 HttpServlet 类,提供了 Http 相关的方法,HttpServlet 扩展了 GenericServlet 类,而 GenericServlet 类又实现了 Servlet 接口和 ServletConfig 接口。

Servlet接口

Servlet接口提供了5个方法,三个与生命周期有关:

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
    ServletConfig getServletConfig();
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    String getServletInfo();
    void destroy();
}
GenericServlet类

GenericServlet 是一个抽象类,实现了 Servlet 接口,并且对其中的 init() 和 destroy() 和 service() 提供了默认实现。在 GenericServlet 中,主要完成了以下任务:
将 init() 中的 ServletConfig 赋给一个类级变量,可以由 getServletConfig 获得;
为 Servlet 所有方法提供默认实现;
可以直接调用 ServletConfig 中的方法;

abstract class GenericServlet implements Servlet,ServletConfig{
   //GenericServlet通过将ServletConfig赋给类级变量
   private trServletConfig servletConfig;
   public void init(ServletConfig servletConfig) throws ServletException {
      this.servletConfig=servletConfig;
      /*自定义init()的原因是:如果子类要初始化必须覆盖父类的init() 而使它无效 这样
       this.servletConfig=servletConfig不起作用 这样就会导致空指针异常 这样如果子类要初始化,
       可以直接覆盖不带参数的init()方法 */
      this.init();
   }
   //自定义的init()方法,可以由子类覆盖  
   //init()不是生命周期方法
   public void init(){
   }
   //实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法 
   public abstract void service(ServletRequest request,ServletResponse response) 
     throws ServletException,java.io.IOException{
   }
   //实现空的destroy方法
   public void destroy(){ }
}

可以看到如果继承这个类的话,我们必须重写 service() 方法来对处理请求。

HttpServlet类

HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,使得使用更加简单方便,由于是扩展了 Http 的内容,所以还需要使用 HttpServletRequest 和 HttpServletResponse,这两个类分别是 ServletRequest 和 ServletResponse 的子类。代码如下:

abstract class HttpServlet extends GenericServlet{
 
   //HttpServlet中的service()
   protected void service(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse){
        //该方法通过httpServletRequest.getMethod()判断请求类型调用doGet() doPost()
   }
 
   //必须实现父类的service()方法
   public void service(ServletRequest servletRequest,ServletResponse servletResponse){
      HttpServletRequest request;
      HttpServletResponse response;
      try{
         request=(HttpServletRequest)servletRequest;
         response=(HttpServletResponse)servletResponse;
      }catch(ClassCastException){
         throw new ServletException("non-http request or response");
      }
      //调用service()方法
      this.service(request,response);
   }
}

我们可以看到,HttpServlet 中对原始的 Servlet 中的方法都进行了默认的操作,不需要显式的销毁初始化以及 service(),在 HttpServlet 中,自定义了一个新的 service() 方法,其中通过 getMethod() 方法判断请求的类型,从而调用 doGet() 或者 doPost() 处理 get,post 请求,使用者只需要继承 HttpServlet,然后重写 doPost() 或者 doGet() 方法处理请求即可。
我们一般都使用继承 HttpServlet 的方式来定义一个 servlet。

ServletContext

ServletContext是servlet与servlet容器之间的直接通信的接口。servlet容器在启动一个web应用时,会为它创建一个ServletContext对象。同一个web应用的所有servlet对象共享一个ServletContext。servlet可通过它访问访问容器的各种资源。可以使用ServletContext通过编码的方式向容器中手动注册三大组件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值