相关技术:为了灵活实现的不同路径(/hello)执行不同的资源( HeIIoMyServlet)我们需要使用XML进行配置;为了限定XML内容,我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析。

XML:XML称为Extensible Markup Language,意思是可扩展的标记语言。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。

应用:

1.2.1.3 XML语法

l  XML文档声明

1.文档声明必须为<?xml开头,以?>结束;

2.文档声明必须从文档的0行0列位置开始:

3.文档声明只有属性:

a)     versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;

b)     encoding:指定当前文档的编码。可选属性,默认值是。utf-8:

l  元素element

1.元素是XML文档中最重要的组成部分,

2.普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>

3.元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a ></b>

4.空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭介,例如:<c/>

5.元素命名:

a)     区分大小写

b)     不能使用空格,不能使用冒号:

c)      不建议以XML,  xml,  Xml开头

6.格式化良好的XML文档,必须只有一个根元素。

l  属性

1.属性是元素的一部分,它必须出现在元素的开始标签中

2.属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引

3.一个元素可以有O ~ N个属性,但一个元素中不能出现同名属性

4.属性名不能使用空格、冒号等特殊字符,且必须以字母开头

l  注释

XML的注释与HTML相同,即以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略!

l  转义字符

XML中的转义字符与HTML一样。

因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:"<"、”>”、” ’ ”、” ” ”、”&”。

l  CDATA区

<![CDATA[
任意内容
]]>  

当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。

在CDATA段中出现的“<”、“>’,、“””、“‘”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。

在CDATA段中不能包含“]]>”,即CDATA段的结束定界符。

什么是DTD

DTD (Document Type Definition ),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。

DTD重点要求

开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2,  hibernate等。

通过提供的DTD"web-app_2_3.dtd "编写XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)> <!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)> <!ATTLIST web-app version CDATA #IMPLIED>

案例实现

l  步骤1:创建web.xml文档,并将“web-app_ 2_ 3.dtd"拷贝相同目录下。

l  步骤2:从DTD文档开始处,拷贝需要的“文档声明”

l  步骤3:完成xml内容编写

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app version="2.3">
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file></welcome-file>
<welcome-file></welcome-file>
</welcome-file-list>
</web-app>

DTD语法(了解)

文档声明

1.内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

<?xml version="1.0" encoding="UTF-8"? standalone="yes" ?>
<!DOCTYPE web-app [
...//具体语法
]>
<web-app>
</web-app>

  

2.外部DTD——本地DTD,DTD文档在本地系统上,公司内部自己项目使用。

3.外部DTD——公共DTD,DTD文档在网络上,一般都有框架提供。

元素声明
定义元素语法:<!ELEMENT元素名 元素描述>

    元素名:自定义

    元素描述包括 : 符号和数据类型

          常见符号: ?  *  +  ()  |  ,

          常见类型:#PCDATA表示内容是文本,不能是子标签

符号

符号类型

描述

示例

?

问号

表示该对象可以出现,但只能出现一次

(菜鸟?)

*

星号

表示该对象允许出现任意多次,也可以是零次

(爱好*)

+

加号

表示该对象最少出现一次,可以出现多次

(成员+)

()

括号

用来给元素分组

(古龙|金庸|梁羽生),

(王朔|余杰),毛毛

|

竖条

表明在列出的对象中选择一个

(男人|女人)

,

逗号

表示对象必须按指定的顺序出现

(西瓜,苹果,香蕉)

l  实例

<!ELEMENT  web-app(servlet*,servlet-mapping*,welcome-file-list?)>

    web-app包括3个标签,且必须顺序出现。

        servlet子标签个数任意

        servlet-mapping子标签个数任意

        welcome-file-list子标签最多只能出现一次

<!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>

    servlet有3个子标签,且必须顺序出现

        servlet-name,必须有,且只能出现1次

        description,可选1次

        servlet-class和jsp-file二选一,且只能出现一次

