Servlet配置方式

Servlet配置方式

浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置方式

1.基于xml文件的配置方式

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Demo</servlet-name>
        <servlet-class>com.nenu.Demo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Demo</servlet-name>
        <url-pattern>/Demo</url-pattern>
    </servlet-mapping>
</web-app>

2.基于注解的配置方式

在需要配置的类前面加:

@WebServlet("/Demo1")

例如前面的xml配置文件可以被替换为:

@WebServlet("/Demo1")//这里配置Servlet
public class Demo1 implements Servlet {

}

我们会在xml文件配置不直观,麻烦,而且xml中需要配置所有其他的东西,所以后期Servlet一般都用注解的方式替代。Servlet有很多注解,可以对Servlet更方便的配置。

上述两种配置结果完全一样。

Servlet的生命周期

Servlet的生命周期例子

作为一个对象来讲,一定会有创建、使用和回收的过程。

java有专门的垃圾回收机制,会自动的帮助我们回收对象,有不同的算法对对象进行回收。我们首先需要了解基础,后期深入了解垃圾回收机制和java虚拟机内存结构等等。学过C++,C++的对象一定要释放。但Java你只需要创建对象就好了。

  • 声明周期显示到代码里,就是这样,Servlet类里面有五个方法:init、ServletConfig、service、getServletInfo、destory。
  • 其中init是servlet的初始化,service是servlet业务方法、destory释放了servlet对象
  • 其他两个方法与其声明周期无关

例如:

package com.nenu;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/Demo1")
public class Demo1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("执行servlet的初始化");
    }//设置输出

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行servlet业务逻辑");
    }//设置输出

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

    @Override
    public void destroy() {
        System.out.println("servlet的销毁");
    }//设置输出
}

以上代码在此三处设置输出,启动tomcat,执行并访问后,控制台输出如下:

说明调用了init方法,然后调用了service,再刷新几次又调用了很多次service:

init一次,servlet对象就存在了,之后的访问都是使用同一个servlet对象。首先检测servlet容器里面有没有目标Demo1的实体类对象。没有的话创建一个,然后调用它的service;第二次再检测,没有则创建,有就直接用。这样可以节约很多内存空间,而且只需要有一个servlet目标对象即可。类似于我们打电话只需要一部手机接打电话,可以无限循环的打电话,而不需要每次打电话都换一台手机。

destory方法什么时候执行呢?tomcat一关,开始释放资源,当tomcat服务停掉了,装载servlet的对象就停掉了。

那么对象怎样创建出来的呢,servlet方法是非静态方法,非静态方法的调用必须借助于对象。这里并没有看到new Demo1的对象,我们没看到并不代表不存在。而这一系列的完成都是由tomcat容器完成的。通过反射机制来创建对象。通反射机制拿到构造函数,反射创建对象一般都是调用无参的构造函数。我们可以把无参的构造函数重写一下,添加到代码里:

public Demo1(){
        System.out.println("创建了Servlet对象");
    }

肯定是先构造对象,再调用方法。

输出结果印证了这一点,关闭tomcat:

Servlet的生命周期(从创建到销毁):

  1. 当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执行第三步。
  2. 调用init方法完成初始化操作
  3. 调用Servlet方法完成业务逻辑操作
  4. 关闭tomcat时,会调用destory方法,释放当前对象所占用的资源

Servlet声明周期方法

包括无参构造函数、init、service、destory

  1. 无参构造函数只调用一次,创建对象
  2. init只调用一次、初始对象
  3. service调用N次,执行业务方法
  4. destory只调用一次,卸载对象

原文地址:https://www.cnblogs.com/yangf428/p/12522674.html

时间: 2024-08-29 07:29:25

Servlet配置方式的相关文章

servlet的web.xml文件的几种配置方式

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http

Servlet提交表单的注解方式与xml的配置方式

最近在学习Struts这个框架,先从配置方式学起,这里又需要使用Servlet来进行比较,所以我记录一下Servlet中注解和xml的配置两种提交表单的方式,用验证用户名是否为空的例子给大家讲解一下. 一.注解方式,格式如下在Servlet类的上面写 1 @WebServlet("/login") 然后Servlet的注解写好后,在index,jsp中的表单写访问的路径 1 <form action="${pageContext.request.contextPath}

Spring MVC Controller配置方式

在SpringMVC中,对于Controller的配置方式有很多种,如下做简单总结 第一种 URL对应Bean 如果要使用此类配置方式,需要在XML中做如下样式配置 <!-- 表示将请求的URL和Bean名字映射-->   <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>   <bean name="/hello.do" c

spring,springmvc,mybatis基本整合(一)--xml文件配置方式(2)

spring,springmvc,mybatis基本整合(一)–xml文件配置方式(2)之mapper接口 一,整合结构 二,所需jar包 如上图. 三,整合配置 1,web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://j

springmvc的系统学习之配置方式

资源:尚学堂  邹波 springmvc框架视频  一.springMVC 工作流程        页面请求---->控制器(Controller DispatcherServlet)---->请求委托----->处理器(XXController  实际类) ---->业务处理 (HandlerMapping . HandlerAdaper 结合后将url映射到处理器) 处理器 ----> 返回ModelAndView ----> 控制器  -----> 传递Mo

常用的两种spring、mybatis 配置方式

在之前的文章中总结了三种方式,但是有两种是注解sql的,这种方式比较混乱所以大家不怎么使用,下面总结一下常用的两种总结方式: 一. 动态代理实现 不用写dao的实现类 这种方式比较简单,不用实现dao层,只需要定义接口就可以了,这里只是为了记录配置文件所以程序写的很简单: 1.整体结构图: 2.三个配置文件以及一个映射文件 (1).程序入口以及前端控制器配置 web.xml <?xml version="1.0" encoding="UTF-8"?> &

Servlet配置详解

1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义). 所有部署描述符文件的顶层(根)元素为web-app.请注意,XML元素不像HTML,他们是大小写敏感的.因此,web-App和WEB-APP都

hibernate的校验框架validation 和 HttpMessageConverter的配置方式

好像是2个不相干的配置内容,但他们都用到了<mvc:annotation-driven /> 结果在配置的时候一直无法糅合在一起. 解决方案: hibernate的校验框架validator的验证 主要说的是使用Annotaion JSR标准的验证, public class User {     @NotEmpty(message = "用户名不能为空")         private String username;         @Size(min=6 ,max=

javaSE学习笔记—Servlet配置(12)

问题1: 用户是否可以即使用get又使用post发送请求? 对于开发人员而言不知道用户到底要使用什么请求方式,因此需要将doGet或doPost都要重写.但是响应的数据时一样,因此可以在实现一个方法的基础上在另一个方法中直接调用即可. public class Template extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws Servle