最近学java servlet,有 deployment descriptor这一概念,它到底是啥东西啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最近学java servlet,有 deployment descriptor这一概念,它到底是啥东西啊?相关的知识,希望对你有一定的参考价值。

好像是部署什么的,请讲得详细一些。

就是你的一个servlet写好这后你要部署(deployment )到服务器(如:tomcat),然后才能运行

Descriptor是接口
所有超级接口:
Cloneable, Serializable
所有已知实现类:
DescriptorSupport, ImmutableDescriptor

--------------------------------------------------------------------------------

public interface Descriptorextends Serializable, Cloneable
JMX 元素的附加元数据。Descriptor 与 MBeanInfo、MBeanAttributeInfo 等关联。它由一个字段集合组成。字段由一个名称和一个关联值组成。

字段名称不区分大小写。名称 descriptorType、descriptortype 和 DESCRIPTORTYPE 都是等效的。但是,第一次设置字段时所使用的大小写将保留在 getFields() 和 getFieldNames() 方法的结果中。

并非所有的字段名称和值都可以预定义。任何程序都可以定义和添加新字段。

描述符可以是可变的,也可以是不可变的。不可变的描述符一旦创建就不能更改。对于不可变的描述符,可以修改描述符内容的 Descriptor 方法将抛出异常。不可变的描述符通常是 ImmutableDescriptor 或子类的实例。可变描述符通常是 DescriptorSupport 或子类的实例。

某些字段由 JMX 实现使用。这意味着这类字段的存在可以改变 JMX API 的行为,或者可以在 JMX API 返回的描述符中设置这类字段。这些字段在下表中将以斜体 形式出现,每个字段在 JMX 类中都有一个相应的常量。例如,字段 defaultValue 由常量 JMX.DEFAULT_VALUE_FIELD 表示。

在下表中描述了某些其他字段的常规含意,但 JMX 实现不必了解或设置它们。

在此版本或所有未来版本中由 JMX 规范定义的字段名称将永远不会包含句点 (.)。通过在名称中包含句点,用户可以安全地创建自己的字段,并能确保这些名称不会与任何将来的 JMX API 版本相冲突。建议遵循 Java 包命名约定以避免不同来源的字段名称发生冲突。例如,由 example.com 创建的字段可能有名称 com.example.interestLevel。

注意,defaultValue、legalValues、maxValue 和 minValue 字段中的值应该与对关联的 MBeanAttributeInfo 或 MBeanParameterInfo 调用 getType() 方法所返回的类型一致。对于 MXBean,这意味着它们应该属于映射的 Java 类型,该类型在 MXBean 类型映射规则中称作 opendata(J)。
参考技术A Deployment descriptor在servlet里就是指web.xml,意思是配置描述,有的地方简写为DD,因为你的servlet 配置都写在web.xml里,所以有这个名字。本回答被提问者采纳

Java学习之Servlet

一、Servlet:其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。

二、Hello Servlet

1、新建一个web工程,要有一个服务器

2、新建一个实现Servlet接口的类

3、配置Servlet,用意:匹配客户端请求,指向具体Servlet

3.1、具体配置文件路径在webContent/WEB-INF/web.xml

3.2、配置信息

4、启动Run AS 

浏览器地址栏:http://localhost:8080/p02_HellowServlet/a

分析:http://localhost:8080/项目名称+<url-pattern>节点内容(/a)

<url-pattern>写法:

Ⅰ、全路径匹配
   以 / 开始   /a /aa/bb
   localhost:8080/项目名称/aa/bb