<!ELEMENT servlet-name(#PCDATA)>

    servlet-name的标签体必须是文本

<!ELEMENT  welcome-file-list  (welcome-file+)>

      welcome-file-list至少有1个子标签welcome-file

Schema约束

1.2.3.1什么是Schema

l  Schema是新的XML文档约束:

l  Schema要比DTD强大很多,是DTD替代者;

l  Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml .

l  Schema功能更强大,数据类型更完善

l  Schema支持名称空间

1.2.3.2 Schema重点要求

与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等通过提供”web-app_ 2_ 5.xsd"编写xml文档

案例实现

1.步骤1:创建web.xml,并将"web-app_2_5.xsd"拷贝到同级目录

2.步骤2:从xsd文档中拷贝需要的“命名空间”

3.完成xml内容编写

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file></welcome-file>
<welcome-file></welcome-file>
</welcome-file-list>
</web-app>

解析原理及结构模型

XML DOM和HTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,

并获得一个Document对象,通过Document对象就可以对DOM进行操作

DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!

API使用

如果需要使用dom4j,必须导入jar包。

dom4j必须使用核心类SaxReader加载xml文档获得Document通过Document对象获得文档的根元素,然后就可以操作了。

步骤:

1.获取解析器

2.获得document文档对象

3.获取根元素

4.获取根元素下的子元素

5.遍历子元素

6.判断元素名称为servlet的元素

7.获取servlet-name元素

8.获取servlet-class元素

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test; public class TestDom4j {
@Test
public void testReadWebXML() {
try {
// 1.获取解析器
SAXReader saxReader = new SAXReader();
// 2.获得document文档对象
Document doc = saxReader.read("src/com/oracle/demo06/web.xml");
// 3.获取根元素
Element rootElement = doc.getRootElement();
// System.out.println(rootElement.getName());//获取根元素的名称
// System.out.println(rootElement.attributeValue("version"));//获取根元素中的属性值
// 4.获取根元素下的子元素
List<Element> childElements = rootElement.elements();
// 5.遍历子元素
for (Element element : childElements) {
//6.判断元素名称为servlet的元素
if ("servlet".equals(element.getName())) {
//7.获取servlet-name元素
Element servletName = element.element("servlet-name");
//8.获取servlet-class元素
Element servletClass = element.element("servlet-class");
System.out.println(servletName.getText());
System.out.println(servletClass.getText());
}
} } catch (DocumentException e) {
e.printStackTrace();
}
} }

案例实现

1.3.1准备工作

为了模拟服务器端程序,且可以同时存在多个类似程序。故提供接口,接口中有3个方法,我们人为约定三个方法的调用顺序。

public interface IMyServlet {

	public void init();

	public void service();

	public void destory();
}
public class MyServletImpl implements IMyServlet {

	@Override
public void init() {
System.out.println("啊,俺来也……");
} @Override
public void service() {
System.out.println("我可以为你服务……");
} @Override
public void destory() {
System.out.println("啊,俺去也……");
} }

反射执行

测试程序我们直接new HeIloServlet,这种编程方式我们称为硬编码,及代码写死了。为了后期程序的可扩展,开发中通常使用实现类的全限定类名(com.oracle.demo06.MyServletImpl)通过反射加载字符串指定的类,并通过反射创建实例。

public class TestMyServlet {

	@Test
public void testMyServlet(){
MyServletImpl my = new MyServletImpl();
my.init();
my.service();
my.destory();
} @Test
public void testMyServlet1(){
try {
String className = "com.oracle.demo06.MyServletImpl";
Class clazz = Class.forName(className);
MyServletImpl my = (MyServletImpl) clazz.newInstance();
my.init();
my.service();
my.destory();
} catch (Exception e) {
e.printStackTrace();
}
}
}

解析xml

使用反射我们己经可以创建对象的实例,此时我们使用的全限定类名,在程序是仍写死了,我们将器配置到xml文档中。

xml文档内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>MyServlet1</servlet-name>
<servlet-class>com.oracle.demo06.servlet.MyServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet1</servlet-name>
<url-pattern>/myServlet1</url-pattern>
</servlet-mapping> </web-app>

解析实现:

步骤:

//1.创建解析器对象

//2.使用解析器加载web.xml文件得到document对象

//3.获取根元素节点

//4.根据元素名称获取子元素节点

//5.根据元素名称获取servlet-class的文本节点

//6.通过类全名获取字节码文件

//7.创建实例对象

//8.调用实例对象里面的方法

package com.oracle.demo06.servlet;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test; public class TestMyServlet { @Test
public void testMyServlet(){
try {
//1.创建解析器对象
SAXReader saxReader = new SAXReader();
//2.使用解析器加载web.xml文件得到document对象
Document document = saxReader.read("src/com/oracle/demo06/servlet/web.xml");
//3.获取根元素节点
Element rootElement = document.getRootElement();
//4.根据元素名称获取子元素节点
Element servletElement = rootElement.element("servlet");
//5.根据元素名称获取servlet-class的文本节点
String servletClass = servletElement.element("servlet-class").getText();
//System.out.println(servletClass);
//6.通过类全名获取字节码文件
Class clazz = Class.forName(servletClass);
//7.创建实例对象
MyServlet1 my = (MyServlet1) clazz.newInstance();
//8.调用实例对象里面的方法
my.init();
my.service();
my.destory();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

  

  

  

  

  

  

  

JavaEE之servlet相关技术的更多相关文章

  1. jsp/servlet相关技术及知识

    JSP页面的内容由两部分组成: 静态部分:标准的HTML标签.静态的页面内容, 动态部分:受Java程序控制的内容,这些都由java语言动态生成 简单的jsp页面代码: <%@ page lan ...

  2. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

  3. j2e应用相关技术

    j2e应用相关技术 轻量级j2e应用以传统的jsp作为变现层技术,以一系列开源框架作为MVC层,中间件,持久层解决方案,并将这些开源框架有机组合在一起,使得j2e具有高度的可扩展性,可维护性. ser ...

  4. 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

    一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...

  5. 【原】http缓存与cdn相关技术

    摘要:最近要做这个主题的组内分享,所以准备了一个星期,查了比较多的资料.准备的过程虽然很烦很耗时间,不过因为需要查很多的资料,因此整个过程下来,对这方面的知识影响更加深刻.来来来,接下来总结总结 一 ...

  6. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

  7. 关于全站https必要性http流量劫持、dns劫持等相关技术

    关于全站https必要性http流量劫持.dns劫持等相关技术 微信已经要求微信支付,申请退款功能必须12月7号之前必须使用https证书了(其他目前为建议使用https),IOS也是2017年1月1 ...

  8. JavaScript对SVG进行操作的相关技术

    原文地址:http://www.ibm.com/developerworks/cn/xml/x-svgscript/   本文主要介绍在 SVG 中通过编程实现动态操作 SVG 图像的知识. SVG ...

  9. Servlet相关接口和Servlet的生命周期

    http://www.cnblogs.com/luotaoyeah/p/3860292.html Servlet相关接口和Servlet的生命周期 创建一个Servlet类最直接的方式是实现javax ...

随机推荐

  1. Laravel 集成 JPush 极光推送指北

    我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...

  2. 函数新特性、内联函数、const详解

    一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...

  3. HTML-JavaScript的DOM操作-非重点部分

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档(HTML文档),对象是指文档中每个元素:模型是指抽象划的东西. 2.Windows对象操作 一.属性和方法 属性(值或者 ...

  4. ORM中的一对一和多对多

    ORM中的一对一和多对多 Django ORM  ORM 一对一 什么时候用一对一? 当 一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁 把不怎么常用的字段 单独拿出来做成一张表 然 ...

  5. 【算法笔记】B1044 火星数字

    1044 火星数字 (20 分)   火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, ...

  6. ASP.NET中类的多语言编译

    App_Code 文件夹中同时使用多种语言编程的方法 在web.config文件里,加入如下的配置 <configuration>  <system.web> <comp ...

  7. Oracle分析函数、窗口函数简单记录汇总

    一.分析函数.窗口函数一般形式 1.分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,他们的使用 ...

  8. MB Star C3 vs MB Star C4

    New Mercedes Benz Star C3 is a professional diagnostic tool specially for mercedes benz cars. Merced ...

  9. python PIL库的使用

    )PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图,转换图像格式,打印图像等等. 图像展示(I ...

  10. 2.5 Go 算术运算与变量使用技巧

    变量作用域 简单来说,GO的变量以块为范围:一个if-else的块,就可以包含一个变量的生命周期.变量的声明,要在使用之前. package main import ( "fmt" ...