Ⅱ、路径匹配 , 前半段匹配
  以  / 开始 , 但是以 * 结束  /a/* /* 
  星号(*)其实是一个通配符,匹配任意文字
  localhost:8080/项目名称/aa/bb
Ⅲ、以扩展名匹配
  写法: 没有/  以 * 开始   *.扩展名    *.aa *.bb

三、Servlet执行过程

1、通过URL请求找到对应Web项目(发布在tomcat服务器上的web项目)

2、查找web.xml文件中url-pattern节点中是否有符合URL格式的,如果没有就404,有的话获取其兄弟节点servlet-name内容

3、根据servlet-name查找servlet节点下servlet-class指向servlet的类全名称,并执行Servlet中的service方法

四、Servlet接口方法分析

 1 public class HelloServlet implements Servlet {
 2     @Override
 3     public void init(ServletConfig config) throws ServletException {
 4     System.out.println("Servlet init");
 5     }
 6 
 7     @Override
 8     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
 9     System.out.println("Servlet service");
10     }
11     
12     @Override
13     public void destroy() {
14     System.out.println("Servlet destroy");
15     }
16 
17     @Override
18     public ServletConfig getServletConfig() {
19 
20     return null;
21     }
22 
23     @Override
24     public String getServletInfo() {
25 
26     return null;
27     }
28 }

运行结果:

 

 Ⅰ、Init方法:在创建该servlet的实例时,就执行该方法。
        一个servlet只会初始化一次, init方法只会执行一次
        默认情况下是 : 初次访问该servlet,才会创建实例。

Ⅱ、service方法:只要客户端来了一个请求,那么就执行这个方法了。
          该方法可以被执行很多次。 一次请求,对应一次service方法的调用

Ⅲ、destroy方法:servlet销毁的时候,就会执行该方法

      1. 该项目从tomcat的里面移除。

        

      2. 正常关闭tomcat就会执行 shutdown.bat

Ⅳ、getServletConfig方法:对外提供可获取ServletConfig对象的公共方法

    ServletConfig对象所对应的实体,如下图:

      

     ServletConfig对象对应是上图servlet节点,那么就应该有方法可以获取子节点内容的方法

    三个方法:

      getServletName

      getInitParameter(String name)

      getInitParameterNames

      演示:

      servlet节点配置  

 1     <servlet>
 2         <servlet-name>HelloServlet</servlet-name>
 3         <servlet-class>com.marw.servlet.HelloServlet</servlet-class>
 4         <init-param>
 5             <param-name>params01</param-name>
 6             <param-value>1</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>params02</param-name>
10             <param-value>2</param-value>
11         </init-param>
12         <init-param>
13             <param-name>params03</param-name>
14             <param-value>3</param-value>
15         </init-param>
16         <init-param>
17             <param-name>params04</param-name>
18             <param-value>4</param-value>
19         </init-param>
20         <load-on-startup>2</load-on-startup>
21     </servlet>

      service方法中的代码

 1     @Override
 2     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
 3     System.out.println("Servlet service");
 4     
 5     // 获取到的是配置servlet里面servlet-name 的文本内容
 6     String servletName = config.getServletName();
 7     System.out.println("servletName=" + servletName);
 8 
 9     // 2、。 可以获取具体的某一个参数。
10     String str = config.getInitParameter("params01");
11     System.out.println("params01=" + str);
12 
13     // 3.获取所有的参数名称
14     Enumeration<String> names = config.getInitParameterNames();
15     // 遍历取出所有的参数名称
16     while (names.hasMoreElements()) {
17         String key = (String) names.nextElement();
18         String value = config.getInitParameter(key);
19         System.out.println("key===" + key + "   value=" + value);
20 
21     }
22     }

      结果:

        

 Ⅴ、getServletInfo方法:可以自定义信息

补充:load-on-startup改变Servlet初始化(Init)方法执行时机

1. 默认情况下,只有在初次访问servlet的时候,才会执行init方法。

2. 初始化方法做一些比较耗时的逻辑,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。

3. 在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2(服务器启动时机)开始即可。

以上是关于最近学java servlet,有 deployment descriptor这一概念,它到底是啥东西啊?的主要内容,如果未能解决你的问题,请参考以下文章

Java学习之Servlet篇

Java学习之Servlet

Java学习之Javaweb核心servlet

Java web每天学之Servlet工作原理详情解析

Java学习之servlet

javaweb回顾第一篇servlet的学习和理解